首页 > 其他分享 >ATM+购物车

ATM+购物车

时间:2022-10-31 20:44:22浏览次数:70  
标签:username money ATM 用户 购物车 dict user interface

ATM+购物车

项目分析

1.项目功能需求
    1.注册功能
    2.登录功能
    3.查看余额
    4.提现功能
    5.充值功能
    6.转账功能
    7.查看流水
    8.添加购物车
    9.结算购物车
    10.管理员功能
    
2.项目框架设计
    当前项目使用三层架构比较合适
    1.用户交互层  只负责与用户交互,获取用户输入与信息展示给用户
    2.核心逻辑层  负责项目的逻辑判断和运算
    3.数据处理层  负责数据的保存与读取

搭建项目框架

1.项目目录搭建
    根据软件开发目录创建出相应的目录与文件
    bin文件夹  start.py 启动文件
    conf文件夹  settings.py文件 配置文件
    core文件夹  src.py 原本是存放项目的核心功能,这里充当第一层,与用户交互
    interface文件夹  存放接口文件,这里充当项目的第二层,核心逻辑层,且根据功能划分不同的         文件,这里可大致分为四个文件
        user_interface.py  存放与用户相关的功能
        bank_interdace.py  存放银行相关的功能
        shop_interface.py  存放购物相关的功能
        admin_interface.py  存放管理员相关的功能
    lib文件夹  common.py  存放项目的公共功能
    db文件夹  db_handler.py  存放数据操作相关的代码,这里充当第三层数据处理层

2.项目功能搭建
    使用空函数先搭建出第一层和启动文件

项目具体编写

1.注册功能

第一层
    1.获取用户信息输入(用户名密码与确认密码)
    2.比对密码与确认密码
    3.将用户名和密码传入第二层,由第二层来执行相应的逻辑判断和运算
    4.获取第二层处理后的结果,并展示给用户

    def register():
    username = input('注册用户名:').strip()
    password = input('注册密码:').strip()
    surepassword = input('确认密码:').strip()
    if not password == surepassword:
        print('两次密码不一致')
        return
    password = common.hashlib_msg(password)
    res = user_interface.register_interface(username, password)
    print(res)
第二层
    1.将用户名传入数据库判断用户名是否存在
    2.编写用户相关字典
    3.将用户字典传入数据库存储
    
    def register_interface(username, password):
    is_username = db_handler.select(username)
    if is_username:
        return '用户名已存在'
    user_dict = {
        'username': username,
        'password': password,
        'balance': 1000000,
        'shop_car': {},
        'bank_water': [],
        'is_blaklist': False
    }
    db_handler.save(user_dict)
    loger.info(f'用户{username}注册成功')
    return '注册成功'

第三层
    1.获取用户字典并存储 (创建存储数据相关的函数)
    2.获取用户名判断用户是否存在然后再读取 (创建查询数据相关的函数)
    
    def save(user_dict):
    username = user_dict.get('username')
    user_file = os.path.join(settings.DB_DIR, f'{username}.json')
    with open(user_file, 'w', encoding='utf8') as f:
        json.dump(user_dict, f, ensure_ascii=False)


def select(username):
    user_file = os.path.join(settings.DB_DIR, f'{username}.json')
    if not os.path.exists(user_file):
        return False
    with open(user_file, 'r', encoding='utf8') as f:
        return json.load(f)

2.登录功能

第一层
    1.获取用户输入
    2.调用第二层登录函数,将用户名密码传入并打印返回值
    
    def login():
    username = input('登录用户名:').strip()
    password = input('登录密码:').strip()
    password = common.hashlib_msg(password)
    res, res1 = user_interface.login_interface(username, password)
    if res:
        is_login['username'] = username
    print(res1)
    
