作业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

posted @ 2020-03-29 15:55  the3times  阅读(31)  评论(0)    收藏  举报