作业一:编写登录接口

(1)输入用户名和密码;

  (2)认证成功后显示欢迎信息;

  (3)输错三次后锁定。

思路:我们知道,要想让程序记住之前输入多少次,锁定用户,那么可以使用数据库来保存用户的状态,然而,数据库的知识还没有学习,因此我们要使用文件来保存文件。持久化保存数据信息,要保存在硬盘中。

(1)登陆,三次登陆锁定用户

用户信息文件         (用文件存储用户信息)

  黑名单文件

1.黑名单检测,不让登陆

    2.用户名密码判定

readme:

1.让用户输入用户名,首先在锁定列表中进行查找,查看用户是否进行锁定,如果用户没有在锁定文件中,那么在尝试看用户是否在用户文件中,如果输入的用户在文件中,则让用户输入密码,对密码进行判断,如果密码等于对应的用户的话就满足认证,让用户登陆成功,如果输入错误,则让用户重新输入,如果三次都没有成功,则锁定这个用户。

  2.在上面的思路中,我们可以遍历文件,把用户的信息存放在一个字典中,到时候只需要根据用户输入的用户名作为键,然后匹配对应的密码,看是否与用户输入的密码等同即可。

  3.我们也可以添加一个注册模块,如果用户不在用户文件中,则提示让注册,注册之后再登陆。

为此:我们采用两种方式进行尝试,一种是从上而下的编程;第二种是函数式编程方式:

流程图如下:

上面流程图是登录的过程,下面来编写代码:

#现有两个文件,一个lock_user,用于存储用户列表,一个lock_file用于锁定用户
#要想使用常规方法来造成多次输入的情况,必须使用while函数循环,为此,我们设置一个标识符,用来结束循环active = True
#设置标识符,用于结束真个循环,当我们想结束整个循环的时候,可以让表示符为false
user_dic = {}
#定义一个空字典,用于存储未锁定用户的用户名和密码
lock_dic = {}
#定义一个用于存储锁定用户的空字典
i = 0
while active:username = input("Please input your name:")#让用户输入用户名with open("lock_user","r") as f:#打开文件,并且遍历文件的每一行,用户把用户信息存储到字典中,以我们熟悉的方式处理for line in f.readlines():user,password = line.strip().split(":")#读取文件的每一行,并且分割字符串,生成用户名和密码存储在下面字典中lock_dic[user] = passwordif username in lock_dic.keys():#判断用户名是否在锁定列表中,如果在退出print("对不起,你输入的用户名已经被锁定,请联系管理员......")breakelse:passwith open("user_list","r") as f1:#打开文件,目的是判断用户是否注册for line1 in f1.readlines():user1,pwd = line1.strip().split(":")user_dic[user1] = pwdwhile active:if username in user_dic:#判断用户是否注册,如果注册了,就让用户输入密码if i < 3:#给用户三次机会input_pwd = input("Pleae input your password:")if input_pwd == user_dic[username]:print("登录成功,欢迎回来!")exit()else:if i == 2:#如果第三次用户还没有输对,则把用户从用户文件移除到锁定文件中print("对不起,你输入的次数过多,你的账户已经被锁定,请联系管理员")with open("lock_user", "a") as f3:f3.write("\n%s:%s" % (username, user_dic[username]))with open("user_list","r+") as f4:lines = f4.readlines()if ("%s:%s\n" %(username,user_dic[username])) in lines:lines.remove(("%s:%s\n" %(username,user_dic[username])))else:lines.remove(("%s:%s" %(username,user_dic[username])))#逐行读取文件信息f4.writelines(lines)active = Falseelse:print("您还有%s次机会输入,如果都没输对,系统将索斯能够你的用户名" %(2-i))i += 1else:#如果用户没有注册,让用户这测,并且把注册后的用户添加到新的列表中print("您输入的用户没有注册,请注册")log_user = input("Please input your login in name:")log_pwd = input("Please input your log password:")with open("user_list","a") as f2:f2.write("\n%s:%s" %(log_user,log_pwd))print("注册成功,欢迎您的加入!")active = False

