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