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('您的账户余额是