ATM+购物车


1.项目开发流程

2.项目需求分析

3.项目架构设计(重点)

4.项目架构搭建

5.注册登录功能

内容

项目开发流程

假设我们是一家外包公司 专门给别人编写软件

1.需求分析

产品经理带着开发部门老大(架构师、研发经理)去客户公司寻求客户的需求

见客户之前架构师和研发经理会先大致了解一下客户的需求

然后琢磨出一套比较容易编写的流程

之后在于客户交谈中引导客户按照提前设想好的流程提需求

ps:这么做的目的是为了防止客户提出一些无厘头的要求!!!

2.架构设计

架构师会根据具体的业务需求选择:

开发的编程语言

项目的后端框架

项目所需的数据库(主库、从库)

项目组织结构(软件开发目录规范、自定义结构)

项目功能划分(将一个大项目拆分成多个小项目)

项目的报价(开发人员数量 天数等:  一个程序员一天按照1500+算)

3.分组开发

将项目拆分之后的多个小项目交给不同开发部门下的多个编程人员编写

每个人可能只会写很小的一部分(降低复杂度 提升开发效率 缩短开发周期)

4.项目测试

交给测试部门全面测试

语法错误千万不要提交到测试部门才被发现 这样可能会扣绩效甚至三次之后直接全铺盖走人!!!

ps:跟测试小姐姐搞好关系 这样的话很多bug都不需要提交报告 私下提醒并修改即可

5.交付上线

将项目打包给运维人员运行维护即可

6.目前行业的特点

小公司很累 但是成长速度很快(整体参与)
大公司轻松 但是成长速度缓慢(只拧螺丝)

需求分析

项目大致需求

- 额度15000或自定义

- 支持多账户登录

- 可以查看账户余额

- 可以提现(可自定义手续费比例)

- 提供还款接口

- 支持账户间转账

- 记录每月日常消费流水

- 实现购物商城,买东西加入购物车,调用信用卡接口结账

- 提供管理接口,包括添加账户、用户额度,冻结账户等

- ATM记录操作日志

- 用户认证功能

提炼项目功能

1.用户注册

2.登录功能

3.查看余额

4.余额提现

5.账户充值

6.金额转账

7.查看流水

8.添加购物车

9.查看购物车

10.结算购物车

11.管理员功能

项目大致技术栈

1.python基础核心编程

2.函数(装饰器)

3.常见内置模块

架构设计

研究常见软件架构(非常重要)

举例:

百度:百度帐户登录 需要获取用户名和密码 然后校验用户名和密码

在这里校验是基于网络将用户名和密码发送到百度的后台进行校验,后台去专门存储数据的地方校验数据

大致分为三层:浏览器 后台 数据库

ps:很多程序其实都是三层架构

第一层:用户层只做简单的数据展示

第二层:整个程序的核心层 做具体业务逻辑

第三层:数据存取

开发项目的固定结构

第一层:前端

第二层:后端

第三层:数据库

基于上述架构分析 也可以将ATM分为三层架构

展示层:只展示功能选项 基本逻辑

逻辑层:所有业务逻辑

数据层:给逻辑层提供数据存取

ATM架构牛逼之处:程序的扩展性非常的强

比如展示层等我们以后学了前端可以直接替换成页面

展示层目前是cmd操作 可以换成页面

核心逻辑层以后学了框架之后替换成框架

逻辑层目前是普通的python代码 可以换成django框架

数据存取层以后学了数据库直接替换成数据库

数据层目前是json文件 可以换成MySQL数据库

分组开发(回归正题)

1.搭建项目目录

针对启动脚本文件start.py可以放在bin目录下 也可以直接放在项目根目录

start.py
conf
      settings.py
lib
      common.py
core
      src.py
interface
      user_interface
      bank_interface
      shop_interface
db
log
readme

2.功能框架搭建

利用空函数

3.注册登录功能

1.start.py

# 先考虑sys.path问题
import os
import sys


base_dir = os.path.dirname(__file__)
sys.path.append(base_dir)
# sys.path.append(os.path.dirname(__file__)
from core import src
# 导入run功能


if __name__ == '__main__':
    src.run() # 确保是执行文件才可以调用run

2.conf

-----settings.py

"""配置文件中的变量默认全是大写"""

import os

# 存储到db目录下 (下列代码是跟数据存储相关的 所以可以放在第三层供外界调用 只要调用了就表示要操作数据
BASE_DIR = os.path.dirname(os.path.dirname((__file__)))
DB_DIR = os.path.join(BASE_DIR,'db')
if not os.path.exists(DB_DIR): # 增加程序的健壮性
    os.mkdir(DB_DIR)

3.core

-----src.py

# 作为三层架构的第一层>>>:展示层
import json
import os
from interface import user_interface

def register():
    # 获取用户数据 (展示层)
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    confirm_pwd = input('confirm_pwd>>>:').strip()
    # 校验两次密码是否一致
    if not password == confirm_pwd:
        print('两次密码不一致')
        return
    res = user_interface.check_user_interface(username)
    if res:
        print(res)
        return
        # 调用核心逻辑层注册功能完成注册即可
    msg = user_interface.register_interface(username,password)
    print(msg)
def login():
    # 获取用户数据
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 校验用户是否存在
    flag,data = user_interface.login_interface(username)
    if flag:
        # 再校验密码是否一致
        if password == data.get('password'):
            print('登录成功')
        else:
            print('密码错误')
    else:
        print(data)

4.db

-----db_handler.py

# 数据存取层 专门处理数据存取

import os
import json
from conf import settings

def save(user_dict):
    username = user_dict.get('username')
    file_path = os.path.join(settings.DB_DIR,f'{username}.json')
    with open(file_path,'w',encoding='utf8') as f:
        json.dump(user_dict,f)

def select(username):
    file_path = os.path.join(settings.DB_DIR, f'{username}.json')
    if os.path.exists(file_path):
        # 如果文件存在 则打开文件返回用户数据
        with open(file_path,'r',encoding='utf8') as f :
            return json.load(f)

5.interface

-----user_interface.py

from db import db_handler

def register_interface(username,password):
    # 构建用户字典
    user_dict = {
            'username':username,
            'password':password,
            'balance':15000,
            'flow':[],
            'shop_car':{},
            'is_lock':False, # 记录账号是否被锁定
            'is_admin':False, # 记录是否是管理员
        }
    # 调用第三层保存数据的方法
    db_handler.save(user_dict)
    # 给第一层返回提示信息
    return f'{username}用户注册成功'

def check_user_interface(username):
    res = db_handler.select(username)
    if res:
        return '用户名已存在'

def login_interface(username):
    res = db_handler.select(username)
    if res:
        return True,res
    return False,'用户名不存在'