day012 用python实现信息卡管理及购物商城的项目

需求

#需求:
1 这是一个信用卡管理程序
2 用户手持信用卡购物,使用函数,按照软件开发规范
3 用户名密码存放于文件中,支持多用户登陆,使用json
4 程序启动,先登录或者注册,保存信息到文件中,记录日志
5 用户的登陆,密码输错三次,锁定,不能再登录
6 用户可以取现,消费,还款,提额
7 允许用户根据商品编号购买商品,用户选择商品,检测余额,够用扣款,不够用提示,用户行为都要记录日志
8 用户可以随时退出,退出时,打印已购买商品和余额

借鉴了老师在day011中的代码框架,添加了部分代码。

项目的结构如下。

项目的目录结构如下。

项目的运行结果展示

待改进的地方

1.  未做到单点登录
2.  日志的信息不够详细
3.  项目的健壮性,输入校验等等,有待提高

代码如下。

#/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',  # 日志文件的编码,再也不用担心中文log乱码了},},'loggers': {#logging.getLogger(__name__)拿到的logger配置'': {'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕'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):   #已注册用户的登录流程if db.get(name).get('locked'):logger.warning('该用户已被锁定')print ('该用户已被锁定')else:logging_error_times = 0while True:if logging_error_times >= 3:logger.warning('密码输入错误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('密码错误')logging_error_times += 1else:           #注册is_register = input('是否注册? (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('用户不注册')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 ('购买成功,还有%d元'%money)if item in items_bought_dic:items_bought_dic[item] += item_numelse:items_bought_dic[item] = item_numelse:print ('余额不足')else:print ('请输入:【商量名称】 【商品数量】')@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 ('取现成功,账户余额%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('还款数量? '))money += repay_numdb[current_user['user']]['money'] = moneycommon.save_db(db)print('还款成功,你还有%d' % (money))@auth
def run():print('''
1. 取现
2. 还款
3. 消费
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)  # 导入上面定义的logging配置logger = logging.getLogger(name)  # 生成一个log实例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'))

  

日志的截图

转载于:https://www.cnblogs.com/marathoner/p/10273662.html

python闯关_Day012相关推荐

  1. python闯关训练营怎么样3.0_泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?...

    大多数互联网的从业者都有一个梦想:进大厂. 因为不仅可以享受较好的福利待遇,也能与更优秀的人一起共事,获得更专业.更快速的成长. 最近经常有朋友提及想要入门编程学习,该如何学习? 关于编程学习,各种语 ...

  2. Python 闯关之路一(语法基础)

    原文:https://www.cnblogs.com/wj-1314/p/8403977.html python 闯关之路一(语法基础) 1,什么是编程?为什么要编程? 答:编程是个动词,编程就等于写 ...

  3. 小学生蓝桥杯Python闯关 | 满分数

    学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间. 附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客 [题目描述] 我 ...

  4. 小学生蓝桥杯Python闯关 | 吉利又霸气的英文名

    学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间. 附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客 [题目描述] 每 ...

  5. 小学生蓝桥杯Python闯关 | 汇总

    学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间. 1.小学生蓝桥杯Python闯关 | 获取字符串的最后一个字符_COCOgsta的博客-CSDN博客 2. ...

  6. python闯关游戏,Python挑战游戏( PythonChallenge)闯关之路Level 0

    Python挑战游戏( PythonChallenge)闯关之路Level 0 Python挑战游戏( PythonChallenge)闯关之路Level 0 关卡入口地址:http://www.py ...

  7. python闯关2-罗马数字编码

    这来自一个游戏闯关练习python的网站,有些网络可能无法访问,所以我决定开始整理里面的题目和大家分享. 题干 罗马数字来源于古罗马编码系统.它们是基于字母表的特定字母的组合,所表示的数等于这些数字相 ...

  8. python闯关训练营怎么样3.0_【新升级】3周!0基础Python量化投资!闯关式学习打卡,解锁新技能!...

    2020年热度最高的编程语言是谁?Python! Python应用方向很多,包括数据分析.爬虫.开发.运维.自动化测试,不过Python+金融还有一个有趣的应用方向:量化投资. 非金融背景的同学要理解 ...

  9. python闯关游戏_Python爬虫闯关游戏(第三关)

    打开网址,发现需要先注册: 注册一下登陆: 发现和第二关一样,这一关是加了一个登陆,下面开始闯关: import requests from bs4 import BeautifulSoup def ...

最新文章

  1. [Educational Codeforces Round 16]A. King Moves
  2. 在项目中配置Nexus Repository的信息
  3. 零元学Expression Blend 4 - Chapter 1 缘起
  4. cefsharp.wpf离线安装包下载_在vscode里编写c++程序(解决gdb下载失败问题)
  5. java oschina_简单说说 OSChina 的技术架构
  6. 分享网页到微信朋友圈的官方接口
  7. vs设计窗口不见了_龙猫腕表评测:VS沛纳海320V2版本
  8. Flutter基础—定位对齐之大小比例
  9. 巨坑:从Sqoop导入MySQL导入TINYINT(1)类型数据到hive(tinyint),数据为null
  10. python编程音乐播放器_python 开发在线音乐播放器-简易版
  11. 苹果又被拒了:Guideline 4.3 - Design
  12. 统计模型混响信号预报matlab,基于MATLAB的混响效果设计课程设计
  13. 农村三资管理平台app_农村三资管理系统功能
  14. linux下添加三菱触摸屏usb驱动,[转载]三菱触摸屏GT Works3和PLC GX Works2编程软件下载...
  15. 我与刘强东的故事:他的1000亿和我的5000万(转超级表格)
  16. Validation参数校验注解
  17. CAT的Client端初始化
  18. 基于Android的sina微博分享功能
  19. Python函数(完整版)
  20. 看几个拿到外企offer的故事... 送你一套免费英语资料(价值1899)

热门文章

  1. mounted钩子函数_Vue 探索之路——生命周期和钩子函数的一些理解
  2. 【转载】博客园编辑数学公式的方法
  3. Linux环境安装zookeeper3.5.5后,总是启动不了
  4. python学习格式化输出(一)
  5. leetcode 二叉树的层次遍历 II(Binary Tree Level Order Traversal II)
  6. Python 全栈开发十 socket网络编程
  7. Codeforces #471
  8. Dubbo超时机制导致的雪崩连接
  9. JSON.parse()、eval()和JSON.stringify()
  10. python3 字符串方法