第二层
    1.调用第三层的查数据函数查询用户名是否存在,并获取返回值
    2.判断返回值的布尔值
    3.判断输入的用户密码和存储的用户密码是否一致
    
    def login_interface(username, password):
    user_dict = db_handler.select(username)
    if not user_dict:
        return False, '用户名不存在'
    if user_dict.get('is_blaklist'):
        return False, '您已被拉入黑名单中,无法登陆'
    if user_dict.get('password') == password:
        loger.info(f'用户{username}登录成功')
        return True, '登录成功'
    else:
        return False, '密码错误'
    
第三层
    由于编写注册功能代码时就已经将第三层代码写好了,所以之后就可以直接调用第三层的函数
    
登录功能编写完以后需要考虑用户密码的安全性和之后的功能都是基于登录用户的
    1.用户密码的安全性
        用户注册登录都需要对密码进行加密,那么可以将加密代码封装成公共函数在登录注册时直接调用即可
    2.获取用户登录状态
        在本地使用全局变量来记录用户登录状态,也就是写在第一层,用户登录后全局变量的值更改为当前登录用户,第二步后面的每个函数在执行时都需要校验用户是否登录,在公共功能中编写用户登录校验装饰器

3.查看余额

第一层
    1.调用第二层对应函数,将全局变量记录的用户名作为参数传入
    2.获取返回值并打印
    
    @common.outer
def select_balance():
    res = user_interface.select_balance_interface(is_login.get('username'))
    print(res)
    
第二层
    1.调用第三层的查询函数
    2.获取用户字典
    3.获取用户字典中的余额作为返回值
    
    def select_balance_interface(username):
    user_dict = db_handler.select(username)
    balabce = user_dict.get('balance')
    loger.info(f'用户{username}查看了余额')
    return balabce

第三层
    执行查询函数即可

4.提现功能

第一层
    1.获取用户想要提现的金额
    2.调用第二层相应函数
    3.获取返回值并打印
    
    @common.outer
