## ATM购物车项目思路

三层架构

image

功能展示:

1.注册功能
2.登陆功能
3.查看余额
4.提现功能
5.还款功能
6.转账功能
7.查看流水
8.添加购物车
9.查看购物车
10.结算购物车
11.管理员功能

功能逻辑

1.注册功能

'用户展示层'
1.获取用户输入
2.判断用户两次密码是否一致

3.加密密码

4.连接代码逻辑核心层

def register():  # 注册
    # 获取用户输入
    while True:
        username = input('请输入您想要注册的用户名').strip()
        password = input('请输入您想要注册的用户密码').strip()
        password1 = input('请确定您的密码>>>:').strip()
        if password == password1:
            hash_pwd = common.get_hash(password)
            # 核对用户名是否存在
            flag, msg = user_interface.register_interface(username, hash_pwd)
            print(msg)
            break
        else:
            print('您两次输入的密码不一致,请重新输入')

'代码逻辑核心层
1.判断用户名是否存在,连接用户数据
2.用户名不存在,写入用户
3.注册成功,返回值给第一层接收

def register_interface(username, password):
    user_dict = db_handler.read_user(username)
    if user_dict:
        return False, f'用户名{username}已存在'
    user_dict = {'username': username,
                 'password': password,
                 'balance': 15000,
                 'shop_car': {},
                 'state': False,
                 'bank_flow': []}
    # 拼接用户路径
    db_handler.save(user_dict)
    logger.debug(f'用户{username}已注册成功')  #日志
    return True, f'用户{username}已注册成功'

2.登录成功

'用户展示层'

1.获取用户输入

2.加密用户密码

3.传递数据进代码核心层

4.通过第二层返回的用户状态修改全局变量,储存登录的用户名

5.添加装饰器

def login():  # 登录
    while True:
        username = input('请输入您的用户名>>>:').strip()
        password = input('请输入您的用户密码>>>:').strip()
        hash_pwd = common.get_hash(password)
        # 调用第二层接口
        flag, msg = user_interface.login_interface(username, hash_pwd)
        if flag:
            is_login['login_is'] = username
            print(msg)
            break
        print(msg)

'代码核心层'

1.通过第一层传递的用户名获取用户字典

2.判断用户是否存在,不存在直接返回

3.用户存在,比对用户加密密码是否一致

4.返回登录成功或者密码错误

def login_interface(username, password):
    user_dict = db_handler.read_user(username)
    if not user_dict:
        return False, f'用户{username}不存在,请确认后登录'
    if user_dict['state']:
        return False, '您的账户已被管理员冻结,请联系管理员'
    if password == user_dict.get('password'):
        logger.debug(f'用户{username}登录成功') #日志
        return True, f'用户{username}登录成功'
    else:
        return False, '密码错误'

3.查看余额

'用户展示层'

1.通过全局变量获取当前登录用户

2.传数据进入代码核心层

def check_balance():  # 查看余额
    username = is_login['login_is']
    # 直接调用第二层
    flag, msg = bank_intertface.check_balan_interface(username)
    print(msg)

'代码核心层'

1.通过第一层传递的用户名调用数据层获得用户字典

2.将用户字典中的余额参数返回第一层

def check_balan_interface(username):
    user_dict = db_handler.read_user(username)
    logger.debug(f'用户{username}查看了自己的余额')  #日志
    return True, f'尊敬的{username}您的账户余额为{user_dict.get("balance")}元'

4.提现功能

'用户展示层'

1.通过全局变量获取当前登录用户

2.获取用户要提现的金额

3.传数据进入代码核心层(用户名,提现金额)

def withdraw():  # 提现
    username = is_login.get('login_is')
    withdraw_money = input('请输入您想要提现的金额').strip()
    flag, msg = bank_intertface.withdraw_interface(username, withdraw_money)
    print(msg)

'代码核心层'

1.通过第一层传递的用户名调用数据层获得用户字典

2.获取用户余额

3.转换用户要提现的金额为浮点型

4.对比用户需要提现的金额和余额

5.余额大于提现金额的情况下,计算用户体现的手续费

6.用于的余额减去提现的金额和手续费的金额

7.保存修改后的用户余额到数据库

