diff --git a/admin/dashboard/blueprints/plugin_routes.py b/admin/dashboard/blueprints/plugin_routes.py
new file mode 100644
index 0000000..286a47c
--- /dev/null
+++ b/admin/dashboard/blueprints/plugin_routes.py
@@ -0,0 +1,158 @@
+import logging
+from flask import Blueprint, request, jsonify, render_template
+
+from admin.dashboard.blueprints.auth import login_required
+from plugin_common.plugin_manager import PluginManager
+from plugin_common.plugin_registry import PluginRegistry
+
+# 创建蓝图
+plugin_routes = Blueprint('plugin_routes', __name__)
+LOG = logging.getLogger(__name__)
+
+
+# 机器人管理页面
+@plugin_routes.route('/plugins')
+@login_required
+def robot_management():
+ return render_template('plugins_manage.html')
+
+@plugin_routes.route('/api/plugins', methods=['GET'])
+@login_required
+def get_plugins():
+ """获取所有插件列表"""
+ try:
+ # 获取插件注册表
+ plugin_registry = PluginRegistry()
+ plugins = plugin_registry.get_all_plugins()
+
+ # 转换为前端需要的格式
+ plugin_list = []
+ for name, plugin in plugins.items():
+ # 获取插件模块名
+ try:
+ module_name = plugin.__class__.__module__.split('.')[-2]
+ except (IndexError, AttributeError):
+ module_name = "unknown"
+
+ plugin_info = {
+ "name": plugin.name,
+ "module_name": module_name,
+ "version": getattr(plugin, 'version', 'N/A'),
+ "author": getattr(plugin, 'author', 'N/A'),
+ "description": getattr(plugin, 'description', 'N/A'),
+ "status": plugin.status.name if hasattr(plugin, 'status') else 'UNKNOWN'
+ }
+ plugin_list.append(plugin_info)
+
+ return jsonify({"success": True, "data": plugin_list})
+ except Exception as e:
+ LOG.error(f"获取插件列表失败: {str(e)}", exc_info=True)
+ return jsonify({"success": False, "message": f"获取插件列表失败: {str(e)}"})
+
+@plugin_routes.route('/api/plugins/info', methods=['GET'])
+@login_required
+def get_plugin_info():
+ """获取插件详细信息"""
+ try:
+ plugin_name = request.args.get('plugin_name')
+ if not plugin_name:
+ return jsonify({"success": False, "message": "缺少插件名称参数"})
+
+ # 获取插件管理器
+ plugin_manager = PluginManager().get_instance()
+ display_name, plugin = plugin_manager.find_plugin_by_name(plugin_name)
+
+ if not plugin:
+ return jsonify({"success": False, "message": f"未找到插件: {plugin_name}"})
+
+ # 获取插件模块名
+ try:
+ module_name = plugin.__class__.__module__.split('.')[-2]
+ except (IndexError, AttributeError):
+ module_name = "unknown"
+
+ # 构建详细信息
+ plugin_info = {
+ "name": plugin.name,
+ "module_name": module_name,
+ "version": getattr(plugin, 'version', 'N/A'),
+ "author": getattr(plugin, 'author', 'N/A'),
+ "description": getattr(plugin, 'description', 'N/A'),
+ "status": plugin.status.name if hasattr(plugin, 'status') else 'UNKNOWN',
+ "command_prefix": getattr(plugin, 'command_prefix', ''),
+ "commands": getattr(plugin, 'commands', []),
+ "config": getattr(plugin, '_config', {})
+ }
+
+ return jsonify({"success": True, "data": plugin_info})
+ except Exception as e:
+ LOG.error(f"获取插件详情失败: {str(e)}", exc_info=True)
+ return jsonify({"success": False, "message": f"获取插件详情失败: {str(e)}"})
+
+@plugin_routes.route('/api/plugins/enable', methods=['POST'])
+@login_required
+def enable_plugin():
+ """启用插件"""
+ try:
+ data = request.get_json()
+ plugin_name = data.get('plugin_name')
+ if not plugin_name:
+ return jsonify({"success": False, "message": "缺少插件名称参数"})
+
+ # 获取插件管理器
+ plugin_manager = PluginManager().get_instance()
+
+ # 启用插件
+ if plugin_manager.start_plugin(plugin_name):
+ return jsonify({"success": True, "message": f"插件 {plugin_name} 启用成功"})
+ else:
+ return jsonify({"success": False, "message": f"插件 {plugin_name} 启用失败"})
+ except Exception as e:
+ LOG.error(f"启用插件失败: {str(e)}", exc_info=True)
+ return jsonify({"success": False, "message": f"启用插件失败: {str(e)}"})
+
+@plugin_routes.route('/api/plugins/disable', methods=['POST'])
+@login_required
+def disable_plugin():
+ """禁用插件"""
+ try:
+ data = request.get_json()
+ plugin_name = data.get('plugin_name')
+ if not plugin_name:
+ return jsonify({"success": False, "message": "缺少插件名称参数"})
+
+ # 获取插件管理器
+ plugin_manager = PluginManager().get_instance()
+
+ # 禁用插件
+ if plugin_manager.stop_plugin(plugin_name):
+ return jsonify({"success": True, "message": f"插件 {plugin_name} 禁用成功"})
+ else:
+ return jsonify({"success": False, "message": f"插件 {plugin_name} 禁用失败"})
+ except Exception as e:
+ LOG.error(f"禁用插件失败: {str(e)}", exc_info=True)
+ return jsonify({"success": False, "message": f"禁用插件失败: {str(e)}"})
+
+@plugin_routes.route('/api/plugins/reload', methods=['POST'])
+@login_required
+def reload_plugin():
+ """重载插件"""
+ try:
+ data = request.get_json()
+ plugin_name = data.get('plugin_name')
+ if not plugin_name:
+ return jsonify({"success": False, "message": "缺少插件名称参数"})
+
+ # 获取插件管理器
+ plugin_manager = PluginManager().get_instance()
+
+ # 重载插件
+ reloaded_plugin = plugin_manager.reload_plugin(plugin_name)
+
+ if reloaded_plugin:
+ return jsonify({"success": True, "message": f"插件 {plugin_name} 重载成功"})
+ else:
+ return jsonify({"success": False, "message": f"插件 {plugin_name} 重载失败"})
+ except Exception as e:
+ LOG.error(f"重载插件失败: {str(e)}", exc_info=True)
+ return jsonify({"success": False, "message": f"重载插件失败: {str(e)}"})
\ No newline at end of file
diff --git a/admin/dashboard/templates/base.html b/admin/dashboard/templates/base.html
index 7fc3c95..ddf069d 100644
--- a/admin/dashboard/templates/base.html
+++ b/admin/dashboard/templates/base.html
@@ -148,6 +148,11 @@
通讯录管理
+
+
{% raw %}{{ JSON.stringify(selectedPlugin.config, null, 2) }}{% endraw %}
+