第14天简单的购物商城作业的编写
功能需求:
1. 用户可以注册,登录,注销,查询账户,退出系统,购物等操作,如下图
2. 用户登录进去之后可以保存状态信息进之后进行其他的一些操作,如购物,支付等:
3. 用户的信息主要以以下的格式存储在文件中。
"abc|123|0,qwe|456|239"
流程的分析:
当我们遇到这样一个需求的时候,应该如何去做呢?首先,我们应该有一个系统的接口,用来展示我们系统所具有的具体功能。然后通过用户输入的信息按照功能字典分别导入到不同的函数中进行相应的处理。
# 系统的功能提示 sys_msg = ''' 欢迎使用简单的购物车系统, 请选择: 1.注册 | 2.登录 | 3.账户 | 4.充值 | 5.购物 | 6.支付 | 7.购物车 | 10.注销 | 0.退出 >>> '''
系统功能提示,主要用来提示用户系统具有什么样的功能
# 功能字典 method_dic = { '1': register, # 注册 '2': login, # 登录 '3': account, # 查询账户 '4': top_up, # 充值 '5': shopping, # 购物 '6': pay_money, # 支付 '7': shop_car_info, # 购物车 '10': logout # 注销 }
功能字典,通过用户的输入调用不同的函数处理不同的功能
# 这个就是实现系统接口的函数,通过用户输入的choice来选择使用什么样的函数处理相应的功能
@outer def system(): """系统""" while True: choice = input(sys_msg).strip() # 退出系统 if choice == "0": print("退出系统! ") break # 错误选项 if choice not in method_dic: print("功能输入有误,请重新输入!") continue # 正确的选项eg: method_dic['1']() ==> register() method_dic[choice]() # 进入简单的购物车系统 system()
因为此购物商城只是单纯的一些函数的实现,较为简单,具体说明在代买中已经有注释,此处不再赘述(在每一个函数前面加上了一个装饰器,用来标识每一个函数的运行和结束。)以下为实现的源代码
from functools import wraps # 存储用户信息的文件路径 file_path = "usr.info" # 全局变量 # 存储当前登录成功的用户的信息 # user的存储格式 {"usr":"abc", "ps": "123", "money": 0} user = {} # 文件中的用户信息是以[用户名|密码|资产,用户名|密码|资产]构成的, # eg:"abc|123|0,qwe|456|239" # 将用户信息从文件中读取出来以变量的形式存储在内存中,以便于后续大量的信息交互 # user_dic的格式: ''' { "abc": {"ps": "123", "money": 0}, "qwe": {"ps": "456", "money": 239} } ''' user_dic = {} # 从文件中读取出来的用户信息 # 购物车{"iPad": 3, "Mac": 1} shop_car_dic = {} def outer(func): """在执行每一个模块之前和之后加上字符串提示""" @wraps(func) def wrapper(*args, **kwargs): print("执行%s操作".center(100, "*") % func.__doc__) res = func(*args, **kwargs) print("结束%s操作".center(100, "*") % func.__doc__) return res return wrapper def get_users(): """调取当前内存中的用户信息""" # 如果内存中已经有用户的信息,直接返回 if user_dic: return user_dic # 读文件,更新内存中的user_dic with open(file_path, 'r', encoding='utf-8') as f: data = f.read() # 文件内容为空 if not data: return user_dic # 文件的内容为: "abc|123|0,qwe|456|239" data_list = data.split(",") for single_user_info in data_list: # 切片获取到单个用户的信息之后更新user_dic single_user_info_list = single_user_info.split("|") usr = single_user_info_list[0] ps = single_user_info_list[1] money = int(single_user_info_list[2]) user_dic[usr] = {"ps": ps, "money": money} return user_dic @outer def register(): """注册""" # 获取所有用户的信息 users = get_users() # 账号输入操作 temp_info = "请" while True: username = input(temp_info + "输入账号: \t").strip() # 用户名格式 if not username: print("用户名不能为空!") temp_info = "请重新" continue # 用户名已经存在 if username in users: print("用户名已经存在!") temp_info = "请重新" continue # 用户名不存在 break # 密码输入操作 temp_info = "请" while True: password = input(temp_info + "输入密码: \t").strip() # 密码格式不正确 if len(password) < 3: print("您输入的密码过短!") temp_info = "请重新" continue # 密码格式正确 break # 账号和密码都正确,可以写入文件中 with open(file_path, 'a', encoding='utf-8') as f: # 文件为空,写入str = "abc|123|0" if not users: f.write("%s|%s|%d" % (username, password, 0)) # 文件不为空, 写入str = ",abc|123|0" else: f.write(",%s|%s|%d" % (username, password, 0)) # 更新注册信息到内存中 users[username] = {"ps": password, "money": 0} print("账号注册成功") @outer def login(): """登录""" users = get_users() global user if user: print("系统已经处于登陆状态!") return # 账号输入操作 temp_info = "请" while True: username = input(temp_info + "输入账号:\t").strip() # 账号不存在 if username not in users: # 文件不为空,如果为文件为空,就会出现一直输入的情况 if users: print("您输入的账号不存在!") temp_info = "请重新" continue return # 账号存在 break # 密码输入操作 temp_info = "请" count = 0 while count < 3: password = input(temp_info + "输入密码:\t").strip() # 密码不匹配 if password == users[username]['ps']: print("登陆成功!") # 更新登陆状态信息 money = users[username]['money'] # global user user = {"usr": username, "ps": password, "money": money} # user["usr"] = username # user['ps'] = password # user['money'] = money return print("输入的密码有误!") temp_info = "请重新" count += 1 # 更新user信息 @outer def account(): """查询账户""" # 用户已经登录 if user: print("账户:%s | 金额: %d" % (user['usr'], user['money'])) return print("当前系统未登录!") @outer def logout(): """注销""" if not user: print("系统未登录!") return user.clear() print("注销成功") def user_dic_write_file(): """将内存中用户信息写入文件中""" # dic ==> str的转换 users = get_users() user_info = "" for k, v in users.items(): usr = k ps = str(v['ps']) money = str(v['money']) if not user_info: user_info += "|".join((usr, ps, money)) else: user_info = user_info + ',' + "|".join((usr, ps, money)) with open(file_path, 'w', encoding='utf-8') as f: f.write(user_info) def update(key, value): """ 更新个人账户的金额或者密码 :param key: 可以输入ps或者是money :param value: 需要更改的值 :return: """ # 1. 更新user = {"usr":"abc", "ps": "123", "money": 0} if key == "money": user[key] += value if key == "ps": user[key] = value # 2. 更新user_dic users = get_users() users[user['usr']][key] = user[key] # 3. 更新文件内容 user_dic_write_file() @outer def top_up(): """充值""" # 系统未登录 if not user: print("请先登录系统!") return # 金额输入操作 temp_info = "请" while True: money = input(temp_info + "输入金额: ").strip() # 格式是否准确 if not money.isdigit(): print("您输入的金额有误") temp_info = "请重新" continue money = int(money) break # 金额更新操作 # 1.更新user update('money', money) print("充值成功") @outer def pay_money(): """支付""" # 购物车信息为空 if not shop_car_dic: print("您的购物车为空,请先进行购物!") return False shop_total_price = sum([price_dic[key] * value for key, value in shop_car_dic.items()]) # 余额不足 if user['money'] < shop_total_price: print("亲,余额不足,请充值!") return False # 余额充足,进行购买 update("money", 0 - shop_total_price) shop_car_dic.clear() print("购买成功!") return True @outer def shopping(): """购物""" # 用户是否登录 if not user: print("系统未登录!") return # 商品编号输入操作 temp_info = "请" print(goods_msg) while True: shop_num = input(temp_info + "输入商品编号:").strip() if shop_num == "0": print("退出购物!") break # 商品编号格式错误 if shop_num not in goods_dic: print("输入有误!") temp_info = "请重新" continue shop_name = goods_dic[shop_num] # 购买个数输入操作 temp_info = "请" while True: shop_count = input(temp_info + "购买的个数:").strip() if not shop_count.isdigit(): print("输入有误!") temp_info = "请重新" continue shop_count = int(shop_count) # 商品已经在购物车内 if shop_name in shop_car_dic: shop_car_dic[shop_name] += shop_count else: shop_car_dic[shop_name] = shop_count break # 打印购物车的信息 shop_car_info() # 支付 pay_money() @outer def shop_car_info(): """购物车""" if not shop_car_dic: print("您的购物车为空!请前往购物!") return print("%s的购物车信息为:" % user['usr']) for key, value in shop_car_dic.items(): print("商品:%s | 个数:%d" % (key, value)) # 功能字典 method_dic = { '1': register, '2': login, '3': account, '4': top_up, '5': shopping, '6': pay_money, '7': shop_car_info, '10': logout } # 商品字典 goods_dic = { "1": "iPhone", "2": "Mac", "3": "iPad" } # 价格字典 price_dic = { "iPhone": 100, "Mac": 200, "iPad": 300 } # 商品信息提示 goods_msg = ''' 请添加商品到购物车: 1. iPhone | 2. Mac | 3. iPad | 0.退出购物 ''' # 系统的功能提示 sys_msg = ''' 欢迎使用简单的购物车系统, 请选择: 1.注册 | 2.登录 | 3.账户 | 4.充值 | 5.购物 | 6.支付 | 7.购物车 | 10.注销 | 0.退出 >>> ''' @outer def system(): """系统""" while True: choice = input(sys_msg).strip() # 退出系统 if choice == "0": print("退出系统! ") break # 错误选项 if choice not in method_dic: print("功能输入有误,请重新输入!") continue # 正确的选项eg: method_dic['1']() ==> register() method_dic[choice]() # 进入简单的购物车系统 system()