上面代码中,主要用的是对文件的操作,文件的操作我掌握的还不是很熟练,另外我们在读取文件的时候,大家都经常遇到恶心的应该就是空行吧!我们在遍历文件的时候,如果使用split()方法分隔,遇到空行的时候会报错,因为分隔不了,没有参数提供给我们的变量,这个时候可以事先做个判断,而且文件的操作使用w+写读模式容易一不小心把后台文件内容清楚,被boss开除,因为文件的操作本人不是怎么喜欢。空行的问题可以使用if进行判断,如果遇到空行,回避掉。函数式编程程序如下:

import getpass
#导入模块,用于让用户输入密码处于隐藏状态
def locked_user(username):#查看用户是否锁定lock_users = []#定义一个空的列表,用于存储锁定用户信息with open("lock_file","r") as f:#打开文件for line in f.readlines():#逐行读取文件信息if line.strip():#对文件进行判断,判断是否是空行,因为空行的时候会报错lock_user,lock_pwd = line.strip().split(":")#字符串分割,生成用户名和密码,用户名存放在一个列表中进行验证是否锁定lock_users.append(lock_user)else:passif username in lock_users:#用户在锁定列表中告诉用户已经锁定print("您输入的用户已经被锁定,请联系管理员!")else:#用户没有锁定,返回用户名进行接下来用户是否注册的验证return usernamedef isregister(username):#验证是否注册user_dic = {}#定义一个空字典,用于存放用户名和密码users = []#定义一个空的列表,用于存储用户名with open("user_file","r") as f1:for line1 in f1.readlines():if line1.strip():users1,pwd1 = line1.strip().split(":")#字符串分割,生成用户名和密码user_dic[users1] = pwd1#生成用户名和密码字典users.append(users1)#把用户名以及对应的密码存放在一个字典中else:passif username in user_dic.keys():#判断用户名是否在用户列表中,在进行验证i = 0while i < 3:pwd = input("请输入你的用户密码:")if user_dic[username] == pwd:print("欢迎回来!")return Falseelse:if i == 2:print("对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员!")# 用户名锁定之后要把锁定用户添加到锁定列表中,从user_file中剔除with open("user_file", "r+") as f3:lines = f3.readlines()num = users.index(username)lines.pop(num)f3.writelines(lines)with open("lock_file", "a") as f4:f4.write("\n%s:%s" % (username, pwd))return Falseelse:print("您输入的密码不对,你还有%s次机会..." % (2 - i))i += 1else:#不在让用户注册print("您输入的用户没有注册,请注册!")register(rigister_name = input("请输入你要注册的用户名:"),rigister_pwd = getpass.getpass("请输入您的密码"))def register(rigister_name,rigister_pwd):#用户注册账号,注册之后添加到用户列表中,且打印一条注册成功的消息,结束过程with open("user_file","a") as f2:f2.write("\n%s:%s" %(rigister_name,rigister_pwd))print("注册成功,欢迎您!")return Falseactive = True
#定义一个标识符,用于开启结束循环
while active:username = input("请输入您的用户名::")locked_user(username)active = isregister(username)

上面代码基本上能够满足要求,能够验证是否锁定,是否注册,没有注册让用户注册,注册之后添加到用户列表中;注册输入密码,密码三次后锁定,从用户文件删除,添加到锁定文件;但是用户文件哪里有一点小bug,因为我不知道如何读取一个文件删除之后在添加,因为"w"模式打开文件后直接清空文件,他妈的,操。而"r+"模式打开后,如果在添加信息进去的话,之前的信息还存在。造成没有删除的用户重复。

在读取文件中也经常会遇到空格这种恶心的操作,真心不喜欢呀。不过可以使用if函数对空格进行判断,判断空格的位置。

转载于:https://www.cnblogs.com/gengcx/p/6828174.html

