09-11-周四_16-52-32
This commit is contained in:
169
project06/[任务书]用户登录注册功能.md
Normal file
169
project06/[任务书]用户登录注册功能.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# 用户登录注册功能
|
||||
|
||||
##### 需求
|
||||
|
||||
- 优化基于文件的用户管理系统,使用函数来编写功能
|
||||
- 加上注册的功能,在程序运行的开始,让用户选择是登录和注册
|
||||
- 如果选择的是登录功能,正常登录
|
||||
- 如果选择的是注册功能,那就确保能够按照要求进行注册
|
||||
- 不管用户选择了登录还是注册,都要在新的文件`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>
|
||||
>
|
||||
>- 理解程序的运行逻辑
|
||||
>- 程序运行成功的截图,单独发送给组长
|
Reference in New Issue
Block a user