作业20200329
需求
编写小说阅读程序实现下属功能
# 一:程序运行开始时显示
0 账号注册
1 充值功能
2 阅读小说
# 二: 针对文件db.txt,内容格式为:"用户名:密码:金额",完成下述功能
2.1、账号注册
2.2、充值功能
# 三:文件story_class.txt存放类别与小说文件路径,如下,读出来后可用eval反解出字典
{"0":{"0":["倚天屠狗记.txt",3],"1":["沙雕英雄转.txt",10]},"1":{"0":["令人羞耻的爱.txt",6],"1":["二狗的妻子与大草原的故事.txt",5]},}
3.1、用户登录成功后显示如下内容,根据用户选择,显示对应品类的小说编号、小说名字、以及小说的价格
"""
0 玄幻武侠
1 都市爱情
2 高效养猪36技
"""
3.2、用户输入具体的小说编号,提示是否付费,用户输入y确定后,扣费并显示小说内容,如果余额不足则提示余额不足
# 四:为功能2.2、3.1、3.2编写认证功能装饰器,要求必须登录后才能执行操作
# 五:为功能2.2、3.2编写记录日志的装饰器,日志格式为:"时间 用户名 操作(充值or消费) 金额"
# 附加:
# 可以拓展作者模块,作者可以上传自己的作品
项目框架
iReader/
|-- bin
| |-- start.py # 项目开启动文件
|-- conf/
| |-- settings.py # 项目配置文件
|-- core/
| |-- account.py # 记录当前登录用户信息
| |-- iread.py # 阅读小说板块函数
| |-- ireader.py # 项目主程序
| |-- login.py # 登录板块函数
| |-- logout.py # 退出板块函数
| |-- payment.py # 支付函数
| |-- recharge.py # 充值板块函数
| |-- register.py # 注册板块函数
| |-- upload.py # 上传板块函数
|-- db/
| |-- db.txt # 所用用户信息文件
| |-- story_class.txt # 小说分类信息文件
| |-- storys # 小说文件夹
| | |-- 倚天屠狗记.txt # 具体小说文件
| | |-- 射雕英雄传.txt
|-- lib/
| |-- append2file.py # 将新内容追加到文件的工具
| |-- copyer.py # 拷贝工具
| |-- get_story_content.py # 读取小说内容
| |-- get_story_dict.py # 将小说分类信息读取到内存字典保存
| |-- my_auth.py # 登录状态检查装饰器函数
| |-- my_log.py # 充值缴费日志装饰器函数
| |-- update2file.py # 更新用户文件信息
| |-- update_story_class.py # 更新小说分类文件
| |-- verify_account.py # 检查账号名是否存在和登录判断函数
|-- README.txt # 说明文档
项目总结
使用全局变量current_user保存登录用户的信息。其他模块下的函数直接通过导入的方式访问到它,实现全局变量跨模块的引用。
core/account.py
# 保存当前用户信息
"""
初始未登录时,列表为空
用户登录成功后,将 用户名,密码,账户余额存放在列表中
每个功能直接操控该列表(导入该变量,单例模式基础),列表内容时时更新
"""
current_user = []
装饰器的实现:登录校验和充值缴费日志
# 登录校验装饰器:
- 直接使用全局模块current_user,判断用户使用登录
# 充值缴费日志装饰器:
- 使用带参数的装饰器
- 全局变量的current_user列表最后一个元素是用户余额,判断充值还是支付前后余额差,即金额变化数
lib/my_auth.py
from functools import wraps
from core.account import current_user
def my_auth(func):
"""
登录状态认证,装饰器
:param func:
:return:
"""
@wraps(func)
def inner(*args, **kwargs):
if current_user:
res = func(*args, **kwargs)
return res
else:
print('请您先登录')
return inner
lib/my_log.py
import time
from functools import wraps
from core.account import current_user
from conf.settings import LOG_FILE
from lib.append2file import append2file
def my_log(type):
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
money_before = current_user[-1]
res = func(*args, **kwargs)
money_after = current_user[-1]
change = abs(money_after - money_before)
user = current_user[0]
date_time = time.strftime('%Y-%m-%d %H:%M:%S')
new_log =[date_time, user, type, change]
append2file(new_log, LOG_FILE)
return res
return inner
return wrapper
使用软件某规范时,涉及模块的相互应用,一定要注意避免出现循环导入的情况。
对于工具类函数,尽可能封装好,不使用使用导入的方式获取,使用形参的方式获取,即可完成功能。
这一点在简化代码和避免出现循环导入方面很有必要。
补充:源文件
链接:https://pan.baidu.com/s/1xJtOt9Vazk5C7dJqccs51g
提取码:k0a9

浙公网安备 33010602011771号