25---项目的三层架构——ATM购物车

一 项目三层架构设计

在项目开发中,清晰明了的结构设计非常重要。它的重要性至少提现在三个方面:结构清晰;可维护性强;可扩展性高。

常用的项目结构设计中,三层架构设计非常实用。这种架构设计模式将整个程序分为三层:

用户视图层:用于与用户交互的,可以接受用户的输入,打印接口返回的数据。
逻辑接口层:接收视图层传递过来的参数,根据逻辑判断调用数据层加以处理并返回一个结果给用户视图层。
数据处理层:接受接口层传递过来的参数,做数据的增删改查。

二 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、管理员功能

一个项目是如何从无到有
一 需求分析
    1.拿到项目,会先在客户那里一起讨论需求,
    商量项目的功能是否能实现,周期与价格,得到一个需求文档。
    
    2.最后在公司内部需要开一次会议,最终得到一个开发文档,
    交给不同岗位的程序员进行开发。
        - Python: 后端,爬虫
        
        - 不同的岗位:
            - UI界面设计:
                - 设计软件的布局,会分局软件的外观切成一张张图片。
            
            - 前端:
                - 拿到UI交给他的图片,然后去搭建网页面。
                - 设计一些页面中,哪些位置需要接收数据,需要进行数据交互。
            
            - 后端:
                - 直接核心的业务逻辑,调度数据库进行数据的增删查改。
            
            - 测试:
                - 会给代码进行全面测试,比如压力测试,界面测试(CF卡箱子)。
            
            - 运维:
                - 部署项目。
二 程序的架构设计
1、程序设计的好处
    1)思路清晰
    2)不会出现写一半代码时推翻重写
    3)方便自己或以后的同事更好维护
    
2、三层架构设计的好处
    1)把每个功能都分层三部分,逻辑清晰
    2)如果用户更换不同的用户界面或不同,
    的数据储存机制都不会影响接口层的核心
    逻辑代码,扩展性强。
    3)可以在接口层,准确的记录日志与流水。
    
3、三层架构
	一 用户视图层
    用于与用户交互的,可以接受用户的输入,打印接口返回的数据。
    
	二 逻辑接口层
    接受 用户视图层 传递过来的参数,根据逻辑判断调用数据层加以处理,
    并返回一个结果给 用户视图层。
  三 数据处理层
    接受接口层传递过来的参数,做数据的 
        - 保存数据  save()
        - 查看数据  select()
        - 更新数据
        - 删除数据

三 分任务开发
四 测试
五 上线

2 项目架构图

程序三层结构

3 登录功能

Ⅰ 用户视图层
def login():
    while True:
        username = input('请输入用户名').strip()
        user_info = judge(username)
        if user_info is None:
            print('用户名不存在')
            continue
        # 记录用户输错密码次数
        count = 0
        while count <= 3:
            password = input('请输入登陆密码').strip()
            flag,msg = login_interface(username,password,count)
            if flag == 'locked':
                print(msg)
                break
            if flag == True:
                print(msg)
                global log_name
                log_name = username
                break
            elif flag == False:
                print(msg)
                count += 1
                continue
        break
Ⅱ 逻辑接口层
def login_interface(username,password,count):
    # 获取用户信息
    user_info = judge(username)

    # 判断用户是否被锁定
    if user_info['locked'] == False:
        return 'locked','账户被锁定,请联系管理员'

    if count == 2:
        user_info['locked'] = False
        # 更新用户信息
        save(user_info)
        return 'locked', '账户被锁定,请联系管理员'

    # 在count!=3的情况下判断密码的输入是否正确
    # 用户输入密码加密与文件中的密码进行对比
    hash_pwd = get_md5(password)
    if hash_pwd == user_info.get('password'):
        return True,'登录成功'
    else:
        return False, '密码错误'
Ⅲ 数据处理层
import os
import json
from conf.setting import DB_USER_PATH

# 判断用户文件是否存在
def judge(username):
    # 用户文件路径
    user_path = os.path.join(DB_USER_PATH,f'{username}.json')
    if os.path.exists(user_path):
        # 如果存在,打开文件,获取用户信息
        with open(user_path,'r',encoding='utf-8') as f:
            user_info = json.load(f)
            return user_info
    else:
        return None


# 保存用户数据
def save(user_info):
    # 从用户信息中获取用户名
    username = user_info.get('username')
    # 用户信息文件
    user_data_path = os.path.join(DB_USER_PATH,f'{username}.json')
    # 将用户字典写入用户文件中
    with open(user_data_path,'w',encoding='utf-8') as f:
        json.dump(user_info,f,ensure_ascii=False)
posted @ 2020-04-02 22:51  微信搜索-程序媛小庄  阅读(196)  评论(0编辑  收藏  举报