python编写小说阅读程序(内含注册函数、认证函数、充值函数、购买小说功能)

编写小说阅读程序实现下属功能

# 一:程序运行开始时显示
    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

 运行结果:

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值