小说阅读器

小说阅读器

 



启动模块bin/start.py
复制代码
 1 import os
 2 import sys
 3 
 4 BASE_PATH=os.path.dirname(os.path.dirname(__file__))
 5 sys.path.append(BASE_PATH)
 6 
 7 
 8 from core import src
 9 
10 if __name__== '__main__':
11     src.run()
复制代码
 
核心代码模块core/src.py
复制代码
  1 from db import db_handler as db
  2 from lib import common
  3 
  4 
  5 login_user = None
  6 
  7 
  8 
  9 
 10 def register():
 11     '''
 12     注册功能
 13     :return: 
 14     '''
 15     while True:
 16         inp_name = input('输入用户名').strip()
 17         name, psd, remind = db.getinfo(inp_name)
 18         if inp_name in name:
 19             print('用户已存在')
 20         password = input('输入密码')
 21         re_psd = input('再次输入密码')
 22         if password == re_psd:
 23             db.save_reg(inp_name, password)
 24             print('注册成功')
 25             break
 26         else:
 27             print('两次密码不一致,请重新输入')
 28 
 29 
 30 
 31 def login():
 32     '''
 33     登录功能
 34     :return: 
 35     '''
 36     while True:
 37         inp_name = input('输入用户名')
 38         name, psd, remind = db.getinfo(inp_name)
 39         if inp_name not in name:
 40             print('用户名不存在,请先注册')
 41             continue
 42         password = input('输入密码').strip()
 43         if password == psd:
 44             global login_user
 45             login_user = inp_name
 46             print('登录成功,亲爱的{}用户'.format(login_user))
 47             break
 48         else:
 49             print('账号密码错误')
 50 
 51 
 52 
 53 @common.log
 54 @common.auth
 55 def add_credit():
 56     '''
 57     充值功能
 58     :return: 
 59     '''
 60     print('欢迎使用充值功能,亲爱的{}用户'.format(login_user))
 61     while True:
 62         amount = input('输入充值金额')
 63         if not amount.isdigit():
 64             print('请输入数字')
 65             continue
 66         comf = input('确定要充值{}元吗,按Y/y确认,按R/r'.format(amount))
 67         if comf == 'R' or comf == 'r':
 68             continue
 69         if comf == 'Y' or comf == 'y':
 70             name, psd, remind = db.getinfo(login_user)
 71             remind=int(remind)
 72             old_data = '{}:{}:{}'.format(name, psd, remind)
 73             remind += int(amount)
 74             new_data = '{}:{}:{}'.format(name, psd, remind)
 75             db.update(old_data, new_data)
 76             print('已成功充值{}'.format(amount))
 77             break
 78         return amount
 79 
 80 
 81 @common.log
 82 @common.auth
 83 def reader():
 84     '''
 85     小说功能
 86     :return:
 87     '''
 88     book_dic=db.get_book()
 89     if not book_dic:
 90         print('库存没有小说了')
 91         return
 92     while True:
 93         print('''
 94             === 欢迎来到阅读小说功能主页 ===
 95                     0 玄幻武侠
 96                     1 都市爱情
 97                     2 高效养猪36技
 98             ============ end ============
 99             ''')
100         cmd=input('输入你想阅读的小说种类编号').strip()
101         if cmd not in book_dic:
102             print('请正确输入编号')
103         second_dic =book_dic[cmd]
104         for num,booklist in second_dic.item():
105             name,price=booklist
106             print('小说编号[{}],小说名《{}》,小说价格[{}]'.format(num,name,price))
107         while True:
108             cmd = input('输入你想购买的小说编号')
109             if cmd not in second_dic:
110                 print('请正确输入编号')
111                 continue
112             if cmd in second_dic:
113                 name=second_dic[cmd][0]
114                 price=second_dic[cmd][1]
115                 cmd = input('当前选择的小说名为: 《{name}》,商品单价为: [{price}], 请输入Y/y购买:'.format(name,price)).strip()
116                 if cmd == 'Y' or cmd=='y':
117                     name,psd,remind = db.getinfo(login_user)
118                     remind=int(remind)
119                     if remind<int(price):
120                         price('余额不足,请先充值')
121                         break
122                     old_data = '{}:{}:{}'.format(name, psd, remind)
123                     remind -= int(price)
124                     new_data = '{}:{}:{}'.format(name, psd, remind)
125                     db.update(old_data, new_data)
126                     print('购买成功,请欣赏内容')
127                     fictiondata=db.show(name)
128                     print('''
129                     -------开始阅读--------
130                     {}
131                     '''.format(fictiondata))
132 
133 
134 
135 def logout():
136     '''
137     登出功能
138     :return:
139     '''
140     global login_user
141     login_user=None
142 
143 
144 #运行菜单
145 func_dic={
146 '0':['注册',register],
147 '1':['登录',login],
148 '2':['充值',add_credit],
149 '3':['小说',reader],
150 '4':['登出',logout],
151 }
152 
153 def run():
154     while True:
155         print('''
156                 ~~~~~~~欢迎来到小说世界~~~~~~~
157                         0 账号注册
158                         1 账号登录
159                         2 充值功能
160                         3 阅读小说
161                         4 登出
162                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
163                 ''')
164         cmd= input('请输入功能编号,按4退出').strip()
165         if cmd =='4':
166             logout()
167             break
168         if cmd not in func_dic:
169             print('请正确输入功能编号')
170             continue
171         func_dic[cmd][1]()
172 
173 run()
复制代码
 

