From 283ada66bc3191e6dc6511c1a5c63cebfde92663 Mon Sep 17 00:00:00 2001 From: liuwei Date: Thu, 27 Mar 2025 11:11:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E7=9C=8B=E6=9D=BF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/dashboard/server.py | 209 +++++++++++++++++++++----------------- 1 file changed, 114 insertions(+), 95 deletions(-) diff --git a/admin/dashboard/server.py b/admin/dashboard/server.py index 25f6afa..0928ada 100644 --- a/admin/dashboard/server.py +++ b/admin/dashboard/server.py @@ -275,15 +275,125 @@ class DashboardServer: return jsonify({"success": True, "data": system_info}) + @app.route('/api/dashboard_summary') + @login_required + def api_dashboard_summary(): + try: + days = request.args.get('days', 7, type=int) + summary = self.stats_db.get_dashboard_summary(days) + + # 转换用户和群组ID为名称 + if 'top_users' in summary: + for user in summary['top_users']: + if 'user_id' in user: + user['user_name'] = self.contact_manager.get_nickname(user['user_id']) + + if 'top_groups' in summary: + for group in summary['top_groups']: + if 'group_id' in group: + group['group_name'] = self.contact_manager.get_nickname(group['group_id']) + + return jsonify({"success": True, "data": summary}) + except Exception as e: + self.logger.error(f"获取仪表盘摘要数据出错: {e}") + return jsonify({"success": False, "error": str(e)}), 500 + + @app.route('/api/plugin_trend') + @login_required + def api_plugin_trend(): + days = request.args.get('days', 7, type=int) + plugin_name = request.args.get('plugin_name', '') + trend = self.stats_db.get_plugin_trend(plugin_name, days) + return jsonify({"success": True, "data": trend}) + + @app.route('/api/robot/group//message_trend') + @login_required + def api_group_message_trend(group_id): + try: + days = request.args.get('days', 7, type=int) + trend_data = self.message_storage.get_message_trend(group_id, days) + + # 格式化数据为前端需要的格式 + dates = [] + counts = [] + for item in trend_data: + # 将日期转换为字符串 + if isinstance(item['date'], datetime): + date_str = item['date'].strftime('%Y-%m-%d') + else: + date_str = str(item['date']) + + dates.append(date_str) + counts.append(item['message_count']) + + return jsonify({ + 'success': True, + 'data': { + 'dates': dates, + 'counts': counts + } + }) + except Exception as e: + self.logger.error(f"获取群组消息趋势数据出错: {e}") + return jsonify({'success': False, 'error': str(e)}), 500 + + @app.route('/api/error_detail/') + @login_required + def api_error_detail(error_id): + detail = self.stats_db.get_error_detail(error_id) + return jsonify({"success": True, "data": detail}) + + @app.route('/api/robot/add_group', methods=['POST']) + @login_required + def api_add_group(): + try: + data = request.json + group_id = data.get('group_id') + + if not group_id or not group_id.strip(): + return jsonify({"success": False, "error": "群组ID不能为空"}), 400 + + group_id = group_id.strip() + + # 检查群组是否已存在 + if group_id in GroupBotManager.local_cache["group_list"]: + return jsonify({"success": False, "error": "该群组已存在"}), 400 + + # 添加群组到列表并启用机器人功能 + GroupBotManager.local_cache["group_list"].add(group_id) + r = self.db_manager.get_redis_connection() + r.sadd("group:list", group_id) + + # 设置ROBOT功能为启用状态 + GroupBotManager.set_group_permission(group_id, Feature.ROBOT, PermissionStatus.ENABLED) + + # 获取群组名称(如果可能) + group_name = self.contact_manager.get_nickname(group_id) + + return jsonify({ + "success": True, + "message": f"群组 {group_id} 已成功添加", + "group": { + "group_id": group_id, + "group_name": group_name, + "robot_status": "enabled" + } + }) + except Exception as e: + self.logger.error(f"添加群组失败: {e}") + return jsonify({"success": False, "error": str(e)}), 500 + return app def run(self): """运行服务器""" - from waitress import serve + from werkzeug.serving import make_server self.logger.info(f"启动服务器: {self.host}:{self.port}") try: - serve(self.app, host=self.host, port=self.port) + # 修改:使用线程安全的方式运行服务器 + self._server = make_server(self.host, self.port, self.app) + self._server.serve_forever() except Exception as e: self.logger.error(f"服务器运行失败: {e}") self._stop_event.set() @@ -293,100 +403,9 @@ class DashboardServer: self.logger.info("正在停止服务器...") self._stop_event.set() - # 如果使用了waitress,需要额外的停止逻辑 - # 这里可能需要根据实际情况调整 + # 修改:使用werkzeug服务器的关闭方法 if self._server: - # 某些服务器可能有shutdown方法 - if hasattr(self._server, 'shutdown'): - self._server.shutdown() - # 或者需要关闭socket - elif hasattr(self._server, 'socket'): - self._server.socket.close() + self._server.shutdown() self.logger.info("服务器已停止") - -# 在 _create_app 方法中添加以下路由 - -@app.route('/api/dashboard_summary') -@login_required -def api_dashboard_summary(): - try: - days = request.args.get('days', 7, type=int) - summary = self.stats_db.get_dashboard_summary(days) - - # 转换用户和群组ID为名称 - if 'top_users' in summary: - for user in summary['top_users']: - if 'user_id' in user: - user['user_name'] = self.contact_manager.get_nickname(user['user_id']) - - if 'top_groups' in summary: - for group in summary['top_groups']: - if 'group_id' in group: - group['group_name'] = self.contact_manager.get_nickname(group['group_id']) - - self.logger.info(f"看板主页统计数据: {summary}") - return jsonify({"success": True, "data": summary}) - except Exception as e: - self.logger.error(f"获取仪表盘摘要数据出错: {e}") - return jsonify({"success": False, "error": str(e)}), 500 - -@app.route('/api/plugin_trend') -@login_required -def api_plugin_trend(): - days = request.args.get('days', 7, type=int) - plugin_name = request.args.get('plugin_name', '') - trend = self.stats_db.get_plugin_trend(plugin_name, days) - - # 如果趋势数据中包含用户或群组ID,也进行转换 - if isinstance(trend, list): - for item in trend: - if 'user_id' in item: - item['user_name'] = self.contact_manager.get_nickname(item['user_id']) - if 'group_id' in item: - item['group_name'] = self.contact_manager.get_nickname(item['group_id']) - - self.logger.info(f"看板主页/api/plugin_trend: {trend}") - return jsonify({"success": True, "data": trend}) - -@app.route('/api/robot/group//message_trend', methods=['GET']) -@login_required -def get_group_message_trend(group_id): - """获取群组消息趋势数据""" - try: - days = request.args.get('days', default=7, type=int) - # 获取消息存储实例 - trend_data = self.message_storage.get_message_trend(group_id, days) - - # 格式化数据为前端需要的格式 - dates = [] - counts = [] - for item in trend_data: - # 将日期转换为字符串 - if isinstance(item['date'], datetime): - date_str = item['date'].strftime('%Y-%m-%d') - else: - date_str = str(item['date']) - - dates.append(date_str) - counts.append(item['message_count']) - - return jsonify({ - 'success': True, - 'data': { - 'dates': dates, - 'counts': counts - } - }) - except Exception as e: - return jsonify({ - 'success': False, - 'error': str(e) - }) - -@app.route('/api/error_detail/') -@login_required -def api_error_detail(error_id): - detail = self.stats_db.get_error_detail(error_id) - return jsonify({"success": True, "data": detail}) \ No newline at end of file