基于python实现信用卡功能

最近在学习python,出于练手目的,写了一个信用卡功能程序。

主要功能包括:登录和注册账号、信用卡消费、还款和提现、查看额度和账单等,选择消费时,调用购物模块实现购物车的添加、删除和查看,以及结算等功能。

用到的数据库如下:

用户信息表、密码表、商品信息总表、信用卡额度表、账单表等;

主要流程图如下:

登录模块

信用卡模块

购物模块

代码如下:

python程序包为ATM,包含三个py文件,分别为login.py、shopping.py、credit.py;

  1 import pymysql
  2 
  3 menu = '''\n请选择菜单:
  4 1 登录
  5 2 注册
  6 3 退出
  7 '''
  8 menu_list = ['1', '2', '3']
  9 
 10 
 11 def login():
 12     '''
 13     登录
 14     '''
 15     # 创建数据库连接
 16     db = pymysql.connect("localhost",  "用户名", "密码", "数据库名")
 17     cursor = db.cursor()
 18     # 判断用户名是否有效
 19     locked_flag = ''
 20     username = input('请输入登录用户名:')
 21     while True:
 22         if username == '':
 23             username = input('用户名为空,请重新输入:')
 24         else:
 25             sql = "SELECT * FROM userinfo \
 26                    WHERE username = '%s'" % (username)
 27             cursor.execute(sql)
 28             results = cursor.fetchone()
 29             if not results:
 30                 username = input('用户名不存在,请重新输入:')
 31             else:
 32                 sql = "SELECT * FROM password \
 33                        WHERE username = '%s' \
 34                        AND locked = 'X'" % (username)
 35                 cursor.execute(sql)
 36                 results = cursor.fetchone()
 37                 if results:
 38                     locked_flag = 'X'
 39                 break
 40     if locked_flag == 'X':
 41         print('该账号已锁定,请联系管理员!')
 42         # 关闭数据库连接
 43         db.close()
 44         return
 45     # 判断密码是否正确
 46     error_times = 0
 47     password = input('请输入密码:')
 48     while True:
 49         sql = "SELECT * FROM password \
 50                WHERE username = '%s' \
 51                AND password = '%s'" % (username, password)
 52         cursor.execute(sql)
 53         results = cursor.fetchone()
 54         if not results:
 55             error_times += 1
 56             if error_times < 3:
 57                 print('密码输入错误,您还有%d次机会' % (3 - error_times))
 58                 password = input('请输入密码:')
 59             else:
 60                 sql = "UPDATE password SET locked = 'X' \
 61                          WHERE username = '%s'" % (username)
 62                 cursor.execute(sql)
 63                 db.commit()
 64                 print('密码错误次数达到3次,账号%s已锁定!' % username)
 65                 # 关闭数据库连接
 66                 db.close()
 67                 return     
 68         else:
 69             print('账号%s登录成功。' % username)
 70             # 关闭数据库连接
 71             db.close()
 72             return username
 73 
 74 
 75 def register():
 76     '''
 77     注册
 78     '''
 79     # 创建数据库连接
 80     db = pymysql.connect("localhost", "用户名", "密码", "数据库名")
 81     cursor = db.cursor()
 82     # 输入有效注册用户名
 83     username = input('请输入注册用户名:')
 84     while True:
 85         if username == '':
 86             username = input('注册用户名不可为空,请重新输入:')
 87         else:
 88             sql = "SELECT * FROM userinfo \
 89                    WHERE username = '%s'" % (username)
 90             cursor.execute(sql)
 91             results = cursor.fetchone()
 92             if results:
 93                 username = input('注册用户名已存在,请重新输入:')
 94             else:
 95                 break
 96     # 输入有效密码
 97     password = input('请输入密码:')
 98     password2 = input('请再次输入密码:')
 99     while True:
