关键词:
作业:编写登陆接口
- 输入用户名密码
- 认证成功后显示欢迎信息
- 输错三次后锁定
知识:
1.循环的使用;
2.continue,break在循环中中断的作用;
3.文件的写入,读取;
4.各基础知识的穿插应用
一、程序架构图
二、程序流程图如下:
三、具体代码及思路如下:
1.导入模块,及主程序页面
import os,json,random def main_show(): '''进入主页展示''' login_message = ''' ------------------------------------------------------------------------------------------------- 您好,欢迎来到京东二货市场 ------------------------------------------------------------------------------------------------- 【1】登录 【2】注册 【3】解锁 【q】退出 ------------------------------------------------------------------------------------------------- ''' print(login_message)
设置程序进入样式,告诉用户进去是什么样子,平台的功能,而不是进去啥都没有。程序要使用到os,json,random标准库。
2.存储用户文件的读写
def test_file(file): ''' 验证存储用户的文件是否存在,不存在生成 :param file: 文件名 :return: 无返回值 ''' if os.path.exists(file): #判断用户文件是否存在,不存在生成一个用户文件 pass else: with open(file,"w+") as f: users = {} json.dump(users,f) def read_file(file): ''' 从用户文件中读取用户列表,以方便进行验证 :param file: 文件名 :return: 返回读取的用户列表 ''' with open(file,'r+') as fr: users = json.load(fr) return users
def write_file(users,file):
'''
把修改后的用户列表重新写入进去
:param users: 用户名列表
:param file: 文件名
:return: 无返回值
'''
with open(file,'w+') as fw:
json.dump(users,fw)
第一段函数是判断用户文件是否存在,如果不存在则生成一个用户文件,如果存在了则不生成,为什么要这样呢?防止如果用户文件存在,我们会使用"w+"打开文件的时候把里面的文件信息清空;如果不存在的话,我们就生成用户文件,并且使用json模块把一个空的用户字典写入文件中,方便下面读取添加用户信息。
第二段函数是读取文件信息,并且以字典形式返回用户字典,这样,我们就可以在字典中操作用户信息了,字典的功能我们都会;另外把读取的功能封装到一个函数中,在后面我们经常会用到,比如用户唯一性验证;修改用户列表的时候都要打开文件。
第三段函数是重新写入文件中,以"w+"的模式,清空之前的用户列表,重新写入进去,当我们修改用户信息的时候,都需要重新写进去。
上面判断用户文件是否存在的时候,我们用到了os.path.exists(),这个是用来判断文件是否存在的,存在返回True,否则False。
3.随机验证码生成
def random_code(length): ''' 随机验证码生成模块 :param length: 验证码的长度,自己定义多长的验证码,开发人员自己定制 :return: 返回生成的随机验证码 ''' codes = [] for i in range(length): num = random.randrange(length) if i == num: code = random.randint(0,9) codes.append(str(code)) else: capital_codes = list(range(65,91)) #小写字符随机验证码数字 capital_codes.extend(list(range(97,123))) #大写数字随机验证码数字 tem_code = random.choice(capital_codes) #random.choice()随机跳跳出一个元素,因为随机,不知道跳出那个 codes.append(chr(tem_code)) rand_code = "".join(codes) return rand_code
上面代码是用来生成随机验证码的,length是随机验证码的长度,我们可以自己定义长度,验证码是由数字,大写,小写字母组成,是随机生成的,我们知道,大写字符是从:65-90,小写字母是从:97-122,我们先把这两个范围的数放到一个列表中,然后使用random.choice()从列表中随机挑选一个数字,然后进行转码,转换成字母形式, 这里要注意的是列表功能extend(),这个功能没有生成新的列表,如list1.extend(list2),是把list2中的元素扩展到list1中,改变list1。
在这里,我们也用到了字符串中的拼接str.join(),由于把列表元素拼接成一个新的字符串。
4.登录函数
def log_in(users): ''' 登录模块 :param user: 用户名 :param pwd: 密码 :param users: 用户列表{"alex":[123456,"unlocked","15111252591"} :return: 无返回值 ''' flag = True while flag: user = input("请输入您的用户名:") if user in users.keys(): '''判断用户名是否存在,存在之后验证是否锁定,如果锁定告诉要联系管理员解锁''' if users[user][1] == 'locked': print("对不起,您输入的密码已经锁定,请联系管理员解锁!!!") break '''我们知道,我们登录网站都是先验证用户名存在不存在,如果存在了,就输入密码,但是不会先验证密码,而是输入验证码 ,验证码输入之后,验证验证码是否正确,如果验证码正确才会验证密码''' pwd = input("请输入您的密码:") '''输入验证码,并且先验证验证码是否正确,验证码输入是没有限制的,一直到你输入对位置''' while True: random_num = random_code(6) #调用随机验证码生成函数,生成一个6位数的随机验证码 print("验证码:",random_num) verification_code = input("请输入验证码:").lower() if verification_code == random_num.lower(): break else: print("验证码输入有误,请重新输入:") continue '''验证码验证完毕之后,该验证密码,密码和验证码不一样,密码是有输入次数限制的,密码只能输入三次''' try_num = 0 while try_num < 3: if pwd == users[user][0]: print("登录成功,欢迎来到京东二手市场!") flag = False break else: if try_num != 2: print("您输入的密码有误,你还有%s次锁定用户!" %(2-try_num)) pwd = input("请输入您的密码:") else: print("您输入的次数过多,账户已经锁定,请联系管理员解锁!") users[user][1] = "locked" flag = False break try_num += 1 else: print("对不起,您输入的用户名没有注册!!!") break return users
此函数是登录功能的核心,用户信息是以字典形式存储的{username:[pwd,unlocked,telephone]},首先让用户输入用户名,并验证用户名是否注册,没有注册是不能登录的;验证成功之后验证用户是否锁定,锁定也是不能登录的(如,我们去取款机,如果锁定的话,肯定是没有后续操作的);输入密码,密码输入之后不会立马验证,每个网站基本上都不会先验证密码,而是让用户先输入验证码,先进行验证码的验证,验证码输入是没有次数限制的,验证码验证成功之后,进行密码验证,如果密码输入成功,则登录成功;否则会有三次机会,这个是按照银行系统来的,如果没有连续输入三次错误,则后续还能在输入三次,当然没有银行那样时间限制,银行是隔天才重新回复三次机会,当天只有三次机会。如果三次都错误,则锁定密码。锁定之后就只能解锁之后才登录了。
里面的新尝试,循环里面嵌套pwd = input("请输入您的密码:"),以前总是一根筋,如何先输入密码,输入之后先验证验证码,后验证密码,现在在验证密码的时候,重新在循环里面添加让用户输入密码的语句即可。
5.注册模块
def register(status="unlocked"): ''' 进行注册,注册完成之后写入文件内部,默认都是没有锁定的 :return: 无返回值,只是注册之后重新写入文件库 ''' message = ''' --------------------------------------------------------------------------------------------- \033[34;1m 欢迎来到注册平台,请按照下面提示进行注册\033[0m --------------------------------------------------------------------------------------------- ''' flag = True while flag: username = input("请输入你的用户名:") flag = uniqueness_verification(username) ''''我们知道,密码一般是需要输入两次的,两次一直才算成功''' while True: pwd1 = input("请输入您的密码:") pwd2 = input("请再次输入密码:") if pwd1 == pwd2: break else: print("两次输入的密码不一致,请重新输入:") while True: telephone_num = input("请输入你的手机号:") if len(telephone_num) == 11: break else: print("对不起,您输入的手机号码有误,请重新输入!!") '''都输入完成之后,要存入到文件中''' '''注册验证码都是最后输入的,输入只需要正确就可以,没有说验证要在密码验证前面''' while True: random_num = random_code(4) print("\033[31m验证码:%s\033[0m" %random_num) input_num = input("请输入验证码:") if random_num.lower() == input_num.lower(): #统一转化为小写,这样就不用在意用户输入什么直接可以验证 break else: print("您输入的验证码有误,请重新输入!") filename = "users_file" users = read_file(filename) #读取之前文件中用户,进行添加 users[username] = [pwd1,status,telephone_num] #新增注册 print("恭喜你,注册成功!") '''注册成功之后,写入文件''' write_file(users, filename) #注册完成之后,重新写入文件
注册模块的主题,首先展示注册模块的样式,接着让用户输入用户名,并进行唯一性验证,验证是否用户名已经被使用;接着输入密码两次,两次密码要一致,接着输入手机号,手机号码限定长度是11位;然后输入验证码;注册成功之后,打开文件,并且把新注册用户添加进去,重新写入用户文件。
6.唯一性约束
def uniqueness_verification(username): ''' 用户名唯一性验证,我们知道,用户名是不允许重复的,其实手机号也有唯一性约束,但是我们知道,手机号总是经常改变, :param username: 用户名 :return: 无返回值 ''' flag = False filename = "users_file" users = read_file(filename) if username in users.keys(): print("对不起,您输入的用户名已经注册,请重新输入!") return True else: return flag
上面代码是实现用户名唯一性的验证,我们知道,注册的时候要求用户名是唯一的。
7.解锁功能
def unlock(filename): ''' 管理员进行解锁,正常来说只有管理员才能够解锁,这样就只能在添加控制条件了,不过也没关系,就当联系尝试了 不过应该超级管理员都是在一个文件单独存放的,只有联系超级管理员才能够解锁,需要一些验证,才能登录超级管理员 这里因为也没有太好的办法来交互了,就用户自己解锁,通过手机号,这个还是很多网站常用的找回密码的方法,只要修改了密码 就当重新解锁了,支付宝呀,等在线都是这样操作的 :param filename: 文件名 :return: ''' '''打开文件,读取用户信息''' users = read_file(filename) message = '''\033[36;1m -------------------------------------------------------------------------------------------------- 【1】修改密码 【2】找回密码 -------------------------------------------------------------------------------------------------- \033[0m''' print(message) flag = True #循环开启和关闭的标志 while flag: function_num = input("请选择您要操作的功能:") if not function_num in ['1','2']: print("您输入的功能有误,请重新输入!") continue username = input("请输入用户名:") #判断用户名是否存在 if username in users.keys(): ''''通过手机号进行修改密码''' while True: telephone_num = input("请输入您的手机号:") if telephone_num == users[username][2]: '''验证码验证''' while True: rand_num = random_code(4) print("验证码:",rand_num) tem_random_code = input("请输入验证码:") if rand_num.lower() == tem_random_code.lower(): break else: print("您输入的验证码有误,请重新输入!") break else: print("您输入的手机号有误,请重新输入!") while True: if function_num == '1': pwd1 = input("请输入你要修改的密码:") pwd2 = input("请再次输入您要修改的密码:") if pwd1 == pwd2: print("密码修改成功!") users[username][0] = pwd1 users[username][1] = "unlocked" flag = False break else: print("对不起,您两次输入的密码不一致,请重新输入!") continue elif function_num == "2": print("\033[30m您的账户密码是:\033[0m",users[username][0]) users[username][1] = 'unlocked' flag = False break else: print("对不起,您输入的用户没有注册!!!") break return users #解锁成功之后,返回新的用户名表,并重写写入到文件中
上面代码实现解锁功能,解锁里面有两种情况,一种是找回密码,一种是修改密码;找回密码我们是通过手机号来找回的,让用户输入注册手机号,并输入验证码,通过后台把原密码发送至用户手机;修改密码也是通过手机号,当然,用户登录成功之后,可以直接修改用户密码,这里没有实现;密码修改之后,要重新写入用户文件。修改用户文件信息都要通过读和写两步。
验证码的验证:rand_num.lower() == tem_random_code.lower(),我们通过把验证码和用户名统一转化为大写或者小写,实现让用户无论输入什么,都统一进行转换比较,提升用户的体验度。
8.各主菜单展示模块
def login_show(): '''登录展示提醒''' show_message = ''' ----------------------------------------------------------------------------------------------- \033[34m 欢迎来到登录界面,请按一下提示完成登录 如果发现账号锁定,请进行验证解锁,祝你冲浪愉快[0m ----------------------------------------------------------------------------------------------- ''' print(show_message) def register_show(): ''' 注册展示页面,进行提醒 :return: ''' show_message = ''' ---------------------------------------------------------------------------------------------------- \033[32;1m 欢迎来到注册页面,请按照以下提示完成注册 \033[0m ---------------------------------------------------------------------------------------------------- ''' print(show_message) def unlock_show(): '''解锁页面展示''' show_message = '''\033[33;1m ---------------------------------------------------------------------------------------------------- 欢迎来到解锁页面,请按照下面提示进行解锁 您可以选择找回密码,或者修改密码 ---------------------------------------------------------------------------------------------------- \033[0m''' print(show_message)
上面的代码,主要是为了好看,让界面看起来顺眼,一目了然,让用户知道自己在哪里,在干什么。
9.程序主体
if __name__ == "__main__": main_show() flag = True while flag: choice_num = input("请选择您要选择的操作:") if choice_num == '1': login_show() '''判断用户文件是否存在''' filename = 'users_file' test_file(filename) users = read_file(filename) users_message = log_in(users) write_file(users_message,filename) elif choice_num == '2': register_show() register() elif choice_num == '3': unlock_show() '''修改密码,解除锁定,我们知道,现在网络平台都是通过手机号自己解锁的,不过要通过验证码充值密码''' filename = 'users_file' users = unlock(filename) write_file(users,filename) elif choice_num == 'q': break else: print("对不起,找不到您输入编号的功能,请重新输入") continue
上面代码就是把上面所有的函数串联到一起,主体其实很简单,就判断用户选择的是什么功能,具体操作都在之前的代码块里面,只需要调用传入参数即可。
所有上面函数组合一起:
import os,json,random def main_show(): '''进入主页展示''' login_message = ''' ------------------------------------------------------------------------------------------------- 您好,欢迎来到京东二货市场 ------------------------------------------------------------------------------------------------- 【1】登录 【2】注册 【3】解锁 【q】退出 ------------------------------------------------------------------------------------------------- ''' print(login_message) def test_file(file): ''' 验证存储用户的文件是否存在,不存在生成 :param file: 文件名 :return: 无返回值 ''' if os.path.exists(file): pass else: with open(file,"w+") as f: users = {} json.dump(users,f) def read_file(file): ''' 从用户文件中读取用户列表,以方便进行验证 :param file: 文件名 :return: 返回读取的用户列表 ''' with open(file,'r+') as fr: users = json.load(fr) return users def write_file(users,file): ''' 把修改后的用户列表重新写入进去 :param users: 用户名列表 :param file: 文件名 :return: 无返回值 ''' with open(file,'w+') as fw: json.dump(users,fw) def random_code(length): ''' 随机验证码生成模块 :param length: 验证码的长度,自己定义多长的验证码,开发人员自己定制 :return: 返回生成的随机验证码 ''' codes = [] for i in range(length): num = random.randrange(length) if i == num: code = random.randint(0,9) codes.append(str(code)) else: capital_codes = list(range(65,91)) #小写字符随机验证码数字 capital_codes.extend(list(range(97,123))) #大写数字随机验证码数字 tem_code = random.choice(capital_codes) #random.choice()随机跳跳出一个元素,因为随机,不知道跳出那个 codes.append(chr(tem_code)) rand_code = "".join(codes) return rand_code def log_in(users): ''' 登录模块 :param user: 用户名 :param pwd: 密码 :param users: 用户列表{"alex":[123456,"unlocked","15111252591"} :return: 无返回值 ''' flag = True while flag: user = input("请输入您的用户名:") if user in users.keys(): '''判断用户名是否存在,存在之后验证是否锁定,如果锁定告诉要联系管理员解锁''' if users[user][1] == 'locked': print("对不起,您输入的密码已经锁定,请联系管理员解锁!!!") break '''我们知道,我们登录网站都是先验证用户名存在不存在,如果存在了,就输入密码,但是不会先验证密码,而是输入验证码 ,验证码输入之后,验证验证码是否正确,如果验证码正确才会验证密码''' pwd = input("请输入您的密码:") '''输入验证码,并且先验证验证码是否正确,验证码输入是没有限制的,一直到你输入对位置''' while True: random_num = random_code(6) #调用随机验证码生成函数,生成一个6位数的随机验证码 print("验证码:",random_num) verification_code = input("请输入验证码:").lower() if verification_code == random_num.lower(): break else: print("验证码输入有误,请重新输入:") continue '''验证码验证完毕之后,该验证密码,密码和验证码不一样,密码是有输入次数限制的,密码只能输入三次''' try_num = 0 while try_num < 3: if pwd == users[user][0]: print("登录成功,欢迎来到京东二手市场!") flag = False break else: if try_num != 2: print("您输入的密码有误,你还有%s次锁定用户!" %(2-try_num)) pwd = input("请输入您的密码:") else: print("您输入的次数过多,账户已经锁定,请联系管理员解锁!") users[user][1] = "locked" flag = False break try_num += 1 elseday1作业--登录接口作业:编写登陆接口输入用户名密码认证成功后显示欢迎信息输错三次后锁定 知识: 1.循环的使用; 2.continue,break在循环中中断的作用; 3.文件的写入,读取; 4.各基础知识的穿插应用 &n... 查看详情
day1:作业编写登录接口并画出相应的流程图
作业要求:1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定代码如下_user_list=[]_user_dict={}_login_error_count=0whileTrue:user_naming=input(‘Plassinputyourname:‘)user_password=input(‘Plassinputyourpassword:‘)user_data=open(‘Us 查看详情
day1作业编写登录窗口
作业一:编写登录接口 (1)输入用户名和密码; (2)认证成功后显示欢迎信息; (3)输错三次后锁定。 思路:我们知道,要想让程序记住之前输入多少次,锁定用户,那么可以使用数据库来... 查看详情
day1作业要求
Day1作业作业需求博客模拟登录三级菜单博客地址杨振伟Day1博客地址模拟登录1.程序说明实现功能如下用户输入密码,密码验证后登录成功用户登录成功后提示登录信息用户输入3次错误密码后锁定2.程序测试账号测试账号:admin测... 查看详情
day1作业-模拟登录
#/usr/bin/envpython#-*-coding:utf-8-*-#Author:jenvid.yangimportgetpassimportshutiluserspwd={}#print(type(userspwd))userssta={}luser=[]count=0usercontent=open(‘../config/users.inf‘,‘r‘)forlineinusercon 查看详情
day1(代码片段)
作业1编写登录接口?输入用户名密码?认证成功后显示欢迎信息?输错三次后锁定---思路:用户信息文件、密码文件、检测用户名,是否让登录用户名密码判定 作业2多级菜单市区县?三级菜单?可依次选择进入各子菜单?所需新知... 查看详情
day1作业:编写登陆接口
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 思路:要求是编写登陆接口,那么要有一个存放用户信息的模块;三... 查看详情
day1作业一:编写登陆接口
作业一:编写登陆接口 1.输入用户名和密码 2.认证成功后显示欢迎信息 3.输错三次后锁定Readme: (1)提示用户输入用户名; (2)用户名验证,... 查看详情
day1课后作业:用户登录简单版
user="gaojun"password="123abc"foriinrange(3):user=input(‘请输入用户名:‘)password=input(‘请输入密码:‘)ifuser=="gaojun"andpassword=="123abc":print("欢迎!gaojun!")breakelse:print("用户或密码错误!")else:print("输入次数到达3次,!")解释 查看详情
老男孩day1作业二
作业内容:(1)编写登录接口(2)认证成功后显示欢迎信息(3)输错三次锁定 以下为代码,分为两个部分的代码,一是register.py,另一个是login.py;其中register.py实现的注册功能,客户可输入用户名密码,用户名密码保存在... 查看详情
day1作业:编写登录窗口一个文件实现
思路: 1、参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则; 1)认证流程参考的是Linux的登录:当你输入完用户名密码后再验证用户名是否存在用... 查看详情
day1-用户登录接口程序
代码:1yuying01172day1--login.py34#!/usr/bin/envpython5#-*-coding:utf-8-*-6#AuthorYuying7#读取工号信息8staff_data={}9withopen(‘staff_list‘,‘r‘)asdf:10forkvin[d.strip().split(‘‘)fordindf]:11staff_data[kv[0]]=kv 查看详情
beta冲刺--day1
这个作业属于哪个课程2021春软件工程实践S班这个作业要求在哪里团队作业六——Beta冲刺+事后诸葛亮这个作业的目标Beta冲刺文档SCRUM成员冲刺描述成员昨日完成存在问题问题解决方案或描述下一日冲刺安排ZLX安排完善前后端对... 查看详情
day1-作业
编写登陆接口输入用户名密码认证成功后显示欢迎信息输错三次后锁定代码如下:#!/usr/bin/envpython#-*-coding:utf-8-*-count=0name="hx"passwd="123"f=open(‘user_black‘,‘r‘)lock_file=f.read()f.close()name=input("请输入用户名:")foriinrange(1):iflock_fil 查看详情
day1-作业2
作业二:编写登陆接口输入用户名密码认证成功后显示欢迎信息输错三次后锁定编程思想:1.先初始化需要的值2.写主程序逻辑,判断账号密码3次记录黑名单,并锁定3.读取黑名单并判断是否输入为黑名单用户#!/usr/bin/envpython#-*-co... 查看详情
编写登录接口-第一个作业
编写登录接口让用户输入用户名密码认证成功后显示欢迎信息输错三次后退出程序1count=12whilecount<4:3name=input(‘name:‘)4password=input(‘password:‘)5ifname==‘egon‘andpassword==‘123‘:6print(‘欢迎登录‘)7break8else:9print(‘不好意思,您已... 查看详情
day1作业二:多级菜单操作
作业二:多级菜单(1)三级菜单(2)可以次选择进入各子菜单(3)所需新知识点:列表、字典要求:输入b返回上一层,输入q退出整个程序 查看详情
day1作业-三级菜单
#/usr/bin/envpython#-*-coding:utf-8-*-#Author:jenvid.yangimportjsonfilecontent=open(‘../config/menue.json‘)content=json.load(filecontent)print(type(content))filecontent.close()whileTrue:foriincontent: 查看详情