# 导入必要的模块
from flask import Flask, request, jsonify, session

# 创建Flask应用实例
app = Flask(__name__)

# 设置应用的密钥，用于加密会话数据
# 必须设置一个安全的密钥，不要在生产环境中使用硬编码的密钥
app.secret_key = "your_secret_key"  # 替换为一个安全的密钥

# 登录路由
@app.route("/login", methods=["POST"])  # 直接在这里指定HTTP方法
def login():
    """
    处理用户登录请求。
    如果用户名和密码正确，则将用户名存储在session中并返回登录成功的消息。
    如果用户名或密码不正确，则返回相应的错误信息。
    """
    try:
        get_data = request.get_json()  # 获取请求体中的JSON数据
        username = get_data.get("username")  # 获取用户名
        password = get_data.get("password")  # 获取密码

        # 检查用户名和密码是否都存在
        if not all([username, password]):
            return jsonify(msg="参数不完整"), 400  # 返回参数不完整的错误信息

        # 验证用户名和密码是否正确
        if username == "asd123" and password == "asdasd":
            session["username"] = username  # 将用户名存入session
            return jsonify(msg="登录成功"), 200  # 返回登录成功的消息
        else:
            return jsonify(msg="账号或密码错误"), 401  # 返回账号或密码错误的消息
    except Exception as e:
        return jsonify(error=str(e)), 500  # 返回异常错误信息

# 检查登录状态路由
@app.route("/session", methods=["GET"])
def check_session():
    """
    检查当前用户的登录状态。
    如果用户已登录（即session中有用户名），则返回该用户的名称及“已登录”的消息。
    如果用户未登录，则返回“未登录”的消息。
    """
    try:
        username = session.get("username")  # 从session中获取用户名
        if username is not None:  # 如果用户名存在
            return jsonify(username=username, msg="已登录"), 200  # 返回用户名及已登录的消息
        else:
            return jsonify(msg="未登录"), 401  # 返回未登录的消息
    except Exception as e:
        return jsonify(error=str(e)), 500  # 返回异常错误信息

# 登出路由
@app.route("/logout", methods=["GET"])
def logout():
    """
    处理用户登出请求。
    清除session中的所有数据，并返回登出成功的消息。
    """
    try:
        session.clear()  # 清除session中的所有数据,clear()等可变数据类型的一个方法，用于移除所有的元素。
        return jsonify(msg="成功退出登录"), 200  # 返回登出成功的消息
    except Exception as e:
        return jsonify(error=str(e)), 500  # 返回异常错误信息

if __name__ == '__main__':
    app.run(host="0.0.0.0")  # 运行应用，监听所有网络接口，使得局域网内的其他设备也可以访问