zoukankan      html  css  js  c++  java
  • 编写可供用户查询的员工信息表(二)

    编写可供用户查询的员工信息表

    要求:

    1.需要用户认证

    2.员工信息表文件内容:

      ID  Name  Department  Phone

    3.认证成功后查询正确信息 

    上一篇内容:https://www.cnblogs.com/easypython/p/9080561.html

    〇上一篇已经实现基本要求,但代码还有所欠缺,比如登录成功后输入回车或空格会把文件信息作一次性读取出操作,而此篇内容为对上一篇的修改补充;可实现功能:

    〇1.编写登录接口,输入用户名和密码

    〇2.用户验证成功登录后显示登录欢迎信息

    〇3.用户输错密码超限后锁定

    〇4 不同的错误锁定方式可以有所区别

    〇解决一次性输出文件所有信息的BUG

    代码分享如下: 

     1 #!/usr/bin/env/python                                                            #声明解释器
     2 # -*- coding: utf-8 -*-                                                           #声明使用utf-8编码,此行Python3不需要
     3 import sys                                                                         #导入sys模块
     4 import time                                                                                                                 #导入time模块                              
     5 
     6 dic_account = {}                                                                                                            #定义一个空字典
     7 normoal_file = "G:pythonexsise\filewhitelist.txt"                                                                       #白名单文件,存放用户名与密码的本地文件,注意路径前'\'
     8 lock_file = "G:pythonexsise\filelock.txt"                                                                               #黑名单文件,我用的是我的本地文件存放的绝对路径
     9 with open(normoal_file) as norm_f:                                                                                          #打开白名单文件
    10     for line in norm_f.readlines():                                                                                         #for循环,readlines()一次性读取所有行
    11         usr,pawd = line.strip().split()                                                                                     #每行去除空格分割后分别赋予两个变量
    12         dic_usr_pawd = {usr:pawd}                                                                                           #以每一行得到的两个变量为键值对就生成一个字典
    13         dic_account.update(dic_usr_pawd)                                                                                    #循环更新扩展字典
    14 
    15 def deny_accout(usrname):                                                                                                   #定义了黑名单的函数
    16     print('33[1;31;40m')                                                                                                  #下一目标输出背景为黑色,颜色红色高亮显示
    17     print('*' * 50)                                                                                                         #输出打印信息
    18     print('33[7;31m错误次数超限,用户已被永久锁定,请联系管理员!33[1;31;40m')                                                 #字体颜色红色反白处理
    19     print('*' * 50)                                                                                                         #打印50个*号
    20     print('33[0m')                                                                                                        #屏幕输出颜色恢复默认值
    21     with open(lock_file,'a') as deny_f:                                                                                     #以追加模式打开黑名单文件
    22         deny_f.write('
    ')                                                                                                  #换行
    23         deny_f.write(usrname)                                                                                               #黑名单中写入锁定用户
    24      sys.exit()                                                              #执行sys模块退出方法
    25 def main():                                                                                                                 #定义主函数
    26     NumOfInput = 1                                                                                                          #定义输入次数变量NumOfInput初始值为1
    27     usr_list = []                                                                                                           #定义一个空列表
    28     while True:                                                                                                             #while 循环
    29         usrname = input('33[1;32m请输入您的用户名:33[0m')                                                                 #用户交互第一步:请输入用户名
    30         if list(dic_account.keys()).count(usrname) == 0:                                                                    #计算输入的用户名在字典里对应键个数是否为零
    31             if len(usrname.strip()) == 0:                                                                                   #如果输入为空
    32                 print('33[1;31m用户名不能为空,请重新输入')                                                                   #打印相应提示信息
    33             else:                                                                                                           #否则(既输入不为空)
    34                 with open(lock_file) as lock_f:                                                                             #打开黑名单文件进行后一步操作
    35                     for line in lock_f.readlines():                                                                         #对于line在黑名单文件中的其中一行,readlines()一次性读取所有行
    36                         if usrname == line.strip():                                                                         #如果输入用户名等于黑名单其中一员
    37                             sys.exit('33[1;41m用户%s已锁定,请联系管理员。33[0m' % usrname)                                 #退出并提示用户账户已锁定
    38                 usr_list.append(usrname)                                                                                    #对列表进行附加元素操作
    39                 redo_num = usr_list.count(usrname)                                                                          #计算列表里元素存在的为usrname个数并赋值变量,usrname引用输入的用户名变量
    40                 if redo_num == 3:                                                                                           #如果列表计算的用户名个数小于3(这里的意思为如果尝试输入的同一个用户名应小于3次)
    41                     deny_accout(usrname)                                                                                   #调用deny_accout()函数,既同一用户名输入次数超过3次加入黑名单
    42                 elif NumOfInput < 5 :                                                                                       #如果循环输入次数不超过5次
    43                     NumOfInput += 1                                                                                         #变量每次循环自增1
    44                     print("33[1;31m出错了,用户名:%s没有找到,请重新输入:" % usrname)                                       #打印相应的错误提示信息
    45                 else:                                                                                                       #否则(输入次数超过5次)
    46                     print('33[1;33m用户名错误次数超限,请5分钟后再试')                                                         #打印错误提示
    47                     time.sleep(300)                                                                                         #调取time模块方法,5分钟内无法操作
    48         else:                                                                                                              #否则(既输入的用户名在白名单中存在)
    49             NumOfInput = 0                                                                                                  #同样赋予输入次数变量NumOfInput初始值为0
    50             while NumOfInput < 3:                                                                                           #进入while循环,输入次数不超过3
    51                 passwd = input('33[1;32m请输入用户%s密码:33[0m' % usrname)                                               #输入用户名密码
    52                 if passwd == str(dic_account[usrname]):                                                                     #如果密码与字典里对应输入用户名的键值相同
    53                     print('33[1;36m登陆成功。您的所有操作有可能会被记录!')                                                    #打印登录成功信息
    54                     while True:                                                                                             #while循环
    55                         match_yes = 0                                                                                       #定义一个变量初始值与后面的赋值对应,具有特殊意义
    56                         sch_input = input("33[1;34;42mPlease enter what the information you need to search: ")            #请输入你想查找的信息
    57                         InfoOfEmTab_file = open("TheInfoOfEmployeeTable.txt")                                               #对文件进行操作,打开员工信息表文件
    58                         while True:                                                                                         #嵌套while循环,目的是读取文件每一行
    59                             line = InfoOfEmTab_file.readline()                                                              #读取文件的一行,readline()每次读取一行
    60                             if len(line) == 0: break                                                                        #读取到文件结尾后结束退出
    61                             if sch_input.strip() in line:                                                                   #假如输入内容在读取文件的其中一行
    62                                 if sch_input.strip() == '':                                                                 #假如输入空格或者回车
    63                                     match_yes = 1                                                                           #满足条件后给变量赋予新值(注:变量赋值不输出任何信息)
    64                                 else:                                                                                       #否则
    65                                     print("33[1;31mMarch Item: 33[1;36m%s" % line)                                      #打印匹配信息
    66                                     match_yes = 2                                                                           #满足条件后给变量赋予新值,与初始变量值不同,所以不打印当变量值为初始值的提示信息
    67                         if match_yes == 0:                                                                                  #变量值如果等于初始值(可以理解为输入不为空或者回车,且用户输入的查找内容不在信息表的任一行)
    68                             print("33[1;31mNo match items had found!Please check it and try again.
    ")                    #打印变量等于初始值需要输出的提示信息
    69                         if match_yes == 1:                                                                                  #对应之前赋值'match_yes = 1'
    70                             print("33[1;31mThere was no character input, please check if the input was corrected!
     ")   #打印赋值为1需要输出的提示信
    71                 if len(passwd.strip()) == 0:                                                                               #如果输入密码为空
    72                     print('33[1;33m密码不能为空,请重新输入,您还有%d次机会。'% (2-NumOfInput))                                  #打印错误提示信息
    73                     NumOfInput += 1                                                                                       #输入次数增加1
    74                 else:                                                                                                    #否则(密码不为空而且密码不正确)
    75                     print('33[1;33m密码错误,请重新输入,您还有%d次机会。'% (2-NumOfInput))                                    #打印密码错误提示
    76                     NumOfInput += 1                                                                                         #输入错误次数增加1
    77             else:                                                                                                           #否则(输入次数超过3)
    78                 print('33[1;31m输入次数超限,请2小时后再试')                                                                  #打印错误提示
    79                 time.sleep(7200)                                                                                           #调取time模块方法,2小时内无法操作
    80 
    81 if __name__ == '__main__':                                                                                                  #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,则不运行
    82     main()                                                                                                                  #执行main()函数

     执行效果图:

     1.输入空格或回车不计算次数,其他不同用户超过5次冻结5分钟无法操作

     

     2.输入黑名单成员直接锁定退出

     

      3.输入同一用户名错误累计3次加入黑名单

     

     4.输入正确用户名,密码错误3次冻结2小时无法操作

     

     5.登陆成功后查询员工信息表,输入空格和回车提示错误信息,输入查询内容,匹配打印相关信息

     

  • 相关阅读:
    TinyOS功率编程指南
    深度学习入门资料
    通信常识
    CTF入门
    前端开发工具之服务器选择
    Spring
    NoSQL -- MongoDB
    NoSQL -- Redis
    mysql alter table修改表结构添加多个字段的几个写法
    gongle 访问助手安装
  • 原文地址:https://www.cnblogs.com/easypython/p/9080972.html
Copyright © 2011-2022 走看看