编写小说阅读程序实现下属功能
# 一:程序运行开始时显示 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消费) 金额
思路:分模块编写函数,按照其题目要求将项目分为四个部分,
即:1.账号注册 2.充值功能 3.阅读购买小说 4.认证功能
充值功能和购买阅读小说需要用户登录认证,所以认证功能要写为“装饰器”,装饰其他函数
新建两个文件“db.txt”,“story_class.txt”,
前者存放用户数据("用户名:密码:金额"),
后者存放书籍信息{"0":{"0":["倚天屠狗记.txt",3],"1":["沙雕英雄转.txt",10]},"1":{"0":["令人羞耻的爱.txt",6],"1":["二狗的妻子与大草原的故事.txt",5]}
新建一个字典将文件里面的书籍信息由字符串类型转化为字典类型方便后期的寻找
充值和购买需要运用文件修改的方法,运用“swap”函数可以临时建立一个文件,然后涉及充值和购买时,登录账户,找到需要用户自己的个人信息然后修改写入临时文件,再用“os”模块中的remove和rename函数把临时文件代替原来的文件,达到修改的目地。
import os
#账号注册
def register(use_name,use_pwd):
with open("db.txt",mode="at",encoding="utf-8") as f:
f.write(use_name)
f.write(":")
f.write(use_pwd)
f.write(":")
f.write('0')
f.write("\n")
#认证
def certify(func):
def wrapper(*args,**kwargs):
in_use_name = input("请输入你的账户:").strip()
in_use_pwd = input("请输入你的账户密码").strip()
certify = {}
with open ("db.txt",mode="rt",encoding="utf-8") as f:
for rang in f:
use_name,use_pwd,money = rang.split(":")
certify [use_name]=use_pwd
if in_use_name in certify:
if certify [in_use_name] == in_use_pwd:
print("登陆成功")
f.close()
res = func(*args, **kwargs)
return res
else:print("账户密码错误,请重新输入")
break
return wrapper
#充值功能
@certify
def top_ups(in_use_name,in_money):
with open ("db.txt",mode="rt",encoding="utf-8") as f1, \
open("db.txt.swap",mode="wt",encoding="utf-8") as f2:
for rang in f1:
use_name, use_pwd, money = rang.strip().split(":")
if in_use_name in use_name:
balance=int(money)+int(in_money)
f2.write(rang.replace(money,str(balance)))
print('充值成功,{}的余额为{}'.format(use_name,str(balance)))
break
else:
f2.write(rang)
os.remove("db.txt")
os.rename("db.txt.swap","db.txt")
#购买小说
@certify
def show_book(judgment,cost):
if judgment == "YES":
with open("db.txt", mode="rt", encoding="utf-8") as f1, \
open("db.txt.swap", mode="wt", encoding="utf-8") as f2:
for rang in f1:
use_name, use_pwd, money = rang.split(":")
balance = int(money) - int(cost)
f2.write(rang.replace(money,str(balance)))
print('购买成功,{}的余额为{}'.format(use_name,str(balance)))
os.remove('db.txt')
os.rename('db.txt.swap', 'db.txt')
elif judgment == "NO":
print('购买失败')
print("0 账号注册\n1 充值功能\n2 阅读小说")
number=input("请输入你操作的编码:")
for x in range(3):
if number == "0":
use_name=input("请输入你的注册账户名:").strip()
use_pwd=input("请输入你的注册账户密码:").strip()
register(use_name, use_pwd)
break
elif number == "1":
use_name = input("请输入你想充值的账号:").strip()
money = input("请输入你想充值的金额:").strip()
top_ups(use_name,money)
break
elif number == "2":
with open("story_class.txt", mode="rt", encoding="utf-8") as f:
res = f.read()
dic = eval(res)
print("0 玄幻武侠\n1 都市爱情\n2 高效养猪36技")
Type = input("请输入你想阅读的小说类型编号:").strip()
print(dic[Type])
book = input("请输入你想阅读的小说编号:").strip()
print(dic[Type][book])
cost = int(dic[Type][book][1])
judgment = input('是否购买小说(请回答YES/NO):').strip()
show_book(judgment,cost)
break
运行结果: