用户登录
登录系统通常分为普通用户与管理员权限,在用户登录系统时,可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序,该程序分为管理员用户与普通用户,其中管理员账号密码在程序中设定,普通用户的账号与密码通过注册功能添加。
任务目标
- 熟练地读取和写入数据
- 掌握目录与文件路径操作
任务分析
用户登录模块分为管理员登录和普通用户登录,在用户使用软件时,系统会先判断用户是否为首次使用:若是首次使用,则进行初始化,否则进入用户类型选择。用户类型分为管理员和普通用户两种,若选择管理员,则直接进行登录;若选择普通用户,先询问用户是否需要注册,若需要注册,先注册用户再进行登录。用户登录模块的具体流程如图1所示。
用户登录流程图
用户登录模块包含的文件有:
(需预先创建)
- 标识位文件flag.txt。
- 管理员账户文件u_root.txt。
- 普通用户账户文件。
标识位文件用于检测是否为初次使用系统,其中的初始数据为0,在首次启动系统后将其数据修改为1;管理员账户文件用于保存管理员的账户信息,该账户在程序中设置,管理员账户唯一;普通用户文件用于保存普通用户注册的账户,每个用户对应一个账户文件,普通用户账户被统一存储于普通用户文件夹users中。
实现用户登录模块可以编写如下函数实现:
- is_first_start():判断是否首次使用系统;
- init():数据初始化;
- print_login_menu():打印登陆菜单;
- user_select():用户选择;
- root_login():管理员登陆;
- user_register():用户注册;
- user_login():普通用户登陆。
代码如下
import os
# 判断是否首次使用系统
def is_first_start():
if not os.path.exists('../flag.txt'):
with open('../flag.txt', 'w') as f:
f.write('0')
return True
else:
with open('../flag.txt', 'r') as f:
flag = f.read()
return flag == '0'
# 数据初始化
def init():
# 初始化管理员账户
if not os.path.exists('../u_root.txt'):
with open('../u_root.txt', 'w') as f:
f.write('root:123456')
# 初始化普通用户文件夹
if not os.path.exists('users'):
os.mkdir('users') # 创建目录
# 修改标识位
with open('../flag.txt', 'w') as f:
f.write('1')
# 打印登陆菜单
def print_login_menu():
print('请选择用户类型:')
print('1. 管理员')
print('2. 普通用户')
# 用户选择
def user_select():
choice = input('请输入选项(1或2):')
while choice != '1' and choice != '2':
choice = input('输入有误,请重新输入选项(1或2):')
return choice
# 管理员登录
def root_login():
with open('../u_root.txt', 'r') as f:
root_info = f.read().split(':') # 以列表形式返回
root_name = root_info[0]
root_pwd = root_info[1]
count = 3 # 三次登录机会
while count > 0:
name = input('请输入管理员账号:')
pwd = input('请输入管理员密码:')
if name == root_name and pwd == root_pwd:
print('管理员登录成功!')
return True
else:
count -= 1
print(f'账号或密码错误,还有{count}次机会。')
print('登录失败!')
return False
# 用户注册
def user_register():
name = input('请输入用户名:')
pwd = input('请输入密码:')
# 判断用户名是否已存在
if os.path.exists(f'users/{name}.txt'):
print('用户名已存在,请重新输入。')
return False
# 创建用户账户文件
with open(f'users/{name}.txt', 'w') as f:
f.write(f'{name}:{pwd}')
print('用户注册成功!')
return True
# 普通用户登录
def user_login():
name = input('请输入用户名:')
pwd = input('请输入密码:')
# 判断用户名是否存在
if not os.path.exists(f'users/{name}.txt'):
print('用户名不存在,请重新输入。')
return False
# 验证密码
with open(f'users/{name}.txt', 'r') as f:
user_info = f.read().split(':')
if user_info[1] == pwd:
print('用户登录成功!')
return True
else:
print('密码错误,请重新输入。')
return False
if __name__ == '__main__':
if is_first_start():
init()
print_login_menu()
choice = user_select()
if choice == '1':
root_login()
else:
register_choice = input('是否需要注册?(yes/no)')
if register_choice.lower() == 'yes':
user_register()
user_login()
运行结果
请选择用户类型:
1. 管理员
2. 普通用户
请输入选项(1或2):2
是否需要注册?(yes/no)yes
请输入用户名:Elysia
请输入密码:123456
用户注册成功!
请输入用户名:Elysia
请输入密码:123456
用户登录成功!Process finished with exit code 0