from flask import request, jsonify from utils.database import get_db from utils.auth import admin_required from utils.helpers import error_response, build_search_conditions from utils.config import get_config_value def register_suggestion_routes(app): @app.route('/api/admin/suggestions', methods=['GET']) @admin_required def get_admin_suggestions(): 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() try: query = 'SELECT * FROM suggestions WHERE deleted_at IS NULL' count_query = 'SELECT COUNT(*) FROM suggestions WHERE deleted_at IS NULL' params = [] count_params = [] if search: search_fields = ['phone', 'nickname', 'content'] 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() items = [dict(row) for row in rows] return jsonify({'items': items, 'total': total, 'page': page, 'limit': limit}) finally: conn.close() @app.route('/api/admin/suggestions/', methods=['GET']) @admin_required def get_admin_suggestion(suggestion_id): conn = get_db() cursor = conn.cursor() try: cursor.execute('SELECT * FROM suggestions WHERE id = ? AND deleted_at IS NULL', (suggestion_id,)) row = cursor.fetchone() if not row: return error_response('建议不存在') return jsonify(dict(row)) finally: conn.close() @app.route('/api/admin/suggestions/', methods=['DELETE']) @admin_required def delete_admin_suggestion(suggestion_id): conn = get_db() cursor = conn.cursor() try: cursor.execute('UPDATE suggestions SET deleted_at = datetime(\'now\') WHERE id = ? AND deleted_at IS NULL', (suggestion_id,)) conn.commit() if cursor.rowcount > 0: return jsonify({'success': True, 'message': '删除成功'}) else: return jsonify({'success': False, 'message': '建议不存在或已被删除'}) except Exception as e: conn.rollback() raise e finally: conn.close() @app.route('/api/suggestions/can-submit', methods=['GET']) def can_submit_suggestion(): auth_header = request.headers.get('Authorization') if not auth_header or not auth_header.startswith('Bearer '): return jsonify({'can_submit': False, 'message': '请先登录'}) token = auth_header.split(' ')[1] conn = get_db() cursor = conn.cursor() try: cursor.execute('SELECT user_id FROM sessions WHERE token = ? AND expires_at > datetime("now")', (token,)) session = cursor.fetchone() if not session: return jsonify({'can_submit': False, 'message': '登录已过期,请重新登录'}) cursor.execute('SELECT phone, nickname FROM users WHERE id = ? AND deleted_at IS NULL', (session['user_id'],)) user = cursor.fetchone() if not user: return jsonify({'can_submit': False, 'message': '用户不存在'}) max_suggestions = int(get_config_value('max_suggestions_per_day', '1')) cursor.execute( "SELECT COUNT(*) FROM suggestions WHERE phone = ? AND date(created_at) = date('now')", (user['phone'],) ) count = cursor.fetchone()[0] if count >= max_suggestions: return jsonify({ 'can_submit': False, 'message': f'您今天已提交{count}条建议,每天最多可提交{max_suggestions}条', 'today_count': count, 'max_count': max_suggestions }) return jsonify({ 'can_submit': True, 'message': '可以提交建议', 'today_count': count, 'max_count': max_suggestions }) finally: conn.close() @app.route('/api/suggestions', methods=['POST']) def create_suggestion(): data = request.json phone = data.get('phone') nickname = data.get('nickname') content = data.get('content') if not phone or not content: return error_response('手机号和建议内容不能为空') # 获取每天可提交的建议次数配置 max_suggestions = int(get_config_value('max_suggestions_per_day', '1')) conn = get_db() cursor = conn.cursor() try: # 检查用户今天已提交的建议次数 cursor.execute( "SELECT COUNT(*) FROM suggestions WHERE phone = ? AND date(created_at) = date('now')", (phone,) ) count = cursor.fetchone()[0] if count >= max_suggestions: return jsonify({ 'success': True, 'message': f'您今天已提交{count}条建议,每天最多可提交{max_suggestions}条,感谢您的关注!', 'already_submitted': True }) cursor.execute( 'INSERT INTO suggestions (phone, nickname, content) VALUES (?, ?, ?)', (phone, nickname, content) ) conn.commit() remaining = max_suggestions - count - 1 message = '建议提交成功,感谢您的反馈!' if remaining > 0: message += f'(今天还可提交{remaining}条)' return jsonify({'success': True, 'message': message}) except Exception as e: conn.rollback() raise e finally: conn.close()