一、编辑登录接口
- 输入用户名密码
- 认证成功后显示欢迎信息
- 输入三次后锁定
说一下我的思路,首先准备工作,创建一个字典存放用户名和密码,一个空列表存放锁定用户,通过pickle模块把这个字典和列表存放到两个文件user_information.pkl、lock.pkl中,关闭文件。
然后,打开文件,通过pickle模块读取两个文件中的dict和list,赋值给两个变量user_info和lock_user,关闭文件
设定次数,初始为0,每循环一次加1,循环开始,用户输入用户名和密码,判断用户名是否存在于lock_user,如果存在,提示用户锁定,结束循环;如果不存在继续向下。接着如果用户名和密码都正确,欢迎登陆,结束程序;如果用户名或密码错误,提示错误,继续登陆,三次以后将用户名添加到lock_user列表,并写入lock.pkl文件。
--------------------------------------------------------------------------
#注释内容,主要用于准备user_information.pkl和lock.pkl文件,运行一次即可
'''import pickle
user_information = {"wx":"passwd", "Jake":"123456", "Perter":"qwer123"}
user_information_file = open("C:\\Users\\wx\\Desktop\\python\\user_information.pkl", "ab")
pickle.dump(user_information, user_information_file)
user_information_file.close()'''
'''lock_user = []
lock_user_file = open("C:\\Users\\wx\\Desktop\\python\\lock.pkl", "ab")
pickle.dump(lock_user, lock_user_file)
lock_user_file.close()'''
-----------------------------------------------------------------------------------
import pickle #导入pickle模块
#读模式打开存放用户名密码的文件,并赋值给user_info变量,关闭文件
user_info_file = open("C:\\Users\\wx\\Desktop\\python\\user_information.pkl", "rb")
user_info = pickle.load(user_info_file)
user_info_file.close()
#读模式打开存锁定用户的文件,并赋值给lock_user变量,关闭文件
lock_user_file = open("C:\\Users\\wx\\Desktop\\python\\lock.pkl", "rb")
lock_user = pickle.load(lock_user_file)
lock_user_file.close()
count = 0
while count < 3:
username = input("Please input your username:")
password = input("Please input your password:")
#判断用户名是否锁定,如果已锁定提示错误,结束循环
if username in lock_user:
print("The user is locked. Please contact the administrator.")
break
#判断用户名密码是否正确,如果正确欢迎登陆,break结束循环
if username in user_info and password == user_info[username]:
print("Welcome user {0} login!".format(username))
break
else: #如果不正确,提示错误
print("Incorrect username or password")
count += 1 ##次数加1
##判断用户登陆次数,等于3表示,已经尝试三次,要锁定用户
if count == 3:
lock_user.append(username) #添加用户到lock_user列表
lock_user_file = open("C:\\Users\\wx\\Desktop\\python\\lock.pkl", "wb") #以写模式打开存放锁定用户文件
pickle.dump(lock_user, lock_user_file) #把lock_user写入存放锁定用户文件
lock_user_file.close() #关闭文件
print("Login failed 3 times, user locked.")
二、三级菜单
- 依次选择进入各自子菜单
- 所需知识点:列表,字典
- 可以随时退出到上一级菜单
#! /usr/bin/env python
# Author:wx
# 2018/9/26 0026 11:07
china = {"北京":{"朝阳":["高碑店", "小红门", "双井", "来广营"], #定义一个字典存放省、市、县
"西城":["金融街", "牛街", "广安门", "新街口"]},
"河北":{"保定":["徐水", "清苑", "满城", "莲池"],
"邯郸":["邯山", "丛台", "复兴", "永年"],
"任丘":["运河", "新华", "任丘", "河间"]},
"河南":{"郑州":["管城", "中原", "金水", "惠济"],
"洛阳":["涧西", "洛龙", "吉利", "孟津"],
"南阳":["宛城", "卧龙", "淅川", "新野"]}}
import sys #加载sys模块
while True: ##进入一级菜单死循环
province = list(china.keys()) ##提取所有省,转化为一个列表
for i,j in enumerate(province): ##利用enumerate()函数把每个省和对应的索引打印出来。索引可以作为编号
print(i, j)
p_id = input("请输入你所在省份的编号,输入q退出程序:") ##提取用户第一级输入
if p_id.isdigit():
p_id = int(p_id) ##判断用户第一级输入是否为数字,如果是转换为整数
if p_id >= 0 and p_id < len(province): ##如果输入数字在省列表索引范围内
city = list(china[province[p_id]].keys()) ##定义第二级市列表
while True: ##进入二级死循环
for i,j in enumerate(city): ##打印出市及其对应编号(索引)
print(i, j)
c_id = input("请输入你所在市区的编号,退出程序输入q,返回上一级输入b:") ##提取用户二级输入
if c_id.isdigit(): ##判断用户第二级输入是否为数字,如果是转换为整数
c_id = int(c_id)
if c_id >= 0 and c_id < len(city): ##如果输入数字在市列表索引范围内
county = china[province[p_id]][city[c_id]] ##定义三级县列表
while True: ##进入三级死循环
for i,j in enumerate(county): ##打印出县及其对应编号(索引)
print(i, j)
county_id = input("请输入你所在县的编号,退出程序输入q,返回上一级输入b:") ##提取用户三级输入
if county_id.isdigit(): #判断用户第三级输入是否为数字,如果是转换为整数
county_id = int(county_id)
if county_id >= 0 and county_id <len(county): ##如果三级输入在县列表索引范围内
print("你所在的地区是:%s->%s->%s" %(province[p_id], city[c_id], county[county_id] )) ##打印省市区
exit(0) ##退出程序
elif county_id == "b": ##如果三级输入b,结束三级循环进入二级循环
break
elif county_id == "q": ##如果三级输入为q,退出程序
sys.exit("正在退出.....")
else: ##如果不是数字、q、b提示错误,继续二级循环
print("输入有误!")
continue
elif c_id == "q": ##如果二级输入为q,调用sys模块退出程序
sys.exit("正在退出....")
elif c_id == "b": ##如果二级输入为b,结束二级循环,进入一级循环
break
else: ##如果二级输入不是q、b或数字,提示错误继续二级循环
print("输入有误!")
else: #如果第一级输入数字超出索引,提示错误,继续下次循环第一级
print("你输入的编号%d不存在,请重新选择."%p_id)
elif p_id == "q": ##如果第一级输入q,调用sys模块退出
sys.exit("正在退出.....")
else: ##如果第一级输入不是数字也不是q,提示输入有误继续下次循环(第一级)
print("输入有误!")
关于三级菜单我的方法比较麻烦,代码较多(ps:水平有限),网上有更简单的方法可以实现