鱼C论坛

 找回密码
 立即注册
查看: 1062|回复: 2

求助数据储存优化及代码优化(用户登录模块)

[复制链接]
发表于 2020-7-3 21:07:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
PS:该程序有一默认锁定的用户(即所读取的文件均不为空)
源代码如下:
import easygui as g 

def count_users():
    count = len(dict_members)
    return count

def secure_question(read_write):
    if read_write == 'read':
        with open('securequestions.pkl','rb') as read_file:
            (questions,answer) = pickle.load(read_file)
            return (questions,answer)
        
    if read_write == 'write':
        (list_question,list_answer) = secure_question('read')
        msg = '请设置账号密保问题'
        title = '账号安全设置'
        choices = ('密保问题','答案')
        while True:
            (str_question,str_answer) = g.multenterbox(msg,title,choices)
            if len(str_question) and len(str_answer):
                break
            else:
                msg = '输入不能为空,请重新输入'
        list_question.append(str_question)
        list_answer.append(str_answer)
        question_data = [list_question,list_answer]
        with open('securequestions.pkl','wb') as write_file:
            pickle.dump(question_data,write_file)
        g.msgbox('密保问题设置成功','安全通知')
        
        
    
def read_user_ID(file_name):
    pickle_file = open(file_name,'rb')
    dict_user = pickle.load(pickle_file)
    pickle_file.close()
    return dict_user

def read_password():
    with open('password.pkl','rb') as passwd_file:
        passwd = pickle.load(passwd_file)
        return passwd

def write_password(password):
    passwd = read_password()
    passwd.append(password)
        
    with open('password.pkl','wb') as passwd_file:
        pickle.dump(passwd,passwd_file)
        
        

def write_file(name,user_ID):
    dict_members[name] = user_ID
    pickle_file = open('data.pkl','wb')
    pickle.dump(dict_members,pickle_file)
    pickle_file.close()


def changepasswd(name):
    (question,answer) = secure_question('read')
    flag = dict_members[name]
    msg = question[flag]
    correct_answer = answer[flag]
    title = '修改密码窗口'
    while True:
        enter_answer = g.enterbox(msg,title)
        if enter_answer == correct_answer:
            msg = '请输入新密码'
            new_password = g.passwordbox(msg,title)
            password_list = read_password()
            password_list[flag] = new_password
            with open('password.pkl','wb') as passwd_file:
                pickle.dump(password_list,passwd_file)
            break
        else:
            msg = question[flag]
            msg = '输入错误,请重新输入'+'\n'+msg

def find_password():
    msg = '请输入您的用户名'
    title = '找回密码'
    name = g.enterbox(msg,title)
    if name in dict_members:
        changepasswd(name)
    else: g.msgbox('您输入的用户名不存在','提示')
        
    
    
def main_menu():
    title = '主界面'
    choices = ('修改密码','注销','退出')
    while True:
        option = g.buttonbox('',title,choices)
        if option == '修改密码':
            changepasswd(current_user)
        if option == '注销':
            return False
        if option == '退出':
            return True

def frozen_users(read_write,name):
    if read_write == 'read':
        with open('frozen.pkl','rb') as frozend_file:
            frozen_user = pickle.load(frozend_file)
            return frozen_user

    if  read_write == 'write':
        Name = name
        frozen_list = frozen_users('read',Name)
        frozen_list.append(name)
        with open('frozen.pkl','wb') as frozen_file:
            pickle.dump(frozen_list,frozen_file)


def frozen_off(name):
    user_ID = dict_members[name]
    (questions,answer) = secure_question('read')
    msg = questions[user_ID]
    title = '账号安全窗口'
    n = 3
    while n:
        answer_enter = g.enterbox(msg,title)
        if answer_enter == answer[user_ID]:
            frozen_list = frozen_users('read',name)
            frozen_list.remove(name)
            with open('frozen.pkl','wb') as frozen_file:
                pickle.dump(frozen_list,frozen_file)
            break
        else:
            n -= 1
            g.msgbox('输入错误,你还有%d次机会'%n,title)
            

def SignIn():
    msg = '请输入用户名和密码'
    title = '用户注册窗口'
    user_info = []
    user_info = g.multpasswordbox(msg,title,('用户名','密码'))
    (name,password) = user_info
    while name in dict_members:
        g.msgbox('用户名已存在请重新输入!')
        SignIn()
    else:
        user_ID = count_users()
        dict_members[name] = user_ID
        
        write_password(password)
        write_file(name,user_ID)
        secure_question('write')
        return { name:user_ID }

def login(msg,title):
    while 1:
        user_info = []
        user_info = g.multpasswordbox(msg,title,('用户名','密码'))
        (name,password) = user_info

        if name not in dict_members:
            g.msgbox('用户名不存在请重新输入!')
            login(msg,title)
        else:
            break
    return user_info


def LogIn():
    
    msg = '请输入用户名和密码'
    title = '用户登录窗口'
    (Name,Password) = login(msg,title)
    if Name in frozen_users('read',Name):
        g.msgbox('该用户已冻结,请前往解冻')
        frozen_off(Name)
    else:
         global current_user
         current_user = Name
         user_ID = dict_members[Name]
         passwd = read_password()
         n = 3
         while (n-1):
            if Password == passwd[user_ID]:
                
                # (暂时不用) g.msgbox('欢迎进入XXOO系统,请点击右上角的X结束程序',ok_button = '退出')
                return True
                break
            else:
                n -= 1
                msg = '密码输入错误,你还有%d次机会' % n
                (Name,Password) = login(msg,title)
         else:
            g.msgbox('已输错三次密码,账号已锁定')
            frozen_users('write',Name)
            frozen_off(Name)
        
    

import pickle

dict_members = read_user_ID('data.pkl')
cmd = True
while cmd:
    title = '请选择操作对象'
    choices = ('注册','登录','忘记密码','退出')
    temp = g.buttonbox('',title,choices)

    if temp == '注册':
        newmember = SignIn()
        dict_members.update(newmember)
        g.msgbox('注册成功,赶紧登陆试试吧~')
        
    elif temp == '登录' :
        while LogIn():
            cmd = main_menu()
            if cmd:
                break

    elif temp == '忘记密码':
        find_password()

    elif temp == '退出' :
        break
        
g.msgbox('欢迎使用本程序',ok_button = '再见')
            
        


        
        

        
    







想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-3 21:16:28 | 显示全部楼层


先提个最基本的优化,你运行程序前先检测有无data.pkl文件,若无就新建,否则读取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-4 18:28:54 | 显示全部楼层
Twilight6 发表于 2020-7-3 21:16
先提个最基本的优化,你运行程序前先检测有无data.pkl文件,若无就新建,否则读取

谢谢,会加进去的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 03:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表