100         if password2 != password:
101             password = input('两次输入密码不一致,请重新输入:')
102             password2 = input('请再次输入密码:')
103         else:
104             sql = "INSERT INTO userinfo(username)\
105                      VALUES ('%s')" % username
106             cursor.execute(sql)
107             sql = "INSERT INTO password(username,password)\
108                      VALUES ('%s','%s')" % (username, password)
109             cursor.execute(sql)
110             db.commit()
111             print('账号%s注册成功。' % username)
112             break
113     # 关闭数据库连接
114     db.close()
115 
116 
117 def logout():
118     '''
119     登出
120     '''
121     print('已成功退出。')
122     exit(0)
123 
124 
125 def what_to_do():
126     '''
127     选项菜单
128     '''
129     print(menu)
130     menu_selected = input('请输入您的菜单选项:')
131     while menu_selected not in menu_list:
132         menu_selected = input('输入错误,请重新输入:')
133     if menu_selected == '1':  # 登录
134         username = login()
135         if username:  # 登录成功,返回用户名
136             return username
137     elif menu_selected == '2':  # 注册
138         register()
139     else:  # 退出
140         logout()
141 
142 # what_to_do()
login.py
  1 import pymysql
  2 
  3 menu = '''\n请选择菜单:
  4 1 购物
  5 2 查看购物车
  6 3 删除商品
  7 4 结算
  8 5 返回
  9 '''
 10 menu_list = ['1', '2', '3', '4', '5']
 11 
 12 my_items = None
 13 my_cart = None
 14 
 15 
 16 class items:
 17     '''
 18     商品信息类
 19     '''
 20     
 21     # 字典,用于存所有商品信息
 22     items = {}
 23 
 24     def __init__(self):
 25         '''
 26         构造方法
 27         取出所有商品信息
 28         '''
 29         db = pymysql.connect("localhost", "用户名", "密码", "数据库名")
 30         cursor = db.cursor()
 31         sql = "SELECT * FROM items"
 32         cursor.execute(sql)
 33         results = cursor.fetchall()
 34         db.close()
 35         for res in results:
 36             item = [res[1], res[2], res[3]]
 37             self.items[res[0]] = item
 38 
 39     def show(self):
 40         '''
 41         显示所有商品信息
 42         '''
 43         print('所有商品信息如下:')
 44         print('编号    名称    单价    库存')
 45         for item in self.items:
 46             print(item, self.items[item][0], self.items[item][1],
 47         self.items[item][2], sep='    ')
 48     
 49     def add(self, num, quantity):
 50         '''
 51         添加商品数量
 52         '''
 53         self.items[num][2] += quantity
 54         
 55     def subtract(self, num, quantity):
 56         '''
 57         减少商品数量
 58         '''
 59         self.items[num][2] -= quantity
 60         
 61     def save(self):
 62         '''
 63         保存所有商品信息到后台表
 64         '''
 65         db = pymysql.connect("localhost", "用户名", "密码", "数据库名")
 66         cursor = db.cursor()
 67         sql = "INSERT INTO items(number,item,price,stock) \
 68         VALUES (%s, %s, %s, %s) \
 69         ON DUPLICATE KEY UPDATE stock = VALUES(stock)"
 70         items_save = []
 71         for item in self.items:
 72             items_save.append((item, self.items[item][0],
 73         self.items[item][1], self.items[item][2]))
 74         cursor.executemany(sql, items_save)
 75         db.commit()
 76         db.close()
 77 
 78 
 79 class cart:
 80     '''
 81     购物车类
 82     '''
 83     # 当前登录用户
 84     username = ''
 85     # 剩余额度
 86     balance = 0
 87     # 总消费金额
 88     total = 0
 89     # 字典,用于存购买商品信息
 90     items = {}
 91 
 92     def __init__(self, username, balance):
 93         '''
 94         构造方法
 95         记录该用户剩余额度值
 96         '''
 97         self.username = username
 98         self.balance = balance
 99 
