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][登录成功]
原文地址:https://www.cnblogs.com/tangxuecheng/p/13584700.html