26、ATM项目的编写流程

1、搭建项目的目录规范

- ATM 项目根目录
        - readme.md  项目的说明书

        - start.py  项目启动文件

        - conf  配置文件
            - settings.py

        - lib   公共方法文件
            - common.py

        - core(用户视图层)  存放用户视图层代码文件
            - src.py

        - interface(逻辑接口层)   存放核心业务逻辑代码
            - user_interface.py   用户相关的接口
            - bank_interface.py   银行相关的接口
            - shop_interface.py   购物相关的接口

        - db(数据处理层)  存放数据与数据处理层代码
            - db_handler.py  数据处理层代码
            - user_data  用户数据

        - log  存放日志文件

2.1、启动项的编写

  启动文件——start文件——先将解释器添加到环境变量

sys.path.append(
    os.path.dirname(__file__)
)

2.2、启动文件——start文件——导入用户视层图

from core import src

2.3、启动文件——start文件——编写开启项目启动函数

if __name__ == ‘__main__‘:

2.4、启动文件——start文件——先执行用户视层图

   src.run()

3.1、获取项目根目录路径

BASE_PATH = os.path.dirname(
    os.path.dirname(__file__)
)

3.2、获取user_data文件夹目录路径

USER_DATA_PATH = os.path.join(
    BASE_PATH, ‘db‘, ‘user_data‘)

4.2.13、用户视图层core——src.py——视图层主程序的编写

def run():
    while True:
        print(‘‘‘
        ===== ATM + 购物车 =====
            1、注册功能
            2、登录功能
            3、查看余额
            4、提现功能
            5、还款功能
            6、转账功能
            7、查看流水
            8、购物功能
            9、查看购物车
            10、管理员功能
        ========= end =========
        ‘‘‘)

4.2.13、用户视图层core——src.py——各种功能的空函数

# 1、注册功能
def register():

# 2、登录功能
def login():

# 3、查看余额
@common.login_auth
def check_balance():

# 4、提现功能
@common.login_auth
def withdraw():

# 5、还款功能
@common.login_auth
def repay():

# 6、转账功能
@common.login_auth
def transfer():

# 7、查看流水
@common.login_auth
def check_flow():

# 8、购物功能
@common.login_auth
def shopping():

# 9、查看购物车
@common.login_auth
def check_shop_car():

# 10、管理员功能(考试额外加分项)
@common.login_auth
def admin():

4.2.12、用户视图层core——src.py——创建函数功能字典

func_dic = {
    ‘1‘: register,
    ‘2‘: login,
    ‘3‘: check_balance,
    ‘4‘: withdraw,
    ‘5‘: repay,
    ‘6‘: transfer,
    ‘7‘: check_flow,
    ‘8‘: shopping,
    ‘9‘: check_shop_car,
    ‘10‘: admin,
}

4.2.13.1、用户视图层core——src.py——视图层主程序的编写——让用户选择功能编号

choice = input(‘请输入功能编号: ‘).strip()

4.2.13.2、用户视图层core——src.py——视图层主程序的编写——判断功能编号是否存在

        if choice not in func_dic:
            print(‘请输入正确的功能编号!‘)
            continue

4.2.13.3、用户视图层core——src.py——视图层主程序的编写——调用选择的函数功能

func_dic.get(choice)()

4.2.2、用户视图层core——src.py——注册功能

  从interface中调用到user_interface

form interface import user_interfacedef register():
    while True:
        username = input(‘请输入用户名: ‘).strip()
        password = input(‘请输入密码: ‘).strip()
        re_password = input(‘请确认密码: ‘).strip()
        if password == re_password:

4.2、用户视图层core——src.py——将数据接口的模块导入

from interface import user_interface
from interface import bank_interface
from interface import shop_interface
from lib import common

6.4.2.2、逻辑接口层interface——user_interface.py——注册接口——判断用户是否存在

  保存数据时需要做加密处理

def register_interface(username, password, balance=15000):
    # 2)查看用户是否存在
    # 2.1) 调用 数据处理层 中的 select函数,会返回 用户字典 或 None
    user_dic = db_handler.select(username)

    # {user: user, pwd: pwd...}   or  None
    # 若用户存在,则return,告诉用户重新输入
    if user_dic:
        # return (False, ‘用户名已存在!‘)
        return False, ‘用户名已存在!‘

7.1.1、公共文件lib——common.py——md5加密

import hashlib
# md5加密
def get_pwd_md5(password):
    md5_obj = hashlib.md5()
    md5_obj.update(password.encode(‘utf-8‘))
    salt = ‘一二三四五,Egon上山打老鼠!‘
    md5_obj.update(salt.encode(‘utf-8‘))
    return md5_obj.hexdigest()

