ATM+购物商城

时间:2020-12-19 06:00:38

知识内容:

1.luffy买tesla

2.ATM+购物商城

一、luffy买tesla

需求:

 1.目录结构说明
account
luffy.json --> 存储用户账户信息 {"money": 1000000, "credit": 300000}
tesla.json --> 存储tesla账户信息 {"money": 0}
bin
start.py --> 项目入口文件
core
withdraw.py --> 项目核心文件
logs
bank.log --> 日志文件 2.功能说明
当执行start.py出现交互窗口如下:
----Luffy Bank----
1.账户信息
2.转账
3.提现
(1)选择1账户信息显示luffy的当前账户余额和信用额度(存在luffy.json中)
(2)选择2转账直接在luffy账户中扣掉75万和5%的税费并且tesla账户增加75万(存在tesla.json中)
(3)当选择3提现,提现金额应该小于信用额度,利息为5%,提现金额为用户自定义
(4)把用户转账、登陆、提现操作均通过logging模块记录日志在bank.log中

思路以及特殊技巧:

1.思路

start.py是程序的主入口,调用withdraw中的chose_func函数来执行代码,chose_func函数的功能类似一个菜单,将各个功能连接在一起,先完成用户信息展示、用户转账、提现这3个功能函数,然后通过装饰器实现用户登录验证并且用户只用登录一次后续就不用登录,最后将日志记录写成一个函数。参数为日志的等级和输出信息,在需要输出日志的地方调用这个函数即可

2.特殊技巧

如何让start.py调用withdraw.py中的函数,利用os模块获得项目的根目录然后动态添加进系统环境变量中即可,代码如下:

 def main():
# 动态添加
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# 导入核心模块文件
from core import withdraw
withdraw.chose_func() # 项目主入口
if __name__ == '__main__':
main()

装饰器实现用户登录:

 # 装饰器函数 -> 实现登录
def login(func):
def wrapper(*args, **kwargs):
global flag
if flag: # 未登录就进行登录验证
print("请先登录然后进行操作")
username = input("username: ")
password = input("password: ")
if username == _username and password == _password:
# print("登录成功!")
logging_message("info", "%s login!" % username)
flag = False # 登录成功就把flag改为False,再使用别的功能就不用登录
func(*args, **kwargs)
else:
# print("用户名或密码错误!")
logging_message("warn", "wrong username or wrong password!")
else: # 登录过就不用验证
func(*args, **kwargs) return wrapper

注:logging_message()是调用日志输出函数

日志输出函数:

 # 实现日志功能 日志位置: /logs/bank.log
def logging_message(level, message):
route = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 提取项目的绝对路径
route += r"\logs\bank.log" # 加上项目文件的相对路径 # create logger
logger = logging.getLogger(_username) # 获得logger对象
logger.setLevel(logging.DEBUG) # 设置一个全局的日志级别 # create console handler and set level to debug
ch = logging.StreamHandler() # 把日志打印到屏幕
ch.setLevel(logging.INFO) # 设定屏幕的日志级别 # create file handler and set level to warning
fh = logging.FileHandler(route) # 把日志打印到文件
fh.setLevel(logging.INFO) # 设定文件的日志级别 # create formatter 设置输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch and fh 给屏幕和文件设置输出格式
ch.setFormatter(formatter)
fh.setFormatter(formatter) # add ch and fh to logger 把日志打印到指定的handler中
logger.addHandler(ch)
logger.addHandler(fh) # 'application' code
# 设置信息
if level == 'debug':
logger.debug(message)
if level == 'info':
logger.info(message)
if level == 'warn':
logger.warning(message)
if level == 'error':
logger.error(message)
if level == 'critical':
logger.critical(message) # 添加下面一句,在记录日志之后移除句柄
logger.removeHandler(ch)
logger.removeHandler(fh)

3.完整代码:https://github.com/15387062910/python_train/tree/master/luffy_tesla

二、ATM+购物商城

需求:

 模拟实现一个ATM + 购物商城程序
功能如下:
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器

示例代码 https://github.com/triaquae/py3_training/tree/master/atm 

简易流程图:https://www.processon.com/view/link/589eb841e4b0999184934329

思路以及特殊技巧:

代码实现: