python第四天作业
# Author:zylong
模拟atm + 购物商城程序
1.额度 15000
2.实现 购物商城,买东西加入购物车,调用信用卡接口结账
3.提现(手续费5%),查询余额,还款,按月查询账单
4.多账户登陆
5.多账户之间转账
6.记录每月日常消费流水
7.Atm记录操作日志
8.提供管理接口,包括添加账户,用户额度,冻结账户
9.用户认证使用装饰器
建的目录结构如下:

启动类:
# Author:zylong #项目启动 #就是调用main 这个来启动项目 #这里需要知道,如何冲这里引用到main import os,sys #__file_ """ __file__ creditCardShopping.py os.path.abspath(__file__) D:\pythonworkspace\oldboy\day4\CreditCardAndShopping\atm\bin\creditCardShopping. py """ #往系统中添加临时环境 print(__file__) print(os.path.abspath(__file__)) #D:\pythonworkspace\oldboy\day4\CreditCardAndShopping\atm\bin print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from core import main from conf import property #这样就将main,和property引进来了
程序入口:
# Author:zylong #程序的入口 print("main")
用户信息操作公共:
# Author:zylong # 公共的用户信息模块,这个就是取用户信息,和添加用户信息 import json # 讲用户信息获取出来 # info = dict() # 用户姓名和密码,是否冻结,已经信用卡的信息保存在文件中 # 例如 # info = { # "zhangsan": { # "password": "123", # # true就是冻结,false 就是没有冻结 # "isFreeze": True, # # 信用卡有多张,默认有一张 # "creditCards": { # "creditCardA": { # # 额度 # "amount": 15000, # # 已使用 # "hasUserd": 5000 # } # } # } # } # info = "aaddccddeeff" # with open("../conf/test", "a") as f: # json.dump(info, f) # 这样的数据结构直接使用json序列化就可以了 with open("../conf/user", "r") as f: info = json.load(f) # print(info) def saveInfo(sinfo): with open("../conf/user", "w") as f: json.dump(sinfo, f) def saveMoneyRecord(info): with open("../logs/moneyrecord","a") as f: # json.dump(info,f)#序列化后换行不好使 f.write(info) def saveShoppinglog(log): with open("../logs/shopping","a") as f: # json.dump(log,f) f.write(log)
登陆:
# Author:zylong #用户认证模块,因为对于信用卡的所有操作都需要先登录 import commoninfo info = commoninfo.info def loginCheck(fun): def wrapper(*args,**kwargs): # username = input("input your username:") #用户姓名是进行某些操作传递过来的,这里规定,登陆的第一个元素必须传用户姓名 username = args[0] if username in info: passwd = input("input your passwd:") if info[username]["password"] == passwd : return fun(*args,**kwargs) else: print("your password is wrong") else: print("your username is wrong!") return wrapper
购物:
# Author:zylong #支付购买的商品 import json,time from creditCard import shoppingSettlement from commoninfo import saveShoppinglog # goods = {'iphoneX': 7000, 'iphone7p': 4000, 'iphone mac pro': 18000, 'cup': 80, 'book': 50, 'abc': 88} # # with open("../conf/goods","w") as f: # json.dump(goods,f) with open("../conf/goods","r") as f: goods = json.load(f) # print(goods) def goShopping(): for i,k in enumerate(goods): print(i,k,goods[k]) goodsList = list(goods.keys()) priceList = list(goods.values()) index = int(input("please input you want to buy")) price = priceList[index] username = input("please input your username") res = shoppingSettlement(username,price) if res: #记录购物成功日志 print("you have buy %s success"%goodsList[index]) shoppingtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())) log = "%s %s shopping %s spend %s \n"%(shoppingtime,username,goodsList[index],price) saveShoppinglog(log)
信用卡:
# Author:zylong #信用卡里面的 所偶有操作都需要登陆条件下进行 import commoninfo,user,time from login import loginCheck info = commoninfo.info; # info = { # "zhangsan":{ # "password":"123", # #true就是冻结,false 就是没有冻结 # "isFreeze":True, # #信用卡有多张,默认有一张 # "creditCards":{ # "creditCardA":{ # #额度 # "amount":15000, # #已使用 # "hasUserd":5000 # } # } # } # } #1.购物结账 @loginCheck def shoppingSettlement(username,price): #查询用户的所有的信用卡里可消费的金额 user = info[username] #是否冻结 isFreeze = user["isFreeze"] if isFreeze: print("your count is freeze") else: #判断信用卡中的金额是否足够 #这个按卡进行区分,如果每一个卡里的钱都不足时,提示转账,如果只有一个卡时,直接提示金额不足。 count = len(user["creditCards"]) if count < 1: print("you don't have card ,please contact admin") flag = False cardName = "" for card in user["creditCards"].items(): if card[1]["amount"] - card[1]["hasUserd"] > price: flag = True cardName = card[0] break if flag:#说明有足够的金额 user["creditCards"][cardName]["hasUserd"] += price commoninfo.saveInfo(info) trantime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) record = "{time} {user} {trade} {card} shoppingSettlement {money} \n".format(time=trantime, user=username, trade="shoppingSettlement", card=cardName, money=price)[:] commoninfo.saveMoneyRecord(record) return True elif count == 1: print("you don't have enough money ,please repay money") else : print("you have many cards,Please transfer") #将username中的cardAname的price转到cardBname中 @loginCheck def transfer(username,cardAname,cardBname,price): if user.isHaveUser(username): if cardAname in info[username]["creditCards"] and cardBname in info[username]["creditCards"] : #判断是否有足够的金额 cardAMap = info[username]["creditCards"][cardAname] cardBMap = info[username]["creditCards"][cardBname] if cardAMap["amount"] - cardAMap["hasUserd"] > price : cardAMap["amount"] -= price cardBMap["amount"] += price commoninfo.saveInfo(info) trantime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) record = "{time} {user} {trade} {cardA} transfer {cardB} {money} \n".format(time=trantime, user=username, trade="transfer", cardA=cardAname, cardB=cardBname,money=price) commoninfo.saveMoneyRecord(record) else: print("%s don't have enough money"%cardAname) else: print("you don't have that cards") else: print("don't have this user %s"%username) # shoppingSettlement("zhangsan",1000) @loginCheck def RepayMoney(username,cardname,price): #判断用户是否存在,判断卡是否存在 if user.isHaveUser(username): if cardname in info[username]["creditCards"]: info[username]["creditCards"][cardname]["hasUserd"] -= price commoninfo.saveInfo(info) #记录还款流水,时间 trantime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) record = "{time} {user} {trade} {card} repay {money} \n".format(time=trantime, user=username, trade="repay", card=cardname, money=price) commoninfo.saveMoneyRecord(record) else: print("you don't have this card") #提现跟还款的操作类似
操作用户:
# Author:zylong #添加账户,冻结账户,解冻 import commoninfo # info = dict() info = commoninfo.info # info = { # "zhangsan":{ # "password":"123", # #true就是冻结,false 就是没有冻结 # "isFreeze":True, # #信用卡有多张,默认有一张 # "creditCards":{ # creditCardA:{ # #额度 # "amount":15000, # #已使用 # "hasUserd":5000 # } # } # } # } #这个是管理员用户,管理员用户需要先登录,然后添加正常的信用卡用户,假设管理员不需要登陆直接给用户开卡,冻结 #1.给zhangsan用户再开一张信用卡 #这里面都会做一件事,判断用户是否存在,写一个装饰器 def isHaveUser(name): if name not in info: print("%s 这个用户不存在,不能添加信用卡"%name) return False return True def addCreditCard(name,cardname,money): if not isHaveUser(name): pass elif cardname in info[name]["creditCards"]: print("%s 这个卡已存在了,不能重复添加"%cardname) else: card = {"mount":money,"hasUserd":0} info[name]["creditCards"][cardname] = card commoninfo.saveInfo(info) #2.创建一个lisi用户,并设置他的登陆密码,及信用卡信息 def createUser(name,passwd,cardname,money): #信息不能为空 if isHaveUser(name): print("%s 用户已存在"%name) else: sinfo = { "password":passwd, "isFreeze":False, "creditCards":{ cardname:{ "mount": money, "hasUserd": 0 } } } info[name] = sinfo commoninfo.saveInfo(info) def freezeUser(name): if isHaveUser(name): #解冻 info[name]["isFreeze"] = True commoninfo.saveInfo(info) def unFreezeUser(name): if isHaveUser(name): #解冻 info[name]["isFreeze"] = False commoninfo.saveInfo(info) # unFreezeUser("zhangsan")

浙公网安备 33010602011771号