内容概要
- 项目开发流程
- 项目需求分析
- 项目架构设计
- 项目架构搭建
- 项目功能编写
内容详情
# 公司中的项目流程几乎都可以分为以下五个步骤
'''假设我们是一家外包公司 专门给别人编写软件'''
1.需求分析
产品经理带着开发部门老大(架构师、研发经理)去客户公司寻求客户的需求
见客户之前架构师和研发经理会先大致了解一下客户的需求
然后琢磨出一套比较容易编写的流程
之后在与客户交谈中引导客户按照提前设想好的流程提需求
ps:这么做的目的是为了防止客户提出一些无厘头的要求!!!
2.架构设计
架构师会根据具体的业务需求决定
开发的编程语言、
项目的后端框架、
项目所需的数据库(主库、从库)
项目组织结构(软件开发目录规范、自定义结构)
项目功能划分(将一个大项目拆分成多个小项目)
项目的报价(开发人员数量 天数等: 一个程序员一天按照1500+算)
还需要产品经理继续叠加报价(其他部分人员开销等)
3.分组开发
将项目拆分之后的多个小项目交给不同开发部门下的多个编程人员编写
每个人可能只会写很小的一部分(降低复杂度 提升开发效率 缩短开发周期)
4.项目测试
交给测试部门全面测试
语法错误千万不要提交到测试部门才被发现 这样可能会扣绩效甚至三次之后直接全铺盖走人!!!
ps:跟测试小姐姐搞好关系 这样的话很多bug都不需要提交报告 私下提醒并修改即可
5.交付上线
将项目打包给运维人员运行维护即可
"""
小公司可能需要你一个人完成上面所有的事情
小公司很累 但是成长速度很快(整体参与)
大公司轻松 但是成长速度缓慢(只拧螺丝)
"""
# 项目大致需求
- 额度15000或自定义
- 支持多账户登录
- 可以查看账户余额
- 可以提现(可自定义手续费比例)
- 提供还款接口
- 支持账户间转账
- 记录每月日常消费流水
- 实现购物商城,买东西加入购物车,调用信用卡接口结账
- 提供管理接口,包括添加账户、用户额度,冻结账户等
- ATM记录操作日志
- 用户认证功能
# 提炼项目功能
1.用户注册
2.登录功能
3.查看余额
4.余额提现
5.账户充值
6.金额转账
7.查看流水
8.添加购物车
9.查看购物车
10.结算购物车
11.管理员功能
# 项目大致技术栈
1.python基础核心编程
2.函数(装饰器)
3.常见内置模块(os,sys,json)
"""
分析常见软件架构
百度:
百度账户登录
1.需要获取用户名和密码
2.基于网络将用户名和密码发送到百度的后台进行校验
3.后台去专门存储数据的地方校数据
大致分了三层
浏览器 后台 数据库
淘宝:
购物结算功能
1.购物车的添加
2.商品价格的最终核算和账户扣款
3.后台专门数据库数据修改
大致分了三层
浏览器 后台 用户数据库
"""
# 由分析可知很多程序其实都是三层架构
第一层用户层只做简单的数据展示
第二层是整个程序的核心层
做具体业务逻辑
第三层是数据存取
其实我们刚刚分析的三层就是以后开发项目的固定结构
第一层其实叫做 前端
第二层其实叫做 后端
第三层其实叫做 数据库
# 基于上述架构分析 我们可以将简易项目ATM分为三层架构
展示层---只展示功能选项 基本逻辑
逻辑层---所有业务逻辑
数据层---给逻辑层提供数据存取
################################################
ATM架构牛逼之处!!!
程序的扩展性非常的强
比如展示层等我们以后学了前端可以直接替换成页面
展示层目前是cmd操作 可以换成页面
核心逻辑层以后学了框架之后替换成框架
逻辑层目前是普通的python代码 可以换成django框架
数据存取层以后学了数据库直接替换成数据库
数据层目前是json文件 可以换成MySQL数据库
################################################
# 搭建项目目录 组织项目结构(软件开发目录规范、自定义项目结构)
'''前端展示层、后端功能框架、数据库搭建 暂时利用模块文件'''
针对启动脚本文件start.py可以放在bin目录下 也可以直接放在项目根目录
start.py(启动文件)
conf(配置文件夹)
settings.py
lib(公共功能文件夹)
common.py
core(展示层功能文件夹)
src.py
interface(逻辑层功能文件夹)
将第二层分为三个文件(根据功能的不同)
user_interface
bank_interface
shop_interface
db(数据层文件夹)
log
readme
requirments
def register(): # 用户注册
pass
def login(): # 用户登录
pass
def check_account(): # 查看余额
pass
def withdraw(): # 余额提现
pass
def repay(): # 充值功能
pass
def transfer(): # 金额转账
pass
def check_flow(): # 查看流水
pass
def add_shop_car(): # 添加购物车
pass
def check_shop_car(): # 查看购物车
pass
def clear_shop_car(): # 结算购物车
pass
def admin_sys(): # 管理员功能
pass
func_dict = {'1': register, '2': login,
'3': check_account, '4': withdraw, '5': repay, '6': transfer, '7': check_flow,
'8': add_shop_car, '9': check_shop_car, '10': clear_shop_car,
'11': admin_sys}
def run():
while True:
print("""
===============用户===============
1.用户注册
2.用户登录
===============账户===============
3.查看余额
4.余额提现
5.充值功能
6.金额转账
7.查看流水
===============购物===============
8.添加购物车
9.查看购物车
10.结算购物车
===============管理===============
11.管理员功能
===============退出===============
退出系统请输入q
===============结束===============
""")
choice = input('请输入您想要执行的功能编号:').strip()
if choice == 'q':
print('欢迎下次光临 祝您生活愉快')
break
if choice in func_dict:
func_name = func_dict.get(choice)
func_name()
else:
print('功能编号不存在')
# 启动文件
import os
import sys
from core import src
sys.path.append(os.path.dirname(__file__))
if __name__ == '__main__':
src.run()
# 配置文件
import os
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)
# 以注册功能为例将功能代码拆分到搭建好的三层架构
1.展示层
username = input("请输入你要注册的用户名:").strip()
password = input("请输入你要注册的密码:").strip()
password2 = input("请再次输入你的密码:").strip()
if not password == password2:
print("用户密码不一致")
return
res = user_interface.check_user_interface(username)
if res:
print(res)
return
msg = user_interface.register_interface(username, password)
print(msg)
2.逻辑层:
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 '用户已存在'
else:
return
3.数据处理层:
import os
import json
from conf import settings
def save(user_dict):
username = user_dict.get('username')
file_dir = os.path.join(settings.DB_DIR, f'{username}.json')
with open(file_dir, 'w', encoding='utf8')as f:
json.dump(user_dict, f, ensure_ascii=False)
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)