项目开发流程
产品经理带着开发部门老大,去客户公司寻求客户的需求
见客户之前架构师和研发经理会先大致了解客户的需求然后琢磨出一套比较容易编写的流程,之后在于客户交谈的中引导客户按提前设想好的流程提需求
架构师根据具体的业务需求进行选择
开发的编程语言
项目的后端框架
项目需要的数据库(主库,从库)
项目组织结构(软件开发目录规范,自定义结构)
项目功能划分(将一个大项目拆分成多个小项目)
项目报价(开发人员数量 天数等:一个程序员按照1500+计算)
将项目拆分后的多个小项目交给不同开发部门下的多个编程人员编写
每个人致谢很小一部分(降低复杂度 提升开发效率缩短开发周期)
交给测试部门全面测试
语法错误千万不要提交到测试部门后才被发现,这样会被扣绩效,甚至有的公司三次之后直接走人
将项目打包给运维人员运行维护
"""
小公司可能需要你一个人完成上面所有的事情
小公司很累 但是成长速度很快(整体参与)
大公司轻松 但是成长速度缓慢(只拧螺丝)
"""
ATM项目
需求分析
- 额度15000或自定义
- 支持多账户登录
- 可以查看账户余额
- 可以提现(可自定义手续费比例)
- 提供还款接口
- 支持账户间转账
- 记录每月日常消费流水
- 实现购物商城,买东西加入购物车,调用信用卡接口结账
- 提供管理接口,包括添加账户、用户额度,冻结账户等
- ATM记录操作日志
- 用户认证功能
1.用户注册
2.登录功能
3.查看余额
4.提现
5.充值
6.转账
7.查看流水
8.添加购物车
9.查看购物车
10.结算
11.管理员功能
1.python基础核心编程
2.函数(装饰器)
3.常见内置模块(os,sys,json)
架构设计
'''
根据功能的不同划分不同的文件,类似于大型公司 有很多部门,部门里又有很多小组,拆分成不同的部门、不同的组,让他们各自干各自擅长的事情,目的是为了进行精细化管理,提高效率
'''
百度:
百度账户登录
需要获取用户名和密码 然后校验用户名和密码
问:在哪里校验?
肯定不在你的电脑上(如果在 难道所有人的数据你的电脑上都有?)
是基于网络将用户名和密码发送到百度的后台进行校验
后台去专门存储数据的地方校数据
浏览器 后台 数据库
淘宝:
购物结算功能
商品价格的最终核算和账户扣款在哪里完成
肯定不在你当前计算机上!!!
浏览器 后台 用户数据库
'''
我们称之为三层架构,或者是‘三明治结构’
第一层用户层只做简单的数据展示 前端
第二层是整个程序的核心层 后端
做具体业务逻辑
第三层是数据存取 数据库
'''
基于上述架构分析 我们也应该将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
db.control
user.json
log
readme
代码示例
src.py
from interface import user_interface
from interface import shop_interface
from interface import bank_interface
from lib import common
dic_verify = {'is_login': 'jason'}
user_now = dic_verify.get('is_login')
def register():
username = input('请输入用户名:').strip()
pwd = input('请输入密码:').strip()
pwd_second = input('请再次输入密码:').strip()
if pwd == pwd_second:
pwd = user_interface.pwd_hd5(pwd)
flag = user_interface.verify_username(username)
if flag:
print('用户名已存在')
return
else:
user_interface.creat_user(username, pwd)
print('用户注册成功')
res = common.creat_log('注册信息')
res.debug(f"用户{username}注册成功")
return
else:
print('两次密码不同')
def login():
username = input('请输入用户名:').strip()
pwd = input('请输入密码:').strip()
pwd = user_interface.pwd_hd5(pwd)
if user_interface.verify_username(username):
if user_interface.verify_pwd(username, pwd):
print('登录成功')
res = common.creat_log('登录信息')
res.debug(f"用户{username}登录成功")
else:
print('密码错误')
else:
print('用户名不存在')
def view_amount():
amount = user_interface.get_amount(user_now)
print(f'您当前余额为{amount}元')
res = common.creat_log('查看余额')
res.debug(f"用户{user_now}查看了他的余额")
def get_money():
pass
def recharge():
pass
def transfer():
which_user = input('您希望转给谁:')
how_many = input('转账金额:')
if user_interface.transfer_money(user_now, which_user, how_many):
print(f'您成功的向{which_user}转账{how_many}元')
res = common.creat_log('转账')
res.debug(f"用户{user_now}向{which_user}进行了转账")
else:
print('转账失败')
res = common.creat_log('转账')
res.debug(f"用户{user_now}向{which_user}转账失败")
def buy_history():
flow = user_interface.history_list(user_now)
for i in flow:
print(i)
res = common.creat_log('查看流水')
res.debug(f"用户{user_now}查看了字自己的消费记录")
def add_shop():
print('1.鸡蛋 1元\n'
'2.泡面 5元\n'
'3.老干妈 10元\n'
'4.笔记本电脑 20000元\n')
good_choice = input('请输入想要购买物品的编号:')
good_count = input('请输入您要购买的数量:')
shop_interface.add_good(user_now,good_choice,good_count)
print('添加购物车成功')
def look_shop():
pass
def clear_shop():
pass
def admin():
pass
user_interface.py
from db import db_contor
from lib import common
import hashlib
import datetime
import os
md5 = hashlib.md5()
def verify_username(username):
info, flag = db_contor.select(username)
return flag
def verify_pwd(username, pwd):
a = username + '.json'
path = common.get_path('db', a)
userinfo = db_contor.read_json(path)
user_pwd = userinfo['pwd']
if user_pwd == pwd:
return True
else:
return False
def creat_user(username, pwd):
userdic = {
'username': username,
'pwd': pwd,
'balance': 15000,
'flow': [],
'shop_car': {},
'is_lock': False,
'is_admin': False,
}
h = username + '.json'
path = common.get_path('db', h)
db_contor.write_json(userdic, path)
def pwd_hd5(pwd):
md5.update(pwd.encode('utf8'))
pwd_dark = md5.hexdigest()
return pwd_dark
def get_amount(username):
a = username + '.json'
path = common.get_path('db', a)
userinfo = db_contor.read_json(path)
amount = userinfo['balance']
return amount
def transfer_money(who,which,how):
a = who + '.json'
path_who = common.get_path('db', a)
b = which + '.json'
path_which = common.get_path('db', b)
if os.path.exists(path_which):
userinfo_who_dic = db_contor.read_json(path_who)
if userinfo_who_dic['balance'] > int(how):
userinfo_who_dic['balance'] = userinfo_who_dic['balance'] - int(how)
now = datetime.datetime.now()
buy_info = str(now) + ' ' + '向' + which + '转账' + how + '元'
flow = userinfo_who_dic['flow']
flow.append(buy_info)
userinfo_who_dic['flow'] = flow
db_contor.write_json(userinfo_who_dic,path_who)
userinfo_which_dic = db_contor.read_json(path_which)
userinfo_which_dic['balance'] = userinfo_which_dic['balance'] + int(how)
now = datetime.datetime.now()
buy_info = str(now) + ' ' + '接收' + who + '的转账' + how + '元'
flow = userinfo_which_dic['flow']
flow.append(buy_info)
userinfo_which_dic['flow'] = flow
db_contor.write_json(userinfo_which_dic, path_which)
return True
else:
return False
else:
return None
def history_list(username):
a = username + '.json'
path = common.get_path('db',a)
userinfo = db_contor.read_json(path)
flow = userinfo['flow']
return flow
shop_interface.py
from db import db_contor
from lib import common
import hashlib
import datetime
import os
def add_good(username,choice,goodcount):
good_price_dic = {'1': 1, '2': 5, "3": 10, "4": 20000}
good_name_dic = {'1':'鸡蛋','2':'泡面','3':'老干妈','4':'笔记本电脑'}
goodprice = good_price_dic[choice]
goodname = good_name_dic[choice]
a = username + '.json'
path = common.get_path('db',a)
userinfo = db_contor.read_json(path)
good_dic = userinfo['shop_car']
good_dic[goodname] = [goodcount,goodprice]
userinfo['shop_car'] = good_dic
db_contor.write_json(userinfo,path)
common.py
import os
from conf import setting
import logging.config
def get_path(*args):
'''
传入的参数将会与项目根目录的路径进行拼接
'''
a = os.path.dirname(os.path.dirname(__file__))
b = os.path.join(a, *args)
return b
def creat_log(msg):
logging.config.dictConfig(setting.LOGGING_DIC)
logger1 = logging.getLogger(msg)
return logger1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人