ATM程序项目规范
Posted happyfei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ATM程序项目规范相关的知识,希望对你有一定的参考价值。
ATM购物车程序(练习)
------------README
作者:飞乐 版本:示例版本 v0.1 程序介绍: 实现ATM常用功能 功能全部用python的基础知识实现,用到了timeossysopen函数模块知识, 主要帮给大家一个简单的模块化编程的示例 注意:只实现了"认证","注册","购物"和"支付"功能 程序结构: ATM--/ ├——─ README ├── atm #ATM主程目录 │ ├── __init__.py │ ├── bin #ATM 执行文件 目录 │ │ ├── __init__.py │ │ ├── start.py #ATM 执行程序 │ │ └── manage.py #ATM 管理端,未实现 │ ├── conf #配置文件 │ │ ├── __init__.py │ │ └── settings.py #文本配置 │ ├── core #主要程序逻辑都 在这个目录 里 │ │ ├── __init__.py │ │ ├── auth.py #用户认证模块 │ │ ├── shop.py #购物商城 │ │ ├── register.py #用户注册模块 │ │ ├── src.py #主逻辑交互程序 │ ├── db #用户数据存储的地方 │ │ ├── __init__.py │ │ ├── db.py #生成一个临时的账户数据 │ │ └── error_db.py #账户锁定文本 │ ├── lib #公共程序 │ │ ├── __init__.py │ │ ├── common.py #临时获取的用户信息 │ └── log #日志目录 │ ├── __init__.py └── ── ├── access.log #用户访问和操作的相关日志
ATM
-------bin目录
start.py
1 import sys,os 2 BASE_DIR=os.path.dirname(os.path.dirname(__file__)) 3 sys.path.append(BASE_DIR) 4 5 from core import src 6 src.run()
-------conf目录
settings.py
import os BASE_DIR=os.path.dirname(os.path.dirname(__file__)) DB_PATH=r‘%sdbdb.txt‘%BASE_DIR#用户注册信息路径 ER_PATH=r‘%sdberror_db.txt‘%BASE_DIR#锁定账户的信息路径
#以下内容是增加的功能
LOG_PATH=r‘%slogaccess.log‘%BASE_DIR#定义日志文件路径 BOSS_LOG_PATH=r‘%slogoss.log‘%BASE_DIR#定义日志文件路径 """ logging配置 """ # 定义三种日志输出格式 开始 standard_format = ‘[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]‘ ‘[%(levelname)s][%(message)s]‘ #其中name为getlogger指定的名字 simple_format = ‘[task_id:%(name)s][%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s‘ id_simple_format = ‘[task_id:%(name)s][%(levelname)s][%(asctime)s] %(message)s‘ # log配置字典(字典的key不能改) LOGGING_DIC = { ‘version‘: 1, #定义的版本 ‘disable_existing_loggers‘: False,#无用 #1、定义日志的格式 ‘formatters‘: {#字典的key可以随便取 ‘standard‘: {#key是固定格式 ‘format‘: standard_format#定义的日志格式 }, ‘simple‘: { ‘format‘: simple_format }, ‘id_simple‘:{ ‘format‘:id_simple_format }, }, ‘filters‘: {}, #过滤,不用 #2、定义日志输入的目标:文件或者终端,发送给boss ‘handlers‘: {#控制文件写入 #打印到终端的日志 ‘stream‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.StreamHandler‘, # 打印到屏幕 ‘formatter‘: ‘simple‘#绑定格式 }, #打印到文件的日志,收集info及以上的日志 ‘access‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 保存到文件(日志轮转) ‘formatter‘: ‘standard‘,#绑定日志格式 ‘filename‘: LOG_PATH, # 日志文件 ‘maxBytes‘: 1024*1024*5, # 日志大小 5M#一份日志文件的大小 ‘backupCount‘: 5,#最多保存五份日志,写完五份时轮转 ‘encoding‘: ‘utf-8‘, # 日志文件的编码,再也不用担心中文log乱码了 }, #打印到文件的日志,收集error及以上的日志 ‘boss‘: { ‘level‘: ‘ERROR‘, ‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 保存到文件(日志轮转) ‘formatter‘: ‘id_simple‘,#绑定日志格式 ‘filename‘: BOSS_LOG_PATH, # 日志文件 ‘maxBytes‘: 1024*1024*5, # 日志大小 5M#一份日志文件的大小 ‘backupCount‘: 5,#最多保存五份日志,写完五份时轮转 ‘encoding‘: ‘utf-8‘, # 日志文件的编码,再也不用担心中文log乱码了 }, }, ‘loggers‘: { #logging.getLogger(__name__)拿到的logger配置 ‘‘: {#定义日志的名字 ‘handlers‘: [‘access‘, ‘stream‘,‘boss‘], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 ‘level‘: ‘DEBUG‘, ‘propagate‘: False, # 向上(更高level的logger)传递 }, }, } #因为这是单独的功能,下面代码不能在这里写,要把它写在lib文件common内 # import logging.config # import logging # logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 # # l1=logging.getLogger(‘egon‘) # l1.debug(‘测试‘)
-------core目录
auth.py
1 import sys,os 2 BASE_DIR=os.path.dirname(os.path.dirname(__file__)) 3 sys.path.append(BASE_DIR) 4 from lib import common #导入读取到的用户信息 5 from conf import settings #导入配置模块获取文本路径,用于锁定账户写入文本 6 7 8 def outter(func): 9 def inner(*args,**kwargs): 10 user_info_dic = common.user_info() 11 while True: 12 if len(user_info_dic) == 0: 13 print(‘请先注册‘) 14 break 15 if common.current_user[‘username‘]: 16 print(‘用户已登录‘) 17 res = func(*args,**kwargs) 18 return res 19 20 uname=input(‘用户名>>:‘).strip() 21 if uname==‘q‘:break 22 if uname not in user_info_dic: 23 print(‘用户不存在。。。‘) 24 continue 25 26 if uname in common.user_error_info(): 27 print(‘此账户已被锁定‘) 28 continue 29 30 if user_info_dic[uname][‘status‘]>2: 31 with open(settings.ER_PATH,‘a‘,encoding=‘utf-8‘)as f: 32 f.write(‘%s|‘%uname) 33 user_info_dic[uname][‘status‘]=0 34 print(‘尝试次数过多,账户已被锁定‘) 35 continue 36 37 pwd=input(‘密码>>:‘).strip() 38 if pwd==‘q‘:break 39 if pwd==user_info_dic[uname][‘password‘]: 40 print(‘欢迎 %s 登录成功‘%uname) 41 common.current_user[‘username‘]=uname#将用户名存入临时字典内 42 common.current_user[‘balance‘]=int(user_info_dic[uname][‘balance‘])#将价格信息转成int存入字典内,用于购物运算 43 res=func(*args,**kwargs) 44 return res 45 else: 46 print(‘密码错误‘) 47 user_info_dic[uname][‘status‘] +=1 48 return inner 49 50 51 @outter 52 def auth1(): 53 pass
register.py
1 import sys,os 2 BASE_DIR=os.path.dirname(os.path.dirname(__file__)) 3 sys.path.append(BASE_DIR) 4 from conf import settings 5 6 def get_uname(): 7 while True: 8 uname=input(‘请输入用户名>>:‘).strip() 9 if not uname.isalpha(): 10 print(‘输入不合法‘) 11 continue 12 with open(settings.DB_PATH,‘r‘,encoding=‘utf-8‘)as f: 13 for line in f:#如果break没有运行,则运行else 14 line=line.strip(‘ ‘).split(‘,‘) 15 if uname==line[0]: 16 print(‘用户已存在‘) 17 break 18 else: 19 return uname 20 def get_pwd(): 21 while True: 22 pwd1=input(‘请输入密码>>:‘).strip() 23 if not len(pwd1) > 0: 24 print(‘输入不能为空‘) 25 continue 26 pwd2=input(‘请再次输入密码>>:‘).strip() 27 if pwd1==pwd2: 28 return pwd1 29 else: 30 print(‘两次输入密码不一致,请重新输入‘) 31 def get_bal(): 32 while True: 33 bal=input(‘请输入金额>>:‘).strip() 34 if bal.isdigit(): 35 return bal 36 else: 37 print(‘输入非法‘) 38 def uinfo_write(uname,pwd,bal): 39 with open(settings.DB_PATH,‘a‘,encoding=‘utf-8‘)as f: 40 f.write(‘%s,%s,%s ‘%(uname,pwd,bal)) 41 print(‘注册成功‘) 42 43 #用户注册执行入口 44 def registe(): 45 print(‘