Files
python-flask/project06/[任务书]用户登录注册功能.md
2025-09-11 16:52:33 +08:00

170 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 用户登录注册功能
##### 需求
- 优化基于文件的用户管理系统,使用函数来编写功能
- 加上注册的功能,在程序运行的开始,让用户选择是登录和注册
- 如果选择的是登录功能,正常登录
- 如果选择的是注册功能,那就确保能够按照要求进行注册
- 不管用户选择了登录还是注册,都要在新的文件`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>
>
>- 理解程序的运行逻辑
>- 程序运行成功的截图,单独发送给组长