170 lines
4.8 KiB
Markdown
170 lines
4.8 KiB
Markdown
# 用户登录注册功能
|
||
|
||
##### 需求
|
||
|
||
- 优化基于文件的用户管理系统,使用函数来编写功能
|
||
- 加上注册的功能,在程序运行的开始,让用户选择是登录和注册
|
||
- 如果选择的是登录功能,正常登录
|
||
- 如果选择的是注册功能,那就确保能够按照要求进行注册
|
||
- 不管用户选择了登录还是注册,都要在新的文件`logs`中进行记录,记录格式如下
|
||
|
||
```
|
||
2024-12-06 15:15:57 开始调用注册
|
||
2024-12-06 15:15:57 结束调用注册
|
||
2024-12-06 15:15:57 开始调用注册
|
||
2024-12-06 15:15:57 结束调用注册
|
||
2024-12-06 15:15:57 开始调用登录
|
||
2024-12-06 15:15:57 结束调用登录
|
||
2024-12-06 15:15:57 开始调用登录
|
||
2024-12-06 15:15:57 结束调用登录
|
||
```
|
||
|
||
- 用户登录成功后,可以查看当前用户的IP地址,使用闭包获取
|
||
|
||
## 参考代码
|
||
|
||
```python
|
||
from datetime import datetime
|
||
from urllib.request import urlopen
|
||
|
||
|
||
def logs(msg):
|
||
# 记录到logs中
|
||
# 日期 时间 开始调用{msg}功能
|
||
# 日期 时间 结束调用{msg}功能
|
||
# 获取当前的时间,并且生成格式示例:2035-01-20 23:59:23
|
||
def warpper(func):
|
||
def inner(*args, **kwargs):
|
||
with open('logs', 'a') as f:
|
||
nowtime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||
f.write(f"{nowtime} 开始调用{msg}\n")
|
||
ret = func(*args, **kwargs)
|
||
nowtime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||
f.write(f"{nowtime} 结束调用{msg}\n")
|
||
return ret
|
||
|
||
return inner
|
||
|
||
return warpper
|
||
|
||
|
||
def get_db():
|
||
# 获取db文件中存储的用户信息
|
||
with open(db_file, 'a+', encoding="utf-8") as f:
|
||
# 移动光标到开头
|
||
f.seek(0)
|
||
# 逐行读取内容并且放入字典db中
|
||
for line in f:
|
||
# 将每一行的信息读取出来,依据|分割,临时存入temp_list中
|
||
temp_list = line.strip().split('|')
|
||
# 字典的key是用户名,值是密码
|
||
db[temp_list[0]] = temp_list[1]
|
||
|
||
|
||
def write_db():
|
||
# 将更新后的用户信息写回数据库文件
|
||
with open(db_file, "w", encoding="utf-8") as f:
|
||
for k, v in db.items():
|
||
data = f"{k}|{v}\n"
|
||
f.write(data)
|
||
|
||
|
||
def check_user(username):
|
||
# 检测用户是否存在
|
||
# 返回1,表示存在
|
||
# 返回0,表示不存在
|
||
if db.get(username, 0):
|
||
return 1
|
||
else:
|
||
return 0
|
||
|
||
|
||
@logs("登录")
|
||
def login(username, password):
|
||
# 接收用户名和密码
|
||
# 返回1,表示登录成功
|
||
# 返回0,表示登录失败
|
||
if db[username] == password:
|
||
return 1
|
||
else:
|
||
return 0
|
||
|
||
|
||
@logs("注册")
|
||
def register(username, password):
|
||
# 接收用户名和密码
|
||
# 返回1,表示注册成功
|
||
db[username] = password
|
||
write_db()
|
||
return 1
|
||
|
||
|
||
def get_ip():
|
||
# 打印用户当前的ip地址
|
||
content = urlopen('http://myip.ipip.net').read().decode('utf-8')
|
||
|
||
def inner():
|
||
print(content)
|
||
|
||
return inner
|
||
|
||
|
||
# 闭包函数
|
||
get_ip = get_ip()
|
||
|
||
|
||
def menu():
|
||
while True:
|
||
# 打印菜单,并且根据用户的输入来决定使用什么功能
|
||
print("请选择".center(20, '='))
|
||
print("1. 登录".center(20, ' '))
|
||
print("2. 注册".center(20, ' '))
|
||
print("=" * 22)
|
||
choice = input(">>>")
|
||
# 刷新数据库里面的信息
|
||
get_db()
|
||
# 根据用户选择来执行登录或者注册
|
||
if choice == '1':
|
||
# 登录的代码
|
||
username = input("用户名:")
|
||
if check_user(username):
|
||
# 当用户名存在的时候获取密码,并且进行用户校验
|
||
password = input("密码:")
|
||
if login(username, password):
|
||
print("登录成功!")
|
||
get_ip()
|
||
else:
|
||
print("密码不正确")
|
||
else:
|
||
print("用户名不存在")
|
||
elif choice == '2':
|
||
# 注册的代码
|
||
username = input("用户名:")
|
||
if check_user(username):
|
||
# 当用户名存在的时候
|
||
print("用户名已存在")
|
||
else:
|
||
password = input("密码:")
|
||
if register(username, password):
|
||
# 可以正确注册的时候
|
||
print("注册成功!")
|
||
else:
|
||
print("未知错误!")
|
||
else:
|
||
print("选择错误")
|
||
|
||
|
||
# 定义数据库文件的名字
|
||
db_file = "db"
|
||
# 定义空字典,用于临时存放数据库内容
|
||
db = {}
|
||
menu()
|
||
```
|
||
|
||
|
||
|
||
><span style="color: red; background: yellow; padding: 2px 5px; font-size: 22px;">作业6.1提交的内容</span>
|
||
>
|
||
>- 理解程序的运行逻辑
|
||
>- 程序运行成功的截图,单独发送给组长
|