• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
秋天的童话
梦想从此启航
博客园    首页    新随笔    联系   管理    订阅  订阅

优秀作业:登录锁定和三层菜单程序展示之三

    来自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()
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值说明用户列表文件不存在
checkinput

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()
adduser

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()
login

 

四、三层菜单之readme:

# README.md #

day001-work-2

@南非波波

功能实现:多级菜单展示

流程图:
![](http://i.imgur.com/VTPPhZU.jpg)

程序实现:

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()
main

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)
welcome

3、citylist程序:

#!/usr/local/env python3
'''
Author:@swht
Blog:http://www.cnblogs.com/songqingbo/
E-mail:qingbo.song@gmail.com
'''

CityList ={
"华北地区":{
    "北京市":["东城区","西城区","海淀区","朝阳区"],
    "天津市":["和平区","河西区","河东区","红桥区","南开区","河北区"],
    "河北省":[],
    "山西省":[],
    "内蒙古自治区":[]
    },
"东北地区":{
    "辽宁省":["铁岭市","阜新市","朝阳市","沈阳"],
    "吉林省":[],
    "黑龙江省":[]
    },
"华东地区":{
    "上海市":["浦东新区","长宁区","宝山区","青浦区"],
    "江苏省":[],
    "浙江省":[],
    "安徽省":[],
    "福建省":[],
    "江西省":[],
    "山东省":["济南市","青岛市","潍坊市"]
    },
"华中地区":{
    "河南省":[],
    "湖北省":[],
    "湖南省":[]
    },
"华南地区":{
    "广东省":[],
    "海南省":[],
    "广西壮族自治区":[]
    },
"西南地区":{
    "重庆市":[],
    "四川省":[],
    "贵州省":[],
    "云南省":[],
    "西藏自治区":[]
    },
"西北地区":{
    "陕西省":[],
    "甘肃省":[],
    "青海省":[],
    "宁夏回族自治区":[],
    "新疆维吾尔自治区":[]
    },
"特别行政区":{
    "香港特别行政区":[],
    "澳门特别行政区":[],
    "台湾省":[]
    }
}
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()
checkinput

 

做人一定要靠自己
posted @ 2016-01-10 22:23  凯-子  阅读(279)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3