def withdraw_interface(username, withdraw_money):
    user_dict = db_handler.read_user(username)
    balance = user_dict['balance']
    # 这里调用转浮点型的函数,保证小数,整数都能够提现
    flag, value = common.get_num(withdraw_money)
    if flag:
        if balance < value * (1 + settings.MONEY_RATIO):
            return False, '您的余额不足以提现'
        user_dict['balance'] -= value * (1 + settings.MONEY_RATIO)
        db_handler.save(user_dict)  # 保存修改后的数据
        times = time.strftime('%Y-%m-%d %X')
        logger.debug(f'用户{username}提现{value}元')  #日志
        user_dict['bank_flow'].append(f'时间{times}:成功提现{value}元,手续费{value * settings.MONEY_RATIO}元')
        return True, f'{username}您成功提现{value}元,手续费{value * settings.MONEY_RATIO}元'
    return False, '请输入正确的数字'

5.还款功能

'用户展示层'

1.通过全局变量获取当前登录用户

2.获取用户要还款的金额

3.传数据进入代码核心层(用户名,还款金额)

def pay_balance():  # 还款
    username = is_login['login_is']
    pay_num = input('请输入您想要还款的金额').strip()
    flag, msg = bank_intertface.pay_balance_interface(username, pay_num)
    print(msg)

'代码核心层'

1.通过第一层传递的用户名调用数据层获得用户字典

2.转换用户还款的金额为浮点型

3.获取用户余额直接加上还款余额

4.保存用户修改后的余额,并返回给第一层

def pay_balance_interface(username, pay_num):
    user_dict = db_handler.read_user(username)
    # 调用转浮点型的函数
    falg, value = common.get_num(pay_num)
    # 如果为True证明是小数或者整数
    if falg:
        user_dict['balance'] += value
        times = time.strftime('%Y-%m-%d %X')
        user_dict['bank_flow'].append(f'时间{times}:成功还款{value}元')
        db_handler.save(user_dict)
        logger.debug(f'用户{username}还款{value}元') #日志
        return True, f'尊敬的{username},您成功还款{value}元'
    return False, '请输入正确的还款金额'

6.转账功能

'用户展示层'

1.获取当前登录用户

2.获取用户转账账户

3.获取用户转账金额

4.传数据到第二层代码核心层(当前用户名,转账用户名,转账金额)

def transfer_money():  # 转账
    username = is_login['login_is']
    tranfer_name = input('请输入您想要转账的账户>>>:').strip()
    tranfer_num = input('请输入您想要转账的金额>>>:').strip()
    flag, msg = bank_intertface.transfer_money_interface(username, tranfer_name, tranfer_num)
    print(msg)

'代码核心层'

1.读取转账用户数据,判断账户是否存在

2.转换转账金额会浮点型

3.判断当前用户余额是否足够转账

4.当前用户余额减去转账金额

5.被转账用户余额加上转账金额

6.保存两者新产生的余额到用户字典

7.保存两者新产生的用户字典到数据库

8.返回转账成功到第一层

def transfer_money_interface(username, tranfer_name, tranfer_num):
    tranfer_name_dict = db_handler.read_user(tranfer_name)
    if not tranfer_name_dict:
        return False, '您所转账的账户不存在,请确认后输入'
    user_dict = db_handler.read_user(username)
    # 调用转数字的函数,把字符串转换
    falg, value = common.get_num(tranfer_num)
    if falg:
        if value > user_dict['balance']:
            return False, f'尊敬的用户{username}您的账户余额不足,无法转账'
        else:
            tranfer_name_dict['balance'] += value
            times = time.strftime('%Y-%m-%d %X')
            tranfer_name_dict['bank_flow'].append(f'时间{times}:收到{username}转账{value}元')
            user_dict['balance'] -= value
            user_dict['bank_flow'].append(f'时间{times}:向{tranfer_name}转账{value}元')
            db_handler.save(tranfer_name_dict)
            db_handler.save(user_dict)
            logger.info(f'用户{username}向{tranfer_name}转账{value}元')
            #日志
            logger.info(f'用户{tranfer_name}收到{username}转账{value}元')
            #日志
            return True, f'尊敬的用户{username}您成功向用户{tranfer_name}转账{value}元'
    return False, '请输入正确的数字'