day1 作业编写登录窗口相关推荐

  1. day1:作业 编写登录接口并画出相应的流程图

    作业要求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 代码如下 _user_list =[] _user_dict = {} _login_error_count = 0 w ...

  2. day1作业:登录接口

    作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 思路: (1)用户输入用户名: (2)去锁定文件中验证用户名是否锁定: (3)去当前用户验证用户是否存在: ...

  3. 老男孩Day1作业(一):编写登录接口

    要求:编写登录接口 1. 输入用户名和密码 2. 认证成功后显示欢迎信息 3. 输错三次后锁定 1)编写思路 编写思路参考下面GitHub链接中的流程图 https://github.com/Chui ...

  4. 老男孩Day1作业(二):编写多级菜单

    要求:编写多级菜单 1.三级菜单 2.可依次进入各子菜单 3.菜单能够回到上一级 4.用到知识点:字典.列表.多层循环.函数 1)编写思路 编写思路参考下面GitHub链接中的流程图 https:// ...

  5. android登录窗口——基础编

    大家一定在CS/BS的程序有登录窗口,ANDROID也应该是,下面我来做了一个界面欢迎大家参考! main 代码 package net.blogjava.mobile; import android ...

  6. loginform登录表单 vs_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...

    原标题:[VSRC唯科普]穿越网页表单与登录窗口的采集(第9/14篇) 鸣 谢 VSRC感谢业界小伙伴-- Mils投稿精品科普类文章.VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相 ...

  7. C#登录窗口(访问数据库)的制作,类文件的制作及使用

    一.类文件的编写及使用. 可以单独建立一个类文件(使用记事本),然后包含在项目中,使用时加上该类的命名空间,就可以使用这个类了. 如何在一个项目里包含一个类文件? 1.在项目里新建一个文件夹: 2.将 ...

  8. 宋分题——Java实现登录窗口 和 信息录入窗口

    编写一个登录窗口, 密码输入采用密码框,输入密码显示为"*",当输入用户名admin密码123的时候点击确定跳转到学生信息录入窗口界面,其他输入显示用户名密码错误.点击取消退出运行 ...

  9. Dreamweaver实现 登录窗口界面(简单实例)

    窗口界面形式 如下图所示,使用HTML语言实现登录窗口界面. 窗口实现简略分析 如果要实现上图中的登录窗口界面,需要用到文本框(Text).按钮(Button).表格.表单(Form)等标记以及设置相 ...

最新文章

  1. 设备漏电对计算机影响,电脑机箱漏电对电脑有影响吗
  2. html与html5论文区别,HTML、XML、XHTML和HTML5的异同
  3. ​用 Python 动态可视化,看看比特币这几年
  4. struts2教程(4)--类型转换
  5. java限频_单个用户及Ip请求频率限制思路(附java实现)
  6. 冲突域、广播域的通俗讲解
  7. 进程控制(二)与linux下的自有服务
  8. Python的变量名、数据类型和简单运算、条件语句,循环及练习——02
  9. ajax与DOM的使用,AJAX和DOM的运行经验
  10. Android-JNI开发系列《一》-动态库的函数注册
  11. Hadoop The Definitive Guide:Hadoop权威指南-PART 1
  12. Ruby完全自学手册
  13. Ubuntu系统实现简单c语言编程
  14. win10 软路由_软路由和硬路由的区别分析
  15. Mac上命令行安装证书p12文件及描述文件mobileprovision
  16. 计算机网络本直通线的制作方法,计算机网络技术实训报告模版--交叉线与直通线制作.doc...
  17. centos7.5 挂载超过2T的大硬盘步骤
  18. 第七颗头骨 忘魂花 凤凰
  19. 2021年度上海公务员考试公告(11月05日开启)
  20. 社保及公积金转外省流程

热门文章

  1. HDFS伪分布式环境搭建
  2. 元素水平垂直居中的方法
  3. 【设计模式】装饰者模式
  4. Oracle date 和 timestamp 区别
  5. C++转义字符 amp; keyword
  6. mysql page header_MySQL系列:innodb源码分析之page结构解析
  7. RLC协议简单理解1-RLC报文格式
  8. 互联网协议 — D-IP(确定性的)网络架构
  9. 互联网协议 — IPv4 互联网协议第 4 版
  10. Linux_Shell基础