You need to sign in or sign up before continuing.
user.py 3.55 KB
import time
import hashlib
from flask import Blueprint, redirect, render_template, request, Flask, session

from utils.query import query
from utils.errorResponse import errorResponse
from utils.logger import app_logger as logging

ub = Blueprint('user',
               __name__,
               url_prefix='/user',
               template_folder='templates')

# 密码加密函数
def hash_password(password: str, salt: str = 'XiaoXueQi2024') -> str:
    """
    使用 SHA256 对密码进行加盐哈希
    :param password: 用户输入的密码
    :param salt: 加盐值,默认值为 'XiaoXueQi2024'
    :return: 哈希后的密码
    """
    hash_with_salt = hashlib.sha256(salt.encode('utf-8'))
    hash_with_salt.update(password.encode('utf-8'))
    return hash_with_salt.hexdigest()
  
@ub.route('/login', methods=['GET', 'POST'])
def login():
    """
    处理用户登录请求
    :return: 登录页面或重定向到主页
    """
    if request.method == 'GET':
        return render_template('login_and_register.html')  # 显示登录页面

    try:
        username = request.form.get('username')
        password = request.form.get('password')
        
        if not username or not password:
            logging.warning("登录失败:用户名或密码为空")
            return render_template('login_and_register.html', msg='用户名和密码不能为空')
        
        # 查询用户
        sql = "SELECT * FROM user WHERE username = %s AND password = %s"
        result = query(sql, [username, password], "select")
        
        if result:
            session['username'] = username
            logging.info(f"用户 {username} 登录成功")
            return redirect('/page/home')
        else:
            logging.warning(f"用户 {username} 登录失败:用户名或密码错误")
            return render_template('login_and_register.html', msg='用户名或密码错误')
            
    except Exception as e:
        logging.error(f"登录过程发生错误: {e}")
        return render_template('login_and_register.html', msg='登录失败,请稍后重试')


@ub.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        return render_template('login_and_register.html')
    else:

        def filter_fn(user):
            return request.form['username'] in user

        users = query('select * from user', [], 'select')
        filter_list = list(filter(filter_fn, users))
        if len(filter_list):
            return errorResponse('该用户名已被注册')
        else:
            time_tuple = time.localtime(time.time())
            hash_with_salt = hashlib.sha256('XiaoXueQi2024'.encode('utf-8'))
            hash_with_salt.update(request.form['password'].encode('utf-8'))
            query(
                '''
                insert into user(username,password,createTime) values(%s,%s,%s)
            ''', [
                    request.form['username'],
                    hash_with_salt.hexdigest(),
                    str(time_tuple[0]) + '-' + str(time_tuple[1]) + '-' +
                    str(time_tuple[2])
                ])

        return redirect('/user/login')


@ub.route('/logOut')
def logOut():
    session.clear()
    return redirect('/user/login')

@ub.route('/user/logout')
def logout():
    """用户登出"""
    try:
        username = session.get('username')
        session.clear()
        logging.info(f"用户 {username} 成功登出")
        return redirect('/user/login')
    except Exception as e:
        logging.error(f"登出过程发生错误: {e}")
        return redirect('/user/login')