模拟实现一个ATM + 购物商城程序
- 
额度 15000或自定义
- 
实现购物商城,买东西加入 购物车,调用信用卡接口结账
- 
可以提现,手续费5%
- 
每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
- 
支持多账户登录
- 
支持账户间转账
- 
记录每月日常消费流水
- 
提供还款接口
- 
ATM记录操作日志 
- 
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
- 
用户认证用装饰器
# import time
import datetime
# time.time()   # 当前时间戳
# datetime.datetime.now() # 本地之间
# 数据处理=====================================
# 全部用户数据
user_data = []
# 加载数据到内存
def load_data():
    f = open("DB/user_db.txt","rt",encoding="utf-8")
    for line in f:
        line = line.strip("\n")
        if line == "\n":continue
        ls = line.split("|")
        usr_dic = {"name":ls[0],
                   "pwd":ls[1],
                   "max": ls[2],
                   "money": ls[3],
                   "lock": ls[4]}
        user_data.append(usr_dic)
    f.close()
# 根据账户名获取一个用户
def get_usr(name):
    for usr in user_data:
        if usr["name"] == name:
            return usr
# 将内存中的数据持久存储到文件中
def save_to_file():
    f = open("DB/user_db.txt","wt",encoding="utf-8")
    for usr in user_data:
        text = "|".join(usr.values())
        text += "\n"
        f.write(text)
    f.close()
# 数据处理=====================================
# 登录验证装饰器(闭包函数) (再不改变源代码的调用方式基础上 为这个函数添加新功能)
def login_auth(func):
    def wrapper(*args,**kwargs):
        # 验证是否登陆过了
        if current_usr == None:
            print("请先登录!")
            atm_login()
            if current_usr:
                return func(*args,**kwargs)
        else:
            return func(*args,**kwargs)
    return wrapper
# 购物中心========================================
# 商品信息
products = [{"name":"挨粪叉","price":6888},
            {"name":"锤子TNT","price":10888},
            {"name":"小米mix2","price":2888}]
# 购物车
car = {}
# 购物
def shopping():
    while True:
    # 打印出所有商品信息
        count = 1
        for p in products:
            print("序号:%-3s 名称:%-10s 价格:%-6s" % (count,p["name"],p["price"]))
            count += 1
        select = input("亲输入商品的序号q退出:\n")
        if select == "q":
            return
        if select.isdigit() and int(select) >= 1 and int(select) <= len(products):
            pd = products[int(select)-1]
            print("%s已成功加入购物车!" % pd["name"])
            # 判断商品是否已经存在于购物车
            if pd["name"] in car:
                car[pd["name"]]["count"] += 1
            else:
                car[pd["name"]] = {"price":pd["price"],"count":1}
        else:
            print("输入有误请重新输入!")
# 查看购物车
def show_cars():
    if not car:
        s = input("你的购物车是空的! 你要买点什么吗? y/n")
        if s == "y":
            shopping()
            return
        else:
            return
    print("您的购物车信息:")
    for p in car:
        print("名称:%-10s 价格:%-8s 数量:%-3s 总价:%-10s" % (p,
                                                     car[p]["price"],
                                                     car[p]["count"],
                                                     car[p]["price"] * car[p]["count"]))
    select = input("输入y调整商品数量!(数量为0则删除商品!) 输入其他退出!")
    if select == "y":
        modify_count()
# 调整购物车中的商品数量
def modify_count():
    while True:
        name = input("请输入商品名称q退出:\n")
        if name == "q":
            return
        if name not in car:
            print("输入不正确请重试!")
            continue
        while True:
            count = input("输入调整后数量:\n")
            if not count.isdigit():
                print("数量不正确 必须是整数!")
                continue
            count = int(count)
            if count == 0:
                car.pop(name)
                print("%s已删除" % name)
                return
            else:
                car[name]["count"] = count
                print("修改成功!")
                return
