优秀作业:登录锁定和三层菜单程序展示之三
来自python12期的宋庆波的优秀作业:
一、登录验证之readme说明:
# README
day001-work-1
@南非波波!
功能实现:用户注册、登录接口
程序实现:
1.文件说明:
main.py:主程序入口
checkinput.py:检查用户输入是否符合规定,设置功能函数
addusers.py:用户注册接口
login.py:用户登录接口
2.设置功能函数:
main.main():主体函数,程序的主入口,允许用户进行选择注册用户、用户登录、程序退出;
checkinput.Countnum(filename):获取文件行数,该函数在此暂未调用,在后续的练习中,比如购物网站等可能需要用到,暂且放在这里以作了解;
checkinput.UserBlack(UserName):判断用户名是否在黑名单中;
checkinput.UserBlackAdd(Users):将用户名添加到黑名单列表中;
checkinput.AddUsersList(Users):判断用户输入的用户名是否在列表中存在;
addusers.AddUsers():通过调用各种判断函数,将用户输入的用户和密码添加到用户列表中,如果用户已经存在,会返回main.main()函数;
login.Login():判断用户输入情况,用户在黑名单退出系统,不在用户列表返回主页提醒用户注册,用户和密码匹配成功后返回登录界面(欢迎信息和当前日期时间);
代码地址:
https://github.com/swht/projects/tree/master/day01/work-1.1
博客地址:
http://www.cnblogs.com/songqingbo/p/5091808.html #最下面
使用方法:
python3 main.py
二、登录验证之流程图:

三、登录验证之代码:
1、main主程序:
#!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import checkinput,login,addusers import time,sys def main(): Choose = input(''' ============================================== 欢迎光临南非波波小屋! ============================================== [1]注册 [2]登录 [3]退出 请选择相应指令:''').strip() if Choose == '': print("指令不能为空,请输入正确指令!") else: if Choose.isdigit(): Choose = int(Choose) if Choose >= 1 and Choose <= 3: if Choose == 1: addusers.AddUsers() if Choose == 2: login.Login() if Choose == 3: print("欢迎下次光临南非波波小屋!") time.sleep(1) sys.exit(0) else: print("你输入的指令已超出范围,请按照系统指令进行输入!") else: print("请输入正确的指令,指令为整数型数字!") #main if __name__ =="__main__": main()
2、checkinput程序:
#!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import os,sys,time UsersListPath = "./userslist.txt" UserBlackPath = "./userblacklist.txt" #获取文件内容的行数 def Countnum(filename): files = open(filename) data = files.read() files.flush() files.close() return data.count('\n') #判断用户是否在黑名单中 def UserBlack(UserName): '''黑名单判断''' if os.path.exists(UserBlackPath): #判断黑名单文件是否存在 FileUsers = open(UserBlackPath) #打开黑名单文件 for UserBlack in FileUsers.readlines(): #读取黑名单文件内容 if UserName == UserBlack: #判断黑名单列表中用户名称是否与指定userName相同 print("对不起,该用户已在系统黑名单列表中,请联系管理员!") time.sleep(1) sys.exit(1) #若相同提醒用户‘该用户在黑名单列表中’并且退出程序 FileUsers.close() #关闭黑名单文件句柄 #将用户添加到黑名单中 def UserBlackAdd(Users): '''黑名单列表增加''' print("该用户将被家到系统黑名单中...") FileUsers = open(UserBlackPath,"a") FileUsers.write(Users) FileUsers.close() sys.exit(0) #判断用户是否存在userlist列表中 def AddUsersList(Users): if os.path.exists(UsersListPath): #判断文件存在 if Countnum(UsersListPath) == 0: #判断文件内容为空 return False else: UsersListFile = open(UsersListPath,'r') for lines in UsersListFile.readlines(): db = lines.strip("\n").strip() #去除换行符 db = eval(db) #将字符串类型转换成字典类型 if Users == db['user']: return True #返回True值说明用户名匹配成功 UsersListFile.close() else: #文件不存在 return False #返回False值说明用户列表文件不存在或为空 #判断用户是否存在userlist列表中 def LoginUsersList(Users,Passwd): if os.path.exists(UsersListPath): #判断文件存在 if Countnum(UsersListPath) == 0: #判断文件内容为空 return False else: UsersListFile = open(UsersListPath,'r') for lines in UsersListFile.readlines(): db = lines.strip("\n").strip() #去除换行符 db = eval(db) #将字符串类型转换成字典类型 if Users == db['user']: if Passwd == db['passwd']: return True #返回True值说明用户名和密码匹配成功 UsersListFile.close() else: #文件不存在 return False #返回False值说明用户列表文件不存在
3、adduser程序:
#!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import getpass,sys,time import checkinput,main UsersListPath = "./userslist.txt" #判断用户输入的是否符合要求 def AddUsers(): print(''' ============================================== 欢迎加入南非波波小屋 ==============================================''') CountFlag1 = 0 CountFlag2 = 0 while True: if CountFlag1 < 3: User = input("请输入你的用户名:").strip() if User == '': print("你的输入为空,请重新输入!") CountFlag1 += 1 CountFlag2 += 1 else: if len(User) >= 4 and len(User) <= 10: if checkinput.AddUsersList(User) == True: print("该用户已被注册!") else: while True: if CountFlag2 < 3: Passwd1 = getpass.getpass("请输入你的密码:").strip() #getpass.getpass()可以将用户输入的密码以暗文形式实现 if Passwd1 == '': print("你的输入为空,请重新输入!") CountFlag2 += 1 elif len(Passwd1) < 6: print("你的密码太简单,请重新输入!") CountFlag2 += 1 else: Passwd2 = getpass.getpass("请再次输入你的密码:").strip() if Passwd1 == Passwd2: db = {"user":User,"passwd":Passwd1} UsersListFile = open(UsersListPath,"a") UsersListFile.write(str(db)) UsersListFile.write('\n') UsersListFile.close() #直接调用增加用户接口 main.main() else: print("你两次输入的密码不一致,请重新输入!") CountFlag1 += 1 else: print("你输入的错误次数已达3次!系统将返回主页!") main.main() else: print("请输入4-10位字符或数字组合作为用户名!") CountFlag1 += 1 else: print("你输入的错误次数已达3次!系统将退出!感谢你对南非波波小屋的支持!") time.sleep(1) sys.exit(1) # AddUsers()
4、login程序:
#!/usr/local/env python3 ''' Author:@南非波波 Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import sys,time,getpass import checkinput,main def Login(): '''用户登录接口函数''' CountFlag1 = 0 #用户输入错误次数的统计 CountFlag2 = 0 #用户输入为空的次数统计 print(''' ============================================== 欢迎光临南非波波小屋 ==============================================''') while True: if CountFlag1 < 3: if CountFlag2 < 3: Users = input("请输入登录用户名:").strip() #获取用户输入且去除首尾空格符 if Users == '': print("你的输入为空,请重新输入!") CountFlag1 += 1 CountFlag2 += 1 else: checkinput.UserBlack(Users) #黑名单不存在 Passwd = getpass.getpass("请输入你的密码:").strip() if Passwd == '': print("密码不能为空,请重新入") CountFlag1 += 1 CountFlag2 += 1 else: if checkinput.LoginUsersList(Users,Passwd) == True: print("%s你好,欢迎光临南非波波小屋,今天是%s" % (Users,(time.strftime('%Y-%m-%d\t%H:%M:%S',time.localtime(time.time()))))) time.sleep(1) sys.exit(0) elif checkinput.LoginUsersList(Users,Passwd) == False: print("你输入的用户名不存在!请先注册后再登录!") main.main() else: #其他情况就报用户名或密码错误 print("你输入的用户名或密码错误!") CountFlag1 += 1 else: print("你输入的错误次数已达3次,系统将返回主页!") main.main() else: print("你输入的错误次数已达3次,系统将退出") if Users == '': #如果用户输入为空将直接退出 sys.exit(1) else: #如果用户输入不为空将用户最后输入错误的users加到黑名单列表 checkinput.UserBlackAdd(Users) # Login()
四、三层菜单之readme:
# README.md #
day001-work-2
@南非波波
功能实现:多级菜单展示
流程图:

