20_项目开发规范
项目开发流程: 需求分析-->概要设计-->项目计划-->详细设计-->编码测试-->项目测试-->调试修改-->项目发布-->后期维护
需求分析: 确定用户的真实需求
1.反复确认,使用用户能理解的表达方式表达
2.完成需求文档,用户确认
概要设计: 对项目进行初步分析和整体设计
1.确定功能模块
2.进行可行性分析,搭建整体架构图
3.确定技术思路和使用框架
4.形成概要文档指导开发流程
项目计划: 确定项目开发的时间轴和流程
1.确定开发工作的先后顺序
2.确定时间轴,事件里程碑
3.人员分工
4.形成甘特图和思维导图等辅助内容
详细设计: 项目的实现手册
1.形成详细的文档: 思路,逻辑流程,功能说明,技术的说明,数据结构说明,代码说明
编码测试: 安装预定计划实现代码编写,并且做基本检测
1.写代码
2.写测试程序
3.技术攻关
项目测试: 对项目按照功能进行测试
1.跨平台测试,适用测试
2.完成测试报告
调试修改: 调试修改完善代码
1.根据测试报告进行代码修改
项目发布:
1.项目交付用户进行发布
2.编写项目说明文档
后期维护: 交付后的线上维护
项目注意事项:
1.按时完成项目工作和项目时间不足之间的冲突
2.项目实施人员之间的冲突
项目工具的使用:
编写文档: World, Excel, PPT, Markdown, LaTeX
项目流程图: MindMaster, Visio
项目管理: project
代码管理: SVN, Git
1.目录结构
~/Desktop/project_specification $ tree . ├── bin │ └── start.py ├── conf │ ├── __pycache__ │ │ ├── my_log_settings.cpython-37.pyc │ │ └── settings.cpython-37.pyc │ ├── config.ini │ ├── my_log_settings.py │ └── settings.py ├── core │ ├── __pycache__ │ │ └── core.cpython-37.pyc │ └── core.py ├── db │ ├── coco_json │ └── echo_json ├── lib │ ├── __pycache__ │ │ └── read_ini.cpython-37.pyc │ └── read_ini.py └── log └── all1.log 9 directories, 13 files
2.bin目录: 存放执行脚本
start.py
import os import sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from core import core from conf import my_log_settings if __name__ == '__main__': my_log_settings.load_my_logging_cfg() core.run()
3.conf目录: 存放配置文件
config.ini
[DEFAULT] user_timeout = 1000 [admin] password = administrator money = 10000000 [coco] password = coco1234 money = 10000000000 [echo] password = echo1234 money = 10
my_log_settings.py
""" logging配置 """ import logging.config import os # 定义三种日志输出格式 开始 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' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' # 定义日志输出格式 结束 logfile_dir = r'%s/log' % os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录 logfile_name = 'all1.log' # log文件名 # 如果不存在定义的日志目录就创建一个 if not os.path.isdir(logfile_dir): os.mkdir(logfile_dir) # log文件的全路径 logfile_path = os.path.join(logfile_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)传递 }, }, } def load_my_logging_cfg(): logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 logger = logging.getLogger(__name__) # 生成一个log实例 logger.info('It works!') # 记录该文件的运行状态 if __name__ == '__main__': load_my_logging_cfg()
settings.py
import os config_path = r'%s/%s' % (os.path.dirname(os.path.abspath(__file__)), 'config.ini') user_timeout = 10 user_db_path = r'%s/%s' % (os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'db')
4.core目录: 存放核心逻辑
core.py
import logging import time from conf import settings from lib import read_ini config = read_ini.read(settings.config_path) logger = logging.getLogger(__name__) current_user = {'user': None, 'login_time': None, 'timeout': int(settings.user_timeout)} def auth(func): def wrapper(*args, **kwargs): if current_user['user']: interval = time.time() - current_user['login_time'] if interval < current_user['timeout']: return func(*args, **kwargs) name = input('name>>: ') password = input('password>>: ') if config.has_section(name): if password == config.get(name, 'password'): logger.info('登录成功') current_user['user'] = name current_user['login_time'] = time.time() return func(*args, **kwargs) else: logger.error('用户名不存在') return wrapper @auth def buy(): print('buy...') @auth def run(): print(''' 1.购物 2.查看余额 3.转账 ''') while True: choice = input('输入>>: ').strip() if not choice: continue if choice == '1': buy() elif choice == '2': pass elif choice == '3': pass elif choice.upper() == 'Q': exit() else: pass if __name__ == '__main__': run()
5.db目录: 存放数据库文件
alex_json
egon_json
6.lib目录: 存放自定义的模块与包
read_ini.py
import configparser def read(config_file): config = configparser.ConfigParser() config.read(config_file) return config
7.log目录: 存放日志
# all1.log [2020-07-11 21:48:19,234][MainThread:4611722688][task_id:conf.my_log_settings][my_log_settings.py:74][INFO][It works!] [2020-07-11 21:48:25,138][MainThread:4611722688][task_id:core.core][core.py:22][INFO][登录成功] [2020-07-11 21:48:52,370][MainThread:4448214464][task_id:conf.my_log_settings][my_log_settings.py:74][INFO][It works!] [2020-07-11 21:48:59,745][MainThread:4448214464][task_id:core.core][core.py:27][ERROR][用户名不存在] [2020-07-11 21:49:14,244][MainThread:4590759360][task_id:conf.my_log_settings][my_log_settings.py:74][INFO][It works!] [2020-07-11 21:49:24,448][MainThread:4590759360][task_id:core.core][core.py:22][INFO][登录成功] [2020-07-11 21:49:38,576][MainThread:4590759360][task_id:core.core][core.py:27][ERROR][用户名不存在] [2020-07-11 21:50:05,884][MainThread:4317466048][task_id:conf.my_log_settings][my_log_settings.py:74][INFO][It works!] [2020-07-11 21:50:12,417][MainThread:4317466048][task_id:core.core][core.py:22][INFO][登录成功] [2020-07-11 21:51:22,107][MainThread:4450725312][task_id:conf.my_log_settings][my_log_settings.py:74][INFO][It works!] [2020-07-11 21:51:30,945][MainThread:4450725312][task_id:core.core][core.py:22][INFO][登录成功]
版权:本文版权归作者
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任