# 结算
@login_auth
def pay_cars():
    # 计算商品总价格
    sum = 0
    for p in car:
        sum += car[p]["price"] * car[p]["count"]
    print("您的订单总价为:%s元" % sum)
    if paymoney(sum):
        print("剁手成功! 回家等着吧!")
        clear_cars()
# 清空购物车
def clear_cars():
    car.clear()
    print("购物车已清空!")
def shop_center():
    shopfuncs = {"1":shopping,"2":show_cars,"3":pay_cars,"4":clear_cars}
    while True:
        print("""
1.购物
2.查看购物车
3.结算
4.清空
q.退出""")
        index = input("请选择:\n").strip()
        if index == "q":
            return
        if index in shopfuncs:
            shopfuncs[index]()
        else:
            print("输入不正确!请重试!")
# 购物中心========================================
# ATM====================================================
# 用于保存登录成功的用户信息
current_usr = None
# 日志装饰器.
# 日志文件
atmlog_file = open("DB/log.txt","at",encoding="utf-8")
# 用户流水文件
moneyflow = None
def atm_logger(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        # 记录日志
        atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(),current_usr["name"],func.__name__))
        atmlog_file.flush() # 立即刷出缓存区的数据到硬盘 如果每次write都操作一次硬盘
                            # 效率非常低 所以python内置了缓冲区  只有当缓冲区满了才会写入硬盘 一次来降低硬盘操作次数
    return wrapper
# 登录
def atm_login():
    while True:
        name = input("请输入账户名:(q退出)\n").strip()
        # 手动记录日志 因为用户还没有登陆
        atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(), name, atm_login.__name__))
        atmlog_file.flush()
        if name == "q":
            return
        if not name:
            print("用户名不能为空!")
            continue
        usr = get_usr(name)
        if not usr:
            print("用户名不存在!")
            continue
        pwd = input("请输入密码:\n").strip()
        if not pwd:
            print("密码不能为空!")
            continue
        if name == usr["name"] and pwd == usr["pwd"]:
            print("登录成功")
            global current_usr,moneyflow
            # 打开流水文件
            moneyflow = open("DB/%s.txt" % name,"at",encoding="utf-8")
            # 记录当前登录用户信息
            current_usr = usr
            return
        else:
            print("账户名或密码不正确!请重试!")
#     提现
@login_auth
@atm_logger
def withdraw():
    while True:
        print("当前余额:%s元" % current_usr["money"])
        money = input("请输入提款金额:(整数 q退出)\n")
        if money == "q":return
        if not money.isdigit():
            print("输入有误!请重试!")
            continue
        money = int(money)
        # 手续费
        opt = money * 0.05
        print("需要手续费%s元" % opt)
        usr_moeny = float(current_usr["money"])
        if money+opt > usr_moeny:
            print("余额不足!很尴尬")
            continue
        current_usr["money"] = str(usr_moeny - money - opt)
        save_to_file()
        print("请提取你的钞票!")
        moneyflow.write("[%s] 账户:%s 提现%s元 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    money,
                                                    current_usr["money"]))
        moneyflow.flush()
        return
#     转账
@login_auth
@atm_logger
def transfer():
    while True:
        account = input("请输入对方的账户名:\n")
        to_usr = get_usr(account)
        if not to_usr:
            print("账户不存在 请重新输入!")
            continue
        print("当前余额:%s元" % current_usr["money"])
        money = input("请输入转账金额:(整数 q退出)\n")
        if money == "q": return
        money = str_to_num(money)
        if not money:
            print("输入有误!请重试!")
            continue
        usr_moeny = float(current_usr["money"])
        if money  > usr_moeny:
            print("余额不足!很尴尬")
            continue
        # 原始账户减去
        current_usr["money"] = str(usr_moeny - money)
        # 目标账户加上
        to_usr["money"] = str(float(to_usr["money"]) + money)
        save_to_file()
        print("转账成功!")
        moneyflow.write("[%s] 账户:%s 转账%s元 给%s 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    money,
                                                    account,
                                                    current_usr["money"]))
        moneyflow.flush()
        return
