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

4.8 KiB
Raw Blame History

用户登录注册功能

需求
  • 优化基于文件的用户管理系统,使用函数来编写功能
  • 加上注册的功能,在程序运行的开始,让用户选择是登录和注册
  • 如果选择的是登录功能,正常登录
  • 如果选择的是注册功能,那就确保能够按照要求进行注册
  • 不管用户选择了登录还是注册,都要在新的文件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地址使用闭包获取

参考代码

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提交的内容

  • 理解程序的运行逻辑
  • 程序运行成功的截图,单独发送给组长