import json  # 调度内置 json 模块,用于数列化输入输出,相比eval,功能更全面,融合度更高
from conf import settings # 从配置文件configure (包) 中调用设置 setting (模块),用于使用setting中的名称空间
from interface import user # 从接口文件interface (包) 中调用 user (模块) 里面的名称空间
from lib import common
from interface import bank
from interface import shop

user_info = {'name': None} # 定义确定登陆状态字典


# 注册
def register(): # 定义注册功能函数
print('注册...') # 打印注册,提示用户
while True: # 启动循环
name = input('请输入用户名>>:').strip()
# name接收用户输入注册用户名,input内置了输出流在此体现注释功能,strip方法去除多余空格

pwd = input('请输入密码>>:').strip()
# pwd接收用户输入注册密码,input内置了输出流在此体现注释功能,strip方法去除多余空格

conf_pwd = input('请输入密码>>:').strip()
# conf_pwd 用户再次输入密码,用于用户确认自己输入的密码,strip方法去除多余空格

if pwd == conf_pwd: # 逻辑判断:如果第二次输入的密码等于第一次输入的密码
flag, msg = user.register_interface(name, pwd)
# 开头通过接口包导入了用户模块,在用户模块里面调用注册接口函数
# 通过res,与msg解压赋值 接收返回值
if flag: # 如果两个返回值为通过解压赋值得到的第一个是True
print(msg) # 输出的msg解压赋值得到得是字符串‘注册成功’
break # 终止注册
else: # 如果两个返回值为通过解压赋值得到的第一个是False,也就是相对与True的其他情况,else
print(msg) # 输出‘用户已存在'


# 登陆
def login(): # 定义登陆功能函数
if user_info['name']:
# 如果开头定义的user_info的K['name']有值,不为空,说明是已经登陆过的
return # 无返回值,直接退出登陆系统

while True: # 循环打印
name = input('请输入用户名>>:').strip() # 接收用户用户名
pwd = input('请输入密码>>:').strip() # 接收用户密码
flag, msg = user.login_interface(name, pwd) # flag,msg解压赋值接收(调用user内的登陆接口函数,传参执行,拿到返回值)
if flag: # 如果flag = True
user_info['name'] = name # 登陆成功,确定上线状态
print(msg) # 登陆成功
break # 退出当前循环
else: # 其他情况,就是False
print(msg) # 密码错误


# 查看余额
@common.auth
def check_balance(): # 定义查看余额功能函数
msg = user.check_balance_interface(user_info['name'])
print(msg)


# 提现
@common.auth
def withdraw(): # 定义提现功能函数
while True: # 循环开始
money = input('请输入体现金额:').strip() # 提示用户输入提现金额
if money.isdigit():
money = int(money) # 将输入的字符串转化为整型
flag, msg = bank.withdraw_interface(user_info['name'], money)
# 执行bank模块里面的 withdraw_interface 提现接口函数功能
# 传入src开头的用户信息状态字典中的 'name' 的值,和用户输入的money整型钱数
# flag标识接收return的第一个返回值True/False
# msg信息接收return的第二个返回值,
# '用户:[%s] 提现 [%s¥]!' % (name, money)
# '尊敬的用户,您的余额不足,请充值!'
if flag: # flag标识接收return的第一个返回值True
print(msg) # 打印,'用户:[%s] 提现 [%s¥]!' % (name, money)
break # 退出循环

else: # 其他情况,也就是flag标识接收return的第一个返回值False
print(msg) # 打印,'尊敬的用户,您的余额不足,请充值!'
else:
print('请输入数字!')


# 转账
@common.auth
def transfer(): # 定义转账功能函数
while True: # 开始循环
to_user = input('请输入转账目标用户:').strip() # 转账目标用户,输入目标账户名称
money = input('请输入转账金额:').strip() # 输入要转账的金额

money = int(money) # 将要转账的金额转换为整型
flag, msg = bank.transfer_interface(user_info['name'], to_user, money)
# flag,msg解压赋值接收 bank模块下面的转账接口函数
# (三个传值,登陆状态下的来源用户name作为K对应的值,目标用户的name,和要转账的金额的整型)
if flag:
# 如果 flag 接收的函数返回值是
# return False,'目标用户不存在!'
# return True,'转账成功,用户[%s]转账给用户[%s] %s $!'(只会执行if True,或者if not False)
# return False,'尊敬的用户,您的余额不足,请充值!'

print(msg) # 打印'转账成功,用户[%s]转账给用户[%s] %s $!'
break # 退出转账循环
else:
# 其他情况
# return False,'目标用户不存在!'
# return False,'尊敬的用户,您的余额不足,请充值!'
print(msg)
# 输出'目标用户不存在!'
# 输出'尊敬的用户,您的余额不足,请充值!'


# 还款
@common.auth
def repay(): # 定义还款功能函数
while True: # 开始循环
money = input('请输入还款金额:').strip() # 接收用户输入的还款金额
money = int(money) # 将用户输入的金额转换成整型,后续作运算
msg = bank.repay_interface(user_info['name'], money)
# msg接收bank模块 下面的还款接口功能函数 传入(用户登陆状态信息内的name作为K的值,传入的还款金额整型)
print(msg) # 打印返回值 '还款[%s]成功!'% money
break # 退出循环


# 查看流水
@common.auth
def check_flow(): # 定义查看流水账单功能函数
flow_s = bank.check_flow_interface(user_info['name'])
for line in flow_s:
print(line)