# 将字符串转成数字 "11212101.s"
def str_to_num(text):
    if text.isdigit():
        return int(text)
    if "." in text:
        ts = text.split(".")
        if len(ts) == 2:
            if ts[0].isdigit() and ts[1].isdigit():
                return float(text)
#     还款
@login_auth
@atm_logger
def repayment():
    print("您当前欠款:%s" % (str_to_num(current_usr["max"]) - str_to_num(current_usr["money"])))
    while True:
        print("repayment")
        money = input("请输入还款金额!q退出:\n")
        if money == "q":return
        money = str_to_num(money)
        if not money:
            print("输入有误 请重试!")
            continue
        current_usr["money"] = str(str_to_num(current_usr["money"]) + money)
        save_to_file()
        print("还款成功!")
        moneyflow.write("[%s] 账户:%s 还款%s元 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    money,
                                                    current_usr["money"]))
        moneyflow.flush()
        return
# 结算 需要传入订单总价格
@login_auth
@atm_logger
def paymoney(price):
    if price > str_to_num(current_usr["money"]):
        print("额度不足!又尴尬了")
    else:
        current_usr["money"] = str(str_to_num(current_usr["money"]) - price)
        save_to_file()
        print("结算成功!")
        moneyflow.write("[%s] 账户:%s 购物消费%s元 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    price,
                                                    current_usr["money"]))
        moneyflow.flush()
        return True
def atm():
    atm_funcs = {"1": atm_login, "2": withdraw, "3": transfer, "4": repayment}
    while True:
        print("""
1.登录
2.提现
3.转账
4.还款
(q.退出!)""")
        index = input("请选择:\n")
        if index == "q":
            # 清空当前用户信息 关闭流水文件
            global current_usr
            if current_usr:
                current_usr = None
                moneyflow.close()
            return
        if index in atm_funcs:
            atm_funcs[index]()
        else:
            print("输入有误请重试!")
# ATM====================================================
# 管理员接口=============================================
# 显示所有的用户信息 并从中选择一个用户
def show_users_and_select():
    while True:
        for usr in user_data:
            print("%-10s %-10s %-10s %-2s" % (usr["name"],usr["max"],usr["money"],usr["lock"]))
        select = input("请选择一个用户(输入用户名:q退出)\n")
        if select == "q":
            return
        for u in user_data:
            if select == u["name"]:
                return u
        else:
            print("输入不正确 请重新输入!")
# 管理员登录
def admin_login():
    while True:
        name = input("请输入管理员账户名:(q退出)\n").strip()
        if name == "q":
            return
        if not name:
            print("用户名不能为空!")
            continue
        pwd = input("请输入管理员密码:\n").strip()
        if not pwd:
            print("密码不能为空!")
            continue
        if name == "admin" and pwd == "123":
            print("登录成功")
            return True
        else:
            print("账户名或密码不正确!请重试!")
#添加账户
def create_user():
    while True:
        name = input("请输入账户名:(q退出)\n").strip()
        if name == "q":
            return
        if not name:
            print("用户名不能为空!")
            continue
        # 获取用户 通过账户名
        usr = get_usr(name)
        if usr:
            print("用户名已经存在,请重试!")
            continue
        pwd = input("请输入密码:\n").strip()
        if not pwd:
            print("密码不能为空!")
            continue
        if pwd != input("请再次输入密码:").strip():
            print("两次密码不相同请重试!")
            continue
        # 将用户输入的信息打包成字典 存到列表中
        new_usr = {"name":name,"pwd":pwd,"max":"15000","money":"500","lock":"0"}
        user_data.append(new_usr)
        print("创建成功!")
        # 持久化存储......
        save_to_file()
        return
