1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
2、允许用户根据商品编号购买商品
3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4、可随时退出,退出时,打印已购买商品和余额
5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
7、允许查询之前的消费记录
1)编写思路
编写思路参考下面GitHub链接中的流程图
2)具体实现
# -*- coding:utf-8 -*- # Author:Chuixin Zeng # 导入JSON模块 import json # 导入日期时间模块 import datetime # 导入系统OS模块 import os # 自定义欢迎信息 info = ''' 1. 按"A"注册 2. 按"B"登录 3. 按"Q"退出 ''' # 自定义错误提示信息 _error_info = '输入有误,请检查后重新输入!' # 定义一个_save_account函数 # 用于将购物相关信息保存到JSON文件,比如购物时间,购物历史,购物列表,账户余额,创建的新用户和现有已存在用户信息 def _save_account(database, filename='DataBase.json'): # 打开并可写文件,若文件已存在,则以前的内容将被清除 # 使用with as语句的效率更高,不需要单独设置如何读文件之后再如何关闭文件,一个with as搞定所有读写关闭操作 with open(filename,'w') as f: # f相当于一个变量,把打开并修改文件的操作赋予f json.dump(database,f) # json.dump是将一个Python数据类型列表进行json格式的编码解析 # 定义一个_load_database函数,用于从json文件中读取信息,默认加载的数据库是database.json文件 def _load_database(filename='DataBase.json'): with open(filename) as f: database = json.load(f) # 解码JSON数据,将一个JSON编码的字符串转换回一个Python数据结构 return database # 返回解码后的数据 # 定义一个函数_set_shopping_time,设置并记录购物的时间,函数里面定义了一个参数account,用于保存账户信息 def _set_shopping_time(account): database = _load_database() # 设定要记录到哪个数据库,这里使用的是前面定义好的函数_load_database定义的database.json d1 = datetime.datetime.now() # 设置购物时间为当前时间 d2 = d1.strftime('%Y-%m-%d %H:%M:%S') # 将当前时间进行格式转换 database[account]['shopping_time'] = d2 # 将转换好的时间记录到字典里面的shopping_time键上 _save_account(database) # 保存购物时间到数据库中,这里的数据库是指database.json文件 # 定义一个函数,用于获取已经保存过的购物时间 def _get_datetime(account): database = _load_database() data = database[account]['shopping_time'] # 返回变量data的值,变量data保存的就是account键对应的购物时间值,这个值是从json里面解码出来后到字典里 # 由json到Python可识别的字典数据的解码过程由_load_database函数完成 return data # 定义一个函数_get_shopping_history,用于查询购物历史记录 def _get_shopping_history(account): database = _load_database() history = database[account]['shopping_list'] # 增加一个空列表,配合下边for循环将购物清单中的重复项合并 aa = [] for i in history: # 将购物车里面的shopping list和aa空列表进行对比,如果列表里面没有,就添加到列表 # 也就意味着,如果列表已经有了就不添加了,达到了购物车去重的功能 if i not in aa: aa.append(i) # 然后循环遍历aa列表里面的购物清单 for j in aa: # 统计购买的每件商品的数量,也就是aa列表里面每件商品的数量,数量从history原始列表里面取(未去重的列表) count = history.count(j) # 统计购买商品的日期,日期就是account字典对应的商品的日期 date = _get_datetime(account) # 打印购买的商品的数量、日期和商品名称 print('您于%s购买了%s件%s' %(date,count,j)) # 定义一个函数login,用于登录系统 def _login(): database = _load_database() # 加载数据库,使用的是前面定义好的加载数据库的函数 blacklist = _load_database('BlackList.json') # 设置用户的黑名单列表,在列表中的用户将不允许登录到购物系统 print('欢迎登录购物系统!') # 打印欢迎信息 # 第一个死循环 while True: account = input("请输入您的账号登录系统(按q退出):") if account in blacklist: # 如果账户在黑名单里面,则退出登录 print("您的账号已经被锁定,请联系管理员处理!") _logout() # 直接调用下面定义好的_logout()函数 # 判断如果用户输入的是q,就退出购物系统 elif account == 'q': _logout() # 判断如果用户在数据库里面,则继续判断用户输入的密码是否正确 # 这里使用while循环和count计数器,如果输入错误密码大于3次,则锁定账户 elif account in database: count = 0 while count < 3: pwd = input('请输入密码:') # 如果用户输入的密码和数据库保存的密码匹配 if pwd == database[account]['pwd']: # 进入到死循环 while True: # 首先登录成功后,先获取用户账户的余额,告诉用户还剩多少钱,余额通过_get_balance函数得到 account_balance = _get_balance(account) # 高亮打印账户的余额信息 print('您的账户余额是