# 购物车功能
@common.auth
def shopping(): # 定义购物花钱赚钱功能函数
goods_list = [
['凤爪', 50],
['T-shirt', 150],
['macbook', 21800],
['iphoneX', 7000]
]

# 购物车
shopping_cart = {}

# 购物总额
cost = 0

# 获取用户余额
user_balance = bank.check_balance_interface(user_info['name'])

while True:
for index, goods in enumerate(goods_list):
# enumerate枚举对象(取出内容信息,并加索引,索引默认值为1)
# index 接收索引,goods 接收商品信息
print(index, goods) # 挨个打印出来

choice = input('请选择商品编号:').strip()
# 提示用户输入商品编号

if choice.isdigit(): # 如果用户输入的内容全是数字(isdigit()返回bool值,在此返回True才会执行内部代码)
choice = int(choice) # 将用户输入的choice字符串类型 转换为 int 整型类型,以方便后续做数字的比较运算

if choice >= 0 and choice < len(goods_list):
# 如果用户输入的数字大于等于0,此时0代表的商品是['凤爪', 50]
# 并且,用户输入的 小于商品列表的总索引数,此时总索引为 4

good_name, good_price = goods_list[choice]
# goods_list[choice] ,假设输入的choice为1,goods_list[choice] == goods_list[1] == ['T-shirt', 150]
# 通过解压赋值
# good_name,拿到的是商品名称 'T-shirt'
# good_price,拿到的是商品价格 150

if user_balance >= good_price:
# 如果用户余额,大于等于,商品价格

if good_name in shopping_cart: # 如果商品名在购物车中
shopping_cart[good_name] += 1
# 以商品名作为K,商品名的数量+1
else: # 如果不在
shopping_cart[good_name] = 1
# 加进去商品名,并设定初始值为1

cost += good_price # 每添加到购物车一次商品,购物总额加上每一次添加的商品金额 再赋值给 购物总额

flag, msg = shop.add_shopping_cart_interface(user_info['name'], shopping_cart)
# flag,msg 解压赋值接收 函数的返回值 True,'添加购物车成功!'
if flag: # 如果接收了True:
print(msg) # 输出msg通过解压赋值所得到的包含的信息 ‘添加购物车成功!’
print(shopping_cart) # 输出 目前的购物车列表
else:
print('余额不足,请充值')


elif choice == 'q': # 如果输入的其他情况是q
if cost == 0: break # 如果 商品总额为0,说明没有添加商品,没有产生价格变动,退出当前循环

confirm = input('确认购买输入 y,取消输入 n').strip()
# 确认= 接收用户的输入信息,确认购买输入y,取消购买输入n

if confirm == 'y': # 如果输入的是y
flag, msg = bank.pay_interface(user_info['name'], cost)
# flag,msg通过解压赋值拿到 bank模块下面 付款接口功能 函数的返回值
# 返回给外界 True,'支付成功!' 或
# 返回给外界 False,'消费失败!'

if flag: # 如果 接收了True,继续执行下面代码
print(msg) # 输出'支付成功!'
break # 退出循环

else: # 其他情况 (接收了False)
print(msg) # 输出'消费失败!'

else: # 如果输入的不是y,
print('退出购买!') # 输出'退出购买!'
break # 退出循环

else: # 请选择商品编号时的输入有误,非本系统识别或存储类型
print('输入有误!') # 输出提示 '输入有误!',继续循环


# 查看购物车
@common.auth
def check_shop(): # 定义查看购物车功能函数
shopping_cart = shop.show_shopping_cart_interface(user_info['name'])
# 调用显示购物车的接口,拿到返回值用户信息字典 中的 购物车作为K对应的值

if shopping_cart: # 如果用户信息字典 中的 购物车作为K对应的值 有数据,执行后续代码
print(shopping_cart) # 输出购物车中的数据

else: # 用户信息中的购物车的K没有对应的值,为None的情况下
print('购物车已被清空') # 输出'购物车已被清空'


# 注销用户
@common.auth
def logout():
msg = user.logout_interface()
print(msg)


func_dic = {
'1': register,
'2': login,
'3': check_balance,
'4': withdraw,
'5': transfer,
'6': repay,
'7': check_flow,
'8': shopping,
'9': check_shop,
'0': logout,
} # 定义函数功能字典,用于用户输入键位后,提取对应的K的值V,加括号运行对应函数功能


# 主程序
def run(): # 运行,整个购物车的入口
while True: # 循环开始
print('''
1.注册
2.登陆
3.查看余额
4.提现
5.转账
6.还款
7.查看流水
8.购物车
9.查看购物车
0.注销用户
q.退出
''') # 显示提示用户输入所需功能,根据序号输入
choice = input('请选择功能编号>>:').strip() # 接收用户输入的信息,提示输入功能编号,并去空

quit = ['q', 'Q', 'quit'] # 定义一个退出列表,包含三种可能输入的退出情况
if choice in quit: # 逻辑判断,如果用户所输入的内容在退出字典中
break # 上诉条件成立退出当前循环即整个系统

# 判断用户选择的编号是否在1-9功能内
if choice in func_dic: # 如果输入内容在函数功能字典中
func_dic[choice]()

# 查找对应的数字K在字典中对应的值,提取值就是提前一个未运行的函数名,# 后面追加括号,执行该函数功能


else: # 否则,意思就是其他情况,不在1到9的范围内和退出列表中的输入信息,就是不符合输入规范
print('请输入正确的编号!') # 字面
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