#调整额度
def modify_amount():
    # 先选择一个用户
    usr = show_users_and_select()
    if not usr:
        return
    while True:
        # 输入新的额度
        new_max = input("请输入新的额度:(q退出)\n").strip()
        if new_max == "q":
            return
        if not new_max.isdigit():
            print("输入不正确 请重新输入!")
            continue
        usr["max"] = new_max
        save_to_file()
        print("修改成功!")
        return
#冻结账户
def lock_user():
    # 先选择一个用户
    usr = show_users_and_select()
    if not usr:
        print("取消操作!")
        return
    usr["lock"] = "1"
    save_to_file()
    print("冻结成功!")
#解冻账户
def unlock_user():
    # 先选择一个用户
    usr = show_users_and_select()
    if not usr:
        print("取消操作!")
        return
    usr["lock"] = "0"
    save_to_file()
    print("解冻成功!")
# 管理员接口界面
def admin_view():
    # 调用登录功能验证是否有权限执行操作
    if not admin_login():
        return
    admin_funcs = {"1":create_user,"2":modify_amount,"3":lock_user,"4":unlock_user}
    while True:
        print("""
1.添加账户
2.修改额度
3.冻结账户
4.解冻账户
(q.退出!)""")
        index = input("请选择:\n")
        if index == "q":
            return
        if index in admin_funcs:
            admin_funcs[index]()
        else:
            print("输入有误请重试!")
# 管理员接口=============================================
# 程序的入口函数
def run():
    print("welcome to oldboy ATM system!")
    # 将函数装到字典中 用序号作为key 方便判断
    funcs = {"1": shop_center, "2": atm, "3": admin_view}
    while True:
        print("""
1.购物中心
2.ATM
3.管理员接口
(q.退出!)""")
        index = input("请选择:\n")
        if index == "q":
            print("下次再见!")
            return
        if index in funcs:
            funcs[index]()
        else:
            print("输入有误请重试!")
# 启动系统
load_data()
run()
atmlog_file.close()
# print(user_data)
# print(str_to_num("100.s"))
# import time
import datetime
# time.time()   # 当前时间戳
# datetime.datetime.now() # 本地之间
# 数据处理=====================================
# 全部用户数据
user_data = []
# 加载数据到内存
def load_data():
    f = open("DB/user_db.txt","rt",encoding="utf-8")
    for line in f:
        line = line.strip("\n")
        if line == "\n":continue
        ls = line.split("|")
        usr_dic = {"name":ls[0],
                   "pwd":ls[1],
                   "max": ls[2],
                   "money": ls[3],
                   "lock": ls[4]}
        user_data.append(usr_dic)
    f.close()
# 根据账户名获取一个用户
def get_usr(name):
    for usr in user_data:
        if usr["name"] == name:
            return usr
# 将内存中的数据持久存储到文件中
def save_to_file():
    f = open("DB/user_db.txt","wt",encoding="utf-8")
    for usr in user_data:
        text = "|".join(usr.values())
        text += "\n"
        f.write(text)
    f.close()
# 数据处理=====================================
# 登录验证装饰器(闭包函数) (再不改变源代码的调用方式基础上 为这个函数添加新功能)
def login_auth(func):
    def wrapper(*args,**kwargs):
        # 验证是否登陆过了
        if current_usr == None:
            print("请先登录!")
            atm_login()
            if current_usr:
                return func(*args,**kwargs)
        else:
            return func(*args,**kwargs)
    return wrapper
# 购物中心========================================
# 商品信息
products = [{"name":"挨粪叉","price":6888},
            {"name":"锤子TNT","price":10888},
            {"name":"小米mix2","price":2888}]
