from flask import request, jsonify from utils.database import get_db from utils.helpers import error_response, build_search_conditions from utils.auth import get_user_id_from_token, get_admin_from_token def register_user_routes(app): @app.route('/api/users', methods=['GET']) def get_users(): search = request.args.get('search') page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) offset = (page - 1) * limit conn = get_db() cursor = conn.cursor() query = 'SELECT * FROM users WHERE deleted_at IS NULL' count_query = 'SELECT COUNT(*) FROM users WHERE deleted_at IS NULL' params = [] count_params = [] if search: search_fields = ['phone', 'nickname'] search_cond, search_params = build_search_conditions(search_fields, search) if search_cond: query += search_cond count_query += search_cond params.extend(search_params) count_params.extend(search_params) cursor.execute(count_query, count_params) total = cursor.fetchone()[0] query += ' ORDER BY created_at DESC LIMIT ? OFFSET ?' params.extend([limit, offset]) cursor.execute(query, params) rows = cursor.fetchall() conn.close() items = [] for row in rows: user = dict(row) user['password'] = '******' items.append(user) return jsonify({'items': items, 'total': total, 'page': page, 'limit': limit}) @app.route('/api/users/', methods=['GET']) def get_user(user_id): conn = get_db() cursor = conn.cursor() cursor.execute('SELECT * FROM users WHERE id = ? AND deleted_at IS NULL', (user_id,)) row = cursor.fetchone() conn.close() if not row: return error_response('用户不存在') user = dict(row) user['password'] = '******' return jsonify(user) @app.route('/api/users//tasks', methods=['GET']) def get_user_tasks(user_id): search = request.args.get('search') page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) offset = (page - 1) * limit conn = get_db() cursor = conn.cursor() query = ''' SELECT t.*, u.phone as publisher_phone FROM tasks t LEFT JOIN users u ON t.publisher_id = u.id WHERE (t.publisher_id = ? OR t.acceptor_id = ?) AND t.deleted_at IS NULL ''' count_query = 'SELECT COUNT(*) FROM tasks WHERE (publisher_id = ? OR acceptor_id = ?) AND deleted_at IS NULL' params = [user_id, user_id] count_params = [user_id, user_id] if search: search_fields = ['t.title', 't.description'] search_cond, search_params = build_search_conditions(search_fields, search) if search_cond: query += search_cond count_query += search_cond params.extend(search_params) count_params.extend(search_params) cursor.execute(count_query, count_params) total = cursor.fetchone()[0] query += ' ORDER BY t.created_at DESC LIMIT ? OFFSET ?' params.extend([limit, offset]) cursor.execute(query, params) rows = cursor.fetchall() conn.close() items = [dict(row) for row in rows] return jsonify({'items': items, 'total': total, 'page': page, 'limit': limit}) @app.route('/api/users/', methods=['PUT']) def update_user(user_id): # 权限验证 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] current_user_id = get_user_id_from_token(token) if not current_user_id: return error_response('登录已过期,请重新登录', 401) # 检查是否是管理员 is_admin = get_admin_from_token(None, current_user_id) # 普通用户只能修改自己的信息,管理员可以修改任何用户的信息 if not is_admin and current_user_id != user_id: return error_response('无权修改此用户信息', 403) data = request.json conn = get_db() cursor = conn.cursor() update_fields = [] update_values = [] # 只有管理员可以修改 enabled 字段 if is_admin and 'enabled' in data: update_fields.append('enabled = ?') update_values.append(data['enabled']) # 普通用户可以修改的字段 if 'nickname' in data: update_fields.append('nickname = ?') update_values.append(data['nickname']) if 'gender' in data: update_fields.append('gender = ?') update_values.append(data['gender']) if 'province' in data: update_fields.append('province = ?') update_values.append(data['province']) if 'city' in data: update_fields.append('city = ?') update_values.append(data['city']) if 'district' in data: update_fields.append('district = ?') update_values.append(data['district']) if not update_fields: conn.close() return error_response('没有需要更新的字段') update_values.append(user_id) cursor.execute(f'UPDATE users SET {", ".join(update_fields)} WHERE id = ? AND deleted_at IS NULL', update_values) conn.commit() if cursor.rowcount == 0: conn.close() return error_response('用户不存在') cursor.execute('SELECT * FROM users WHERE id = ? AND deleted_at IS NULL', (user_id,)) updated_user = cursor.fetchone() conn.close() user = dict(updated_user) user['password'] = '******' return jsonify(user)