def withdraw():
    transfer_money = input('请输入要提现的金额(收取0.02%手续费):').strip()
    res = bank_interface.withdraw_interface(is_login.get('username'), transfer_money)
    print(res
          
第二层
    1.获取的用户提现金额为字符串需要转为整型
    2.调用第三层查询函数获取用户字典
    3.用户余额减去提现金额并扣除手续费
    4.调用第三层保存函数,保存修改后的用户字典
          
    def withdraw_interface(username, transfer_money):
    transfer_money = int(transfer_money)
    user_dict = db_handler.select(username)
    if transfer_money > user_dict.get('balance'):
        return '余额不足'
    user_dict['balance'] -= transfer_money
    service_charge = transfer_money * settings.SERVICE_CHARGE
    user_dict['balance'] -= service_charge
    ctime = time.strftime('%Y-%m-%d %X')
    user_dict['bank_water'].append(f'{ctime}成功提现{transfer_money}元,收取{service_charge}元手续费,余额为{user_dict.get("balance")}')
    db_handler.save(user_dict)
    loger.info(f'用户{username}提现了{transfer_money}')
    return f'成功提现{transfer_money}元,收取{service_charge}元手续费,余额为{user_dict.get("balance")}元'
    
注意:提现的金额为整数和小数或其他字符的处理
    手续费为可调,可以写入配置文件

5.充值功能

第一层
    1.获取用户充值金额
    2.调用第二层相应函数
    3.获取返回值并打印
    
    @common.outer
def recharge():
    recharge_money = input('请输入要充值的金额').strip()
    res = bank_interface.recharge_interface(is_login.get('username'), recharge_money)
    print(res)
    
第二层
    1.将用户输入的充值金额转为整型
    2.调用第三层查询函数获取用户字典
    3.用户余额数据处理
    4.保存处理过的用户字典,需调用第三层保存函数
    
    def recharge_interface(username, recharge_money):
    recharge_money = int(recharge_money)
    user_dict = db_handler.select(username)
    user_dict['balance'] += recharge_money
    ctime = time.strftime('%Y-%m-%d %X')
    user_dict['bank_water'].append(f'{ctime}成功充值{recharge_money}元,充值后余额{user_dict.get("balance")}元')
    db_handler.save(user_dict)
    loger.info(f'用户{username}充值{recharge_money}')
    return f'充值成功,充值后余额{user_dict.get("balance")}元'

6.转账功能

第一层
    1.获取转账目标用户和转账金额
    2.调用第二层相应函数
    3.获取返回值并打印
    
    @common.outer
def transfer_accounts():
    target_user = input('您要转账的用户是:').strip()
    transfer_money = input('您要转账的金额是:').strip()
    res = bank_interface.transfer_accounts_interface(is_login.get('username'), target_user, transfer_money)
    print(res)
    
第二层
    1.对获取的金额进行处理转为整型
    2.调用第三层查询函数,根据返回值的布尔值判断目标用户是否存在
    3.调用第三层查询函数,获取当前用户字典
    4.对当前用户和目标用户的余额进行相应的运算处理
    5.将处理过后的两个用户字典调用第三层保存函数进行保存
    
    def transfer_accounts_interface(username, target_user, transfer_money):
    transfer_money = int(transfer_money)
    target_user_dict = db_handler.select(target_user)
    if not target_user_dict:
        return f'要转账的用户{target_user}不存在'
    user_dict = db_handler.select(username)
    user_dict['balance'] -= transfer_money
    target_user_dict['balance'] += transfer_money
    ctime = time.strftime('%Y-%m-%d %X')
    user_dict['bank_water'].append(f'{ctime},成功转账{transfer_money}元,转账后余额{user_dict.get("balance")}元')
    target_user_dict['bank_water'].append(f'{ctime}从{username}转入{transfer_money}元')
    db_handler.save(user_dict)
    db_handler.save(target_user_dict)
    loger.info(f'用户{username}转账给{target_user}{transfer_money}元')
    return f'转账成功,本次转账{transfer_money}元,转账后余额{user_dict.get("balance")}元'

7.查看流水

在注册功能构造用户字典时,在用户字典内创建一个存储用户流水的键值对,之后每一次对用户余额进行操作时都记录下并存入用户字典】
    查询时质询查找到对应用户的用户字典打印存储流水的键值对的值即可

用户可以记录用户流水那么也可以记录软件操作日志,将日志字典放入配置文件中,在公共功能中构造一个自动加载日志字典配置的函数,每执行一次功能就调用一次该函数并产生日志

@common.outer
def select_water():
    res = bank_interface.select_water_interface(is_login.get('username'))
    print(res)
    
def select_water_interface(username):
    loger.info(f'{username}查看了银行流水')
    userdict = db_handler.select(username)
    if not userdict.get('bank_water'):
        return '尚未产生流水'
    for i in userdict.get('bank_water'):
        print(i)
    return

8.添加购物车

第一层
    1.直接调用第二层相应函数
    
    @common.outer
def add_shop_car():
    res = shop_interface.add_shop_car_interface(is_login.get('username'))
    print(res)
    
第二层
    1.获取商品信息并构造一个临时存储商品的字典
    2.循环展示商品信息
    3.用户选择商品
    4.验证用户输入的商品编号
    5.输入购买个数
    6.将购买的商品存入临时字典中
    7.用户退出购买,将临时字典中的数据保存到购物车中
    
    def add_shop_car_interface(username):
    temp_good_dict = {}
    # 1.获取商品信息
    while True:
        good_list = [
            ['挂壁面', 3],
            ['印度飞饼', 22],
            ['极品木瓜', 666],
            ['土耳其土豆', 999],
            ['伊拉克拌面', 1000],
            ['董卓戏张飞公仔', 2000],
            ['仿真玩偶', 10000]
        ]
        # 2.循环展示商品信息
        for num, good in enumerate(good_list):
            print(f'{num}  |  {good[0]}  |  {good[1]}')
        # 3.用户选择商品,输入商品编号
        num = input('请输入您要选择的商品编号(q):').strip()
        # 5.用户买完商品将商品数据保存到购物车中
        if num == 'q':
            username_dict = db_handler.select(username)
            user_shop_char = username_dict.get('shop_car')
            for g_name, g_list in temp_good_dict.items():
                if g_name in user_shop_char:
                    user_shop_char[g_name][0] += g_list[0]
                else:
                    user_shop_char[g_name] = g_list
                    loger.info(f'用户{username}购买了'
                               f'商品:{g_name}  |  数量:{g_list[0]}  |  单价:{g_list[1]}')
            db_handler.save(username_dict)


            return
        if not num.isdigit():  # 验证用户输入的商品编号是否为数字
            print('商品编号为纯数字')
            continue
        num = int(num)
        if num not in range(len(good_list)):  # 验证用户输入的商品编号是否存在
            print('无此编号商品')
            continue
        good_num = input('您要买多少个').strip()
        good_num = int(good_num)
        # 4.将用户购买的商品保存到临时字典中
        good_name = good_list[num][0]
        if good_list[num][0] in temp_good_dict:
            temp_good_dict[good_name][0] += good_num
        else:
            temp_good_dict[good_name] = [good_num, good_list[num][1]]

9.购物车支付

第一层
    1.直接调用第二层相关函数
    
    @common.outer
def pay_shop_car():
    res = shop_interface.pay_shop_car_interface(is_login.get('username'))
    print(res)
    
第二层
    1.调用第三层查询函数,获取用户字典
    2.获取用户购物车
    3.计算购物车中商品总额
    4.比较购物车商品总额与用户余额
    5.支付
    6.将修改后的用户字典重新保存
    
    def pay_shop_car_interface(username):
    username_dict = db_handler.select(username)
    user_shop_char = username_dict.get('shop_car')
    pay_money = 0
    balance = username_dict.get('balance')
    for good_list in user_shop_char.values():
        pay_money += good_list[0] * good_list[1]
    if balance < pay_money:
        print('余额不足')
    else:
        username_dict['balance'] -= pay_money
        username_dict['shop_car'] = {}
        loger.info(f'用户{username}支付购物车{pay_money}')
        print('结算成功')
    db_handler.save(username_dict)

标签:username,money,ATM,用户,购物车,dict,user,interface
From: https://www.cnblogs.com/zyg111/p/16845705.html

相关文章

  • ATM+购物车开发流程
    ATM项目开发流程1.项目需求分析ATM一系列小功能:注册,登录,提现,转账,充值,查看流水,购物车,管理员2.ATM架构设计第一层与用户直接打交道不参与核心逻辑的编写(数据展示与......
  • ATM+购物车项目实战练习
    ATM+购物车项目实战练习项目开发流程在实际的项目开发中,我们通常要经历项目需求分析,架构设计,分组开发,提交测试,交付上线等环节,而作为程序员的我们就可能要经历前三个环节......
  • ATM购物车项目概要
    目录ATM购物车项目概要项目开发流程项目需求分析(具体功能)项目架构设计ATM购物车项目概要项目开发流程需求分析架构设计分组开发提交测试交付上线项目需求分析(......
  • ATM+购物车(思路流程)
    ATM+购物车(思路流程)启动文件首先,创建一个start.py作为整个项目启动的启动文件然后导入os和sys模块,从core中导入src,也就是展示给用户看的在src.py用户视图层中,先......
  • ATM项目的编写
    目录ATM项目的编写项目流程开发项目需求分析项目架构设计项目目录搭建项目功能搭建ATM项目的编写项目流程开发1.需求分析2.架构设计3.分组开发4.提交测试5.交付上线......
  • ATM购物车项目总结
    目录项目实现思路ATM项目优先实现功能拆分函数项目路径展示项目启动文件bin/start.py配置文件conf/setting.py日志模块展示层core/src.py用户注册register1.获取用户......
  • 60-ES10-数组方法扩展-flat与flatMap
     ......
  • react实战笔记88:初步完成购物车条x
    购物车结构......
  • react实战笔记96:完成购物车2
     清除数据 不会整体消失......
  • react实战笔记92:完成购物车详情2
    实现购物车详情......