100     def show(self):
101         '''
102         显示购买商品信息
103         '''
104         self.total = 0
105         print('购买商品信息如下:')
106         print('编号    名称    单价    数量')
107         for item in self.items:
108             self.total += self.items[item][1] * self.items[item][2]
109             print(item, self.items[item][0], self.items[item][1],
110                   self.items[item][2], sep='    ')
111         print('总消费金额为%s元' % self.total)
112         
113     def buy(self, items):
114         '''
115         购买商品
116         '''
117         number = input('请输入购买商品编号:')
118         while number not in items.keys():
119             number = input('商品编号错误,请重新输入:')
120         quantity = int(input('请输入购买数量:'))
121         while quantity > items[number][2]:
122             quantity = int(input('购买数量超过库存,请重新输入:'))
123         self.add(number, quantity, items)
124         
125     def delete(self, item):
126         '''
127         删除商品
128         '''
129         number = input('请输入删除商品编号:')
130         while number not in self.items.keys():
131             number = input('商品编号错误,请重新输入:')
132         quantity = int(input('请输入删除数量:'))
133         while quantity > self.items[number][2]:
134             quantity = int(input('删除数量错误,请重新输入:'))
135         self.subtract(number, quantity, item)
136     
137     def add(self, number, quantity, items):
138         '''
139         添加商品数量
140         '''
141         items[number][2] -= quantity  # 库存减少
142         if number in self.items.keys():
143             self.items[number][2] += quantity
144         else:
145             item = [items[number][0], items[number][1], quantity]
146             self.items[number] = item
147         print('商品添加成功!')
148     
149     def subtract(self, number, quantity, items):
150         '''
151         减少商品数量
152         '''
153         items[number][2] += quantity  # 库存增加
154         self.items[number][2] -= quantity
155         if self.items[number][2] == 0:
156             del self.items[number]
157         print('商品删除成功!')
158     
159     def pay(self):
160         '''
161         结算
162         '''
163         self.total = 0
164         for item in self.items:
165             self.total += self.items[item][1] * self.items[item][2]
166         if self.total > self.balance:  # 剩余额度不够
167             print('剩余额度不足,请先返回还款!')
168         else:
169             return True
170         
171     def save(self):
172         '''
173         保存账单信息到后台表
174         '''
175         db = pymysql.connect("localhost","用户名", "密码", "数据库名")
176         cursor = db.cursor()
177         sql = "INSERT INTO bill(username,item,quantity,amount) \
178         VALUES (%s, %s, %s, %s)"
179         bill_save = []
180         for item in self.items:
181             bill_save.append((self.username, self.items[item][0], self.items[item][2],
182                               self.items[item][1] * self.items[item][2]))
183         cursor.executemany(sql, bill_save)
184         db.commit()
185         db.close()
186 
187 
188 def shop_choice():
189     '''
190     选项菜单
191     '''
192     global my_items, my_cart
193     print(menu)
194     menu_selected = input('请输入您的菜单选项:')
195     while menu_selected not in menu_list:
196         menu_selected = input('输入错误,请重新输入:')
197     if menu_selected == '1':  # 购物
198         my_items.show()
199         my_cart.buy(my_items.items)
200     elif menu_selected == '2':  # 查看购物车
201         my_cart.show()
202     elif menu_selected == '3':  # 删除商品
203         my_cart.show()
204         my_cart.delete(my_items.items)
205     elif menu_selected == '4':  # 结算
206         if my_cart.pay():
207             my_items.save()
208             my_cart.save()
209             my_cart.items.clear()
210             return '4'
211     else:  # 返回
212         return '5'
213 
214 
215 def shop(username, balance):
216     '''
217     外部调用函数
218     '''
219     # 实例化类
220     global my_items, my_cart
221     my_items = items()
222     my_cart = cart(username, balance)
223     while True:
224         shop_flag = shop_choice()
225         if shop_flag == '4':  # 结算
226             return my_cart.total
227         elif shop_flag == '5':  # 返回,则跳出循环
228             break
shopping.py
  1 import pymysql
  2 from ATM import login, shopping
  3 
  4 menu = '''\n请选择菜单:
  5 1 消费
  6 2 查看额度
  7 3 查看账单
  8 4 还款
  9 5 提现
 10 6 返回
 11 7 退出
 12 '''
 13 menu_list = ['1', '2', '3', '4', '5', '6', '7']
 14 
 15 my_credit = None
 16 
 17 
 18 class credit:
 19     '''
 20     信用卡类
 21     '''
 22     username = ''
 23     # 各金额初始为0
 24     amount = 0  # 总额度
 25     balance = 0  # 剩余额度
 26     payment = 0  # 应还金额
 27     
 28     def __init__(self, username):
 29         '''
 30         构造方法
 31         取出该用户各金额值
 32         '''
 33         self.username = username
 34         db = pymysql.connect("localhost", "用户名", "密码", "数据库名")
 35         cursor = db.cursor()
 36         sql = "SELECT * FROM credit WHERE username = '%s'" % self.username
 37         cursor.execute(sql)
 38         results = cursor.fetchone()
 39         db.close()
 40         self.amount = results[1]
 41         self.balance = results[2]
 42         self.payment = results[3]
 43 
 44     def show_amount(self):
 45         '''
 46         查看额度
 47         '''
 48         print('\n您的各信用额度如下')
 49         print('总额度:%s元' % self.amount)
 50         print('剩余额度:%s元' % self.balance)
 51         print('应还金额:%s元' % self.payment)
 52         
 53     def show_bill(self):
 54         '''
 55         查看账单
 56         '''
 57         db = pymysql.connect("localhost",  "用户名", "密码", "数据库名")
 58         cursor = db.cursor()
 59         sql = "SELECT * FROM bill WHERE username = '%s'" % self.username
 60         cursor.execute(sql)
 61         results = cursor.fetchall()
 62         db.close()
 63         print('\n您的账单如下')
 64         for res in results:
 65             print(res[1], res[2], res[3], res[4])
 66     
 67     def add(self, money):
 68         '''
 69         添加余额
 70         '''
 71         self.balance += money
 72         self.payment -= money
 73     
 74     def subtract(self, money):
 75         '''
 76         减少余额
 77         '''
 78         self.balance -= money
 79         self.payment += money
 80     
 81     def repay(self):
 82         '''
 83         还款
 84         '''
 85         money = input('请输入还款金额:')
 86         while True:
 87             try:
 88                 money = float(money)
 89                 break
 90             except:
 91                 money = input('金额有误,请重新输入:')
 92         if money > self.payment:
 93             money = self.payment
 94         self.add(money)
 95         print('还款成功!')
 96     
 97     def withdraw(self):
 98         '''
 99         提现
100         '''
101         money = input('请输入提现金额:')
102         while True:
103             try:
104                 money = float(money)
105                 break
106             except:
107                 money = input('金额有误,请重新输入:')
108         if money > self.balance:
109             money = self.balance
110         self.subtract(money)
111         print('提现成功!')
112         
113     def save(self):
114         '''
115         保存各金额到后台表
116         '''
117         db = pymysql.connect("localhost",  "用户名", "密码", "数据库名")
118         cursor = db.cursor()
119         sql = "UPDATE credit SET amount = %s,balance = %s,payment = %s \
120         WHERE username = '%s'" % (self.amount, self.balance, self.payment, self.username)
121         cursor.execute(sql)
122         db.commit()
123         db.close()
124 
125 
126 def credit_choice():
127     '''
128     选项菜单
129     '''
130     global my_credit
131     print(menu)
132     menu_selected = input('请输入您的菜单选项:')
133     while menu_selected not in menu_list:
134         menu_selected = input('输入错误,请重新输入:')
135     if menu_selected == '1':  # 消费
136         while True:
137             money = shopping.shop(my_credit.username, my_credit.balance)
138             if money != None:
139                 my_credit.subtract(money)
140                 my_credit.save()
141                 print('结算成功!')
142             else:
143                 break
144     elif menu_selected == '2':  # 查看额度
145         my_credit.show_amount()
146     elif menu_selected == '3':  # 查看账单
147         my_credit.show_bill()
148     elif menu_selected == '4':  # 还款
149         my_credit.repay()
150         my_credit.save()
151     elif menu_selected == '5':  # 提现
152         my_credit.withdraw()
153         my_credit.save()
154     elif menu_selected == '6':  # 返回
155         return True
156     else:  # 退出
157         logout()
158 
159 
160 def logout():
161     '''
162     登出
163     '''
164     print('已成功退出。')
165     exit(0)
166 
167 
168 while True:
169     username = login.what_to_do()
170     while not username:  # 登录成功则跳出循环
171         username = login.what_to_do()
172     # 实例化类
173     my_credit = credit(username) 
174     while True:
175         if credit_choice():  # 返回,则跳出循环
176             break
credit.py

以上所有代码全部为自己手动编写,仅供参考。

猜你喜欢

转载自www.cnblogs.com/zlw-xyz/p/12805221.html