6.4.2.1、逻辑接口层interface——user_interface.py——注册接口——给用户输入的密码做一次加密

    # 3)若用户不存在,则保存用户数据
    # 做密码加密
    password = common.get_pwd_md5(password)
    # 3.1) 组织用户的数据的字典信息
    user_dic = {
        ‘username‘: username,
        ‘password‘: password,
        ‘balance‘: balance,
        # 用于记录用户流水的列表
        ‘flow‘: [],
        # 用于记录用户购物车
        ‘shop_car‘: {},
        # locked:用于记录用户是否被冻结
        # False: 未冻结   True: 已被冻结
        ‘locked‘: False
    }

    # 3.2)保存数据
    db_handler.save(user_dic)
    msg = f‘{username} 注册成功!‘

    # 3.3)记录日志
    user_logger.info(msg)

    return True, msg

  注册接口将会传递一个username,给数据处理层,去确定是否已经被注册

5.2.1、数据处理层db——db_handler.py——查看数据

  需要从settings调用地址

  使用os内置函数

import osfrom conf import settings
# 1) 接收接口层传过来的username用户名,拼接用户json文件路径user_path = os.path.join(    settings.USER_DATA_PATH, f‘{username}.json‘)

# 2)校验用户json文件是否存在if os.path.exists(user_path):    # 3) 打开数据,并返回给接口层    with open(user_path, ‘r‘, encoding=‘utf-8‘) as f:        user_dic = json.load(f)        return user_dic

5.2.2、数据处理层db——db_handler.py——保存数据

  使用json函数


import json
# 保存数据(添加新数据或者更新数据)
def save(user_dic):
    # 1) 拼接用户的数据字典
    username = user_dic.get(‘username‘)

    # 根据用户的名字,拼接 用户名.json 文件路径
    user_path = os.path.join(
        settings.USER_DATA_PATH, f‘{username}.json‘
    )

    # 2) 保存用户数据
    with open(user_path, ‘w‘, encoding=‘utf-8‘) as f:
        # ensure_ascii=False让文件中的中文数据,显示更美观
        json.dump(user_dic, f, ensure_ascii=False)

4.2.3.1、用户视图层——core——src.py——让用户输入用户名与密码

、登录功能
def login():
    # 登录视图
    while True:
        # 1) 让用户输入用户名与密码
        username = input(‘请输入用户名: ‘).strip()
        password = input(‘请输入密码: ‘).strip()

  需要通过接口层的登录接口验证账户是否存在

6.4.3、用户接口层——interface——user_inteerface——登录接口

# 登录接口
def login_interface(username, password):
    # 1) 先查看当前用户数据是否存在
    # {用户数据字典}  or  None
    user_dic = db_handler.select(username)

    # 2) 判断用户是否存在
    if user_dic:
        # 若有冻结用户,则需要判断是否被锁定
        if user_dic.get(‘locked‘):
            return False, ‘当前用户已被锁定‘

        # 给用户输入的密码做一次加密
        password = common.get_pwd_md5(password)

        # 3) 校验密码是否一致
        if password == user_dic.get(‘password‘):
            msg = f‘用户: [{username}] 登录成功!‘
            user_logger.info(msg)
            return True, msg

        else:

            msg = f‘用户: [{username}]密码错误!‘
            user_logger.warn(msg)
            return False, msg

    msg = f‘用户: [{username}]用户不存在,请重新输入!!‘
    return False, msg

  通过登录功能验证后,继续编写登录功能

4.2.3.2、用户视图层——core——src.py——调用接口层,将数据传给登录接口

# 2) 调用接口层的注册接口,将用户名与密码交给接口层来进行处理

            # res ---> (False, ‘用户名已存在!‘)
            # res = user_interface.register_interface(
            # flag, msg ---> (flag---> False, msg --> ‘用户名已存在!‘)

            # (True, 用户注册成功),  (False, 注册失败)
            flag, msg = user_interface.register_interface(
                username, password
            )

            # 3) 根据flag判断用户注册是否成功,flag控制break的结束
            if flag:
                print(msg)          global login_user          login_user = username
                break

            else:
                print(msg)

7.1.2、公共文件lib——common.py——登录认证装饰器

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

原文地址:https://www.cnblogs.com/jingpeng/p/12635791.html

时间: 2024-10-05 05:16:43

26、ATM项目的编写流程的相关文章

中小型软件项目开发一般流程建议

一:编写目的 本文档的编写旨在探寻规范的软件开发流程.加快软件开发速度.提高软件开发质量.降低项目综合成本. IT界有一句格言:"You can do it right; you can do it fast; you can do it cheap. Pick two." 而我们要做的就是:提供优质服务.项目周期短.成本低廉 二:总体说明 项目从用户需求说明书的提出,到系统的第一个完整版本的交付使用经历了若干或复杂或简单的过程,但不管项目大小如何一般需要经历以下几个步骤: 1.  

