python闯关_Day012
day012 用python實(shí)現(xiàn)信息卡管理及購(gòu)物商城的項(xiàng)目
?
需求
#需求:
1 這是一個(gè)信用卡管理程序
2 用戶手持信用卡購(gòu)物,使用函數(shù),按照軟件開(kāi)發(fā)規(guī)范
3 用戶名密碼存放于文件中,支持多用戶登陸,使用json
4 程序啟動(dòng),先登錄或者注冊(cè),保存信息到文件中,記錄日志
5 用戶的登陸,密碼輸錯(cuò)三次,鎖定,不能再登錄
6 用戶可以取現(xiàn),消費(fèi),還款,提額
7 允許用戶根據(jù)商品編號(hào)購(gòu)買商品,用戶選擇商品,檢測(cè)余額,夠用扣款,不夠用提示,用戶行為都要記錄日志
8 用戶可以隨時(shí)退出,退出時(shí),打印已購(gòu)買商品和余額
借鑒了老師在day011中的代碼框架,添加了部分代碼。
?
項(xiàng)目的結(jié)構(gòu)如下。
?
項(xiàng)目的目錄結(jié)構(gòu)如下。
?
項(xiàng)目的運(yùn)行結(jié)果展示
?
待改進(jìn)的地方
1. ?未做到單點(diǎn)登錄
2. ?日志的信息不夠詳細(xì)
3. ?項(xiàng)目的健壯性,輸入校驗(yàn)等等,有待提高
代碼如下。
#/bin/start.py import sys,os BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)from core import srcif __name__ == '__main__':src.run()#/conf/setting.pyimport osBASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DB_PATH=os.path.join(BASE_DIR,'db','db.json') LOG_PATH=os.path.join(BASE_DIR,'log','access.log') LOGIN_TIMEOUT=3""" 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 = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'# 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': LOG_PATH, # 日志文件'maxBytes': 1024*1024*5, # 日志大小 5M'backupCount': 5,'encoding': 'utf-8', # 日志文件的編碼,再也不用擔(dān)心中文log亂碼了},},'loggers': {#logging.getLogger(__name__)拿到的logger配置'': {'handlers': ['default', 'console'], # 這里把上面定義的兩個(gè)handler都加上,即log數(shù)據(jù)既寫入文件又打印到屏幕'level': 'DEBUG','propagate': True, # 向上(更高level的logger)傳遞},}, }
#/core/src.pyfrom conf import settings from lib import common import timelogger=common.get_logger(__name__)current_user={'user':None,'login_time':None,'timeout':int(settings.LOGIN_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>>: ')db=common.conn_db()if db.get(name): #已注冊(cè)用戶的登錄流程if db.get(name).get('locked'):logger.warning('該用戶已被鎖定')print ('該用戶已被鎖定')else:logging_error_times = 0while True:if logging_error_times >= 3:logger.warning('密碼輸入錯(cuò)誤3次,該用戶已被')db[name]['locked'] = 1common.save_db(db)breakpassword = input('password>>:')if password == db.get(name).get('password'):logger.info('登錄成功')print('登錄成功')current_user['user'] = namecurrent_user['login_time'] = time.time()return func(*args, **kwargs)else:logger.warning('密碼錯(cuò)誤')logging_error_times += 1else: #注冊(cè)is_register = input('是否注冊(cè)? (Y/N)')if is_register in ['Y','y']:password = input('password>>')db[name] = {"password":password, "money":0, "locked":0}logger.info("登錄成功")print('登錄成功')current_user['user'] = namecurrent_user['login_time'] = time.time()common.save_db(db)return func(*args, **kwargs)else:logger.info('用戶不注冊(cè)')return wrapper@auth def buy():db = common.conn_db()money = db.get(current_user['user']).get('money')print ('目前賬戶有%d元' %money)items_dict = {'item1':1, 'item2':2}print (items_dict.keys())items_bought_dic = {}while True:item_buy = input('buy which(Q退出)?>>').strip()item_buy_split = item_buy.split(' ')#print (item_buy_split[0], item_buy_split[1])if item_buy_split[0] in ['q', 'Q']:db[current_user['user']]['money'] = moneycommon.save_db(db)print('你買了:',items_bought_dic)print('賬戶余額:',money)breakelif item_buy_split[0] in items_dict:item, item_num = item_buy_split[0], item_buy_split[1]item_price = items_dict[item] * int(item_num)print(item,':',item_num,'共花了%d'%item_price)if item_price <= money:money -= item_priceprint ('購(gòu)買成功,還有%d元'%money)if item in items_bought_dic:items_bought_dic[item] += item_numelse:items_bought_dic[item] = item_numelse:print ('余額不足')else:print ('請(qǐng)輸入:【商量名稱】 【商品數(shù)量】')@auth def withdraw():db = common.conn_db()money = db.get(current_user['user']).get('money')print ('賬戶余額%d元' %money)withdraw_num = int(input('取多少錢?'))if withdraw_num <= money:money -= withdraw_numdb[current_user['user']]['money'] = moneycommon.save_db(db)print ('取現(xiàn)成功,賬戶余額%d' % money)else:print ('賬戶余額不足')@auth def repay():db = common.conn_db()money = db.get(current_user['user']).get('money')print('賬戶余額%d元' % money)repay_num = int(input('還款數(shù)量? '))money += repay_numdb[current_user['user']]['money'] = moneycommon.save_db(db)print('還款成功,你還有%d' % (money))@auth def run():print(''' 1. 取現(xiàn) 2. 還款 3. 消費(fèi) Q. 退出''')while True:choice = input('>>: ').strip()if not choice:continueif choice == '1':withdraw()if choice == '2':repay()if choice == '3':buy()if choice in ['Q','q']:quit()
#/db/db.json {"user1": {"password": "111", "money": 2705, "locked": 0}, "user2": {"password": "111", "money": 30000, "locked": 0}, "user3": {"password": "111", "money": 20000, "locked": 0}, "zjl": {"password": "111", "money": 0, "locked": 0}}
#/lib/common.pyfrom conf import settings import logging import logging.config import jsondef get_logger(name):logging.config.dictConfig(settings.LOGGING_DIC) # 導(dǎo)入上面定義的logging配置logger = logging.getLogger(name) # 生成一個(gè)log實(shí)例return loggerdef conn_db():db_path=settings.DB_PATHdic=json.load(open(db_path,'r',encoding='utf-8'))return dicdef save_db(dic):db_path = settings.DB_PATHjson.dump(dic, open(db_path, 'w', encoding='utf-8'))
日志的截圖
?
轉(zhuǎn)載于:https://www.cnblogs.com/marathoner/p/10273662.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python闯关_Day012的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php下载文件添加header响应头
- 下一篇: 【图像处理】——Python实现灰度特征