# 购物车
car = {}
# 购物
def shopping():
    while True:
    # 打印出所有商品信息
        count = 1
        for p in products:
            print("序号:%-3s 名称:%-10s 价格:%-6s" % (count,p["name"],p["price"]))
            count += 1
        select = input("亲输入商品的序号q退出:\n")
        if select == "q":
            return
        if select.isdigit() and int(select) >= 1 and int(select) <= len(products):
            pd = products[int(select)-1]
            print("%s已成功加入购物车!" % pd["name"])
            # 判断商品是否已经存在于购物车
            if pd["name"] in car:
                car[pd["name"]]["count"] += 1
            else:
                car[pd["name"]] = {"price":pd["price"],"count":1}
        else:
            print("输入有误请重新输入!")
# 查看购物车
def show_cars():
    if not car:
        s = input("你的购物车是空的! 你要买点什么吗? y/n")
        if s == "y":
            shopping()
            return
        else:
            return
    print("您的购物车信息:")
    for p in car:
        print("名称:%-10s 价格:%-8s 数量:%-3s 总价:%-10s" % (p,
                                                     car[p]["price"],
                                                     car[p]["count"],
                                                     car[p]["price"] * car[p]["count"]))
    select = input("输入y调整商品数量!(数量为0则删除商品!) 输入其他退出!")
    if select == "y":
        modify_count()
# 调整购物车中的商品数量
def modify_count():
    while True:
        name = input("请输入商品名称q退出:\n")
        if name == "q":
            return
        if name not in car:
            print("输入不正确请重试!")
            continue
        while True:
            count = input("输入调整后数量:\n")
            if not count.isdigit():
                print("数量不正确 必须是整数!")
                continue
            count = int(count)
            if count == 0:
                car.pop(name)
                print("%s已删除" % name)
                return
            else:
                car[name]["count"] = count
                print("修改成功!")
                return
# 结算
@login_auth
def pay_cars():
    # 计算商品总价格
    sum = 0
    for p in car:
        sum += car[p]["price"] * car[p]["count"]
    print("您的订单总价为:%s元" % sum)
    if paymoney(sum):
        print("剁手成功! 回家等着吧!")
        clear_cars()
# 清空购物车
def clear_cars():
    car.clear()
    print("购物车已清空!")
def shop_center():
    shopfuncs = {"1":shopping,"2":show_cars,"3":pay_cars,"4":clear_cars}
    while True:
        print("""
1.购物
2.查看购物车
3.结算
4.清空
q.退出""")
        index = input("请选择:\n").strip()
        if index == "q":
            return
        if index in shopfuncs:
            shopfuncs[index]()
        else:
            print("输入不正确!请重试!")
# 购物中心========================================
# ATM====================================================
# 用于保存登录成功的用户信息
current_usr = None
# 日志装饰器.
# 日志文件
atmlog_file = open("DB/log.txt","at",encoding="utf-8")
# 用户流水文件
moneyflow = None
def atm_logger(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        # 记录日志
        atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(),current_usr["name"],func.__name__))
        atmlog_file.flush() # 立即刷出缓存区的数据到硬盘 如果每次write都操作一次硬盘
                            # 效率非常低 所以python内置了缓冲区  只有当缓冲区满了才会写入硬盘 一次来降低硬盘操作次数
    return wrapper
# 登录
def atm_login():
    while True:
        name = input("请输入账户名:(q退出)\n").strip()
        # 手动记录日志 因为用户还没有登陆
        atmlog_file.write("[%s] user:%s function:%s\n" % (datetime.datetime.now(), name, atm_login.__name__))
        atmlog_file.flush()
        if name == "q":
            return
        if not name:
            print("用户名不能为空!")
            continue
        usr = get_usr(name)
        if not usr:
            print("用户名不存在!")
            continue
        pwd = input("请输入密码:\n").strip()
        if not pwd:
            print("密码不能为空!")
            continue
        if name == usr["name"] and pwd == usr["pwd"]:
            print("登录成功")
            global current_usr,moneyflow
            # 打开流水文件
            moneyflow = open("DB/%s.txt" % name,"at",encoding="utf-8")
            # 记录当前登录用户信息
            current_usr = usr
            return
        else:
            print("账户名或密码不正确!请重试!")
