最近在学习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()
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
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
以上所有代码全部为自己手动编写,仅供参考。