zoukankan      html  css  js  c++  java
  • ATM_购物车

    ATM+购物车

    目录

    ATM购物车

    一、一个项目是如何从无到有的

    1.需求分析
        注册,登陆,查看余额,支付,购物车,
        提现,还款,转账,查看流水,注销,管理员,
        查看购物车,登陆认证装饰器, 密码加密
    
    2.程序的架构设计
        三层架构:
            用户功能层: 接收用户输入的内容,展示给用户的内容. 小的逻辑判断,例如两次密码是否一致.
            接口层: 处理业务逻辑.
            数据处理层: 对数据进行增删查改.
    
    3.分任务开发
    4.测试
    5.上线运行
    

    二、项目需求

    1.注册
    2.登录
    3.转账
    4.查询余额
    5.还款
    6.取款
    7.查看流水
    8.购物
    9.查看购买商品
    10.管理员
    q.注销 
    
    
    需要登录认证装饰器
    管理员:冻结、解冻用户
    

    三、项目开发

    random.txt 项目说明文件

    ATM + 购物车
    
    前戏: 一个项目是如何从无到有的.
    
    一 需求分析
        对项目需求进行分析,并提取出相应的功能.
    
        - 额度15000或自定义  ---> 注册功能
    
        - 实现购物商城,买东西加入购物车,调用信用卡接口结账  ---> 购物车, 支付功能
    
        - 可以提现,手续费5%  ---> 提现
    
        - 支持多账户登录  ---> 登陆
    
        - 支持账户间转账   ---> 转账
    
        - 记录每月日常消费流水  ---> 记录流水
    
        - 提供还款接口  ---> 还款
    
        - ATM记录操作日志  ---> 日志功能
    
        - 提供管理接口,包括添加账户、用户额度,冻结账户等...  ---> 管理员功能
    
        - 用户认证功能  ---> 登陆认证,使用装饰器
    
    二 程序的架构设计
        用户功能层:
            负责接收用户输入的内容,并返回结果给用户.
            做一些小的逻辑判断.
    
        接口层:
            处理业务逻辑.
    
        数据处理层:
            对文件进行处理.
            增,删,查,改操作.
    
        三层架构的好处:
            1.代码结构清晰
            2.可扩展性强.
            3.易维护,管理.
    
    
    三 分任务开发
        - CTO
            - 技术总监
                - 架构师
                    - 项目经理
                        - 普通开发
                            UI: 用户界面设计师
                            前端: 网页的开发
                            后端: 写业务逻辑,写接口
                            测试: 测试软件
                            运维: 部署项目.
    
    四 测试
        - 手动测试
            传统人工去手动测试.
    
        - 自动化测试
            通过脚本模拟人的行为,自动化执行测试.
    
        - 黑盒测试:
            对用户界面进行测试.
    
        - 白盒测试:
            对软件的性能进行测试,例如每分钟能接收多少并发量.
    
    五 上线运行
        把测试好的代码交给运维人员, 部署上线.
    

    start.py 项目启动文件

    import os
    import sys
    from core import src
    BASE_PATH = os.path.dirname(__file__)
    # 添加到环境变量
    sys.path.append(BASE_PATH)
    
    if __name__ == '__main__':
        src.run()
    

    conf--------setting.py 系统环境变量配置

    import os
    
    BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    DB_PATH = os.path.join(BASE_PATH, 'db')
    

    core------src.py 业务核心逻辑

    from interface import user_interface
    from interface import bank_interface
    from interface import shoping_interface
    from lib import common
    from interface import admin_interface
    import datetime
    
    user_info = {
        'user': None
    }
    
    
    def register():
        while True:
            print("---注册---")
            user_name = input('请输入用户名:').strip()
            passwd = input('请输入密码:').strip()
            passwd_d = input('确认密码:').strip()
            # 接口
            flat = user_interface.check_user_interface(user_name)
            if flat:
                print('用户已存在,重新输入!')
                continue
            elif passwd == passwd_d:
                # 接口
                user_interface.register_inerface(user_name, passwd)
                print('注册成功!')
                break
    
    
    def login():
        while True:
            print("---登录---")
            user = input('输入用户名:').strip()
            passwd = input('输入密码:').strip()
            flag, msg = user_interface.login_interface(user, passwd)
            if flag:
                print(msg)
                user_info['user'] = user
                break
            else:
                print(msg)
                break
    
    
    @common.outter
    def transfer():
        while True:
            print("---转账---")
            to_name = input('输入转账目标用户:')
            to_user = user_interface.check_user_interface(to_name)
            if to_user:
                money = input('请输入转账金额:').strip()
                if money.isdigit():
                    money = int(money)
                    flaw, msg = bank_interface.transfer_interface(to_name, money, user_info['user'])
                    if flaw:
                        print(msg)
                        break
                    else:
                        print(msg)
                        break
                else:
                    print('输入不正确!!')
                    continue
    
            else:
                print('用户不存在,重新输入!')
                continue
    
    
    @common.outter
    def check_balance():
        print("---查询余额---")
        bank_interface.select_money(user_info['user'])
    
    
    @common.outter
    def repayment():
        print("---还款---")
        money = input('输入还款金额:').strip()
        if money.isdigit():
            money = int(money)
            bank_interface.repayment_interface(user_info['user'], money)
        else:
            print('输入不正确!')
    
    
    @common.outter
    def withdraw_money():
        print("---取款---")
        money = input('输入取款金额:').strip()
        if money.isdigit():
            money = int(money)
            if money >= 0:
                bank_interface.withdraw_interface(user_info['user'], money)
            else:
                print('必须大于0')
        else:
            print("输入不正确!")
    
    
    @common.outter
    def view_pipelining():
        print("---查看流水---")
        bank_interface.see_worter_interface(user_info['user'])
    
    
    @common.outter
    def shopping():
    
        # 购买过的商品
        pay_list = []
        num_money = 0
        while True:
            print("---购物---")
            shopping_list = [
                ['QBZ95自动步枪', 999],
                ['M4A1', 999],
                ['手雷', 99],
                ['防弹衣', 299],
                ['尼泊尔军刀', 199],
                ['坦克', 5000000],
                ['神秘武器VIP', 1000000]
            ]
    
            # 打印商品列表
            for index, i in enumerate(shopping_list):
                print(index, i)
            print('q.退出 w.结账 e.查看已选商品')
            choice = input('请快速配置你的装备:').strip()
            if choice == 'q':
                break
    
            elif choice == 'w':
                yes = input('是否结账?y/n:')
                if yes == 'y':
                    # 调用接口结账
                    bank_interface.payment(num_money, user_info['user'])
                    # 调用接口保存购买商品
                    shoping_interface.save_car(pay_list, user_info['user'])
                    break
                elif yes == 'n':
                    continue
            elif choice == 'e':
                print('---已选商品---')
                for index, i in enumerate(pay_list):
                    print(index, i)
                continue
    
            # 1.判断输入是否为数字
            if not choice.isdigit():
                print('输入不合法!!!你还有两次机会')
                continue
            # 2.输入的为字符串,转成int数字型
            choice = int(choice)
            # 3.判断选择是否再范围内
            if 0 <= choice <= len(shopping_list):
                name, money = shopping_list[choice]
    
                # 4.添加到已选商品
                now_time = datetime.datetime.today()
                now_time = str(now_time)
                # 时间处理操作  2019-11-21 18:45:18.803910  处理为2019-11-21 18:45:18
                now_time = now_time[0:19]
                # 添加时间
                shopping_list[choice].append(now_time)
                pay_list.append(shopping_list[choice])
                # 计价
                num_money += money
                print('添加成功')
                continue
            else:
                print('请选择正确的范围!!!')
                continue
    
    
    @common.outter
    def shopping_cat():
        while True:
            print("---查看购买商品---")
            shoping_interface.select_car(user_info['user'])
            break
    
    
    def admin():
        while True:
            print('''
            1:冻结用户
            2:解冻用户
            q:退出
            ''')
            dict = {
                '1': lock,
                '2': unlock
            }
    
            choice = input('请输入你的功能:').strip()
            if choice == 'q':
                break
            elif not choice.isdigit():
                print('请输入数字!!')
                continue
            elif choice in dict:
                dict[choice]()
            else:
                print("你的输入有误,重新输入!!!")
                continue
    
    
    def lock():
        print('---冻结用户---')
        user_name = input('请输入你要冻结的用户名:').strip()
        yes = input('确认冻结该用户?  y/n:')
        if yes == 'y':
            res = admin_interface.lock_interface(user_name)
            print(res)
        elif yes == 'n':
            print('已取消冻结!')
        else:
            print('输入有误,重新输入!')
    
    
    def unlock():
        print('---解冻用户---')
        user_name = input('请输入你要解冻的用户名:').strip()
        yes = input('确认解冻该用户?  y/n:')
        if yes == 'y':
            res = admin_interface.unlock_interface(user_name)
            print(res)
        elif yes == 'n':
            print('已取消解冻!')
        else:
            print('输入有误,重新输入!')
    
    
    
    
    def run():
        while True:
            print('''
            1.注册
            2.登录
            3.转账
            4.查询余额
            5.还款
            6.取款
            7.查看流水
            8.购物
            9.查看购买商品
            10.管理员
            q.注销    
            ''')
            list_dic = {
                '1': register,
                '2': login,
                '3': transfer,
                '4': check_balance,
                '5': repayment,
                '6': withdraw_money,
                '7': view_pipelining,
                '8': shopping,
                '9': shopping_cat,
                '10': admin
            }
            choice = input('前选择功能编号:').strip()
            if choice == 'q':
                break
    
            elif choice in list_dic:
                list_dic.get(choice)()
    
            else:
                print('选择功能有误,请重新输入:')
                continue
    

    db-----db_hander.py 真实数据层

    from conf import setting
    import os
    import json
    
    
    def select_user(user):
        user_path = f'{setting.DB_PATH}/{user}.json'
    
        if os.path.exists(user_path):
            with open(user_path,'r',encoding='utf-8')as f:
                user_dict = json.load(f)
                return user_dict
        else:
            return False
    
    
    def save(user_dict):
        # 路径
        user_path = f'{setting.DB_PATH}/{user_dict["user"]}.json'
        # 保存
        with open(user_path, 'w', encoding='utf-8')as f:
            json.dump(user_dict, f, ensure_ascii=False)
            f.flush()
    

    interface-----admin_interface.py 管理员接口

    from db import db_hander
    
    
    # 冻结用户
    def lock_interface(user_name):
            user_dict = db_hander.select_user(user_name)
            if user_dict:
                user_dict['lock'] = False
                # 保存更新
                db_hander.save(user_dict)
                return '已冻结!'
            else:
                return '不存在该用户,重新输入!'
    
    
    # 解冻用户
    def unlock_interface(user_name):
        user_dict = db_hander.select_user(user_name)
        if user_dict:
            user_dict['lock'] = True
            # 保存更新
            db_hander.save(user_dict)
            return '已解冻!'
        else:
            return '不存在该用户,重新输入!'
    

    interface----bank_interface.py 银行接口

    from db import db_hander
    import datetime
    
    # 转账接口
    def transfer_interface(to_name, money, user):
        to_user_dict = db_hander.select_user(to_name)
        user_dict = db_hander.select_user(user)
    
        if to_name != user:
            # 判断转账的钱是否大于余额
            if 0 <= money <= user_dict['balance']:
                # 加减钱的操作
                user_dict['balance'] -= money
                to_user_dict['balance'] += money
    
                # 拼接
                my = user_dict['balance']
                to = to_user_dict['balance']
                time = datetime.datetime.today()
                msg = f'【{user}】用户给【{to_name}】用户转账【{money}】元,当前余额【{my}】元    {time}'
                flg = f'【{to_name}】用户给收到【{user}】用户转账【{money}】元,当前余额【{to}】元    {time}'
                # 添加到流水信息
                user_dict['worter'].append(msg)
                to_user_dict['worter'].append(flg)
    
                # 保存数据
                db_hander.save(user_dict)
                db_hander.save(to_user_dict)
    
    
                return True, msg
            else:
                msg = '余额不足'
                return False, msg
        else:
            return False, '不允许给自己账户转账!'
    
    # 查看余额
    def select_money(user):
        user_dict = db_hander.select_user(user)
        money = user_dict['balance']
        return print('当前余额为【%s】元' % money)
    
    
    # 还款接口
    def repayment_interface(user, money):
        user_dict = db_hander.select_user(user)
        # 加钱操作
        user_dict['balance'] += money
    
        a = user_dict['balance']
        time = datetime.datetime.today()
        msg = f'【{user}】用户还款【{money}】元成功,当前余额【{a}】元   {time}'
        # 添加到流水信息
        user_dict['worter'].append(msg)
        # 保存更新
        db_hander.save(user_dict)
    
    
        return print(msg)
    
    
    # 取款接口
    def withdraw_interface(user, money):
        while True:
            user_dict = db_hander.select_user(user)
            # 判断余额是否足够
            if money <= user_dict['balance']*1.05:
                # 减钱操作,手续费
                money_s = money*0.05
                user_dict['balance'] -= money*1.05
    
                a = user_dict['balance']
                time = datetime.datetime.today()
                msg = f'【{user}】用户取款【{money}】元成功,手续费5%【{money_s}】元,当前余额【{a}】元   {time}'
    
                # 添加到流水信息
                user_dict['worter'].append(msg)
    
                # 保存更新
                db_hander.save(user_dict)
                return print(msg)
            else:
                print('余额不足!!')
                break
    
    
    # 查看流水
    def see_worter_interface(user):
        user_dict = db_hander.select_user(user)
        worter = user_dict['worter']
        for i in worter:
            print(i)
    
    # 结账接口
    def payment(num_money,user):
        while True:
            user_dict = db_hander.select_user(user)
            if num_money <= user_dict['balance']:
                # 减钱的操作
                user_dict['balance'] -= num_money
    
                a = user_dict['balance']
                time = datetime.datetime.today()
                msg = f'【{user}】用户购买商品成功,消费【{num_money}】元,当前余额【{a}】元    {time}'
                # 记录流水
                user_dict['worter'].append(msg)
                # 保存信息
                db_hander.save(user_dict)
                print(msg)
                break
            else:
                print('余额不足,请充值!!!')
                break
    

    interface----shoping_interface.py 购物接口

    from db import db_hander
    
    # 保存购物车
    def save_car(shopping_list, user):
        user_dict = db_hander.select_user(user)
        # 添加到字典
        user_dict['shop_car'].append(shopping_list)
        # 保存
        db_hander.save(user_dict)
    
    # 查看购物车
    def select_car(user):
        user_dict = db_hander.select_user(user)
        car_list = user_dict['shop_car']
        # for index, i in enumerate(car_list):
        #     print(index, i)
        for line in car_list:
            for index, i in enumerate(line):
                print(index, i)
    

    interface----user_interface.py 用户接口

    from db import db_hander
    from lib import common
    
    
    # 查看用户是否存在接口,存在返回Turn和字典,不存在返回False
    def check_user_interface(user):
        user_dict = db_hander.select_user(user)
        if user_dict:
            return user_dict
        else:
            return False
    
    
    # 注册接口
    def register_inerface(user, passwd):
        # 调用接口,加密
        pwd = common.get_md5(passwd)
    
        # 把用户所有信息做成一个字典,然后调用接口保存
        user_dict = {
            'user': user,
            'pwd': pwd,
            'balance': 10000,
            'worter': [],
            'shop_car': [],
            'lock': True
        }
    
        db_hander.save(user_dict)
    
        return f'{user_dict["user"]}用户注册成功!'
    
    
    # 登录接口
    def login_interface(user, passwd):
        user_dict = db_hander.select_user(user)
        passwd = common.get_md5(passwd)
        # 如果用户存在
        if user_dict:
            # 如果用户没有被锁
            if user_dict['lock'] == True:
                # 如果密码正确
                if passwd == user_dict['pwd']:
                    return True, '登录成功!'
                else:
                    return False, '用户名或密码不正确,重新输入!'
            else:
                return False, '用户已被解冻,请联系管理员!'
        else:
            return False, '用户名或密码不正确,重新输入!'
    

    lib----common.py 公共功能

    import hashlib
    from core import src
    
    def get_md5(pwd):
        val = '辜氏家族终极密码'
        md5 = hashlib.md5()
        md5.update(val.encode('utf-8'))
        md5.update(pwd.encode('utf-8'))
        res = md5.hexdigest()
        return res
    
    def outter(func):
    
        def inner(*args, **kwargs):
            while True:
                if src.user_info['user']:
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('请先登录!')
                    break
        return inner
    
  • 相关阅读:
    jquery自调用匿名函数解析
    C# 分页
    C#一般处理程序获取Session
    Python全栈开发,Day12
    Python全栈开发,Day11
    Python全栈开发,Day10
    Python全栈开发,Day9
    Python全栈开发,Day8
    Python全栈开发,Day7
    Python全栈开发,Day6
  • 原文地址:https://www.cnblogs.com/WQ577098649/p/11950838.html
Copyright © 2011-2022 走看看