檔案讀寫實現的 小說閱讀系統
阿新 • • 發佈:2018-12-12
需求: 小說閱讀系統 要求:賬戶資料永久儲存,重新開啟系統,賬戶資料不丟失。 要求:使用函式 第一個介面有以下功能: 1 註冊,2 登入看書系統,3 充值,4檢視榜單:點選榜:推薦榜:打賞榜: 0,:退出 第二個介面:登入看書系統後看到圖書分類 分類,例:1古典仙俠2東玄西幻3霸道總裁4都市人生0退出 (每個類別擁有1本書即可,每本書至少兩頁) 分類下的圖書,例:1塵緣 2褻瀆 ... 選擇編號,閱讀相應書籍,餘額不足不允許檢視,提示餘額不足。 看書過程中,可以選擇1推薦,2打賞,3下一頁(扣餘額),4上一頁,0退出 選1,該書推薦數 選2,該書打賞金額增加 選3, 下一頁 選4,上一頁 選0,退出 可能用到的知識 (import operator 匯入operator模組 l=[['a',2],['b',3],['c',1]] l.sort(key=operator.itemgetter(1),reverse=True) key=operator.itemgetter()會按照括號中的下標去排序 如例題會按列表中,1,2,3(下標為1)的大小去排序,reverse=True為從大到 小排序,reverse=False會從小到大排序。 可以根據實際情況,或真實的客戶需求,或自己的想象,自行新增小說閱讀系統 功能 實現程式碼: #有與程式碼檔案同目錄的book.txt儲存書籍資訊,user.txt儲存使用者資訊 #使用Pickle庫進行檔案讀寫操作 #https import pickle import operator allusers=[] abooks=[] global uuu global ls ls=0 def is_number(s): try: float(s) return True except ValueError: pass try: import unicodedata unicodedata.numeric(s) return True except (TypeError, ValueError): pass return False def loadb(): global abooks f=open("book.txt","wb") abooks=pickle.load(f) #for i in allusers: # print(i) f.close() def viewbook(): f=open("book.txt","rb") l=pickle.load(f) for i in l: print(i) def view(): f=open("user.txt","rb") l=pickle.load(f) for i in l: print(i) f.close() ##def load(): ## global allusers ## f=open("user.txt","rb") ## allusers=pickle.load(f) #for i in allusers: # print(i) ## f.close() def reg(): ##load() while True: regs=0 ex=0 nuser=input("請輸入你的賬戶名:") if nuser=='' or nuser[0]==' ': print("賬戶名不能為空或全為空格") continue f=open("user.txt","rb") l=pickle.load(f) for i in l: if i[0]==nuser: print("該使用者已經存在") ex=1 break if ex==1: continue f.close() npwd=input("請輸入你的密碼:") npwd1=input("請確認一遍你的密碼:") if npwd=='' or npwd[0]==' ': print("密碼不能為空或全為空格") continue if npwd==npwd1: f=open('user.txt','rb') new=[nuser,npwd,0] global allusers allusers=pickle.load(f) f.close() f=open('user.txt','wb') allusers.append(new) pickle.dump(allusers,f) f.close() #f.write((allusers)) regs=1 print("註冊成功") else: print("兩次密碼不一致,註冊失敗") continue if regs==1: break def login(): global ls while True: le=0 lname=input("請輸入你的賬戶名") if lname=='': print("使用者名稱不能為空") continue lpwd=input("請輸入你的密碼") if lpwd=='': print("密碼不能為空") continue f=open("user.txt","rb") l=pickle.load(f) f.close() for i in l: if i[0]==lname: le=1 if i[1]==lpwd: ls=1 break if le==0: print("賬戶不存在!") continue if ls==1: print("登陸成功") break else: print("密碼錯誤,登入失敗") continue if ls==1: return lname #reg() def first(): while True: print("*************請您先登入賬號或註冊一個新的賬號***************") print("************************************************************") print("********************* R 注 冊*************************") print("------------------------------------------------------------") print("********************* L 登 錄*************************") print("------------------------------------------------------------") print("********************* C 充 值*************************") print("------------------------------------------------------------") print("********************* V 查 看 榜 單************************") print("------------------------------------------------------------") print("********************* Q 退 出*************************") print("************************************************************") print("************************************************************") print("************************************************************") choice=input('''請輸入你的選擇(大小寫皆可): 輸入R進行註冊 輸入L進行登入 輸入C進行充值 輸入V檢視榜單 輸入Q退出系統\n:''') if choice=='R' or choice=='r': reg() elif choice=='L' or choice=='l': global uuu uuu=login() if ls==1: print("歡迎您 尊敬的%s客戶" %uuu) kanshu() elif choice=='V' or choice=='v': bangdan() elif choice=='Q' or choice=='q': break elif choice=='C' or choice=='c': cz() else: print("輸錯了,不要著急 請輸入 R或r L或l Q或q V或v C或c來選擇功能") #first() #print("歡迎您 尊敬的%s客戶" %uuu) #def regb(): #book:1 類別 2.書名 3每一頁的價錢 4 第一頁 5 第二頁 6 點選量 7 打賞量 8 推薦量 #loadb() # f=open("book.txt","wb") # global abooks # a1=['古典仙俠','笑傲江湖',50,'令狐沖自幼無父無母。在華山這個充滿著靈性的地方,他既有著師長的呵護,同門的愛護,再加上自身的努力和灑脫不羈的性格','對於江湖的認識,他一方面是靠自己初出江湖時,就已經遊刃有餘了。他性情率真,追求自由自在的生活。',0,0,0] # a2=['玄幻小說','鬥破蒼穹',40,'當年納蘭嫣然被雲韻收為弟子之時,年僅十歲,在雲嵐宗中修煉了五年時間,所謂女大十八變,好多年未見,蕭戰自然不知道面前的少女,便是自己名義上的兒媳婦。','忽然出現的一幕,讓得眾人也是略微一愣,三位長老互相對視了一眼,眉頭不由得皺了皺…',0,0,0] # a3=['霸道總裁','我叫宮洺',30,'大家好我叫宮洺我是ME的董事長','我很有錢我還有一個很帥的弟弟就這樣謝謝大家',0,0,0] # a4=['都市人生','小時代',20,'大家號我叫林蕭我是ME的員工','我沒什麼錢但是我的朋友顧裡很有錢',0,0,0] # abooks.append(a1) # abooks.append(a2) # abooks.append(a3) # abooks.append(a4) # pickle.dump(abooks,f) # f.close() def cz(): while True: czss=0 czex=0 czh=input("請輸入您要充值的賬號(輸入0返回主介面)") if czh=='': print("賬號不能為空") if czh=='0': break czm=input("請輸入您要充值的金額") while is_number(czm)==False or int(czm)<0: czm=input("請輸入一個大於0的正整數") czm=int(czm) f=open("user.txt","rb") global allusers allusers=pickle.load(f) for i in allusers: if i[0]==czh: czex=1 i[2]+=int(czm) print("成功為賬號%s 充值了 %d元" %(czh,czm)) print("當前賬號 %s 餘額 %d 元" %(czh,i[2])) czss=1 break f.close() if czss==1: f=open("user.txt","wb") pickle.dump(allusers,f) f.close() break if czex==0: print("找不到您要充值的賬號,請重新輸入") continue def kanshu(): while True: cash=0 qiangouflag=0 f=open("user.txt","rb") sss=pickle.load(f) for i in sss: if i[0]==uuu: cash=i[2] break print("當前餘額%d" %cash) print('''當前有書籍 古典仙俠類中 1.笑傲江湖 玄幻小說類中 2.鬥破蒼穹 霸道總裁類中 3.我叫宮洺 都市人生類中 4.小時代 0.退出 ''') choice=input("請按照數字選擇你想看的書") while is_number(choice)==False: choice=input("請輸入一個數字") while choice!='1' and choice!='2' and choice!='3' and choice!='4' and choice!='0': choice=input("數字輸入錯誤 請重新輸入0-4的數字") if choice=='0': break choice=int(choice) fu1=0 page=0 f=open("book.txt","rb") lbb=pickle.load(f) print("您選擇閱讀的是%s" %lbb[choice-1][1]) f=open("book.txt","rb") l=pickle.load(f) f.close() f1=open("user.txt","rb") allusers=pickle.load(f1) f1.close() for i in allusers: if i[0]==uuu: if i[2]>l[choice-1][2]: qiangouflag=1 i[2]=i[2]-l[choice-1][2] print("該書一頁消費%d 當前餘額%d" %(l[choice-1][2],i[2])) f2=open("user.txt","wb") pickle.dump(allusers,f2) f2.close() print("第一頁:",end='') print(l[choice-1][3]) f=open("book.txt","rb") l4=pickle.load(f) f.close() f=open("book.txt","wb") l4[choice-1][5]+=1 print("該書的點選量增加了1 目前為%d" %l4[choice-1][5]) pickle.dump(l4,f) f.close() while True: print("1.推薦該書一次") print("2.打賞該書") print("3.下一頁") print("4.上一頁") print("0.退出") ch=input("請根據數字選擇接下來的操作:") if ch=='1': f3=open("book.txt","rb") l1=pickle.load(f3) f3.close() f3=open("book.txt","wb") l1[choice-1][7]+=1 pickle.dump(l1,f3) f3.close() print("%s推薦量增加了一次 目前為%d次" %(l1[choice-1][1],l1[choice-1][7])) elif ch=='2': num=input("請輸入你想打賞的金額") while is_number(num)==0 or int(num)<0: num=input("打賞金額必須為正整數 請重新輸入:") num=int(num) f=open("user.txt","rb") dul=pickle.load(f) f.close() f=open("book.txt","rb") dbl=pickle.load(f) f.close() for i in dul: if i[0]==uuu: if i[2]>=num: f=open("user.txt","wb") i[2]=i[2]-num pickle.dump(dul,f) f.close() f=open("book.txt","wb") dbl[choice-1][6]+=num pickle.dump(dbl,f) f.close() print("成功打賞金額%d 當前剩餘餘額%d 該書賞金總量%d" %(num,i[2],dbl[choice-1][6])) else: print("金額不足 不能打賞") break else: continue elif ch=='3': if page==1: print("已經是最後一頁") continue lmoney=0 f=open("user.txt","rb") ll=pickle.load(f) f.close() for i in ll: if i[0]==uuu: lmoney=i[2] else: pass f=open("book.txt","rb") lb=pickle.load(f) f.close() num=lb[choice-1][2] if lmoney>=num: if fu1==0: fu1=1 f=open("user.txt","wb") for i in ll: if i[0]==uuu: i[2]=i[2]-lb[choice-1][2] break pickle.dump(ll,f) f.close() dangqian=0 f=open("user.txt","rb") uuuu=pickle.load(f) for i in uuuu: if i[0]==uuu: dangqian=i[2] break f.close() print("即將進入下一頁 耗費%d 元 賬戶剩餘%d元" %(num,dangqian)) else: print("已付費") page+=1 f=open("book.txt","rb") bl=pickle.load(f) f.close() print(bl[choice-1][4]) else: print("餘額不足 不能進入下一頁") break elif ch=='4': if page==0: print("已經是第一頁") continue else: page=page-1 print("即將進入第一頁") f=open("book.txt","rb") zl=pickle.load(f) f.close() print(zl[choice-1][3]) elif ch=='0': break else: print("請輸入一個0-4的正整數") continue if qiangouflag==0: print("餘額不足") continue def bangdan(): dianjic=1 tuijianc=1 dashangc=1 f=open("book.txt","rb") bangdan=pickle.load(f) f.close() print("點選榜:") bangdan.sort(key=operator.itemgetter(5),reverse=True) for i in bangdan: print("點選榜第%d名 是%s 點選量%d" %(dianjic,i[1],i[5])) dianjic=dianjic+1 print("推薦榜:") bangdan.sort(key=operator.itemgetter(7),reverse=True) for i in bangdan: print("推薦榜第%d名 是%s 推薦量%d" %(tuijianc,i[1],i[7])) tuijianc=tuijianc+1 print("打賞榜:") bangdan.sort(key=operator.itemgetter(6),reverse=True) for i in bangdan: print("打賞榜第%d名 是%s 打賞量%d" %(dashangc,i[1],i[6])) dashangc=dashangc+1 #view() #viewbook() first()