#     提现
@login_auth
@atm_logger
def withdraw():
    while True:
        print("当前余额:%s元" % current_usr["money"])
        money = input("请输入提款金额:(整数 q退出)\n")
        if money == "q":return
        if not money.isdigit():
            print("输入有误!请重试!")
            continue
        money = int(money)
        # 手续费
        opt = money * 0.05
        print("需要手续费%s元" % opt)
        usr_moeny = float(current_usr["money"])
        if money+opt > usr_moeny:
            print("余额不足!很尴尬")
            continue
        current_usr["money"] = str(usr_moeny - money - opt)
        save_to_file()
        print("请提取你的钞票!")
        moneyflow.write("[%s] 账户:%s 提现%s元 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    money,
                                                    current_usr["money"]))
        moneyflow.flush()
        return
#     转账
@login_auth
@atm_logger
def transfer():
    while True:
        account = input("请输入对方的账户名:\n")
        to_usr = get_usr(account)
        if not to_usr:
            print("账户不存在 请重新输入!")
            continue
        print("当前余额:%s元" % current_usr["money"])
        money = input("请输入转账金额:(整数 q退出)\n")
        if money == "q": return
        money = str_to_num(money)
        if not money:
            print("输入有误!请重试!")
            continue
        usr_moeny = float(current_usr["money"])
        if money  > usr_moeny:
            print("余额不足!很尴尬")
            continue
        # 原始账户减去
        current_usr["money"] = str(usr_moeny - money)
        # 目标账户加上
        to_usr["money"] = str(float(to_usr["money"]) + money)
        save_to_file()
        print("转账成功!")
        moneyflow.write("[%s] 账户:%s 转账%s元 给%s 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    money,
                                                    account,
                                                    current_usr["money"]))
        moneyflow.flush()
        return
# 将字符串转成数字 "11212101.s"
def str_to_num(text):
    if text.isdigit():
        return int(text)
    if "." in text:
        ts = text.split(".")
        if len(ts) == 2:
            if ts[0].isdigit() and ts[1].isdigit():
                return float(text)
#     还款
@login_auth
@atm_logger
def repayment():
    print("您当前欠款:%s" % (str_to_num(current_usr["max"]) - str_to_num(current_usr["money"])))
    while True:
        print("repayment")
        money = input("请输入还款金额!q退出:\n")
        if money == "q":return
        money = str_to_num(money)
        if not money:
            print("输入有误 请重试!")
            continue
        current_usr["money"] = str(str_to_num(current_usr["money"]) + money)
        save_to_file()
        print("还款成功!")
        moneyflow.write("[%s] 账户:%s 还款%s元 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    money,
                                                    current_usr["money"]))
        moneyflow.flush()
        return
# 结算 需要传入订单总价格
@login_auth
@atm_logger
def paymoney(price):
    if price > str_to_num(current_usr["money"]):
        print("额度不足!又尴尬了")
    else:
        current_usr["money"] = str(str_to_num(current_usr["money"]) - price)
        save_to_file()
        print("结算成功!")
        moneyflow.write("[%s] 账户:%s 购物消费%s元 余额%s元\n" % (datetime.datetime.now(),
                                                    current_usr["name"],
                                                    price,
                                                    current_usr["money"]))
        moneyflow.flush()
        return True
def atm():
    atm_funcs = {"1": atm_login, "2": withdraw, "3": transfer, "4": repayment}
    while True:
        print("""
1.登录
2.提现
3.转账
4.还款
(q.退出!)""")
        index = input("请选择:\n")
        if index == "q":
            # 清空当前用户信息 关闭流水文件
            global current_usr
            if current_usr:
                current_usr = None
                moneyflow.close()
            return
        if index in atm_funcs:
            atm_funcs[index]()
        else:
            print("输入有误请重试!")
