ATM+购物车项目搭建
1 > 项目开发流程介绍
公司中的项目流程几乎都是可以分为五个步骤 —— 1.需求分析、2.架构设计、3.分组开发、4.项目测试、5.项目交付。
1.1> 需求分析
公司在研发项目初期,会有产品经理带着开发部门的老大(架构师、研发经理)去寻问客户的需求
见客户之前架构师和研发经理会先大致了解一下客户的需求,
之后后会大致琢磨一套比较容易编写的流程,引导客户按照提前设想好的流程提需求。
这样的目的就是为防止客户提出一些无厘头的要求!!!
1.2 > 架构设计
得到客户同意后,架构师会根据具体的业务需求进行详细的设计
例如,开发使用的编程语言、项目后端框架、项目所需的数据库(主库、从库)项目的组织架构(软件开发目录规范、自定义结构)、项目功能划分(将一个大项目拆成多个小项目)、项目的报价(开发人员的数量 天数等作为依据,一般情况是一个程序员一天按照1500+计算)
最后再给到产品经理继续叠加报价(其他部分的人员开销)
1.3 > 分组开发
上述一套流程下来,基本确定了项目拆分后的多个小项目。
将这些小项目交给不同的开发部门下的多个编程人员编写
每个人可能只会写很小的一部分(降低了项目的复杂程度 提升开发效率 缩短开发周期)
1.4 > 项目测试
程序员写好代码后交付测试部门进行全面的测试
在这里程序员千万不要再交付代码后出现语法错误,一经发现就狠有可能被扣绩效。甚至出现三次之后就直接被开除了。
所有这里建议最好是能跟测试小姐姐们搞好关系,这样很多bug都不需要提交报告私下提醒修改了就行
1.5 > 项目测试
在全面测试没问题后就将项目打包给运维运行维护即可
2 > 项目需求分析
当我们开始编写一个项目的时候我们首先要对整个项目做一个大致的需求,就拿ATM+购物车这个项目来举例:
2.1 > 项目大致需求
- 额度15000或自定义
- 支持多账户登录
- 可以查看账户余额
- 可以提现(可自定义手续费比例)
- 提供还款接口
- 支持账户间转账
- 记录每月日常消费流水
- 实现购物商城,买东西加入购物车,调用信用卡接口结账
- 提供管理接口,包括添加账户、用户额度,冻结账户等
- ATM记录操作日志
- 用户认证功能
然后我们再对这些需求做应该提炼、将需求放在用户展示层。
2.2 > 提炼项目功能
提炼后的项目功能如下,这些项目功能就可以直接放在表示层供用户选择
1.用户注册
2.登录功能
3.查看余额
4.余额提现
5.账户充值
6.金额转账
7.查看流水
8.添加购物车
9.查看购物车
10.结算购物车
11.管理员功能
2.3 > 项目大致技术栈
对大致的需求提炼后我们就要开始编写功能了 我们首先需要做的就是考虑该项目大致需要哪些技术来实现
我们需要考虑3点如下:
1.python基础核心编程
2.函数(装饰器)
3.常见的内置模块(os.sys.json)
3 > 架构设计
常见的软件架构基本上都是分为三层架构
第一层是用户层,只做一些简单 的数据展示 ———— 简称:前端
第二层是整个程序的核心层,做具体业务逻辑———— 简称:后端
第三层数据存取 ———— 简称:数据库
基于上述的架构分析,我们也应该将ATM+购物车这个项目分为三层架构,如下:
1.展示层
只展示功能选项 基于逻辑
2.逻辑层
所有业务逻辑
3.数据库
给逻辑层提供数据存取
4 > 分组开发
架构设计完成之后就要开始进行分组开发了,将每个小项目分配给各个不同的部门进行编写。
4.1 > 搭建项目目录
这里咱就自己来写了,我们需要整个大项目拆分成多个不同的文件夹如下:
ATM+购物车
start.py # start.py文件可以放在bin目录下,也可以直接放在项目根目录
conf
settings.py
lib
common.py
core
src.py
interface
user_interface
bank_interface
shop_interface
db
log
readme
4.2 > 功能框架搭建
将每个展示给用户选择的功能放在core下的src中,并用函数进行封装起来,再在start.py里面编写启动脚本,具体操作如下:
'''根目录 --> start.py 文件'''
import os
import sys
# 将执行文件路径存放到环境变量当中
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
# 导入run功能
from core import scr
if __name__ == '__main__':
src.run()
'''core --> src.py 文件'''
# 用户注册
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("""
===============ATM+购物车=================
1.用户注册
2.登录功能
3.查看余额
4.余额提现
5.账户充值
6.金额转账
7.查看流水
8.添加购物车
9.查看购物车
10.结算购物车
11.管理员功能
===============ATM+购物车=================
""")
choice = input('请输入功能编号>>>:').strip()
if choice in func_dict:
# 获取函数名
func_name = func_dict.get(choice)
# 加括号调用函数
func_name()
else:
print('请输入正确的功能编号')
这样就能实现将程序简单的跑起来了
5 > 编写功能具体实现代码
5.1 > 注册功能代码
'''在全局写的全部变量'''
import os
import json
# 获取当前执行文件位置的上一层目录(根目录)
base_dir = os.path.dirname(os.path.dirname(__file__))
# 拼接db文件夹目录
db_dir = os.path.join(base_dir, 'db')
# 判断用户数据目录是否存在根目录下,不存在就创建
if not os.path.exists(db_dir):
os.mkdir(db_dir)
''' src.py文件下的register函数'''
def register():
username = input('请输入注册的用户名 >>>>>>:').strip()
password = input('请输入用户名的密码 >>>>>>:').strip()
conf_pwd = input('请再次输入用户名的密码 >>>>>>:').strip()
# 校验两次密码是否输入一致
if not password == conf_pwd:
print('两次密码输入不一致')
return
# 判断用户是否已经存在
file_path = os.path.join(db_dir, f'{username}.jason')
if os.path.exists(file_path):
print('用户已经存在')
return
# 构建用户字典
user_dict = {
'username': username,
'password': password,
'balance': 15000, # 初始化金额
'flow': [], # 记录用户流水
'shop_car': {}, # 记录购物车数据
'is_lock': False, # 记录账号是否被锁定
'is_admin': False, # 记录是否是管理员
}
# 拼接路径,将用户字典存入db目录下,以用户名为名称的.json文件
file_path = os.path.join(db_dir, f'{username}.json')
# 将用户字典写入用户数据文件夹
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
print(f'{username}注册成功')
这样就简单的完成了编写一个用户注册的功能并且加上了一个判断用户是否存在的功能
5.2 > 登录功能代码
'''src.py 下的login() 函数'''
def login():
username = input('请输入注册的用户名 >>>>>>:').strip()
password = input('请输入用户名的密码 >>>>>>:').strip()
file_path = os.path.join(db_dir, f'{username}.json')
if not os.path.exists(file_path):
print('----该用户不存在----')
return
with open(file_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
if password == user_dict.get('password'):
print('----用户登录成功----')
else:
print('----密码输入错误----')
这样就可以实现简单的登录功能。
6 > 拆分代码(模块模式)
上述代码运行虽然能运行但是看起来格外的难受,全部挤在了一起。所有我们要将代码进行一下拆分。具体操作如下:
6.1. > 拆分注册代码
6.1.1 > 拆分全局变量
因为全部变量当中拼接路径和创建文件的操作是多个函数都会用到的一个功能,所有我们可以将这些代码拆分到 conf --> settings.py当中 。该文件主要就是存放写配置文件,并且是不会更改的。操作如下:
''' 将下面的代码拆分到 --> conf --> settings.py中'''
import os
import json
# 获取当前执行文件位置的上一层目录(根目录)
base_dir = os.path.dirname(os.path.dirname(__file__))
# 拼接db文件夹目录
db_dir = os.path.join(base_dir, 'db')
# 判断用户数据目录是否存在根目录下,不存在就创建
if not os.path.exists(db_dir):
os.mkdir(db_dir)
在源文件中将上面的代码删除去conf --> settings.py中编写以下代码:
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)
6.1.2 > 拆分用户字典的存入
将下列代码拆分到 interface --> user_interface 下,该文件主要就是用于关于用户数据操作的逻辑代码。
''' interface --> user_interface 文件'''
'''
# 导入json、os模块
# 导入conf 下的settings
import os
import json
from conf import settings
'''
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目录下,以用户名为名称的.json文件
file_path = os.path.join(db_dir, f'{username}.json')
# 将用户字典写入用户数据文件夹
with open(file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
print(f'{username}注册成功')
'''
db_handler.save(user_dict)
return f'{username}用户注册成功'
这里还可以继续拆,将有关数据的存入和读取拆分到db --> db_handler 文件下
'''db --> db_handler 文件 '''
import json
import os
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序列化数据到文件
json.dump(user_dict, f)
6.1.3 > 登录拆分之后的样子
from interface import user_interface
def register():
username = input('请输入注册的用户名 >>>>>>:').strip()
password = input('请输入用户名的密码 >>>>>>:').strip()
conf_pwd = input('请再次输入用户名的密码 >>>>>>:').strip()
# 校验两次密码是否输入一致
if not password == conf_pwd:
print('两次密码输入不一致')
return
res = user_interface.register_interface(username,password)
print(res)
这样看起来就舒服多了,每个文件夹都有每个文件夹的功能,并且每个文件夹的代码都很简洁。完成了一个简单的用户登录的功能。