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
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
|
|
|