zoukankan      html  css  js  c++  java
  • 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][登录成功]
  • 相关阅读:
    SQL注入过滤
    ASP.NET长文章分页
    简单的权限管理类
    不错的面试题
    【转载】【重要】Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结
    回到xwindows
    suse11 linux不自动启动xwindows
    flash的几种工具
    mencoder和ffmpeg参数详解
    ffmpeg和Mencoder使用实例小全
  • 原文地址:https://www.cnblogs.com/tangxuecheng/p/13584700.html
Copyright © 2011-2022 走看看