需求分析
day5 作业:ATM + 购物商城程序
作者:keven
博客地址:http://www.cnblogs.com/chenkeven/articles/8203383.html
http://www.cnblogs.com/chenkeven/articles/8159442.html
http://www.cnblogs.com/chenkeven/articles/8177087.html
http://www.cnblogs.com/chenkeven/articles/8177948.html
http://www.cnblogs.com/chenkeven/articles/8183543.html
使用说明:运行 login 登陆
后台管理:运行user_manager, 用户:admin 密码:admin
需求分析:
ATM:模拟实现一个ATM + 购物商城程序
额度 15000或自定义
1.实现购物商城,买东西加入 购物车,
2.调用信用卡接口结账
3.可以提现,手续费5%
4.支持多账户登录
5.支持账户间转账
6.记录每月日常消费流水
7.提供还款接口
8.ATM记录操作日志
9.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
10.用户认证用装饰器
标红色没有实现。
流程图
login
import user_manager import atm_main import os,sys ATM_dir=os.path.dirname(os.path.abspath(__file__)) sys.path.append(ATM_dir) # # print(ATM_dir) # print(sys.path[-1]) #导入日志函数 from ATM_logging import ATM_logger file_name=r"D:\51cto\day5 作业\ATM\ATM_logging\ATM_LOG" logger=ATM_logger.login(file_name) #读取用户信息,成字典 user_info_dict={} with open("user_info","r",encoding="utf-8") as f: for line in f: line=line.strip().split(",") user_info_dict[line[1]]=line[1:] #print(user_info_dict) #{'keven': ['keven', 'abc123', '20000', 'n'], 'zhangsan': ['zhangsan', '123abc', '20000', 'y'],} def auth(user,passwd,user_info_dict): ''' 定 验证用户名,密码,账号是否锁定函数 ''' if user in user_info_dict.keys() and passwd == user_info_dict[user][1]: if user_info_dict[user][3]== "y": banlance=user_info_dict[user][2] logger.info("用户【{}】,成功登陆".format(user)) res=(user,banlance) else: logger.info("用户【{}】,被锁定的账号尝试登陆") res="账号被锁定,请联系管理员" else: logger.info("用户【{}】,密码错误".format(user)) res="用户名,密码错误" return res #用户验证三次 def authed(): i=0 while True: if i<3: print("欢迎登陆ATM购物商城".center(50, "*")) user = input("pls input your name:") passwd = input("pls input your password:") res= auth(user,passwd,user_info_dict) if res=="用户名,密码错误": print(res) i+=1 #logger.info("用户【{}】,密码错误{}次".format(user,i)) elif res=="账号被锁定,请联系管理员": return res else: balance=res[1] return user,balance else: res="输入错误3次,账号被锁定" user_manager.locked_user(user) logger.warning("用户【{}】,密码错误3次,被系统锁定") return res #用户入口 if __name__=='__main__': res=authed() if res=="账号被锁定,请联系管理员" or res =="输入错误3次,账号被锁定": exit(res) #print(1,res) else: user=res[0] balance=res[1] res=atm_main.main(user,balance) print(res)
ATM_MAIN
import user_manager import shopping import os,sys ATM_dir=os.path.dirname(os.path.abspath(__file__)) sys.path.append(ATM_dir) # # print(ATM_dir) # print(sys.path[-1]) #导入日志函数 from ATM_logging import ATM_logger file_name=r"D:\51cto\day5 作业\ATM\ATM_logging\ATM_LOG" logger=ATM_logger.atm_main_log(file_name) #定义取款函数 def withdraw(user,balance,auth="y"): quxian=input("请输入取现金额:") if quxian.isdigit(): quxian=float(quxian) balance=float(balance) if balance>= quxian*1.05: balance=balance-quxian*1.05 res=user_manager.change_balance(user,str(balance),auth="y") logger.info("用户【{}】,取现{}".format(user,balance)) else: res="余额不足" else: res="输入错误,请重新输入" return res #定义转账函数 ,调用查询,修改余额函数 def transfer(user,banlance): zhuan_u=input("请输入要转入的账号:") zhuan_n=input("请输入要转账的金额:") if zhuan_n.isdigit(): zhuan_n=float(zhuan_n) banlance=float(banlance) if banlance >= zhuan_n: #调用查询余额函数,获取被转入账号余额,调用修改余额函数,修改被转入账号余额 zhuan_u_b=user_manager.select_user_status(zhuan_u)[1] zhuan_u_b=float(zhuan_u_b) zhuan_u_b+=zhuan_n #print(zhuan_u_b) #调用修改余额函数,给转入账号修改金额 banlance-=zhuan_n res=user_manager.change_balance(user,banlance,auth="y") if res=="更新成功": res="转账成功" logger.info("用户【{}】向用户【{}】转账{}".format(user,zhuan_u,zhuan_n)) else: res="输入金额错误,请重新输入" return res #定义还款函数,调用修改 余额函数 def refund(user,balance): refund_n = input("请输入还款金额") if refund_n.isdigit(): #print(type(balance)) balance=float(balance) balance+=float(refund_n) #print(balance) res=user_manager.change_balance(user,balance,auth="y") logger.info("用户【{}】还款{}".format(user, balance)) else: res="输入金额错误,请重新输入" return res #定义用户选择,转发处理 def main(user,balance): logger.info("用户【{}】成功登陆".format(user)) while True: function_dict = { '1':withdraw, '2':transfer, '3':refund, "4":shopping.shopping, "5":user_manager.change_passwd } print("欢迎登陆ATM购物商城".center(50, "*")) print(''' 1.取现 2.转账 3.还款 4.购物商城 5.修改密码 6.退出 ''') user_choice=input("pls input your choice:" ) if user_choice == "6": logger.info("用户【{}】,退出系统") exit("谢谢光临ATM购物商城,再见") elif user_choice in function_dict: res=function_dict[user_choice](user,balance) else: res="选项错误,请重新输入" print(res) if __name__ == '__main__': pass
shopping
import os,sys ATM_dir=os.path.dirname(os.path.abspath(__file__)) sys.path.append(ATM_dir) # # print(ATM_dir) # print(sys.path[-1]) #导入日志函数 from ATM_logging import ATM_logger file_name=r"D:\51cto\day5 作业\ATM\ATM_logging\ATM_LOG" logger=ATM_logger.shopping(file_name) #购物商城函数 def shopping(user,balance): logger.info("用户【{}】,登陆商城购物".format(user)) #获取商品清单,成列表 product_list=[] with open("product_list","r",encoding="utf-8") as f: for line in f: line=line.strip().split(",") product_list.append(line) #print(product_list) #banlance=15000 shopping_l=[] #[['iphonex', '8888'], ['bike', '888'], ['pen', '120'], ['laptop', '6666'], ['car', '666666']] while True: print("欢迎光临购物商城".center(50,"*")) for i,j in enumerate(product_list): print(i,j) u_choice=input("请输入你要购买商品的序号,或者按'q'退出买单:") if u_choice.isdigit(): balance=float(balance) product_price=float(product_list[int(u_choice)][1]) if balance >= product_price: balance-=product_price #print(balance) shopping_l.append(product_list[int(u_choice)][0]) else: res="余额不足" return res elif u_choice == "q": #print(balance) balance=str(balance) for i in shopping_l: print(i) change_balance(user,balance) print("谢谢惠顾") logger.info("用户【{}】,购买商品{}".format(user,shopping_l)) break #return user,banlance else: print("请输入正确的选项") #修改余额 def change_balance(user,balance): #print(user,balance) with open("user_info", "r", encoding="utf-8") as f: with open("new", "w", encoding="utf-8") as f1: for line in f: line=line.split(",") if user in line: line[3]=balance print(balance) line=",".join(line) f1.write(line) res="结账成功" else: line = ",".join(line) f1.write(line) f1.flush() f1.close() os.remove("user_info") os.rename("new","user_info") return res # if __name__ == '__main__': # user_info_dict = {} # with open("user_info", "r", encoding="utf-8") as f: # for line in f: # line = line.strip().split(",") # user_info_dict[line[1]] = line[1:] # f.close() # # i=0 # while i < 3: # user=input("pls input your username:") # passwd=input("pls input your password:") # if user in user_info_dict.keys() and passwd == user_info_dict[user][1]: # print(user_info_dict[user][3]) # status=user_info_dict[user][3].strip() # if status =="y": # balance = float(user_info_dict[user][2]) # #print(balance) # break # elif status == "n": # print("账号被锁定,请联系管理员") # break # else: # print( "用户名密码错误,请重新输入:") # # res= shopping(user,balance) # print(res)
user_manager
import os import sys ATM_dir=os.path.dirname(os.path.abspath(__file__)) sys.path.append(ATM_dir) # # print(ATM_dir) # print(sys.path[-1]) from ATM_logging import ATM_logger file_name=r"D:\51cto\day5 作业\ATM\ATM_logging\ATM_LOG" logger=ATM_logger.user_manager_log(file_name) def add_user(): user=input("pls input username:") passwd=input("pls input password:") balance=input("pls input balance:") status="y" #u_input=[] max_id=0 title="id,user_name,passwd,balance,status" if balance.isdigit(): with open("user_info","r",encoding="utf-8") as f: for line in f: f_dict=dict(zip(title.split(","), line.split(","))) if user in f_dict.values(): res="用户名重复" logger.warning("创建用户{},用户已存在".format(user)) return res else: res = "输入的金额,错误请重新输入!" return res with open("user_info","a+",encoding="utf-8") as f: f.seek(0) for line in f: f_dict=dict(zip(title.split(","),line.split(","))) id=int(f_dict.get("id")) max_id=id if max_id< id else max_id new_id=str(max_id+1) line="{},{},{},{},{}".format(new_id,user,passwd,balance,status) f.write("\n{}".format(line)) f.flush() logger.info("创建用户{},成功".format(user)) res = "用户新增成功" return res def change_balance(user="",balance="",auth="n"): if len(user) ==0: user = input("pls input username such as:'lisi:") balance= input("pls input banlace:") user_info_dict = {} with open("user_info", "r", encoding="utf-8") as f: for line in f: line = line.strip().split(",") user_info_dict[line[1]] = line[1:] if user not in user_info_dict.keys(): logger.warning("修改{}的余额,用户不存在".format(user)) res="账号不存在" return res else: auth="y" if auth=="y": #print(user,balance) try: float(balance) or int(balance) f_flag=True except: f_flag=False #print(f_flag,) if f_flag: balance=str(balance) with open("user_info","r",encoding="utf-8") as f: with open("user_info_new", "w", encoding="utf-8") as f1: for line in f: line=line.split(",") if user in line: line[3]=balance line=",".join(line) f1.write(line) else: line = ",".join(line) f1.write(line) f1.flush() os.remove("user_info") os.rename("user_info_new","user_info") logger.info("成功修改用户【{}】的金额为【{}】".format(user,balance)) res = "更新成功" return res else: logger.critical("输入的金额{},不符合格式".format(balance)) res="输入金额错误,请重新输入" return res #res=2 # def select_user_banlace(user): # if len(user) == 0: # user=input("pls input user:") # with open("user_info","r",encoding="utf-8") as f: # for line in f: # line=line.split(",") # if user in line: # banlance=line[3] # return banlance # f.close() def change_passwd(user="",*args): if len(user) ==0: user = input("pls input username such as:'lisi:") user_info_dict = {} with open("user_info", "r", encoding="utf-8") as f: for line in f: line = line.strip().split(",") user_info_dict[line[1]] = line[1:] if user not in user_info_dict.keys(): logger.warning("修改{}的密码,用户不存在".format(user)) res="账号不存在" return res else: auth="y" else: passwd = input("pls input new password:") with open("user_info","r",encoding="utf-8") as f: with open("user_info_new", "w", encoding="utf-8") as f1: for line in f: line=line.split(",") if user in line: line[2]=passwd line=",".join(line) f1.write(line) else: line = ",".join(line) f1.write(line) f1.flush() os.remove("user_info") os.rename("user_info_new","user_info") logger.info("成功修改用户【{}】的密码".format(user)) res = "更新成功" return res def select_user_status(user=""): if len(user) == 0: user=input("pls input name:") #打印账号状态 with open("user_info","r",encoding="utf-8") as f: for line in f: line=line.split(",") #print(u_input,line) if user in line: res=(user,line[3],line[4].strip(),"y:账号活动,n:账号锁定") logger.info("查询{}的状态".format(user)) return res else: logger.warning("查询{}的状态,用户不存在".format(user)) res="账号不存在" f.close() #res=3 return res def locked_user(user="",status="n"): if len(user) == 0: user=input("pls input username:") status=input("pls input status:,status such as:y (y:激活账号,n:锁定账号):") l=[] with open("user_info","r",encoding="utf-8") as f: for line in f: line=line.split(",") #print(line) l.extend(line) #print(l) if user not in l: res="账号不存在" return res else: with open("user_info","r",encoding="utf-8") as f: with open("user_info_new","w",encoding="utf-8") as f1: for line in f: line=line.split(",") #print(u_input,line) if user in line: line[4]=status line=",".join(line) f1.write("{}\n".format(line)) else: line=",".join(line) f1.write(line) f1.flush() os.remove("user_info") os.rename("user_info_new", "user_info") if status == "y": logger.info("成功激活账号:【{}】".format(user)) res="账号已激活" elif status == "n": logger.info("成功锁定账号:【{}】".format(user)) res="账号已锁定" return res if __name__ == '__main__': print("\033[01;42mwelcome user manager\033[0m".center(50, "*")) user = input("pls input administrator account:") passwd = input("pls input password:") if user == "admin" and passwd == "admin": logger.info("管理员:admin,成功登陆") while True: # user=input("pls input administrator account:") # passwd=input("pls input password:") function_dict={ '1':add_user, '2':change_balance, '3':locked_user, '4':select_user_status, "5":change_passwd } print(''' 1.新增用户 2.修改余额 3.冻结\激活账号 4.查询账号 5.修改密码 6.退出系统 ''') user_choice=input("pls input your choice:") if user_choice == "6": logger.info("管理员:admin,退出系统") exit("再见") elif user_choice in function_dict: res=function_dict[user_choice]() else: res="输入错误请重新输入" print(res) else: exit("用户名密码错误")
logger
import logging import os,sys # ATM_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # sys.path.append(ATM_dir) # # print(sys.path) # # print(ATM_dir) # print(os.path.abspath(__file__)) #定义后台管理收集日志函数 def user_manager_log(file_name): logger = logging.getLogger("u_m_log") logger.setLevel(logging.DEBUG) fh=logging.FileHandler(file_name,encoding="utf-8") fh.setLevel(logging.DEBUG) fh_formatter = logging.Formatter("%(asctime)s %(levelname)s [%(module)s:%(lineno)d] %(message)s") fh.setFormatter(fh_formatter) logger.addHandler(fh) return logger def atm_main_log(file_name): logger = logging.getLogger("A_M_LOG") logger.setLevel(logging.DEBUG) fh = logging.FileHandler(file_name, encoding="utf-8") fh.setLevel(logging.DEBUG) fh_formatter = logging.Formatter("%(asctime)s %(levelname)s [%(module)s:%(lineno)d] %(message)s") fh.setFormatter(fh_formatter) logger.addHandler(fh) return logger def shopping(file_name): logger = logging.getLogger("shopping_log") logger.setLevel(logging.DEBUG) fh=logging.FileHandler(file_name,encoding="utf-8") fh.setLevel(logging.DEBUG) fh_formatter = logging.Formatter("%(asctime)s %(levelname)s [%(module)s:%(lineno)d] %(message)s") fh.setFormatter(fh_formatter) logger.addHandler(fh) return logger def login(file_name): logger = logging.getLogger("login_log") logger.setLevel(logging.DEBUG) fh=logging.FileHandler(file_name,encoding="utf-8") fh.setLevel(logging.DEBUG) fh_formatter = logging.Formatter("%(asctime)s %(levelname)s [%(module)s:%(lineno)d] %(message)s") fh.setFormatter(fh_formatter) logger.addHandler(fh) return logger if __name__=='__main__': file_name = r"D:\51cto\day5 作业\ATM\ATM_logging\user_manager_LOG" logger=user_manager_log(file_name) logger.info("牛逼") logger.debug("debug") logger.warning("warning") logger.error("error") logger.critical("critical")
user_info
1,keven,abc123,1111.0,y 2,zhangsan,abc123,11007.0,y 3,lisi,hah123,15000,y 4,haha,abc123,15000,n 5,hehe,hehe1,15000,y 6,h,h,19000,y
product_list
iphonex,8888 bike,888 pen,120 laptop,6666 car,666666