zoukankan      html  css  js  c++  java
  • python 23 ATM

    1,分析需求

    1.额度15000或自定义     -->  注册功能
    2.实现购物商城,买东西加入购物车,调用信用卡接口结账  --> 购物功能、支付功能
    3.可以提现,手续费5%   --> 提现功能
    4.支持多账户登录  --> 登录功能
    5.支持账户间转账  --> 转账功能
    6.记录日常消费 -->  记录流水功能
    7.提供还款接口 -->  还款功能
    8.ATM记录操作日志 --> 记录日志功能
    9.提供管理接口,包括添加账户、用户额度,冻结账户等。。。 ---> 管理员功能
    10.用户认证用装饰器  --> 登录认证装饰器
    
    • "用户视图层" 展示给用户选择的功能
      1、注册功能
      2、登录功能
      3、查看余额
      4、提现功能
      5、还款功能
      6、转账功能
      7、查看流水
      8、购物功能
      9、查看购物车
      10、管理员功能

    2,程序的架构设计

    三层架构
    一 用户视图层
    用于与用户交互的,可以接受用户的输入,打印接口返回的数据。

    二 逻辑接口层
    接受 用户视图层 传递过来的参数,根据逻辑判断调用数据层加以处理,
    并返回一个结果给 用户视图层。

    三 数据处理层
    接受接口层传递过来的参数,做数据的
    - 保存数据 save()
    - 查看数据 select()
    - 更新数据
    - 删除数据

    3,创建atm文件项目所有所需要的子文件夹及py文件

    conf——sttings.py 配置文件
    core——src.py 用户视图层
    interface——user_interface.py(用户接口),bank_interface.py(银行接口),shopping_interface.py(购物接口)
    db——db_handler.py 数据相关的操作
    lib——common.py 公共功能
    star.py 项目开始文件
    log——存放日志
    readme 项目介绍

    4,开始写功能

    star.py 项目开始文件

    import os
    import sys
    
    from conf import settings
    sys.path.append(settings.BASE_PATH)
    
    from core import src
    if __name__ == '__main__':
        src.run()
    
    

    sttings.py 配置文件

    import os
    import sys
    
    BASE_PATH=os.path.dirname(os.path.dirname(__file__))
    
    USER_DATA_PATH = os.path.join(BASE_PATH, 'db', 'user_data')
    

    src.py 用户视图层

    from interface import user_interface
    from interface import bank_interface
    from lib import common
    
    # 全局变量
    login_user = None
    
    
    def register():
        while True:
            username = input('请输入用户名: ').strip()
            password = input('请输入密码: ').strip()
            re_password = input('请确认密码: ').strip()
            if password == re_password:
                flag, msg = user_interface.register_interface(username, password)
                if flag:
                    print(msg)
                    break
                else:
                    print(msg)
    
    
    
    def login():
        while True:
            username = input('请输入用户名: ').strip()
            password = input('请输入密码: ').strip()
            flag, msg = user_interface.login_interface(username, password)
            if flag:
                print(msg)
                global login_user
                login_user = username
                break
            else:
                print(msg)
    
    @common.login_auth
    def check_balance():
        balance = user_interface.check_bal_interface(login_user)
        print(f'用户{login_user} 账户余额为: {balance}')
    
    @common.login_auth
    def withdraw():
        while True:
            input_money = input('请输入提现金额: ').strip()
            if not input_money.isdigit():
                print('请重新输入')
                continue
            flag, msg = bank_interface.withdraw_interface(login_user, input_money)
            if flag:
                print(msg)
                break
            else:
                print(msg)
    
    @common.login_auth
    def payback():
        pass
    
    @common.login_auth
    def transfer():
        pass
    
    @common.login_auth
    def check_flow():
        pass
    
    @common.login_auth
    def shopping():
        pass
    
    @common.login_auth
    def check_shopcar():
        pass
    
    
    def admin():
        pass
    
    
    #函数字典
    funcdic={
        '1': register,
        '2': login,
        '3': check_balance,
        '4': withdraw,
        '5': payback,
        '6': transfer,
        '7': check_flow,
        '8': shopping,
        '9': check_shopcar,
        '10': admin,
        }
    
    def run():
        while True:
            print('''
            ===== ATM + 购物车 =====
                1、注册功能
                2、登录功能
                3、查看余额
                4、提现功能
                5、还款功能
                6、转账功能
                7、查看流水
                8、购物功能
                9、查看购物车
                10、管理员功能
            ========= end =========
            ''')
            choice=input('请输入操作(q退出):')
            if choice=='q':
                break
            else:
                if choice not in funcdic:
                    print('输入有误')
                else:
                    funcdic[choice]()
    

    user_interface.py(用户接口)

    from db import db_handler
    from lib import common
    
    def register_interface(username, password, balance=15000):
        user_dic = db_handler.select(username)
        if user_dic:
            return False, '用户名已存在!'
        password = common.get_pwd_md5(password)
        user_dic = {
            'username': username,
            'password': password,
            'balance': balance,
            'flow': [],
            'shop_car': {},
            'locked': False
        }
        db_handler.save(user_dic)
        return True, f'{username} 注册成功!'
    
    
    def login_interface(username, password):
        user_dic = db_handler.select(username)
        if user_dic:
            password = common.get_pwd_md5(password)
            if password == user_dic.get('password'):
                return True, f'用户: [{username}] 登录成功!'
            else:
                return False, '密码错误'
        return False, '用户不存在,请重新输入!'
    
    
    def check_bal_interface(username):
        user_dic = db_handler.select(username)
        return user_dic['balance']
    
    

    bank_interface.py(银行接口)

    from db import db_handler
    
    
    def withdraw_interface(username, money):
        user_dic = db_handler.select(username)
        balance = int(user_dic.get('balance'))
        money2 = int(money) * 1.05
        if balance >= money2:
            balance -= money2
            user_dic['balance'] = balance
            db_handler.save(user_dic)
            return True, f'用户[{username}] 提现金额[{money}$]成功,手续费为: [{money2 - float(money)}$]'
        return False, '金额不足,请重新输入!'
    
    

    shopping_interface.py(购物接口)

    
    

    db_handler.py 数据相关的操作

    import json
    import os
    from conf import settings
    
    def select(username):
        user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json')
        if os.path.exists(user_path):
            with open(user_path, 'r', encoding='utf-8') as f:
                user_dic = json.load(f)
                return user_dic
    
    def save(user_dic):
        username = user_dic.get('username')
    
        user_path = os.path.join(settings.USER_DATA_PATH, f'{username}.json')
        with open(user_path, 'w', encoding='utf-8') as f:
            json.dump(user_dic, f, ensure_ascii=False)
    
    

    common.py 公共功能

    import hashlib
    
    def get_pwd_md5(password):
        md5_obj = hashlib.md5()
        md5_obj.update(password.encode('utf-8'))
        salt = '一二三四五,上山打老鼠!'
        md5_obj.update(salt.encode('utf-8'))
        return md5_obj.hexdigest()
    
    
    def login_auth(func):
        from core import src
        def inner(*args, **kwargs):
            if src.login_user:
                res = func(*args, **kwargs)
                return res
            else:
                print('未登录,请登录')
                src.login()
        return inner
    
  • 相关阅读:
    iOS内购开发(也许是最全的介绍)
    React Native 学习(三)之 FlexBox 布局
    React Native组件解析(二)之Text
    苹果开发者账号(个人、公司、企业)的区别
    React Native学习(二)之View
    搭建React Native开发环境
    iOS 提交AppStore不出现构建的版本
    Python使用Mysql过程中一些错误
    数据分析之漏斗模型
    项目管理之敏捷方式(我们的方式)
  • 原文地址:https://www.cnblogs.com/Franciszw/p/12623242.html
Copyright © 2011-2022 走看看