目录
参见:python--- 软件开发目录规范及其发展史_Yietong309的博客-CSDN博客
因为用户后期的操作都需要在登录的情况下才能完成, 所以密码加密, 登录认证装饰器,都属于公共功能, 可以放在lib文件夹下的common.py文件中. 日志功能也属于公共功能,也可以放在这里.
详情参见:python--hashlib加密模块_Yietong309的博客-CSDN博客
前言:
已经学习了一段时间的Python 了, 现在我们通过一个小项目来把基础阶段所学的内容练习一下吧.
项目需求:
- 额度10000或者自定义
- 支持多账户登录
- 可以查看账户余额
- 可以提现
- 提供还款接口
- 支持账户间转账
- 记录每月日常消费
- 实现购物商城
- 提供管理接口,包括添加账户,用户额度,冻结账户等
- ATM记录操作日志
- 用户认证功能
从需求中提炼此项目的核心功能
- 用户注册
- 用户登录
- 查看余额
- 账户提现
- 充值功能
- 转账功能
- 查看账单
- 购物车功能
- 管理员功能
核心技术点为:
1. python核心语法
2. python诸多模块
3. 装饰器
架构设计
三层架构: 浏览器, 服务端, 数据库
以购买商品为例: 浏览器页面展示商品>>> 基于网络将购买商品的操作发送给服务端做核心校验>>>操作响应数据库完成数据修改.
用户层:
数据展示, 数据获取,>>>> cmd窗口可以充当用户层, 奖励啊可以替换成浏览器或者app
核心逻辑层:
业务逻辑>>> 某个py文件充当逻辑层, 后期可以替换成软件开发目录规范或者现成的框架
数据层:
数据的增删改查>>>json文件充当数据库, 将来可以替换成数据库程序,如mysql,redis等
软件开发目录规范
bin
start.py 项目启动文件
conf
settings.py 配置文件
lib
common.py 公共功能
core
src.py 充当第一层
interface 充当第二层
user_interface 用户业务逻辑判断接口
bank_interface 银行业务逻辑判断接口
shop_interface 购物业务逻辑判断接口
admin_interface 管理员业务逻辑判断接口
log 日志文件, 可以通过代码创建
db 数据库文件
db_handler 数据库
readme 项目说明
requirements 项目使用到的软件等信息
参见:python--- 软件开发目录规范及其发展史_Yietong309的博客-CSDN博客
项目功能搭建
利用空函数进行项目搭建
def register():
pass
def login():
pass
....
项目启动脚本
start.py
获取根路径,添加到系统操作路径中,以达到在不同电脑或者系统下能运行的目的.
import os
import sys
from core import src
# 兼容系统环境
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
# 启动脚本
if __name__ == '__main__':
src.run()
配置文件settings.py
配置文件属于配置类信息, 属于万年不变的信息, 所以放在settings里, 且变量名大写,以示身份.
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)
# 这里插播一个后期会用到的小配置信息: 利率, 后期银行业务, 如果需要调整手续费, 可以在这里直接更改,
相对于规定死的手续费,此方法更加灵活一些
# 定义一个利息
TAX_FEE = 0.05
日志功能
日志功能主要是为了记录用户的日常操作. 燕过留痕, 相当于监控系统, 由于该功能写完之后不需要再变动,且需要从头到尾记录, 所以属于配置类文件, 可以放在settings里.
日志功能详情参见: python-- 日志模块, logging_Yietong309的博客-CSDN博客
# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 定义日志输出格式 结束
"""
下面的两个变量对应的值 需要你手动修改
"""
LOG_DIR = os.path.join(BASE_DIR, 'log')
# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(LOG_DIR):
os.mkdir(LOG_DIR)
logfile_name = 'ATM.log'
# log文件的全路径
logfile_path = os.path.join(LOG_DIR, logfile_name)
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
# 打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
# 打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
因为用户后期的操作都需要在登录的情况下才能完成, 所以密码加密, 登录认证装饰器,都属于公共功能, 可以放在lib文件夹下的common.py文件中. 日志功能也属于公共功能,也可以放在这里.
common.py 下功能介绍
密码加密
类似于现实生活里的微信号和密码. 微信号可以让所有人都知道, 但是密码只能自己知道, 一旦密码泄露,个人信息也会全部泄露. 而互联网世界里没有绝对的安全, 所以我们要对密码进行加密处理, 这样别人就算是窃取了我们的数据信息, 也无法直接解密, 从而减小信息泄露的危险.
密码加密的方式有很多1、明文保存;2、对称加密算法来保存;3、MD5、SHA1等单向HASH算法;4、PBKDF2算法;5、bcrypt、scrypt等算法。 这里我们就使用md5进行加密
详情参见:python--hashlib加密模块_Yietong309的博客-CSDN博客
def get_md5(pwd):