数据库操作模块db/db_handler.py

复制代码
 1 from conf import settings
 2 import os
 3 
 4 
 5 def getinfo(username):
 6     '''
 7     取出文件中用户的数据
 8     :param username:
 9     :return:
10     '''
11     with open(settings.DB_TXT_PATH, 'rt', encoding='utf-8')as f:
12         for line in f:
13             if username in line:
14                 name, psd, remind = line.strip().split(':')
15                 return name, psd, remind
16 
17 
18 def save_reg(name, psd, balance=0):
19     '''
20     存注册用户的数据
21     :param name:
22     :param psd:
23     :param balance:
24     :return:
25     '''
26     with open(settings.DB_TXT_PATH, 'at', encoding='utf-8')as f:
27         f.write('{}:{}:{}'.format(name, psd, balance))
28 
29 
30 
31 def update(old_data, new_data):
32     '''
33     更新用户数据
34     :param old_data:
35     :param new_data:
36     :return:
37     '''
38     with open(settings.DB_TXT_PATH, 'rt', encoding='utf-8')as rf:
39         alldata = rf.read()
40         alldata = alldata.replace(old_data, new_data)
41         with open('db.txt.swap', 'wt', encoding='utf-8')as wf:
42             wf.write(alldata)
43     os.rename('db.txt.swap', settings.DB_TXT_PATH)
44 
45 
46 def get_book():
47     '''
48     获取小说数据
49     :return:
50     '''
51     with open(settings.STORY_PATH,'rt',encoding='utf-8')as f:
52         book_dic=eval(f.read())
53         return book_dic
54 
55 
56 def show(bookname):
57     '''
58     查看小说
59     :param bookname:
60     :return:
61     '''
62     book_path = os.path.join(settings.BOOK_DIR, bookname)
63     with open(book_path,'rt',encoding='utf-8')as f:
64         data=f.read()
65     return data
复制代码

公共模块(装饰器)lib/common.py

复制代码
 1 from conf import settings
 2 import time
 3 from core.src import login_user
 4 from core.src import login
 5 
 6 def auth(func):
 7     '''
 8     认证装饰器
 9     :param func:
10     :return:
11     '''
12     def wrapper(*args, **kwargs):
13         if login_user:
14             res = func(*args, **kwargs)
15             return res
16         else:
17             print('请先登录再使用功能')
18             login()
19 
20     return wrapper
21 
22 
23 
24 def log(func):
25     '''
26     记录日志装饰器
27     :param func:
28     :return:
29     '''
30     def wrapper(*args, **kwargs):
31         res = func(*args, **kwargs)
32         now_time = time.strftime('%Y-%m-%d %X')
33         log_data = '{} {} {} {}'.format(now_time, login_user, func.__name__, res)
34         with open('time.log', 'ab')as logf:
35             logf.write(log_data.encode('utf-8'))
36 
37         return res
38 
39     return wrapper
复制代码

配置模块conf/settings.py

复制代码
import os

# 获取项目根目录reader_sys根目录
BASE_PATH = os.path.dirname(os.path.dirname(__file__))

# 获取db目录路径
DB_PATH = os.path.join(BASE_PATH, 'db')

# 获取db.txt的根目录
DB_TXT_PATH = os.path.join(DB_PATH, 'db.txt')

# story_class.txt文件目录路径
STORY_PATH = os.path.join(DB_PATH, 'story_class.txt')

# 小说存放目录
BOOK_DIR = os.path.join(DB_PATH, 'book')

# 日志文件的路径
LOG_PATH = os.path.join(BASE_PATH, 'log', 'user.log')
复制代码

 



面条形式的一个文件下的小说阅读程序实现
1.更新了小说阅读模块
2.重写了用户存取数据的方式:将字典模式改为函数功能,方便之后规范化放入数据库操作模块中
3.独立了登录模块,将认证功能装饰器简化
复制代码
import os
import time

login_user = None