程序实现:
1.文件说明:
main.py:主程序入口
welcome.py:程序首页展示内容
citylist.py:程序的字典内容
checkinput.py:检查用户输入是否符合规定,设置二三级菜单展示函数
2.设置功能函数:
welcome.WelcomeInfo():首页函数,调用checkinput.CheckInputOne(Choose)函数,根据用户输入返回相应值或者调用相应函数
welcome.GoBack(Choose):返回函数,该函数最终设计目标实现多级返回,但目前只实现返回到首页
checkinput.CheckInputOne(Choose):函数判断用户在第一次输入的值是否异常,根据用户输入情况进行相应值返回或者调用相应函数
checkinput.InputIfOne(Choose):调用checkinput.ShowInfo(Area)函数展示地区下面的省份,并且多层循环、遍历字典、列表展示二三层菜单。期间调用checkinput.ChooseInputTwo(Choose)函数进行用户输入的判断,并返回True|Flase值.
3.主函数入口:
import welcome
#main
if __name__ =="__main__":
welcome.WelcomeInfo()
代码地址:
https://github.com/swht/projects/tree/master/day01/work-2
使用方法:
python3 main.py
博客地址:
http://www.cnblogs.com/songqingbo/p/5091830.html
五、三层菜单之流程图:

六、三层菜单之代码:
1、main程序:
#!/usr/local/env python3 ''' Author:@swht Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import welcome #main if __name__ =="__main__": welcome.WelcomeInfo()
2、welcome程序:
#!/usr/local/env python3 ''' Author:@swht Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import citylist import checkinput import sys,time #登录欢迎界面 def WelcomeInfo(): for i in range(0,3): Choose = input(''' =================================================== 欢迎来到中国! =================================================== [11]华北地区 [12]东北地区 [13]华东地区 [14]华中地区 [15]华南地区 [16]西南地区 [17]西北地区 [18]特别行政区 [19]退出 请选择相应指令:''').strip() checkinput.CheckInputOne(Choose) GoBack("地区") #错误次数已达3,程序退出 def GoBack(Choose): if Choose == "地区": print("你的输入错误次数已达3次,系统将退出!") time.sleep(1) sys.exit(1)
3、citylist程序:
#!/usr/local/env python3 ''' Author:@swht Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' CityList ={ "华北地区":{ "北京市":["东城区","西城区","海淀区","朝阳区"], "天津市":["和平区","河西区","河东区","红桥区","南开区","河北区"], "河北省":[], "山西省":[], "内蒙古自治区":[] }, "东北地区":{ "辽宁省":["铁岭市","阜新市","朝阳市","沈阳"], "吉林省":[], "黑龙江省":[] }, "华东地区":{ "上海市":["浦东新区","长宁区","宝山区","青浦区"], "江苏省":[], "浙江省":[], "安徽省":[], "福建省":[], "江西省":[], "山东省":["济南市","青岛市","潍坊市"] }, "华中地区":{ "河南省":[], "湖北省":[], "湖南省":[] }, "华南地区":{ "广东省":[], "海南省":[], "广西壮族自治区":[] }, "西南地区":{ "重庆市":[], "四川省":[], "贵州省":[], "云南省":[], "西藏自治区":[] }, "西北地区":{ "陕西省":[], "甘肃省":[], "青海省":[], "宁夏回族自治区":[], "新疆维吾尔自治区":[] }, "特别行政区":{ "香港特别行政区":[], "澳门特别行政区":[], "台湾省":[] } }
4、checkinput程序:
#!/usr/local/env python3 ''' Author:@swht Blog:http://www.cnblogs.com/songqingbo/ E-mail:qingbo.song@gmail.com ''' import welcome,citylist import sys,time #一级菜单输入字段判断 def CheckInputOne(Choose): if Choose == '': print("指令不能为空,请输入正确指令!") else: if Choose.isdigit(): Choose = int(Choose) if Choose >= 11 and Choose <= 19: InputIfOne(Choose) else: print("你输入的指令已超出范围,请按照系统指令进行输入!") else: print("请输入正确的指令,指令为整数型数字!") def InputIfOne(Choose): if Choose == 11: ShowInfo("华北地区") if Choose == 12: ShowInfo("东北地区") if Choose == 13: ShowInfo("华东地区") if Choose == 14: ShowInfo("华中地区") if Choose == 15: ShowInfo("华南地区") if Choose == 16: ShowInfo("华南地区") if Choose == 17: ShowInfo("西北地区") if Choose == 18: ShowInfo("特别行政区") if Choose == 19: print("欢迎下次再来中国!") time.sleep(1) sys.exit(0) #二级、三级菜单输入字段判断 def ChooseInputTwo(Choose): if Choose == '': print("指令不能为空,请输入正确指令!") else: if Choose.isdigit(): return True elif Choose == 'back' or Choose == 'Back' or Choose == 'BACK': return False else: # print("你输入的指令已超出范围,请按照系统指令进行输入!") pass #二级、三级菜单显示 def ShowInfo(Area): #显示省份 for i in range(0,3): #允许用户最大错误次数3次 print(''' =================================================== 欢迎来到%s! ==================================================='''% Area) # citylist.CityList[Area].keys() 获取地区里面的省份键值 Count = 0 for index,key in enumerate(citylist.CityList[Area].keys()): #python3中citylist.CityList[Area].keys()输出的是dict_keys对象 Count += 1 print("\t\t\t序号:%s 省份:%s" % (index,key)) Choose1 = input("\t\t请选择相应序号进入相应省份!返回上级菜单[Back]:").strip() ChooseInputTwo(Choose1) if ChooseInputTwo(Choose1) == True: Choose1 = int(Choose1) if Choose1 >= 0 and Choose1 < Count: #python3中将dict_keys转换成列表再做索引 #python2中dict.keys()的输出对象就是一个列表,可以直接进行索引操作 #KeyOne = citylist.CityList[Area].keys()[Choose1] KeyOne = list(citylist.CityList[Area].keys())[Choose1] #获取省份keys #显示城市 for i in range(0,3): #允许用户最大错误次数3次 Count = 0 print(''' =================================================== 欢迎来到%s! ===================================================''' % KeyOne) for index,key in enumerate(citylist.CityList[Area][KeyOne]): Count += 1 print("\t\t\t序号:%s 城市地区:%s" % (index,key)) Choose2 = input("\t\t请选择相应序号进入相应城市地区!返回上级菜单[Back]:").strip() ChooseInputTwo(Choose2) if ChooseInputTwo(Choose2) == True: Choose2 = int(Choose2) if Choose1 >= 0 and Choose2 < Count: KeyTwo = citylist.CityList[Area][KeyOne][Choose2] #获取地区名称 print("\t\t哈哈,到头了!\t\t%s" % KeyTwo) print("\t\t穿越到上一级菜单喽......") time.sleep(1) break else: print("你输入的指令不在范围内!") time.sleep(1) continue elif ChooseInputTwo(Choose2) == False: print("\t\t系统将返回上一级菜单!") time.sleep(1) break #跳出当前一级循环 else: print("你是输入有误,请重新输入!") time.sleep(1) continue print("你的输入次数已达三次,系统返回上一级菜单!") else: print("你输入的指令不在范围内!") time.sleep(1) continue #跳出当前循环 elif ChooseInputTwo(Choose1) == False: welcome.WelcomeInfo() #首页 else: print("你的输入有误,请重新输入!") print("你的输入次数已达三次,系统将返回首页!") welcome.WelcomeInfo()
浙公网安备 33010602011771号