diff --git a/code/Deposit.py b/code/Deposit.py new file mode 100644 index 0000000..9a99e0e --- /dev/null +++ b/code/Deposit.py @@ -0,0 +1,99 @@ +import wx +import pymysql +from MySQL import Make_bill, function +import threading +import time + + +class Deposit1(wx.App): + def doClose(self, j): + time.sleep(j) + self.frame.Close() + + def __init__(self, YuanZhangH): + + self.YuanZhangH = YuanZhangH + wx.App.__init__(self) + self.frame = wx.Frame(parent=None, title='存 款', size=(535, 450), + style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) + + panel = wx.Panel(self.frame, -1) + panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) + label_pass = wx.StaticText(panel, -1, "存款金额:", pos=(80, 200)) + # style 为设置输入 + self.JinE = wx.TextCtrl(panel, -1, size=(250, 35), pos=(140, 190)) + + self.QueDing_button = wx.Button(panel, -1, "确 认", size=(80, 60), pos=(120, 280)) + self.QuXiao_button = wx.Button(panel, -1, "返 回", size=(80, 60), pos=(340, 280)) + + self.QueDing_button.SetBackgroundColour('#0a74f7') + self.QuXiao_button.SetBackgroundColour('#0a74f7') + + self.Bind(wx.EVT_BUTTON, self.CunK, self.QueDing_button) + self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button) + + self.frame.Center() + self.frame.Show(True) + + def show_message(self, word=""): + dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def show_check(self, word=""): + dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def QU(self, event): + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + jie = function.Jiemian(self.YuanZhangH) + jie.MainLoop() + + def CunK(self, event): + # 连接到本地数据库 + + z2 = self.JinE.GetValue() + YuanZhangH = self.YuanZhangH + # sql = """ UPDATE card set 余额=余额+z2 WHERE Card_Number= '%s' """ % (z1) + sql = "update card set 余额 = 余额+'{}' where Card_Number = '{}'".format(float(z2), YuanZhangH) + + # 判断,查看用户名和密码名是否为空 + # 不为空之后在进行查询和判断 + # 不然当密码或用户名为空时会出现会导致出错 + if z2: + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + cur.execute(sql) # 执行sql语句 + db.commit() + Make_bill.Make_Bill(YuanZhangH, "存款", float(z2), "无") + self.show_check(word='存款成功') + except Exception as e: + db.rollback() + + + finally: + + db.close() # 关闭连接 + else: + self.show_message(word='存款金额不能为空') + + def OnEraseBack(self, event): + dc = event.GetDC() + if not dc: + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + dc.Clear() + bmp = wx.Bitmap('img\\instagram.jpg') + dc.DrawBitmap(bmp, 0, 0) diff --git a/code/Gaim.py b/code/Gaim.py new file mode 100644 index 0000000..c111c6f --- /dev/null +++ b/code/Gaim.py @@ -0,0 +1,95 @@ +import wx +import pymysql, threading, time +from MySQL import function + + +class Gaim1(wx.App): + def doClose(self, j): + time.sleep(j) + self.frame.Close() + + def __init__(self, YuanZhangH): + + self.YuanZhangH = YuanZhangH + wx.App.__init__(self) + self.frame = wx.Frame(parent=None, title='修改密码', size=(535, 450), + style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) + panel = wx.Panel(self.frame, -1) + panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) + label_user = wx.StaticText(panel, -1, "密 码:", pos=(80, 160)) + label_pass = wx.StaticText(panel, -1, "确认密码:", pos=(80, 215)) + self.mim = wx.TextCtrl(panel, -1, size=(250, 35), pos=(140, 150), style=wx.TE_PASSWORD) + # style 为设置输入 + self.qmim = wx.TextCtrl(panel, -1, size=(250, 35), pos=(140, 205), style=wx.TE_PASSWORD) + + self.QueDing_button = wx.Button(panel, -1, "修 改", size=(80, 60), pos=(120, 280)) + self.QuXiao_button = wx.Button(panel, -1, "返 回", size=(80, 60), pos=(340, 280)) + + self.QueDing_button.SetBackgroundColour('#0a74f7') + self.QuXiao_button.SetBackgroundColour('#0a74f7') + + self.Bind(wx.EVT_BUTTON, self.Xiu, self.QueDing_button) + self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button) + + self.frame.Center() + self.frame.Show(True) + + def show_message(self, word=""): + dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def show_check(self, word=""): + dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def Xiu(self, event): + YuanZhangH = self.YuanZhangH + z1 = self.mim.GetValue() + z2 = self.qmim.GetValue() + sql = "update card set password = '{}' where Card_Number = '{}'".format(z1, YuanZhangH) + if z1 and z2: + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + if z1 == z2: + cur.execute(sql) # 执行sql语句 + db.commit() + self.show_check(word='密码修改成功') + results = cur.fetchall() # 获取查询的所有记录 + # 返回值是一个元组的形式 + else: + self.show_message(word='请确保两次输入密码相同') + + except Exception as e: + db.rollback() + + + finally: + db.close() # 关闭连接 + pass + + def OnEraseBack(self, event): + dc = event.GetDC() + if not dc: + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + dc.Clear() + bmp = wx.Bitmap('img\\instagram.jpg') + dc.DrawBitmap(bmp, 0, 0) + + def QU(self, event): + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + jie = function.Jiemian(self.YuanZhangH) + jie.MainLoop() diff --git a/code/Make_bill.py b/code/Make_bill.py new file mode 100644 index 0000000..ad84409 --- /dev/null +++ b/code/Make_bill.py @@ -0,0 +1,38 @@ +import random +import time +import pymysql + +class Make_Bill(): + def __init__(self, Num, stt, val, Mnum): + self.Num = Num + self.stt = stt + self.val = val + self.Mnum = Mnum + self.Make(self.Num) + def makeid(self): + return int(random.uniform(10000001, 10999999)) + def Make(self, Num): + + sql = "SELECT card类型,Card_Number FROM card WHERE Card_Number = %s" % (self.Num) + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + cur = db.cursor() + try: + cur.execute(sql) # 执行sql语句 + results = cur.fetchall() + print(type(results)) + YH = results[0][0] + YC = results[0][1] + tim = time.strftime('%Y-%m-%d %H:%M:%S ', time.localtime(time.time())) + sql2 = "INSERT INTO bill VALUES ('%s',%s, '%s','%s', %s,'%s','%s')" % ( + tim, self.makeid(), YH, self.stt, self.val, YC, self.Mnum) + cur.execute(sql2) + db.commit() + except Exception as e: + db.rollback() + finally: + + db.close() # 关闭连接 + +# MM=Make_Bill("62155504510128","转账",1000,"62155504510112") + diff --git a/code/Query.py b/code/Query.py new file mode 100644 index 0000000..ed2a98d --- /dev/null +++ b/code/Query.py @@ -0,0 +1,95 @@ +import wx, threading, time +import pymysql +from MySQL import function + + +class Query(wx.App): + def doClose(self, j): + time.sleep(j) + self.frame.Close() + + def __init__(self, card): + self.card = card + wx.App.__init__(self) + self.frame = wx.Frame(parent=None, title='查询', size=(700, 600), + style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) + + self.panel = wx.Panel(self.frame, -1) + self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) + + self.tex1 = wx.StaticText(self.panel, -1, + "交易时间 订 单 ID 所属银行 交易类型 交易金额 账户信息 目标账户", + pos=(70, 220)) + # self.entry_tim = wx.TextCtrl(panel,-1,size=(150,35), pos=(120,120)) + # self.entry_ztim = wx.TextCtrl(panel,-1, size=(150,35), pos=(370,120)) + + self.button = wx.Button(self.panel, -1, "查 询", size=(100, 35), pos=(210, 120)) + self.button2 = wx.Button(self.panel, -1, "返 回", size=(100, 35), pos=(400, 120)) + self.sampleList = [] + self.Bind(wx.EVT_BUTTON, self.Query_transaction_records, self.button) + self.Bind(wx.EVT_BUTTON, self.QU, self.button2) + # listBox.SetSelection(3) + self.frame.Center() + self.frame.Show(True) + + def QU(self, event): + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + jie = function.Jiemian(self.card) + jie.MainLoop() + + def Query_transaction_records(self, event): + sql = "SELECT * FROM bill where 银行卡号='{}'".format(self.card) + + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + cur.execute(sql) + results = cur.fetchall() + print(len(results)) + sampleList = [] + # self.sampleList.extend(sample) + print(self.sampleList) + if results: + for i in range(len(results)): + wor = "" + for j in range(len(results[i])): + print(results[i][j], end=" ") + wor += str(results[i][j]) + wor += " " + print("") + sampleList.append(wor) + listBox = wx.ListBox(self.panel, -1, (20, 250), (680, 350), sampleList, wx.LB_SINGLE) + listBox.SetSelection(3) + else: + self.show_message(word="交易记录为空") + except Exception as e: + db.rollback() + + + finally: + + db.close() # 关闭连接 + + def show_message(self, word=""): + dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + def OnEraseBack(self, event): + dc = event.GetDC() + if not dc: + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + dc.Clear() + bmp = wx.Bitmap('img\\instagram.jpg') + dc.DrawBitmap(bmp, 0, 0) + +# if __name__ == '__main__': +# app=Query("62155504510128") +# app.MainLoop() diff --git a/code/Withdrawal.py b/code/Withdrawal.py new file mode 100644 index 0000000..d4c14e3 --- /dev/null +++ b/code/Withdrawal.py @@ -0,0 +1,97 @@ +import wx +import pymysql, time, threading +from MySQL import Make_bill, function + + +class Withdrawal1(wx.App): + def doClose(self, j): + time.sleep(j) + self.frame.Close() + + def __init__(self, YuanZhangH): + self.YuanZhangH = YuanZhangH + wx.App.__init__(self) + self.frame = wx.Frame(parent=None, title='取 款', size=(535, 450), + style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) + + panel = wx.Panel(self.frame, -1) + panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) + label_pass = wx.StaticText(panel, -1, "取款金额:", pos=(80, 200)) + # style 为设置输入 + self.JinE = wx.TextCtrl(panel, -1, size=(250, 35), pos=(140, 190)) + + self.QueDing_button = wx.Button(panel, -1, "确 认", size=(80, 60), pos=(120, 280)) + self.QuXiao_button = wx.Button(panel, -1, "反 回", size=(80, 60), pos=(340, 280)) + + self.QueDing_button.SetBackgroundColour('#0a74f7') + self.QuXiao_button.SetBackgroundColour('#0a74f7') + + self.Bind(wx.EVT_BUTTON, self.QuK, self.QueDing_button) + self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button) + self.frame.Center() + self.frame.Show(True) + + def show_message(self, word=""): + dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def show_check(self, word=""): + dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def QuK(self, event): + # 连接到本地数据库 + z2 = self.JinE.GetValue() + YuanZhangH = self.YuanZhangH + sql1 = "SELECT 余额 FROM card WHERE Card_Number = %s" % (YuanZhangH) + sql2 = "update card set 余额 = 余额-'{}' where Card_Number = '{}'".format(float(z2), YuanZhangH) + # 判断,查看用户名和密码名是否为空 + # 不为空之后在进行查询和判断 + # 不然当密码或用户名为空时会出现会导致出错 + if z2: + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + cur.execute(sql1) + results = cur.fetchall() + if results[0][0] >= float(z2): + cur.execute(sql2) + db.commit() + Make_bill.Make_Bill(YuanZhangH, "取款", float(z2), "无") + self.show_check(word='取款成功') + else: + self.show_message(word='余额不足') + + except Exception as e: + db.rollback() + finally: + + db.close() # 关闭连接 + else: + self.show_message(word='取款金额不能为空') + + def OnEraseBack(self, event): + dc = event.GetDC() + if not dc: + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + dc.Clear() + bmp = wx.Bitmap('img\\instagram.jpg') + dc.DrawBitmap(bmp, 0, 0) + + def QU(self, event): + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + jie = function.Jiemian(self.YuanZhangH) + jie.MainLoop() diff --git a/code/atm.sql b/code/atm.sql new file mode 100644 index 0000000..db4f8f1 --- /dev/null +++ b/code/atm.sql @@ -0,0 +1,125 @@ +/* +Navicat MySQL Data Transfer + +Source Server : atm +Source Server Version : 80033 +Source Host : localhost:3306 +Source Database : atm + +Target Server Type : MYSQL +Target Server Version : 80033 +File Encoding : 65001 + +Date: 2024-05-31 14:54:56 +*/ + +SET FOREIGN_KEY_CHECKS=0; +-- ---------------------------- +-- Table structure for `bank` +-- ---------------------------- +DROP TABLE IF EXISTS `bank`; +CREATE TABLE `bank` ( + `bank_key` int NOT NULL, + `银行名称` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + PRIMARY KEY (`bank_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- ---------------------------- +-- Records of bank +-- ---------------------------- +INSERT INTO bank VALUES ('1', '中国银行'); + +-- ---------------------------- +-- Table structure for `bill` +-- ---------------------------- +DROP TABLE IF EXISTS `bill`; +CREATE TABLE `bill` ( + `时间` datetime NOT NULL, + `订单ID` int NOT NULL, + `银行` char(50) NOT NULL, + `操作方式` char(50) NOT NULL, + `金额` float NOT NULL, + `银行卡号` char(30) NOT NULL, + `目标账户` char(30) DEFAULT NULL, + PRIMARY KEY (`时间`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- ---------------------------- +-- Records of bill +-- ---------------------------- +INSERT INTO bill VALUES ('2024-05-31 11:05:53', '10744925', '中国银行', '取款', '111', '111', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:09:08', '10788140', '中国银行', '存款', '1', '111', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:09:39', '10939119', '中国银行', '存款', '111', '111', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:09:42', '10613347', '中国银行', '取款', '1', '111', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:10:57', '10946847', '中国银行', '转账', '0', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 11:13:31', '10074488', '', '转账', '1', '222', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:19:10', '10516740', '中国银行', '存款', '33333', '111', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:20:42', '10517518', '中国银行', '转账', '0', '111', '333'); +INSERT INTO bill VALUES ('2024-05-31 11:22:47', '10019783', '中国银行', '存款', '22', '111', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:23:47', '10431147', '中国银行', '存款', '3333', '333', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:23:54', '10390544', '中国银行', '转账', '1', '333', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:24:03', '10284427', '中国银行', '转账', '22', '333', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:24:20', '10429608', '', '转账', '22', '222', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:24:42', '10548491', '中国银行', '转账', '111', '111', '333'); +INSERT INTO bill VALUES ('2024-05-31 11:25:58', '10599121', '中国银行', '转账', '111', '333', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:27:57', '10451816', '', '转账', '111', '222', '333'); +INSERT INTO bill VALUES ('2024-05-31 11:28:07', '10920179', '', '转账', '222', '222', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:28:10', '10317065', '', '转账', '2222', '222', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:30:29', '10919022', '中国银行', '转账', '1', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 11:31:07', '10283188', '', '转账', '1', '444', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:31:20', '10528188', '', '存款', '111', '444', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:31:27', '10851448', '', '取款', '11', '444', '无'); +INSERT INTO bill VALUES ('2024-05-31 11:31:41', '10858951', '', '转账', '1', '444', '111'); +INSERT INTO bill VALUES ('2024-05-31 11:32:28', '10417171', '中国银行', '转账', '1', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 11:36:32', '10530239', '中国银行', '转账', '11', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 11:36:49', '10442202', '中国银行', '转账', '111', '111', '333'); +INSERT INTO bill VALUES ('2024-05-31 11:37:23', '10051895', '中国银行', '转账', '111', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 11:43:27', '10163236', '中国银行', '转账', '1', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 11:44:37', '10549313', '中国银行', '转账', '111', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 12:05:07', '10871814', '中国银行', '转账', '1', '111', '222'); +INSERT INTO bill VALUES ('2024-05-31 13:36:13', '10654129', '', '转账', '1', '000', '111'); +INSERT INTO bill VALUES ('2024-05-31 13:43:53', '10097456', '', '存款', '2999', '888', '无'); +INSERT INTO bill VALUES ('2024-05-31 13:43:57', '10663217', '', '取款', '2', '888', '无'); +INSERT INTO bill VALUES ('2024-05-31 13:44:12', '10549945', '', '转账', '11', '888', '111'); + +-- ---------------------------- +-- Table structure for `card` +-- ---------------------------- +DROP TABLE IF EXISTS `card`; +CREATE TABLE `card` ( + `Card_Number` char(30) NOT NULL, + `持卡人姓名` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yonghu', + `身份证号` char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `余额` float NOT NULL DEFAULT '0', + `card类型` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `password` int NOT NULL, + PRIMARY KEY (`Card_Number`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- ---------------------------- +-- Records of card +-- ---------------------------- +INSERT INTO card VALUES ('000', '用户', '37000000000', '-1', '', '0'); +INSERT INTO card VALUES ('111', '小明', '111111', '1666', '中国银行', '111'); +INSERT INTO card VALUES ('222', '小华', '333333', '2237', '', '222'); +INSERT INTO card VALUES ('333', '小东', '666666', '2111', '中国银行', '333'); +INSERT INTO card VALUES ('444', '用户', '37000000000', '98', '', '444'); +INSERT INTO card VALUES ('777', '用户', '37000000000', '0', '', '777'); +INSERT INTO card VALUES ('888', '用户', '37000000000', '2986', '', '888'); + +-- ---------------------------- +-- Table structure for `user` +-- ---------------------------- +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `User_key` int NOT NULL, + `姓名` char(50) NOT NULL, + `性别` char(20) NOT NULL, + `身份证号` char(30) NOT NULL, + PRIMARY KEY (`User_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- ---------------------------- +-- Records of user +-- ---------------------------- +INSERT INTO user VALUES ('1', '小明', '男', '111111'); diff --git a/code/function.py b/code/function.py new file mode 100644 index 0000000..6b91aad --- /dev/null +++ b/code/function.py @@ -0,0 +1,84 @@ +import wx +from MySQL import transfer, Deposit, Withdrawal, Gaim, Make_bill, Query +import threading, time + +class Jiemian(wx.App): + def doClose(self, j): + time.sleep(j) + self.frame.Close() + + def __init__(self, Num): + wx.App.__init__(self) + self.Num = Num + self.frame = wx.Frame(parent=None, title='自助存取款机', size=(1000, 750), + style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) + + panel = wx.Panel(self.frame, -1) + # img=wx.Icon(name='logo.png',type=wx.BITMAP_TYPE_PNG) + # wx.StaticBitmap(panel,-1,bitmap=img,pos=(0,0)) + # image = wx.Image("instagram.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap() + panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) + self.Query_transaction_records_button = wx.Button(panel, -1, "查询交易记录", size=(200, 60), pos=(0, 250)) + self.transfer_accounts_button = wx.Button(panel, -1, "转 账", size=(200, 60), pos=(0, 375)) + self.deposit = wx.Button(panel, -1, "存 款", size=(200, 60), pos=(800, 375)) + self.withdrawal = wx.Button(panel, -1, "取 款", size=(200, 60), pos=(800, 250)) + self.gaimi = wx.Button(panel, -1, "改 密", size=(200, 60), pos=(0, 500)) + self.tuichu = wx.Button(panel, -1, "退 卡", size=(200, 60), pos=(800, 500)) + + self.Bind(wx.EVT_BUTTON, self.qery, self.Query_transaction_records_button) + self.Bind(wx.EVT_BUTTON, self.transf, self.transfer_accounts_button) + self.Bind(wx.EVT_BUTTON, self.depos, self.deposit) + self.Bind(wx.EVT_BUTTON, self.withdraw, self.withdrawal) + self.Bind(wx.EVT_BUTTON, self.gaim, self.gaimi) + self.Bind(wx.EVT_BUTTON, self.Tui, self.tuichu) + self.frame.Center() + self.frame.Show(True) + + def OnEraseBack(self, event): + dc = event.GetDC() + if not dc: + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + dc.Clear() + bmp = wx.Bitmap('img\\z.png') + dc.DrawBitmap(bmp, 0, 0) + + def transf(self, event): + Num = self.Num + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + app = transfer.Transfer(Num) + app.MainLoop() + + def depos(self, event): + Num = self.Num + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + app = Deposit.Deposit1(Num) + app.MainLoop() + + def withdraw(self, event): + Num = self.Num + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + app = Withdrawal.Withdrawal1(Num) + app.MainLoop() + + def gaim(self, event): + Num = self.Num + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + app = Gaim.Gaim1(Num) + app.MainLoop() + + def Tui(self, event): + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + + def qery(self, event): + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + app = Query.Query(self.Num) + app.MainLoop() + diff --git a/code/main.py b/code/main.py new file mode 100644 index 0000000..10636a8 --- /dev/null +++ b/code/main.py @@ -0,0 +1,4 @@ +from MySQL import t1 #从 MySQL 模块导入t1 +if __name__=='__main__': #当前的文件作为主程序运行 + app = t1.MyApp() #创建了一个名为 app 的对象,该对象是 t1 组件中 MyApp 类的一个实例,初始化一个应用程序 + app.MainLoop() #应用程序的事件循环,使窗口保持打开并能够响应用户操作 diff --git a/code/t1.py b/code/t1.py new file mode 100644 index 0000000..de6432e --- /dev/null +++ b/code/t1.py @@ -0,0 +1,162 @@ +import wx +import random +import pymysql +import time +import threading + +from MySQL import function + + +# 所系使用的是固定位置,导致窗口拉伸的效果不是很好 +class MyApp(wx.App): #定义一个名为MyApp的类,继承自wxPython的App类 + def doClose(self, j): + time.sleep(j) + self.frame.Close() + + def __init__(self): + + wx.App.__init__(self) + self.frame = wx.Frame(parent=None, title='Login', size=(600, 460), + style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) + # 设置窗口的左上角的图标 600, 460 + # 其中参数type表示图片的类型,还有ico,jpgm等类型 + icon_1 = wx.Icon(name='img\\favicon.png', type=wx.BITMAP_TYPE_PNG) + self.frame.SetIcon(icon_1) + + panel = wx.Panel(self.frame, -1) + # 向panel中添加图片 + image = wx.Image("img\\登录背景.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap() + panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) + # 添加文本输入框 + label_user = wx.StaticText(panel, label='用户:', pos=(120, 230)) + label_user.SetBackgroundColour(wx.Colour(255, 255, 255)) + self.entry_user = wx.TextCtrl(panel, -1, size=(225, 35), pos=(160, 225)) + # style 为设置输入 + label_pass = wx.StaticText(panel, label='密码:', pos=(120, 280)) + label_pass.SetBackgroundColour(wx.Colour(255, 255, 255)) + self.entry_pass = wx.TextCtrl(panel, -1, size=(225, 35), pos=(160, 270), style=wx.TE_PASSWORD) + # 添加按钮 + self.but_login = wx.Button(panel, -1, "登陆", size=(130, 50), pos=(140, 340)) + self.but_register = wx.Button(panel, -1, "注册", size=(130, 50), pos=(297, 340)) + # 设置按钮的颜色 + self.but_login.SetBackgroundColour("#0a74f7") + self.but_register.SetBackgroundColour("#0a74f7") + # 给按钮绑定事件 + self.Bind(wx.EVT_BUTTON, self.on_but_login, self.but_login) + self.Bind(wx.EVT_BUTTON, self.on_but_register, self.but_register) + + self.frame.Center() + self.frame.Show(True) + + def OnEraseBack(self, event): #定义一个方法,用于处理窗口背景的擦除事件 + dc = event.GetDC() + if not dc: + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + dc.Clear() + bmp = wx.Bitmap("img\\登录背景.jpg") + dc.DrawBitmap(bmp, 0, 0) + + # 定义一个消息弹出框的函数 + def show_message(self, word=""): + dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def show_que(self, word=""): #定义一个方法,用于显示提示消息框,并在确认后关闭窗口 + dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + t = threading.Thread(target=self.doClose, args=(0.5,)) + t.start() + dlg.Destroy() + + def on_but_login(self, event): #定义一个方法,用于处理登录按钮的点击事件,包括与数据库的连接和用户验证。 + user_name = self.entry_user.GetValue() + pass_word = self.entry_pass.GetValue() + sql = """select password from card where Card_Number ='%s' """ % (user_name) + # 判断,查看用户名和密码名是否为空 + # 不为空之后在进行查询和判断 + # 不然当密码或用户名为空时会出现会导致出错 + if user_name and pass_word: + print(user_name, " ", pass_word) + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + cur.execute(sql) # 执行sql语句 + results = cur.fetchall() # 获取查询的所有记录 + # 返回值是一个元组的形式 + + print(type(results)) + if results: + # print(type(results[0][0])) + # print(results[0][0]) + if results[0][0] == int(pass_word): + self.show_que(word="登陆成功") + jie = function.Jiemian(user_name) + jie.MainLoop() + # self.page1 = function.Jiemian() + # je=Jiemian() + # je.MainLoop() + # self.AddPage(self.page1, "xxpage") + else: + self.show_message(word="密码错误") + else: + self.show_message(word='用户名不存在') + except Exception as e: + db.rollback() + finally: + db.close() # 关闭连接 + else: + self.show_message(word='账号和密码不能为空') + def on_but_register(self, event): #定义一个方法,用于处理注册按钮的点击事件,包括将新用户信息插入到数据库 + user_name = self.entry_user.GetValue() + pass_word = self.entry_pass.GetValue() + sql = "INSERT INTO card (Card_Number, password,持卡人姓名,身份证号,余额,card类型) VALUES ('%s','%s','%s','%s','%s','%s')" % ( + user_name, pass_word, '用户', 37000000000, 0, " ") + # 判断,查看用户名和密码名是否为空 + # 不为空之后在进行查询和判断 + # 不然当密码或用户名为空时会出现会导致出错 + if user_name and pass_word: + print(user_name, " ", pass_word) + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + cur.execute(sql) # 执行sql语句 + results = cur.rowcount # 获取查询的所有记录 + # 返回值是一个元组的形式 + db.commit() + print(type(results)) + if results: + # print(type(results[0][0])) + if results > 0: + self.show_que(word="操作成功") + else: + self.show_message(word="操作失败") + else: + self.show_message(word='操作失败') + + except Exception as e: + db.rollback() + + + finally: + + db.close() # 关闭连接 + else: + self.show_message(word='账号和密码不能为空') + + # je=Jiemian() + # je.MainLoop() + + # je=Jiemian() + # je.MainLoop() diff --git a/code/transfer.py b/code/transfer.py new file mode 100644 index 0000000..76a63b7 --- /dev/null +++ b/code/transfer.py @@ -0,0 +1,148 @@ +import wx +import pymysql, time, threading +from MySQL import Make_bill, function + + +class Transfer(wx.App): + def doClose(self, j): + time.sleep(j) + self.frame.Close() + + def __init__(self, YuanZhangH): + self.YuanZhangH = YuanZhangH + wx.App.__init__(self) + self.frame = wx.Frame(parent=None, title='转 账', size=(535, 450), + style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) + + panel = wx.Panel(self.frame, -1) + panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) + label_user = wx.StaticText(panel, -1, "账 号:", pos=(80, 160)) + label_pass = wx.StaticText(panel, -1, "转账金额:", pos=(80, 215)) + self.ZhangHao = wx.TextCtrl(panel, -1, size=(250, 35), pos=(140, 150)) + # style 为设置输入 + self.JinE = wx.TextCtrl(panel, -1, size=(250, 35), pos=(140, 205)) + + self.YanZheng_button = wx.Button(panel, -1, "验证", size=(50, 35), pos=(400, 150)) + self.QueDing_button = wx.Button(panel, -1, "转 账", size=(80, 60), pos=(120, 280)) + self.QuXiao_button = wx.Button(panel, -1, "返 回", size=(80, 60), pos=(340, 280)) + + self.YanZheng_button.SetBackgroundColour('#0a74f7') + self.QueDing_button.SetBackgroundColour('#0a74f7') + self.QuXiao_button.SetBackgroundColour('#0a74f7') + + self.Bind(wx.EVT_BUTTON, self.YanCard, self.YanZheng_button) + + self.Bind(wx.EVT_BUTTON, self.ZhuanZhang, self.QueDing_button) + self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button) + + self.frame.Center() + self.frame.Show(True) + + def show_message(self, word=""): + dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def show_check(self, word=""): + dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION) + + if dlg.ShowModal() == wx.ID_YES: + # self.Close(True) + pass + dlg.Destroy() + + def QU(self, event): + t = threading.Thread(target=self.doClose, args=(0.05,)) + t.start() + jie = function.Jiemian(self.YuanZhangH) + jie.MainLoop() + + def YanCard(self, event): + z1 = self.ZhangHao.GetValue() + sql = """select 持卡人姓名,card类型 from card where Card_Number ='%s' """ % (z1) + if z1 != self.YuanZhangH: + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + cur.execute(sql) # 执行sql语句 + results = cur.fetchall() # 获取查询的所有记录 + # 返回值是一个元组的形式 + + print(type(results)) + if results: + # print(type(results[0][0])) + # print(results[0][0]) + stt = "持卡人姓名:" + results[0][0] + " " + "银行类型:" + results[0][1] + self.show_check(stt) + + print(results[0][0], " ", results[0][1]) + else: + self.show_message(word='账号不存在') + + except Exception as e: + db.rollback() + + + finally: + db.close() # 关闭连接 + else: + self.show_message(word="转账账号不能与自己相同") + + def ZhuanZhang(self, event): + # 连接到本地数据库 + z1 = self.ZhangHao.GetValue() + z2 = self.JinE.GetValue() + YuanZhangH = self.YuanZhangH + # sql = """ UPDATE card set 余额=余额+z2 WHERE Card_Number= '%s' """ % (z1) + sql = "update card set 余额 = 余额+'{}' where Card_Number = '{}'".format(float(z2), z1) + sql1 = "SELECT 余额 FROM card WHERE Card_Number = %s" % (z1) + sql2 = "update card set 余额 = 余额-'{}' where Card_Number = '{}'".format(float(z2), YuanZhangH) + if z1 != self.YuanZhangH: + if z1 and z2: + db = pymysql.connect(host="localhost", user="root", + password="lwh20021210...", db="atm", port=3306) + # 使用cursor()方法获取操作游标 + cur = db.cursor() + try: + cur.execute(sql1) + results = cur.fetchall() + if results[0][0] >= float(z2): + cur.execute(sql) # 执行sql语句 + db.commit() + cur.execute(sql2) + db.commit() + Make_bill.Make_Bill(YuanZhangH, "转账", float(z2), z1) + self.show_check(word='转账成功') + else: + self.show_message(word='余额不足') + + except Exception as e: + db.rollback() + + + finally: + + db.close() # 关闭连接 + else: + self.show_message(word='账号和转账金额不能为空') + else: + self.show_message(word="转账账号不能与自己相同") + + def OnEraseBack(self, event): + dc = event.GetDC() + if not dc: + dc = wx.ClientDC(self) + rect = self.GetUpdateRegion().GetBox() + dc.SetClippingRect(rect) + dc.Clear() + bmp = wx.Bitmap('img\\instagram.jpg') + dc.DrawBitmap(bmp, 0, 0) + +# if __name__=='__main__': +# app = Transfer("62155504510128") +# app.MainLoop()