# common模块
# 认证装饰器
def auth(func):
    def wrapper(*args, **kwargs):
        if login_user:
            res = func(*args, **kwargs)
            return res
        else:
            print('请先登录再使用功能')
            login()

    return wrapper


# 记录日志装饰器
def log(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        now_time = time.strftime('%Y-%m-%d %X')
        log_data = '{} {} {} {}'.format(now_time, login_user, func.__name__, res)
        with open('time.log', 'ab')as logf:
            logf.write(log_data.encode('utf-8'))

        return res

    return wrapper



# 数据库模块
# 取数据
def getinfo(username):
    with open('db.txt', 'rt', encoding='utf-8')as f:
        for line in f:
            if username in line:
                name, psd, remind = line.strip().split(':')
                return name, psd, remind


# 存注册数据
def save_reg(name, psd, balance=0):
    with open('db.txt', 'at', encoding='utf-8')as f:
        f.write('{}:{}:{}'.format(name, psd, balance))


# 更新数据
def update(old_data, new_data):
    with open('db.txt', 'rt', encoding='utf-8')as rf:
        alldata = rf.read()
        alldata = alldata.replace(old_data, new_data)
        with open('db.txt.swap', 'wt', encoding='utf-8')as wf:
            wf.write(alldata)
    os.rename('db.txt.swap', 'db.txt')


# 注册功能

def register():
    while True:
        inp_name = input('输入用户名').strip()
        name, psd, remind = getinfo(inp_name)
        if inp_name in name:
            print('用户已存在')
        password = input('输入密码')
        re_psd = input('再次输入密码')
        if password == re_psd:
            save_reg(inp_name, password)
            print('注册成功')
            break
        else:
            print('两次密码不一致,请重新输入')


# 登录功能
def login():
    while True:
        inp_name = input('输入用户名')
        name, psd, remind = getinfo(inp_name)
        if inp_name not in name:
            print('用户名不存在,请先注册')
            continue
        password = input('输入密码').strip()
        if password == psd:
            global login_user
            login_user = inp_name
            print('登录成功,亲爱的{}用户'.format(login_user))
            break
        else:
            print('账号密码错误')


# 充值功能
@log
@auth
def add_credit():
    print('欢迎使用充值功能,亲爱的{}用户'.format(login_user))
    while True:
        amount = input('输入充值金额')
        if not amount.isdigit():
            print('请输入数字')
            continue
        comf = input('确定要充值{}元吗,按Y/y确认,按R/r'.format(amount))
        if comf == 'R' or comf == 'r':
            continue
        if comf == 'Y' or comf == 'y':
            name, psd, remind = getinfo(login_user)
            remind=int(remind)
            old_data = '{}:{}:{}'.format(name, psd, remind)
            remind += int(amount)
            new_data = '{}:{}:{}'.format(name, psd, remind)
            update(old_data, new_data)
            print('已成功充值{}'.format(amount))
            break
        return amount
#获取小说数据
def get_book():
    with open('story_class.txt','rt',encoding='utf-8')as f:
        book_dic=eval(f.read())
        return story_dic
#查看小说
def show(bookname):
    with open('','rt',encoding='utf-8')as f:
        data=f.read()
    return data


# 小说功能
@log
@auth
def reader():
    book_dic=get_book()
    if not book_dic:
        print('库存没有小说了')
        return
    while True:
        print('''
            === 欢迎来到阅读小说功能主页 ===
                    0 玄幻武侠
                    1 都市爱情
                    2 高效养猪36技
            ============ end ============
            ''')
        cmd=input('输入你想阅读的小说种类编号').strip()
        if cmd not in book_dic:
            print('请正确输入编号')
        second_dic =book_dic[cmd]
        for num,booklist in second_dic.item():
            name,price=booklist
            print('小说编号[{}],小说名《{}》,小说价格[{}]'.format(num,name,price))
        while True:
            cmd = input('输入你想购买的小说编号')
            if cmd not in second_dic:
                print('请正确输入编号')
                continue
            if cmd in second_dic:
                name=second_dic[cmd][0]
                price=second_dic[cmd][1]
                cmd = input('当前选择的小说名为: 《{name}》,商品单价为: [{price}], 请输入Y/y购买:'.format(name,price)).strip()
                if cmd == 'Y' or cmd=='y':
                    name,psd,remind = getinfo(login_user)
                    remind=int(remind)
                    if remind<int(price):
                        price('余额不足,请先充值')
                        break
                    old_data = '{}:{}:{}'.format(name, psd, remind)
                    remind -= int(price)
                    new_data = '{}:{}:{}'.format(name, psd, remind)
                    update(old_data, new_data)
                    print('购买成功,请欣赏内容')
                    fictiondata=show(name)
                    print('''
                    -------开始阅读--------
                    {}
                    '''.format(fictiondata))
                    

#登出功能
def logout():
global login_user
login_user=None
#运行菜单
func_dic={
'0':['注册',register],
'1':['登录',login],
'2':['充值',add_credit],
'3':['小说',reader],
'4':['登出',logout],
}
def run():
while True:
print('''
        ~~~~~~~欢迎来到小说世界~~~~~~~
                0 账号注册
                1 账号登录
                2 充值功能
                3 阅读小说
                4 登出
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ''')
        cmd= input('请输入功能编号,按4退出').strip()
        if cmd =='4':
            logout()
            break
        if cmd not in func_dic:
            print('请正确输入功能编号')
            continue
        func_dic[cmd][1]()
run()
复制代码

 

 

# 编写小说阅读程序实现下属功能
# # 一:程序运行开始时显示
# 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消费) 金额"
#
#
#
# # 附加:
# # 可以拓展作者模块,作者可以上传自己的作品
#
#
复制代码
import time

userstatus = {'username': None}


def auth(func):
    '''
    认证功能装饰器
    :return:
    '''

    def wrapper(*args, **kwargs):
        if userstatus['username'] is None:
            inp_name = input('输入用户名')
            inp_psd = input('输入密码')
            with open('db.txt', 'rt', encoding='utf-8')as rf:
                userinfo = {}
                for line in rf:
                    name, psd, remind = line.strip().split(':')
                    userinfo[name] = [psd, int(remind)]
                if inp_name not in userinfo:
                    print('用户不存在')
                    return
                if inp_name in userinfo and userinfo[inp_name][0]==inp_psd:
                    print('登录成功,亲爱的{}用户'.format(inp_name))
                    userstatus['username']=inp_name
                    res=func(*args, **kwargs)
                    return res
                else:
                    print('账号密码错误')
                    return
        else:
            res = func(*args, **kwargs)
            return res
    return wrapper


def record_log(func):
    '''
    日志记录功能装饰器
    :return:
    '''

    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        with open('record.log', 'ab')as log_f:
            op_time = time.time()
            amount = func.amount
            log_f.write('{} {} {} {}\n'.format(op_time, userstatus['username'], func.__name__, amount).encode('utf-8'))
        return res

    return wrapper


def register():
    '''
    注册功能
    :return:
    '''
    with open('db.txt', 'rt', encoding='utf-8')as rf:
        userinfo = {}
        for line in rf:
            name, psd, remind = line.strip().split(':')
            userinfo[name] = [psd, int(remind)]
        inp_name = input('输入注册名')
        inp_psd = input('输入密码')
        if inp_name in userinfo:
            print('用户名已存在')
            return
        re_psd = input('再次输入密码')
        if inp_psd == re_psd:
            print('注册成功')
            with open('db.txt', 'at', encoding='utf-8')as af:
                af.write('{}:{}:0\n'.format(inp_name, inp_psd))
        else:
            print('两次密码不一致')
            return


@record_log
@auth
def add_credit():
    '''
    充值功能
    :return:
    '''
    print('欢迎使用充值功能,亲爱的{}'.format(userstatus['username']))
    with open('db.txt', 'rt', encoding='utf-8')as rf:
        userinfo = {}
        for line in rf:
            name, psd, remind = line.strip().split(':')
            userinfo[name] = [psd, int(remind)]
        while True:
            amount = input('请输入充值的金额').strip()
            conf = input('确定要向{}用户充值{}吗,确定输入Y/y,退出N/n'.format(userstatus['username'], amount))
            if conf == 'Y' or conf == 'y':
                print('充值成功,已为您充值{}元'.format(amount))
                userinfo[userstatus['username']][1] += int(amount)
                break
            elif conf == 'N' or conf == 'n':
                break
    with open('db.txt', 'wt', encoding='utf-8')as wf:
        for name in userinfo:
            wf.write('{}:{}:{}\n'.format(userinfo[name], userinfo[name][0], userinfo[name][1]))

@record_log
@auth
def read():
    '''
    阅读小说功能
    :return:
    '''
    pass


def logout():
    '''
    登出
    :return:
    '''
    userstatus['username'] = None
    return


def menu():
    fuc_dic = {
        '0': ('注册功能', register),
        '1': ('充值功能', add_credit),
        '2': ('阅读小说', read),
        '3': ('登出',logout)
    }
    tag= True
    while tag:
        cmd = input('''
        0 账号注册
        1 充值功能
        2 阅读小说
        3 登出
        ''')
        int(cmd)
        if not cmd.isdigit():
            print('请输入数字')
        if cmd.isdigit():
            fuc_dic[cmd][1]()
            if cmd == 3:
                tag=False

menu()

猜你喜欢

转载自www.cnblogs.com/lucky-cat233/p/12596426.html