用代码实现三次用户登录及锁定(选做,时间充足建议做一做)
项目分析:
一.首先程序启动,显示下面内容供用户选择:
1.注册
2.登录

a.用户选择登录的时候,首先判断用户名在userinfo.txt表中存在不在,存在就不能进行注册
b.当注册的用户名不存在的时候将用户名和密码写入到userinfo.txt文件中
c.用户选择登录的时候,判断用户输入的账号和密码是否userinfo.txt存储的一致
d.用户名和密码一致就终止循环,并提示用户登录成功!
e.用户名和密码不一致,只有三次登录机会,三次过后提示用户名被锁定,请联系管理员!并终止循环
f.当用户名输出三次,再次运行程序.登录锁定的账号继续提示用户名被锁定,请联系管理员!

import os
count = 0
dic = {}
def locked(login_user,count = 3):
    with open("userinfo.txt", "r", encoding="UTF-8") as f4, open("userinfo_bak.txt", "w", encoding="UTF-8") as f5:
        for i in f4:
            i = i.strip().split(":")
            if i[0] == login_user:
                i[0] = i[0].replace(i[0], i[0] + "$")
            f5.write(f"{i[0]}:{i[1]}\n")
    # print(f"你输错了{count}次!")
    print(f"检测到用户名{login_user}已经输错了{count}次,已锁定!请联系管理员!")
    os.remove("userinfo.txt")
    os.rename("userinfo_bak.txt", "userinfo.txt")
def user_login_count(login_user):
    with open("userinfo.txt", "r", encoding="UTF-8") as f:
        for i in f:
            i = i.strip().split(":")
            if i[0][-1] == "$" and i[0][0:-1] == login_user:
                dic[login_user] = 3
    if dic.get(login_user,0) != 3:
        dic[login_user] = dic.get(login_user,0) + 1
    # print(dic[login_user])
    return dic[login_user]
def register():
    user = input("请输入注册用户名(退出程序请按q/Q):")
    if user.lower() == "q":
        return "q"
    while 1:
        pwd = input("请输入注册密码:")
        if not pwd.strip():
            print("注册密码不能为空!请重新输入!")
        else:
            break
    with open("userinfo.txt", "r", encoding="UTF-8") as f:
        flag = True
        for i in f:
            i = i.split(":")
            if user == i[0]:
                print("用户名已存在!")
                flag = False
        if flag == True:
            with open("userinfo.txt", "a", encoding="UTF-8") as f1:
                f1.write(user + ":" + pwd + "\n")
                print("注册成功!")
def login():
    flag = False
    while 1:
        login_user = input("请输入登录用户名(退出程序请按q/Q):")
        if login_user.lower() == "q":
            return "q"
        login_pwd = input("请输入登录密码:")
        with open("userinfo.txt","r",encoding="UTF-8") as f:
            for i in f:
                i = i.strip().split(":")
                if i[0][-1] == "$" and i[0][0:-1] == login_user:
                    print(f"用户名{login_user}已被锁!")
                    break
                elif i[0] == login_user and i[1] == login_pwd:
                    flag = True
                    break
        if flag != True:
            ret = user_login_count(login_user)
            if ret == 3:
                locked(login_user)
            else:
                print(f"登陆失败,你已经输错{ret}次了!")
        else:
            print("登陆成功!")
            dic[login_user] = 0
            break
while 1:
    inp = input("请输入序号(1/注册,2/登录,q或Q/退出程序):")
    if inp == "1" or inp == "2" or inp.lower() == "q":
        if inp == "1":
            if register() == "q":
                break
        elif inp == "2":
            if login() == "q":
                break
        elif inp.lower() == "q":
            print("已退出程序!")
            break
    else:
        print("请重新输入!")

百万年薪python之路 -- 模拟三次账号登录锁定功能的更多相关文章

  1. 百万年薪python之路 -- 模块三

    logging 日志模块 loggin模块参数 灵活配置日志级别,日志格式,输出位置: import logging logging.basicConfig(level=logging.DEBUG, ...

  2. 百万年薪python之路 -- 软件的开发规范

    一. 软件的开发规范 什么是开发规范?为什么要有开发规范呢? 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目 ...

  3. 百万年薪python之路 -- 并发编程之 多进程二

    1. 僵尸进程和孤儿进程 基于unix的环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻检测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收. ...

  4. 百万年薪python之路 -- 并发编程之 多线程 三

    1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: ​ 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. ​ 非阻塞: 进程没有遇到IO 当进程遇到IO, ...

  5. 百万年薪python之路 -- 数据库初始

    一. 数据库初始 1. 为什么要有数据库? ​ 先来一个场景: ​ 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...

  6. 百万年薪python之路 -- 并发编程之 协程

    协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...

  7. 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块

    一. IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接 ...

  8. 百万年薪python之路 -- 面向对象之继承

    面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...

  9. 百万年薪python之路 -- JS基础介绍及数据类型

    JS代码的引入 方式1: <script> alert('兽人永不为奴!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script src ...

随机推荐

  1. 排列组合算法的Java实现

    转载于:http://cgs1999.iteye.com/blog/2327664

  2. [C++]类的设计(2)——拷贝控制(析构和三五法则)

    1.析构函数:释放对象使用的资源,并销毁对象的非static数据成员:析构函数不接受参数,因此不能被重载.对于一个给定类,有且只有一个析构函数.   2.析构函数的组成:一个函数体+一个析构部分(im ...

  3. 采用redis生成唯一且随机的订单号

    项目描述 最近做的一个项目有这么一个需求:需要生成一个唯一的11位的就餐码(类似于订单号的概念),就餐码的规则是:一共是11位的数字,前面6位是日期比如2019年07月20就是190720,后面五位是 ...

  4. SpringBootSecurity学习(01)网页版登录入门介绍

    Web应用安全管理 Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理.权限管理的设计一般使用角色 ...

  5. Centos安装PhantomJS

    1.下载PhantomJS [root@liuge ~]# wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-l ...

  6. 波士顿房价预测 - 最简单入门机器学习 - Jupyter

    机器学习入门项目分享 - 波士顿房价预测 该分享源于Udacity机器学习进阶中的一个mini作业项目,用于入门非常合适,刨除了繁琐的部分,保留了最关键.基本的步骤,能够对机器学习基本流程有一个最清晰 ...

  7. Mysql的MyISAM和InnoDB存储引擎的区别

    从以下几个方面: 1.存储结构 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData).  ...

  8. 【SQL server基础】SQL视图加密,永久隐藏视图定义的文本

    SQL可以对视图进行加密.也就是,可永久隐藏视图定义的文本. 注意   此操作不可逆.加密视图后,无法再修改它,因为无法再看到视图定义.如果需要修改加密视图,则必须删除它并重新创建另一个视图. 示例代 ...

  9. 使用.NET Core中创建Windows服务(一) - 使用官方推荐方式

    原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tu ...

  10. .Net Core 商城微服务项目系列(十三):搭建Log4net+ELK+Kafka日志框架

    之前是使用NLog直接将日志发送到了ELK,本篇将会使用Docker搭建ELK和kafka,同时替换NLog为Log4net. 一.搭建kafka 1.拉取镜像 //下载zookeeper docke ...