将看板功能独立,方便独立维护功能。
This commit is contained in:
@@ -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/<group_id>/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/<int:error_id>')
|
||||
@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/<group_id>/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/<int:error_id>')
|
||||
@login_required
|
||||
def api_error_detail(error_id):
|
||||
detail = self.stats_db.get_error_detail(error_id)
|
||||
return jsonify({"success": True, "data": detail})
|
||||
Reference in New Issue
Block a user