7.查看流水

'用户交互层'

1.获取当前登录用户

2.直接传用户名到第二层

3.通过第二层的返回值循环打印用户流水

def check_flow():  # 查看流水
    username = is_login['login_is']
    # 直接调用第二层接口
    flag, msg = bank_intertface.check_flow_interface(username)
    if flag:
        for i in msg:
            print(i)
    else:
        print(msg)

'代码核心层'

1.获取用户字典

2.通过用户字典获取用户流水

3.返回用户流水到第一层

def check_flow_interface(username):
    user_dict = db_handler.read_user(username)
    logger.debug(f'用户{username}查看了自己的流水')  #日志
    if user_dict['bank_flow']:
        return True, user_dict['bank_flow']
    return False, '该账户暂无流水'

8.添加购物车

'用户交互层'

1.获取当前登录用户

2.传数据到第二层

def add_shop_car():  # 添加购物车
    username = is_login['login_is']
    flag, msg = shop_car_interface.add_shop_car_interface(username)
    print(msg)

'代码核心层'

1.定义一个临时购物车在循环外

2.循环打印商品列表

3.获取用户选择的商品

4.判断用户选择是否是纯数字

5.判断用户选择是否在商品列表

6.获取用户购买数量

7.添加用户购买商品,商品数量,商品价格到临时购物车

8.用户重复添加或者选择退出保存购物车

9.调取用户数据获得用户购物车

10.判断临时购物车的商品在不在用户的购物车中

11.添加临时购物车的商品到用户购物车

12.保存用户数据到数据库

def add_shop_car_interface(username):
    temp_shop_car = {}
    while True:
        good_list = [
            ['挂壁面', 3],
            ['印度飞饼', 22],
            ['极品木瓜', 666],
            ['土耳其土豆', 999],
            ['伊拉克拌面', 1000],
            ['董卓戏张飞公仔', 2000],
            ['仿真玩偶', 10000]]
        for num, good_date in enumerate(good_list):
            print(f'商品编号:{num}      |   商品名:{good_date[0]}      |   商品价格:{good_date[1]}')
        choice_good = input('请输入您想购买的商品编号(q退出添加购物车)').strip()
        if choice_good == 'q':
            user_dict = db_handler.read_user(username)
            old_shop_car = user_dict['shop_car']
            for g_name, g_list in temp_shop_car.items():
                if g_name in old_shop_car:
                    old_shop_car[g_name][0] += g_list[0]
                else:
                    old_shop_car[g_name] = g_list
                logger.debug(f'用户{username}购物车添加{g_list[0]}个{g_name}')
            user_dict['shop_car'] = old_shop_car
            times = time.strftime('%Y-%m-%d %X')
            user_dict['bank_flow'].append(f'时间{times}:成功添加购物车')
            db_handler.save(user_dict)
            return True, f'尊敬的{username}您的购物车添加成功'
        if not choice_good.isdigit():
            print('请输入正确的商品编号')
            continue
        choice_good = int(choice_good)
        if choice_good not in range(len(good_list)):
            print('您输入的商品编号不存在')
            continue
        while True:
            choice_good_num = input('请输入您购买的商品的数量')
            if not choice_good_num.isdigit():
                print('请输入正确的数字')
                continue
            else:
                choice_good_num = int(choice_good_num)
                break
        good_date_list = good_list[choice_good]
        good_name = good_date_list[0]
        # 添加临时小字典
        if good_name in temp_shop_car:
            temp_shop_car[good_name][0] += choice_good_num
        else:
            temp_shop_car[good_name] = [choice_good_num, good_date_list[1]]

9.查看购物车

'用户展示层'

1.获取当前登录用户

2.调取用户第二层数据

3.循环打印第二层返回的用户购物车数据

def chenck_shop_car():  # 查看购物车
    username = is_login['login_is']
    flag, msg = shop_car_interface.chenck_shop_car_interface(username)
    if flag:
        for g_name, g_list in msg.items():
            print(f'商品名:{g_name}     |   商品数量:{g_list[0]}       商品单价:{g_list[1]}')
    else:
        print(msg)

