zoukankan      html  css  js  c++  java
  • 洗礼灵魂,修炼python(75)--全栈项目实战篇(3)—— 账户注册登录管理系统

    要求:

    1.系统可以创建用户和登录用户,根据用户的输入不同,做出不同的反应(创建还是登录)

    2.创建用户不能创建已存在的用户名

    3.登录用户的操作最多只能有三次,超过三次冻结账户,每使用一次提示用户还有多少次机会

    4.认证用户成功后显示欢迎用语

    分析:

    1.根据用户输入不同,做出不同反应,那么则可以使用一个变量来接受用户输入的值,然后用if判断,如果是什么就是什么

    2.创建用户输入的用户名要和已存在的用户名(包括冻结用户名和正常用户名)做对比,那么就得有个容器来存储已存在的用户数据,并且每次使用此系统时,都要调用一次这个容器,当创建好用户后又要更新用户数据

    3.登录操作只能有三次,那么可以使用循环语句,for i in range(3)或者while True,在while了三次之后break跳出循环

    4.最后认证用户就简单了,用户名和对应的密码与存放用户数据的容器内的一致就print下认证成功

    开始写代码:

    本项目所有相关文件及代码我已发布到GitHub上:传送门(这是我之前做的,不过实现效果基本和本项目一致)

    我希望你自己已经事先经过思考并实践雇了再看以下代码:

    1.准备四个文件(这些文事先是手动创建的),两个文本文档用于保存数据,一个作为正常用户保存数据,一个作为冻结用户保存数据 ,一个主程序py文件,一个解冻用户py文件。

    2.在什么操作系统环境使用随便你,我这个是通用的

    正常用户数据文档为database.txt,数据如下:(显示不正常是因为有中文,不影响操作)

    {'�������Գ': 'abc@1234', '�����ũ': 'test.com', 'programmer': 'a123@.com', 'test': 'test@1234', 'coder': 'Iwasacoder', 'forloop': 'testasdf'}
    

    冻结用户诗句文档为free.txt,数据如下:

    {'coder': 'python558', 'yang': 'yang1234', 'ling': 'python@415'}
    

    主程序mylogin_and_register.py代码:

    #-*- coding:utf-8 -*-
    
    # import json
    # data=json.loads(f.read().replace("'",'"'))  #将字符串里的单引号替换成双引号,带u'的字符串,u也要去掉
    # print(type(data))
    # f.close()
    
    f=open('database.txt','r')
    database=eval(f.read())
    f.close()
    
    f2=open('free.txt','r')
    free=eval(f2.read())
    f.close()
    
    print('Welcome to login xx system/欢迎使用XX登录系统')
    kw=input('您想注册账户/登录账户,注册请输入【R】键,登录请输入【L】键:')
    
    if kw == 'R':#注册账户
        print('register account:')
        username=input('please enter your name/请输入您的账户名:')
        while  username in database.keys() or username in free.keys(): #如果昵称与已存在的账户名重复,提示重新取名
            print('The "%s" you entered already exists. Please enter a different one/您输入的"%s"已被使用,请输入其他帐户名'%(username,username))
            username=input('please enter your name/请输入您的账户名:')
        else:
            password=input('please enter your password/请输入您的密码:')
            while len(password)<8: #密码规则
                print('Your password is too simple, at least 8 digits. We recommend that you enter letters, numbers, special symbol combinations/您的密
    码过于简单,需要至少8位数,我们建议你输入字母,数字,特殊符号组合')
                password=input('please enter your password/请输入您的密码:')
            else:
                database[username]=password
                f=open('database.txt','w')
                f.write(str(database))
                f.close()
        print('Registered account success/注册账户成功')
    
    '使用while循环'
    if kw == 'L':#登录账户
        count3=0
        while count3<3:
            username=input('please enter your name/请输入您的账户名:')
            password=input('please enter your password/请输入您的密码:')
    
            if username in database.keys() and password == database[username]:
                print('登录成功')
                break
            elif count3 == 2:
                if username not in database.keys():
                    pass
                else:
                    free[username]=database.pop(username)
                    f2=open('free.txt','w')
                    f2.write(str(free))
                    f2.close()
                print('很抱歉,您的次数已用完,账户已锁定,程序将退出')
    
            else:
                print('登录失败,请检查你的帐户名和密码。三次登录失败账户将锁定,您还有%d次机会'%(2-count3))
    
            count3+=1
            if count3 == 3:
                rerun = input('您是我们的VIP客户,现在官方给您无限次登录机会,并且账户不会被冻结,您需要继续登录吗?[y/n]:')
                if rerun == 'y':
                    count3 = 0
    
    
    '使用for循环'
    
    # count2=3 #做为登录次数计数
    # if kw == 'L':#登录账户
    #     for i in range(3):
    #         username=input('please enter your name/请输入您的账户名:')
    #         password=input('please enter your password/请输入您的密码:')
    #         count2-=1
    #         if username in database.keys() and password == database[username]:
    #             print('登录成功')
    #             break
    #         elif i ==2:
    #             if username not in database.keys():
    #                 pass
    #             else:
    #                 free[username]=database.pop(username)
    #                 f2=open('free.txt','w')
    #                 f2.write(str(free))
    #                 f2.close()
    #             print('很抱歉,您的次数已用完,账户已锁定,程序将退出')
    #         else:
    #             print('登录失败,请检查你的帐户名和密码。三次登录失败账户将锁定,您还有%d此机会'%count2)
    
    if kw not in ('R','L'):
        print('输入有误')
    

    解冻用用户unfree.py:

    #-*- coding:utf-8 -*-
    
    f=open('database.txt','r')
    database=eval(f.read())
    f.close()
    
    f=open('free.txt','r')
    free=eval(f.read())
    f.close()
    
    username=input('请输入您需要解冻的帐户名:')
    database[username]=free.pop(username)
    
    f=open('database.txt','w')
    f.write(str(database))
    f.close()
    print('帐户名%s已经解冻,可以正常登录了'%username)
    

    总结:

    其实很简单对吧,然后有个很巧妙的eval()用法,要注意了,比pickle和json模块来的更方便,不过数据够大,还是建议用json或者pickle吧。

    你说这代码还可以优化吗?当然可以,文件是手动创建的,你可以实现自动创建加自动增删数据;你可以加入图形化界面;加入广告操作;加入不同等级的用户分配不同的权限;可以去掉使用文本文档来存储数据,而把数据对接到数据库里等等的,代码只作为参考,如果你们有更好的代码自然不错。

  • 相关阅读:
    Mysql5.6主从复制-基于binlog
    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
    socket recv阻塞与非阻塞error总结
    linux socket talkclient talkserver示例
    linux-socket connect阻塞和非阻塞模式 示例
    OPENSSL FIPS
    epoll的LT和ET使用EPOLLONESHOT
    如何在socket编程的Tcp连接中实现心跳协议
    linux网络编程:splice函数和tee( )函数高效的零拷贝
    Linux网络编程--sendfile零拷贝高效率发送文件
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/8030052.html
Copyright © 2011-2022 走看看