# 二 一个项目开发前,有一份开发文档
#
# 项目: 编写小说阅读程序实现下属功能
#
# # 一:程序运行开始时显示
# 0 账号注册
# 1 账号登录
# 2 充值功能
# 3 阅读小说
import os,sys ATM_PATH = os.path.dirname(__file__)
DB_PATH = os.path.join(ATM_PATH,'db.txt')
LOG_PATH = os.path.join(ATM_PATH,'log.txt')
DIR_PATH = os.path.join(ATM_PATH,'story_class.txt') def check(user):
with open(DB_PATH,'r',encoding='utf-8') as f:
for line in f:
users = line.strip().split(':')
if user == users[0]:
return True
else:
return False def log_in():
global user_in
global login
while True:
user = input('请输入账号:').strip()
with open(DB_PATH,'r',encoding='utf-8') as f:
pwd = input('请输入密码:').strip()
for line in f:
users = line.strip().split(':')
if user == users[0] and pwd == users[1]:
print('登录成功')
user_in = user
login = True
return True
else:
print('登录失败,请重新登录') def register():
while True:
user = input('请输入账号:').strip()
if user:
if not check(user):
pwd = input('请输入密码:').strip()
if pwd:
pwd2 = input('请确认密码:').strip()
if pwd == pwd2:
with open(DB_PATH,'a',encoding='utf-8') as f:
f.write('{}:{}:{}\n'.format(user,pwd,0))
print('注册成功')
else:
print('密码不一致')
else:
print('密码不能为空哦')
else:
print('账号已存在')
else:
print('账号不能为空哦') def log_money(func):
def wrapper(*args,**kwargs):
func(*args,**kwargs)
with open(LOG_PATH,'a',encoding='utf-8') as f:
import time
time1 = time.strftime('%Y-%m-%d %X')
if func.__name__ == 'money_in':
f.write('{} {} 充值 {}元\n'.format(time1,user_in,money))
if func.__name__ == 'money_out':
f.write('{} {} 消费 {}元\n'.format(time1,user_in,money))
return wrapper def log_in_check(func):
def wrapper(*args,**kwargs):
if login:
func(*args,**kwargs)
return True
else:
print('请登录后再操作')
return False
return wrapper @log_money
@log_in_check
def money_in():
while True:
money = input('充值多少:').strip()
if money.isdigit():
money = int(money)
NEW_PATH = os.path.join(ATM_PATH,'.db.txt.swap')
with open(DB_PATH,'r',encoding='utf-8') as f,\
open(NEW_PATH,'w',encoding='utf-8') as f1:
for line in f:
users = line.strip().split(':')
if user_in == users[0]:
users[2] = int(users[2]) + money
f1.write('{}:{}:{}\n'.format(users[0],users[1],users[2]))
print('充值成功,金额为:{}'.format(money))
os.remove(DB_PATH)
os.rename(NEW_PATH,DB_PATH)
break
else:
print('请输入整数数字') @log_money
def money_out(money):
while True:
money = int(money)
NEW_PATH = os.path.join(ATM_PATH, '.db.txt.swap')
with open(DB_PATH, 'r', encoding='utf-8') as f, \
open(NEW_PATH, 'w', encoding='utf-8') as f1:
for line in f:
users = line.strip().split(':')
if user_in == users[0]:
users[2] = int(users[2]) - money
f1.write('{}:{}:{}\n'.format(users[0], users[1], users[2]))
print('购买成功,金额为:{}'.format(money))
os.remove(DB_PATH)
os.rename(NEW_PATH, DB_PATH)
break @log_in_check
def read_book():
with open(DIR_PATH,'r',encoding='utf-8') as f1:
dir = eval(f1.read())
while True:
print("""==========================
0 玄幻武侠
1 都市爱情
2 高效养猪36技
10 上传的小说
==========================""")
choice = input('请输入编号:').strip()
if choice.isdigit():
if choice in dir:
dir1 =dir[choice]
for i in dir1:
print('{} {} 价格:{}'.format(i,dir1[i][0],dir1[i][1]))
choice2 = input('请输入编号:').strip()
if choice2.isdigit():
if choice2 in dir[choice]:
dir2 = dir1[choice2]
shop = input('是否购买 {} ,价格: {},y确认:'.format(dir2[0],dir2[1]))
if shop.lower() == 'y':
global money
money = dir2[1]
money_out(money)
book = dir2[0]
RD_PATH = os.path.join(ATM_PATH, 'fictions', book)
with open(RD_PATH,'r',encoding='utf-8') as f:
book_data = f.read()
print('''* * * * * * * * * * * * * * * * * * *
{0}
* * * * * * * * * * * * * * * * * * *'''.format(book_data))
input()
break
else:
break
else:
print('没有这个书哦')
else:
print('请输入整数数字')
else:
print('还没有这个书哦')
else:
print('请输入整数数字') @log_in_check
def book_up():
while True:
path_book = input('请输入所要上传的书籍路径:').strip()
if os.path.exists(path_book):
name = os.path.basename(r'{}'.format(path_book))
print(name)
UP_PATH = os.path.join(ATM_PATH, 'fictions', name)
print(UP_PATH)
if os.path.exists(UP_PATH):
up_choice = input('文件已存在,是否覆盖:y/n:::').strip()
if up_choice.lower() != 'y':
continue
with open(path_book,'rb') as f,\
open(r'{}'.format(UP_PATH),'wb') as f1:
print('正在上传 ...')
f1.write(f.read())
print('上传完成')
with open(DIR_PATH,'r',encoding='utf-8') as f,\
open('book_up.txt','w',encoding='utf-8') as f1:
d = eval(f.read().strip())
d['10'][str(len(d['10']))] = [name,0]
print(d['10'])
f1.write(str(d))
os.remove(DIR_PATH)
os.rename('book_up.txt',DIR_PATH)
break
else:
print('路径不存在,请重新输入') if __name__ == '__main__':
func_dic = {'0':['账号注册',register],
'1':['账号登录',log_in],
'2':['充值功能',money_in],
'3':['阅读小说',read_book],
'4':['上传小说',book_up],
'5':['退出',exit],
} user_in = None
login =False
while True:
print('===========================')
for i in range(len(func_dic)):
print('{} {}'.format(i,func_dic[str(i)][0]))
print('---------------------------')
choice = input('请输入命令编号:').strip()
if choice == 'q':
break
if choice in func_dic:
func_dic[choice][1]()
else:
print('没有这个编号')
continue # # 三:文件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. Android 开发 --Unable to resolve target 'android-19'
  2. 隐马尔科夫模型(HMM)的概念
  3. URAL 2034 Caravans(变态最短路)
  4. struts2与struts1整合,Unable to load configuration. - interceptor-ref ... struts.xml
  5. shell中使用echo命令改变输出显示样式
  6. git 远程追踪
  7. java--对象比较器
  8. gitoschina使用入门
  9. Python 项目实践三(Web应用程序)第三篇
  10. Kubernetes集群搭建之Etcd集群配置篇
  11. Luogu 1086 - 花生采摘 - [简单模拟]
  12. activemq 生产消费模式,订阅发布模式不同类型数据传输
  13. DOpus 10.5 使用帮助
  14. Linux内核同步:自旋锁
  15. js获取dom元素的子元素,父元素,兄弟元素小记
  16. 如何用nodejs 开发一个命令行交互工具
  17. CentOS 删除桌面环境
  18. LintCode-35.翻转链表
  19. VM虚拟机不能上网的问题解决
  20. MapReduce:实现文档倒序排序,且字符串拼接+年+月+日

热门文章

  1. scrapy爬虫-代理IP中间件
  2. node--非阻塞式I/O,单线程,异步,事件驱动
  3. 网页入侵最后一道防线:CSP内容安全策略
  4. 一些大厂的css reset 代码
  5. Django中的session的使用
  6. Ubuntu16.04如何安装bazel?
  7. HDFS 客户端读写操作详情
  8. JAVA生成EXCEL模板
  9. 关于 服务器ip和域名进行一个绑定
  10. 开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?