'代码核心层'

1.通过用户名获取用户字典

2.获取用户购物车

3.返回用户购物车到第一层

def chenck_shop_car_interface(username):
    user_dict = db_handler.read_user(username)
    shop_car = user_dict['shop_car']
    logger.debug(f'用户{username}查看了自己的购物车')
    if shop_car:
        return True, shop_car
    return False, '您的购物车空空如也'

10.结算购物车

'用户展示层'

1.获取当前登录用户

2.传用户名到第二层

3.接收第二层返回

def pay_shop_car():  # 结算购物车
    username = is_login['login_is']
    flag, msg = shop_car_interface.pay_shop_car_interface(username)
    print(msg)

'代码核心层'

1.获取当前用户字典

2.获取用户购物车数据

3.判断购物车是否有商品

4.计算用户购物车商品总价

5.判断用户余额是否足够支付商品

6.用户余额减去商品总价,保存用户字典

7.将用户字典写入数据库中

def pay_shop_car_interface(username):
    user_dict = db_handler.read_user(username)
    shop_car = user_dict.get('shop_car')
    balance = user_dict['balance']
    if shop_car:
        # 计算购物车的总价
        money_num = 0
        for i in shop_car:
            money_num += shop_car[i][0] * shop_car[i][1]
        if money_num > balance:
            return False, '您的余额不足,请充值'
        else:
            user_dict['balance'] -= money_num
            user_dict['shop_car'] = {}
        logger.debug(f'用户{username}购物消费{money_num}元')
        times = time.strftime('%Y-%m-%d %X')
        user_dict['bank_flow'].append(f'时间{times}:购物消费{money_num}元')
        db_handler.save(user_dict)
        return True, f'尊敬的{username}您购物成功,消费{money_num}元,欢迎下次光临'
    else:
        return False, '您购物车暂时没有任何物品,快去添加吧'

11.管理员功能

'用户展示层'

1.获取管理员登录

​ 1.1调取第二层登录管理员账号

2.给出管理员选择

3.判断管理员选择执行

​ 3.1调取第二层执行管理员选项

4.接收管理员执行结果

def admin():  # 管理员功能
    username = input('请输入管理员账户>>>:').strip()
    password = input('请输入管理员密码>>>:').strip()
    flag, msg = admin_interface.admin_login(username, password)
    if flag:
        print("""
              欢迎你管理员
                1.冻结账户
                2.删除账户
        """)
        admin_choice = input('请选择您想要执行的选择>>>:').strip()
        if admin_choice == '1':
            admin_name = input('请输入您想要冻结的账户>>>:').strip()
            flag, msg = admin_interface.admin_freeze(admin_name)
            print(msg)
        elif admin_choice == '2':
            admin_name = input('请输入您想要删除的账户>>>:').strip()
            flag, msg = admin_interface.admin_def(admin_name)
            print(msg)

'代码核心层'

1.判断当前管理员账号密码,登录操作

def admin_login(username, password):  # 管理员登录
    if username == 'zhanghong' and password == '123':
        logger.info(f'管理员{username}登录')
        return True, f'欢迎管理员{username}'
    else:
        return False, '管理员账号或者密码错误'

冻结账户:

1.读取管理员所要冻结的账户数据

2.修改账户状态为Ture

3.返回第一层

def admin_freeze(username):
    user_dict = db_handler.read_user(username)
    if user_dict:
        user_dict['state'] = True
        db_handler.save(user_dict)
        logger.error(f'用户{username}被管理员冻结账户')
        return True, f'用户{username}被管理员冻结账户'
    else:
        return False, '该账户不存在'

删除账户:

1.获取删除用户数据

2.拼接删除用户文件路径

3.删除用户

def admin_def(username):
    user_dict = db_handler.read_user(username)
    if user_dict:
        user_path = os.path.join(settings.DB_PATH, f'{username}.json')
        os.remove(user_path)
        logger.warning(f'用户{username}被管理员删除')
        return True, f'用户{username}已被删除'
    else:
        return False, '该账户不存在'
posted @ 2022-10-31 20:38  雪语  阅读(25)  评论(0编辑  收藏  举报