You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.3 KiB

from flask import Blueprint, request, jsonify
from models import User, db
from utils.auth_utils import hash_password, verify_password, generate_token, revoke_token
from middleware.auth_middleware import login_required
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/register', methods=['POST'])
def register():
"""用户注册"""
try:
data = request.get_json()
if not data:
return jsonify({'code': 400, 'message': '请求数据不能为空'}), 400
username = data.get('username')
password = data.get('password')
email = data.get('email')
if not username or not password:
return jsonify({'code': 400, 'message': '用户名和密码不能为空'}), 400
if len(username) > 16:
return jsonify({'code': 400, 'message': '用户名长度不能超过16个字符'}), 400
# 检查用户名是否已存在
existing_user = User.query.filter_by(username=username, deleted_at=None).first()
if existing_user:
return jsonify({'code': 400, 'message': '用户名已存在'}), 400
# 创建新用户
hashed_password = hash_password(password)
new_user = User(
username=username,
password=hashed_password,
email=email if email else None,
authority=0
)
db.session.add(new_user)
# 刷新以获取ID
db.session.flush()
user_id = new_user.id
# 提交事务
db.session.commit()
# 验证用户是否真的保存成功
saved_user = User.query.get(user_id)
if not saved_user:
raise Exception('用户保存失败')
return jsonify({
'code': 200,
'message': '注册成功',
'data': new_user.to_dict()
}), 200
except Exception as e:
db.session.rollback()
import traceback
error_msg = str(e)
traceback.print_exc()
print(f'注册失败错误详情: {error_msg}')
return jsonify({
'code': 500,
'message': f'注册失败: {error_msg}'
}), 500
@auth_bp.route('/login', methods=['POST'])
def login():
"""用户登录"""
try:
data = request.get_json()
if not data:
return jsonify({'code': 400, 'message': '请求数据不能为空'}), 400
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({'code': 400, 'message': '用户名和密码不能为空'}), 400
# 查找用户
user = User.query.filter_by(username=username, deleted_at=None).first()
if not user:
return jsonify({'code': 401, 'message': '用户名或密码错误'}), 401
# 验证密码
if not verify_password(password, user.password):
return jsonify({'code': 401, 'message': '用户名或密码错误'}), 401
# 生成Token
token, expire_time = generate_token(user.id, user.username)
return jsonify({
'code': 200,
'message': '登录成功',
'data': {
'user': user.to_dict(),
'token': token,
'expire_time': expire_time
}
}), 200
except Exception as e:
import traceback
error_msg = str(e)
traceback.print_exc()
print(f'登录失败错误详情: {error_msg}')
return jsonify({
'code': 500,
'message': f'登录失败: {error_msg}'
}), 500
@auth_bp.route('/logout', methods=['POST'])
@login_required
def logout():
"""用户退出登录"""
token = request.headers.get('Authorization')
if token.startswith('Bearer '):
token = token[7:]
revoke_token(token)
return jsonify({
'code': 200,
'message': '退出登录成功'
}), 200
@auth_bp.route('/me', methods=['GET'])
@login_required
def get_current_user():
"""获取当前用户信息"""
user = User.query.get(request.user_id)
if not user:
return jsonify({'code': 404, 'message': '用户不存在'}), 404
return jsonify({
'code': 200,
'data': user.to_dict()
}), 200