from flask import request, jsonify from utils.database import get_db from utils.auth import generate_token, get_user_from_token, build_location from utils.helpers import error_response from utils.constants import PHONE_LENGTH, CODE_LENGTH, NICKNAME_MIN_LENGTH, NICKNAME_MAX_LENGTH, ALLOWED_GENDERS from utils.config import get_config_value import datetime def register_auth_routes(app): @app.route('/api/auth/send-code', methods=['POST']) def send_code(): data = request.json phone = data.get('phone') if not phone or len(phone) != PHONE_LENGTH: return error_response(f'请输入正确的{PHONE_LENGTH}位手机号') from utils.sms import send_sms result = send_sms(phone) if result['success']: return jsonify({'success': True, 'message': result['message']}) else: return jsonify({'success': False, 'message': result['message']}), 400 @app.route('/api/auth/login', methods=['POST']) def login(): data = request.json phone = data.get('phone') code = data.get('code') if not phone or len(phone) != PHONE_LENGTH: return error_response(f'请输入正确的{PHONE_LENGTH}位手机号') if not code or len(code) != CODE_LENGTH: return error_response(f'请输入{CODE_LENGTH}位验证码') use_real_sms = get_config_value('use_real_sms', 'false').lower() == 'true' if use_real_sms: from utils.sms import verify_sms_code if not verify_sms_code(phone, code): return error_response('验证码错误或已过期') conn = get_db() cursor = conn.cursor() cursor.execute('SELECT * FROM users WHERE phone = ? AND deleted_at IS NULL', (phone,)) user = cursor.fetchone() if not user: cursor.execute('INSERT INTO users (phone, nickname, enabled) VALUES (?, ?, 1)', (phone, phone[:4] + '用户')) user_id = cursor.lastrowid cursor.execute('SELECT * FROM users WHERE id = ? AND deleted_at IS NULL', (user_id,)) user = cursor.fetchone() is_new_user = True else: is_new_user = False token = generate_token() expires_at = datetime.datetime.now() + datetime.timedelta(days=7) cursor.execute('DELETE FROM sessions WHERE user_id = ?', (user['id'],)) cursor.execute('INSERT INTO sessions (user_id, token, expires_at) VALUES (?, ?, ?)', (user['id'], token, expires_at.strftime('%Y-%m-%d %H:%M:%S'))) conn.commit() result = dict(user) result['location'] = build_location(result) conn.close() response = { 'token': token, 'user': result, 'is_new_user': is_new_user, 'need_profile': not user['nickname'] or len(user['nickname']) < 2 } return jsonify(response) @app.route('/api/auth/logout', methods=['POST']) def logout(): auth_header = request.headers.get('Authorization') if not auth_header or not auth_header.startswith('Bearer '): return error_response('未登录', 401) token = auth_header.split(' ')[1] conn = get_db() cursor = conn.cursor() cursor.execute('DELETE FROM sessions WHERE token = ?', (token,)) conn.commit() conn.close() return jsonify({'success': True, 'message': '登出成功'}) @app.route('/api/auth/me', methods=['GET']) def get_current_user(): auth_header = request.headers.get('Authorization') if not auth_header or not auth_header.startswith('Bearer '): return jsonify({'error': '未登录'}), 401 token = auth_header.split(' ')[1] user = get_user_from_token(token) if not user: return error_response('登录已过期,请重新登录', 401) return jsonify(user) @app.route('/api/auth/delete-account', methods=['POST']) def delete_account(): auth_header = request.headers.get('Authorization') if not auth_header or not auth_header.startswith('Bearer '): return jsonify({'error': '未登录'}), 401 token = auth_header.split(' ')[1] user = get_user_from_token(token) if not user: return jsonify({'error': '登录已过期,请重新登录'}), 401 conn = get_db() cursor = conn.cursor() cursor.execute('UPDATE users SET deleted_at = datetime("now") WHERE id = ?', (user['id'],)) cursor.execute('DELETE FROM sessions WHERE user_id = ?', (user['id'],)) conn.commit() conn.close() return jsonify({'success': True, 'message': '账号注销成功'}) @app.route('/api/user', methods=['PUT']) @app.route('/api/auth/profile', methods=['PUT']) def update_profile(): auth_header = request.headers.get('Authorization') if not auth_header or not auth_header.startswith('Bearer '): return jsonify({'error': '未登录'}), 401 token = auth_header.split(' ')[1] user = get_user_from_token(token) if not user: return jsonify({'error': '登录已过期,请重新登录'}), 401 data = request.json if not data or not isinstance(data, dict): return jsonify({'error': '请求数据格式错误'}), 400 nickname = data.get('nickname', '').strip() if not nickname: return jsonify({'error': '昵称不能为空'}), 400 if len(nickname) < NICKNAME_MIN_LENGTH or len(nickname) > NICKNAME_MAX_LENGTH: return jsonify({'error': f'昵称长度应在{NICKNAME_MIN_LENGTH}-{NICKNAME_MAX_LENGTH}个字符之间'}), 400 gender = data.get('gender') if gender and gender not in ALLOWED_GENDERS: return jsonify({'error': '性别值不正确'}), 400 conn = get_db() cursor = conn.cursor() cursor.execute(''' UPDATE users SET nickname=?, avatar=?, gender=?, province=?, city=?, district=?, street=? WHERE id=? ''', ( nickname, data.get('avatar'), gender, data.get('province'), data.get('city'), data.get('district'), data.get('street'), user['id'] )) conn.commit() cursor.execute('SELECT * FROM users WHERE id = ? AND deleted_at IS NULL', (user['id'],)) updated_user = cursor.fetchone() conn.close() result = dict(updated_user) result['location'] = build_location(result) return jsonify(result)