專案開發流程: 需求分析-->概要設計-->專案計劃-->詳細設計-->編碼測驗-->專案測驗-->除錯修改-->專案發布-->后期維護
需求分析: 確定用戶的真實需求
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.uj5u.com/houduan/45141.html
標籤:Python
