112 lines
3.0 KiB
Go
112 lines
3.0 KiB
Go
package mcpTool
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
|
||
"git.echol.cn/loser/lckt/global"
|
||
"git.echol.cn/loser/lckt/model/system"
|
||
"github.com/mark3labs/mcp-go/mcp"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
// 注册工具
|
||
func init() {
|
||
// 注册工具将在enter.go中统一处理
|
||
RegisterTool(&MenuLister{})
|
||
}
|
||
|
||
// MenuListResponse 菜单列表响应结构
|
||
type MenuListResponse struct {
|
||
Success bool `json:"success"`
|
||
Message string `json:"message"`
|
||
Menus []system.SysBaseMenu `json:"menus"`
|
||
TotalCount int `json:"totalCount"`
|
||
Description string `json:"description"`
|
||
}
|
||
|
||
// MenuLister 菜单列表工具
|
||
type MenuLister struct{}
|
||
|
||
// New 创建菜单列表工具
|
||
func (m *MenuLister) New() mcp.Tool {
|
||
return mcp.NewTool("list_all_menus",
|
||
mcp.WithDescription(`获取系统中所有菜单信息,包括菜单树结构、路由信息、组件路径等,用于前端编写vue-router时正确跳转
|
||
|
||
**功能说明:**
|
||
- 返回完整的菜单树形结构
|
||
- 包含路由配置信息(path、name、component)
|
||
- 包含菜单元数据(title、icon、keepAlive等)
|
||
- 包含菜单参数和按钮配置
|
||
- 支持父子菜单关系展示
|
||
|
||
**使用场景:**
|
||
- 前端路由配置:获取所有菜单信息用于配置vue-router
|
||
- 菜单权限管理:了解系统中所有可用的菜单项
|
||
- 导航组件开发:构建动态导航菜单
|
||
- 系统架构分析:了解系统的菜单结构和页面组织`),
|
||
)
|
||
}
|
||
|
||
// Handle 处理菜单列表请求
|
||
func (m *MenuLister) Handle(_ context.Context, _ mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
// 获取所有基础菜单
|
||
allMenus, err := m.getAllMenus()
|
||
if err != nil {
|
||
global.GVA_LOG.Error("获取菜单列表失败", zap.Error(err))
|
||
return &mcp.CallToolResult{
|
||
Content: []mcp.Content{
|
||
mcp.TextContent{
|
||
Type: "text",
|
||
Text: fmt.Sprintf("获取菜单列表失败: %v", err),
|
||
},
|
||
},
|
||
IsError: true,
|
||
}, nil
|
||
}
|
||
|
||
// 构建返回结果
|
||
response := MenuListResponse{
|
||
Success: true,
|
||
Message: "获取菜单列表成功",
|
||
Menus: allMenus,
|
||
TotalCount: len(allMenus),
|
||
Description: "系统中所有菜单信息的标准列表,包含路由配置和组件信息",
|
||
}
|
||
|
||
// 序列化响应
|
||
responseJSON, err := json.MarshalIndent(response, "", " ")
|
||
if err != nil {
|
||
global.GVA_LOG.Error("序列化菜单响应失败", zap.Error(err))
|
||
return &mcp.CallToolResult{
|
||
Content: []mcp.Content{
|
||
mcp.TextContent{
|
||
Type: "text",
|
||
Text: fmt.Sprintf("序列化响应失败: %v", err),
|
||
},
|
||
},
|
||
IsError: true,
|
||
}, nil
|
||
}
|
||
|
||
return &mcp.CallToolResult{
|
||
Content: []mcp.Content{
|
||
mcp.TextContent{
|
||
Type: "text",
|
||
Text: string(responseJSON),
|
||
},
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
// getAllMenus 获取所有基础菜单
|
||
func (m *MenuLister) getAllMenus() ([]system.SysBaseMenu, error) {
|
||
var menus []system.SysBaseMenu
|
||
err := global.GVA_DB.Order("sort").Preload("Parameters").Preload("MenuBtn").Find(&menus).Error
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return menus, nil
|
||
}
|