# ATM====================================================
# 管理员接口=============================================
# 显示所有的用户信息 并从中选择一个用户
def show_users_and_select():
    while True:
        for usr in user_data:
            print("%-10s %-10s %-10s %-2s" % (usr["name"],usr["max"],usr["money"],usr["lock"]))
        select = input("请选择一个用户(输入用户名:q退出)\n")
        if select == "q":
            return
        for u in user_data:
            if select == u["name"]:
                return u
        else:
            print("输入不正确 请重新输入!")
# 管理员登录
def admin_login():
    while True:
        name = input("请输入管理员账户名:(q退出)\n").strip()
        if name == "q":
            return
        if not name:
            print("用户名不能为空!")
            continue
        pwd = input("请输入管理员密码:\n").strip()
        if not pwd:
            print("密码不能为空!")
            continue
        if name == "admin" and pwd == "123":
            print("登录成功")
            return True
        else:
            print("账户名或密码不正确!请重试!")
#添加账户
def create_user():
    while True:
        name = input("请输入账户名:(q退出)\n").strip()
        if name == "q":
            return
        if not name:
            print("用户名不能为空!")
            continue
        # 获取用户 通过账户名
        usr = get_usr(name)
        if usr:
            print("用户名已经存在,请重试!")
            continue
        pwd = input("请输入密码:\n").strip()
        if not pwd:
            print("密码不能为空!")
            continue
        if pwd != input("请再次输入密码:").strip():
            print("两次密码不相同请重试!")
            continue
        # 将用户输入的信息打包成字典 存到列表中
        new_usr = {"name":name,"pwd":pwd,"max":"15000","money":"500","lock":"0"}
        user_data.append(new_usr)
        print("创建成功!")
        # 持久化存储......
        save_to_file()
        return
#调整额度
def modify_amount():
    # 先选择一个用户
    usr = show_users_and_select()
    if not usr:
        return
    while True:
        # 输入新的额度
        new_max = input("请输入新的额度:(q退出)\n").strip()
        if new_max == "q":
            return
        if not new_max.isdigit():
            print("输入不正确 请重新输入!")
            continue
        usr["max"] = new_max
        save_to_file()
        print("修改成功!")
        return
#冻结账户
def lock_user():
    # 先选择一个用户
    usr = show_users_and_select()
    if not usr:
        print("取消操作!")
        return
    usr["lock"] = "1"
    save_to_file()
    print("冻结成功!")
#解冻账户
def unlock_user():
    # 先选择一个用户
    usr = show_users_and_select()
    if not usr:
        print("取消操作!")
        return
    usr["lock"] = "0"
    save_to_file()
    print("解冻成功!")
# 管理员接口界面
def admin_view():
    # 调用登录功能验证是否有权限执行操作
    if not admin_login():
        return
    admin_funcs = {"1":create_user,"2":modify_amount,"3":lock_user,"4":unlock_user}
    while True:
        print("""
1.添加账户
2.修改额度
3.冻结账户
4.解冻账户
(q.退出!)""")
        index = input("请选择:\n")
        if index == "q":
            return
        if index in admin_funcs:
            admin_funcs[index]()
        else:
            print("输入有误请重试!")
# 管理员接口=============================================
# 程序的入口函数
def run():
    print("welcome to oldboy ATM system!")
    # 将函数装到字典中 用序号作为key 方便判断
    funcs = {"1": shop_center, "2": atm, "3": admin_view}
    while True:
        print("""
1.购物中心
2.ATM
3.管理员接口
(q.退出!)""")
        index = input("请选择:\n")
        if index == "q":
            print("下次再见!")
            return
        if index in funcs:
            funcs[index]()
        else:
            print("输入有误请重试!")
# 启动系统
load_data()
run()
atmlog_file.close()
# print(user_data)
# print(str_to_num("100.s"))
# 只有程序时从当前文件开始运行时才进入if语句
# if __name__ == '__main__':
# 只有程序时从当前文件开始运行时才进入if语句
# if __name__ == '__main__':