1. 程式人生 > >檔案讀寫實現的 小說閱讀系統

檔案讀寫實現的 小說閱讀系統

需求:
小說閱讀系統
要求:賬戶資料永久儲存,重新開啟系統,賬戶資料不丟失。
要求:使用函式
第一個介面有以下功能:
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()