开篇:软件项目的整个流程 - IT软件人员学习系列文章

这段时间闲来无事,就在总结以前的项目经验,然后写成博客的形式以进行记录.本文就对<IT软件人员学习系列文章>做个开篇吧. 对于IT软件的开发来说,无外乎B/S.C/S和Android.iOS(后两项也是C/S).在B/S领域,无外乎PHP.JAVA和ASP.NET这几大阵营.而在C/S领域,JAVA的开发比较复杂,需要编写一些重复的和底层的代码,相比C#的可视化和相似的语法,还是微软的开发工具和语言比较容易上手. 但是,我们今天讲的不是代码,而是整个软件流程,这个属于软件工程的范畴.我们知道,

neutron plugin 与 extension 编写流程

neutron plugin 与 extension 编写流程 关于neutron,它是openstack中管理网络相关的一个项目,它主要负责管理了openstack中的虚拟网络,它将网络作为一种服务提供给租户,它的设计遵循了SDN(soft define network)的设计原则从而实现了网络的虚拟化. neutron采用了插件技术,关于neutron的具体技术细节,可以参考: https://yeasy.gitbooks.io/openstack_understand_neutron/co

推荐:想了解一个项目完整测试流程,看这篇文章就OK了

推荐:想了解一个项目完整测试流程,看这篇文章就OK了 写在前面:本文来自真实企业测试人员的工作总结,用一个项目的进行流程为线索,记录每个阶段测试包含的内容及关注点. <ignore_js_op> 项目的测试流程大只包含的几个阶段:立项.需求评审.用例评审.测试执行.测试报告文档 一.立项后测试需要拿到的文档 1.需求说明书 2.原型图(及UI图) 3.接口文档 4.数据库字典(表的数量.缓存机制) 二.需求评审 参加人员:开发.测试及需求人员,由需求人员主持讲解. 为了会议的有效举行,测试及开

项目开发的流程

1. 项目开发的流程 需求-UI-HTML-测试-部署 2. 项目测试过程 FTP 3. 项目部署过程 SVN

BOS项目 第10天(activiti工作流第二天,流程变量、组任务、排他网关、spring整合activiti、项目中实现流程定义管理)

BOS项目笔记 第10天 今天内容安排: 1.流程变量(设置.获取) 2.组任务(候选人.候选组) 3.排他网关使用 4.spring整合activiti 5.将activiti应用到bos项目中 6.在bos项目中实现流程定义管理(部署.查询.查看png.删除) 1. 流程变量 1.1 设置流程变量的方式 l 方式一:启动流程实例时设置 l 方式二:办理任务时设置 l 方式三:使用RuntimeService的set方法设置 l 方式四:使用TaskService的set方法设置 注意:如果设

【Python图像特征的音乐序列生成】如何生成旋律(大纲),以及整个项目的全部流程

今天连看三篇论文,不是很细致地看,也没有具体去实现,只是大概明白了一些新思路.这三篇论文,一篇概述了Decoder-Encoder模型,一篇延伸这个模型,首次提出了Attention机制,最后一篇详细阐述了LSTM和GRU的工作机理.读完之后,我对机器翻译这个领域,还有LSTM的应用,有了更深的认识. 言归正传,说一下生成旋律的原理. 在之前的乐理部分,我们知道了和弦级数和走向的问题,有很多和弦组合在一起能发挥良好的作用.这些好的和弦连接在一起的音序就被成为进行.流行音乐的和弦进行倾向于从根和弦

参与github上开源项目的大致流程和注意事项

Foreword github是一个很火的代码托管服务网站,可能好多人都想参与一两个项目玩一玩学习一下,但由于是纯英文的网站,可能又会止步于想法上没有动手实践.接下来我就介绍一下参与github上开源项目的大致流程,以及注意的地方.当然这里不会详细介绍git的使用,看懂本文还得需要参考其他资料,学习git的相关使用方法. 大致流程 一.首先需要在github上注册账号并登陆,这个不多说了 二.安装git,到github官网下载安装包.  在这里我用的是github for windows.安装好

Dz插件编写流程1

插件实现流程 开始编写社区插件,您应当首先对插件实现的流程有一个大致的了解,以下是我们推荐的插件编写流程: 熟练使用 Discuz! 社区系统后,对希望完善或补充的个性化功能进行评估,进而提出插件的功能需求. 对插件做一个概括性的设计,例如:需要使用什么菜单.什么参数,配置哪些选项.数据结构如何设计.前后台实现哪些功能等等. 阅读本文档并在系统设置中实际体验 Discuz! 插件接口所实现的功用,例如:您的插件应当如何设计才能良好的挂接到社区系统中来.插件接口能够实现哪些功能.不能实现哪些功能,