- 额度 15000或自定义
- 实现购物商城,买东西加入 购物车,调用信用卡接口结账
- 可以提现,手续费5%
- 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
- 支持多账户登录
- 支持账户间转账
- 记录每月日常消费流水
- 提供还款接口
- ATM记录操作日志
- 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
- 用户认证用装饰器
思维导图
目录结构
atm作业
├── README
├── atm #ATM主程目录
│ ├── bin #ATM 执行文件 目录
│ │ ├── __init__.py
│ │ ├── atm_start.py #ATM 主程序 执行程序
│ │
│ ├── conf #配置文件
│ │ ├── __init__.py
│ │ └── settings.py #未用到
│ ├── core #主要程序逻辑都 在这个目录 里
│ │ ├── __init__.py
│ │ ├── auth.py #用户,信用卡,管理员认证模块
│ │ ├── log.py #日志记录模块
│ │ ├── creditcard.py #信用卡模块\转账\还款\取现等
│ │ ├── shopping.py #购物模块\商城\购物车\购物结算等
│ │ ├── main.py #主逻辑交互程序
│ │ └── user.py # 用户模块\创建\锁定\解锁等
│ ├── db #数据库
│ │ ├── __init__.py
│ │ ├── Blacklist # 用户黑名单文件
│ │ └── user_data #用户文件,用户的各种信息
│ │ └── creditcard #信用卡文件,信用卡的各种信息
│ │ └── shopping_car #购物车文件
│ │ └── shopping_list #商品列表文件
│ └── log #日志目录
│ ├── __init__.py
└── └── water_record #所有的用户,信用卡交易日志
代码说明:实现TAM 装饰器 和 信用卡认证相关功能
代码
#ATM购物功能,本代码 实现信用卡和装饰器认证 相关功能 不是完整版 import os import json #遇到问题:无法调用方法 #问题总结:函数应该先定义在调用 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) creditcard_dic = BASE_DIR + r"/database/creditcard_data" user_dic = BASE_DIR + r"/database/user_data" user_Blacklist = BASE_DIR + r"/database/Blacklist_user" creditcard_record = BASE_DIR + r"/database/creditcard_record" ‘‘‘信用卡信息‘‘‘ def creditcard_data(): while True: with open(creditcard_dic,"r") as f: creditcard_data = json.loads(f.read()) choice = input("请输入要查看信息的信用卡账号 ‘6位数字‘ :").strip() if choice in creditcard_data.keys(): print("我的信用卡信息".center(50,"-")) print("持卡人:\t[ %s ]\n卡号:\t[ %s ]\n额度:\t[ ¥%s ]\n可用额度:\t[ ¥%s ]\n取现额度:\t[ ¥%s ]" %(creditcard_data[choice]["personinfo"], choice, creditcard_data[choice]["deflimit"], creditcard_data[choice]["limit"], creditcard_data[choice]["limitcash"])) else: print("您输入的信用卡,不存在。") choice = input("返回输入’q‘:") if choice == "q": break ‘‘‘信用卡信息‘‘‘ def creditcard_data(): while True: with open(creditcard_dic,"r") as f: creditcard_data = json.loads(f.read()) choice = input("请输入要查看信息的信用卡账号 ‘6位数字‘ :").strip() if choice in creditcard_data.keys(): print("我的信用卡信息".center(50,"-")) print("持卡人:\t[ %s ]\n卡号:\t[ %s ]\n额度:\t[ ¥%s ]\n可用额度:\t[ ¥%s ]\n取现额度:\t[ ¥%s ]" %(creditcard_data[choice]["personinfo"], choice, creditcard_data[choice]["deflimit"], creditcard_data[choice]["limit"], creditcard_data[choice]["limitcash"])) else: print("您输入的信用卡,不存在。") choice = input("返回输入’q‘:") if choice == "q": break ‘‘‘信用卡信息‘‘‘ def creditcard_data(): while True: with open(creditcard_dic,"r") as f: creditcard_data = json.loads(f.read()) choice = input("请输入要查看信息的信用卡账号 ‘6位数字‘ :").strip() if choice in creditcard_data.keys(): print("我的信用卡信息".center(50,"-")) print("持卡人:\t[ %s ]\n卡号:\t[ %s ]\n额度:\t[ ¥%s ]\n可用额度:\t[ ¥%s ]\n取现额度:\t[ ¥%s ]" %(creditcard_data[choice]["personinfo"], choice, creditcard_data[choice]["deflimit"], creditcard_data[choice]["limit"], creditcard_data[choice]["limitcash"])) else: print("您输入的信用卡,不存在。") choice = input("返回输入’q‘:") if choice == "q": break ‘‘‘信用卡取现‘‘‘ def takenow(): while True: print(" 取现 ".center(40, "-")) with open(creditcard_dic, "r+") as f: creditcard_data = json.loads(f.read()) choice = input("请输入取现的信用卡账号, 返回‘q‘ :").strip() if choice == ‘q‘: break if choice in creditcard_data: #print(creditcard_data) limit = creditcard_data[choice]["limit"] limitcash = creditcard_data[choice]["limitcash"] takenow = limit // 2 print("信用卡卡号:\t[ %s ]\n信用卡额度:\t[ ¥ %s ]\n取现额度:\t[ ¥ %s ]" % (choice,limit,takenow)) if limit >= limitcash: print("可取现金额为:\t [ ¥%s ]\n" % (limitcash)) cash = input("请输入要取现的金额,收取%5手续费 :").strip() if cash.isdigit(): cash = int(cash) if cash <= limitcash: if cash > 0 : password = input("请输入信用卡[ %s ] 的密码 :" % (choice)).strip() if password and password == creditcard_data[choice]["password"]: limitcash = int(limitcash - (cash * 0.05 + cash)) limit = int(limit - (cash * 0.05 + cash)) creditcard_data[choice]["limit"] = limit creditcard_data[choice]["limitcash"] = limitcash f.seek(0) f.truncate(0) dic = json.dumps(creditcard_data) f.write(dic) takenow_data = [str(choice),"信用卡取现",str(cash),"手续费",str(int(cash*0.05))] msg = "---".join(takenow_data) print("取现成功".center(40,"-")) print("取现金额:\t[%s]\n手续费:\t[%s]" % (cash, cash * 0.05)) else: print("密码输入错误\n") else: print("金额不能为0") else: print("您的取现金额已经超出取现额度了。") else: print("您的信用额度已经小于取现额度,不能取现了") else: print("您输入的信用卡账号 [ %s ] 错误"%(choice)) ‘‘‘信用卡还款‘‘‘ def repayment(): while True: print(" 还款 ".center(40, "-")) with open(creditcard_dic, "r+") as f: creditcard_data = json.loads(f.read()) choice = input("请输入还款的信用卡账号, 返回‘q‘ :").strip() if choice == ‘q‘: break if choice in creditcard_data: money = input("请输入还款金额:").strip() pwd = input("请输入还款密码 :").strip() if pwd == creditcard_data[choice]["password"]: if money.isdigit(): money = int(money) with open(creditcard_dic, "r+") as f: creditcard_data = json.loads(f.read()) limit = creditcard_data[choice]["limit"] limitcash = creditcard_data[choice]["limitcash"] limit += money limitcash += (money//2) creditcard_data[choice]["limit"]=limit creditcard_data[choice]["limitcash"] = limitcash dic = json.dumps(creditcard_data) rapayment_data = [str(choice), "信用卡还款", str(money)] msg = "---".join(rapayment_data) f.seek(0) f.truncate(0) f.write(dic) f.flush() print("信用卡 [ %s ] 还款金额 [ ¥%s ] 还款成功" % (choice, money)) print("信用卡\t[ %s ]\n可用额度:\t[ ¥%s ]\n取现额度:\t[ ¥%s ] " %(choice, creditcard_data[choice]["limit"], creditcard_data[choice]["limitcash"])) else: print("输入金额格式有误") else: print("密码输入错误") else: print("您输入的信用卡不存在") ‘‘‘信用卡转账‘‘‘ def transfer(): while True: print(" 转账 ".center(40, "-")) with open(creditcard_dic, "r+") as f: creditcard_data = json.loads(f.read()) choice = input("请输入信用卡账号, 返回‘q‘ :").strip() if choice == ‘q‘: break if choice in creditcard_data: current_limit = creditcard_data[choice]["limit"] transfer_account = input("请输入转账账号:").strip() if transfer_account.isdigit(): #print("----------") if len(transfer_account) == 6 : if transfer_account in creditcard_data.keys(): money = input("请输入转账金额:").strip() if money.isdigit(): money = int(money) creditcard_pwd = input("请输入信用卡账号密码:") if creditcard_pwd == creditcard_data[choice]["password"]: if money <= current_limit: creditcard_data[choice]["limit"] -= money creditcard_data[choice]["limitcash"] -= money//2 creditcard_data[transfer_account]["limit"] += money creditcard_data[transfer_account]["limitcash"] += money//2 print("转账成功".center(40,"-")) print("转账卡号:\t[ %s ]\n转账金额:\t[ ¥%s ]"%(transfer_account,money)) print("信用卡:\t[ %s ]\t可用额度还剩:\t[ ¥%s ]\n"%(creditcard_data[choice]["creditcard"], creditcard_data[choice]["limit"])) transfer_data = [str(choice), "信用卡转账", str(money)] msg = "---".join(transfer_data) f.seek(0) f.truncate(0) dic = json.dumps(creditcard_data) f.write(dic) else: print("转账金额不能超过信用额度") else: print("密码输入错误") else: print("请输入数字的金额") else: print("您输入的卡号不存在") else: print("您输入的卡号不存在") else: print("请输入正确的卡号") else: print("您输入的信用卡不存在") ‘‘‘申请信用卡‘‘‘ def new_creditcard(limit=15000,locked=False): while True: print("申请信用卡".center(50, "-")) with open(creditcard_dic, "r+") as f: creditcard_data = json.loads(f.read()) for key in creditcard_data: print("系统已有信用卡 【%s】 \t持卡人 【%s】" % (key,creditcard_data[key]["personinfo"])) choice = input("\n\33[34;0m是否申请新的信用卡 确定‘y‘ 返回‘q‘\33[0m:").strip() if choice == "q":break if choice == "y": creditcard = input("\33[34;0m输入要申请的信用卡卡号(6位数字):\33[0m").strip() if creditcard not in creditcard_data.keys(): if creditcard.isdigit() and len(creditcard) == 6: password = input("\33[34;0m请输入申请的信用卡密码:\33[0m").strip() if len(password) > 0: personinfo = input("\33[34;0m请输入信用卡申请人:\33[0m").strip() if len(personinfo) > 0: creditcard_data[creditcard] = {"creditcard":creditcard, "password":password, "personinfo":personinfo, "limit":limit,"limitcash":limit//2,"locked":locked,"deflimit":limit,} dict = json.dumps(creditcard_data) f.seek(0) f.truncate(0) f.write(dict) print("信用卡:\t[ %s ] 申请成功\n持卡人:\t[ %s ]\n额度:\t[ ¥%s ]\n取现额度:\t[ ¥%s ]"%(creditcard, personinfo, limit, creditcard_data[creditcard]["limitcash"])) else: print("信用卡申请人不能为空\n") else: print("输入的密码不正确\n") else: print("信用卡 %s 卡号不符合规范\n" % (creditcard)) else: print("信用卡 %s 已经存在\n" % (creditcard)) ‘‘‘信用卡绑定‘‘‘ def link_creditcard(): while True: print("\33[32;0m修改信用卡绑定\33[0m".center(40, "-")) with open(user_dic, "r+") as f: user_data = json.loads(f.read()) user_name = input("请输入绑定信用卡的用户名 返回 ‘q‘ :").strip() if user_name == "q":break if user_name in user_data.keys(): creditcard = user_data[user_name]["creditcard"] if creditcard == 0 : print("当前账号: \t%s"%(user_name)) print("信用卡绑定:\33[31;0m未绑定\33[0m\n") else: print("当前账号: \t%s" %(user_name)) print("绑定的信用卡: %s\n"%(creditcard)) choice = input("\33[34;0m是否要修改信用卡绑定 确定 ‘y‘ 返回‘q‘ \33[0m:") if choice == "q":break if choice == "y": creditcard_new = input("\33[34;0m输入新的信用卡卡号(6位数字)\33[0m:").strip() if creditcard_new.isdigit() and len(creditcard_new) ==6: with open(creditcard_dic, "r+") as f1: creditcard_data = json.loads(f1.read()) if creditcard_new in creditcard_data.keys(): user_data[user_name]["creditcard"]=creditcard_new dict = json.dumps(user_data) f.seek(0) f.truncate(0) f.write(dict) print("\33[31;1m信用卡绑定成功\33[0m\n") else: print("\33[31;0m输入信用卡卡号不存在(未发行)\33[0m\n") else: print("\33[31;0m输入信用卡格式错误\33[0m\n") else: print("请选择 ’y‘ 或 ’q‘ ") else: print("您输入的用户 [ %s ] 不存在 ") ‘‘‘查看信用卡流水‘‘‘ def cat_cred_record(): while True: choice = input("请输入要查看流水记录的信用卡账号:").strip() with open(creditcard_dic) as f1: cred_record = json.loads(f1.read()) if choice: if choice in cred_record.keys(): print("信用卡 [ %s ] 流水记录".center(50, "-") % (choice)) with open(user_Water) as f: for i in f: if choice in i: #print("\33[31;0m信用卡 [ %s ] 还没有进行过消费,去商城买点东西吧\33[0m\n" % (choice)) print(i.strip()) else: print("您输入的信用卡 [ %s ] 不存在"%(choice)) else: print("您输入的信用卡 [ %s ] 不存在"%(choice)) choice = input("返回 ‘q‘:") if choice == "q": break ‘‘‘认证装饰器‘‘‘ def auth(auth_type): def out_wrapper(func): if auth_type == "user_auth": # 用户认证 def wrapper(): res = func user_name = input("请输入登录用户名 :").strip() user_pwd = input("请输入登录密码 :").strip() if len(user_name) > 0: with open(user_dic, "r") as f: user_data = json.loads(f.read()) if user_name in user_data.keys() and user_pwd == user_data[user_name]["password"]: if user_data[user_name]["locked"] == False: print("[ %s ] 用户认证成功" % (user_name)) return res, user_name else: print("[ %s ] 用户已经被锁定,认证失败" % (user_name)) else: print("[ %s ] 用户或密码错误,认证失败" % (user_name)) else: print("[ %s ] 用户输入不能为空" % (user_name)) return wrapper if auth_type == "creditcard_auth": # 信用卡认证 def wrapper(): res = func() creditcard = input("请输入信用卡卡号(6位数字):").strip() password = input("请输入信用卡密码 : ").strip() if creditcard: with open(creditcard_dic, "r") as f: creditcard_data = json.loads(f.read()) if creditcard in creditcard_data.keys() and password == creditcard_data[creditcard]["password"]: if creditcard_data[creditcard]["locked"] == False: print("信用卡 [ %s ] 验证成功" % (creditcard)) return res, creditcard else: print("信用卡 [ %s ]已经被冻结,请使用其他信用卡" % (creditcard)) else: print("信用卡卡账号或密码输入错误") else: print("信用卡账号输入不能为空") return wrapper if auth_type == "admin_auth": # 管理员认证 def wrapper(): res = func() admin_dic = {"admin": "admin", "passwrod": "123"} admin_name = input("请输入管理员账号 :").strip() admin_pwd = input("请输入密码 :").strip() if admin_name: if admin_name in admin_dic and admin_pwd == admin_dic["passwrod"]: print("管理员账号[%s] 登陆成功。" % (admin_name)) return res, admin_name else: print("账号或密码错误") else: print("管理员账号输入不能为空") return wrapper return out_wrapper @auth(auth_type="user_auth") def user_auth(): print("用户登录认证".center(40,"-")) return "True" @auth(auth_type="creditcard_auth") def creditcard_auth(): print("信用卡登录认证".center(40,"-")) return "True" @auth(auth_type="admin_auth") def admin_auth(): print("管理员登录认证".center(40,"-")) return "True" def main_list(): msg = [" ATM ", "购物商城", "管理系统", "退出程序 输入 q", ] index = 0 for i in msg: print("\t\t\t\t", index + 1, "\t ", i) index += 1 def atm_list(): msg = ["信用卡信息", "信用卡取现", "信用卡转账", "信用卡还款", "申请信用卡", "信用卡绑定", "信用卡流水", "返回上一层 输入 q", "退出程序 输入 exit"] index = 0 for i in msg: print("\t\t\t\t", index + 1, "\t ", i) index += 1 if __name__ == ‘__main__‘: def main(): print("购物商城ATM系统".center(40, "-")) # lock() # 三次锁定模块 while True: print("欢迎来到购物商城ATM系统".center(40, "-")) print(" \t\t\t\t ID\t\t信息") main_list() choice = input("请选择 ID :").strip() if choice == "q": print(" bye bye ".center(50, "-")) exit() if choice.isdigit(): choice = int(choice) if choice >= 1 and choice <= 4: if choice == "q": break while True: if choice == 1: print("欢迎来到信用卡中心".center(50, "-")) print(" \t\t\t\t ID\t\tATM信息") atm_list() # 信用卡列表 atm_choice = input("请选择 ATM ID :").strip() if atm_choice == "q": break if atm_choice == "exit": exit() if atm_choice.isdigit(): atm_choice = int(atm_choice) if atm_choice >= 1 and atm_choice <= 7: while True: if atm_choice == 1: creditcard_data() # 信用卡信息模块 break elif atm_choice == 2: creditcard_auth() # 信用卡认证模块 takenow() # 信用卡取现模块 break elif atm_choice == 3: creditcard_auth() # 信用卡认证模块 transfer() # 信用卡转账模块 break elif atm_choice == 4: creditcard_auth() # 信用卡认证模块 repayment() # 信用卡还款模块 break elif atm_choice == 5: new_creditcard(limit=15000, locked=False) # 申请信用卡模块 break elif atm_choice == 6: link_creditcard() # 用户绑定信用卡模块 break elif atm_choice == 7: cat_cred_record() # 查看信用卡流水模块 break else: print("请输入正确的 ID ") else: print("请输入正确的 ID ") elif choice == 4: exit() main()
代码写完再上传后续代码