
* fix(style): 修复 border 额外的 reset 导致 tailwind border 属性生效异常的问题 * feat: 添加错误预览组件并优化请求错误处理逻辑 * optimize: select and update necessary fields in `ChangePassword` method - Simplify `ChangePassword` method signature by removing unnecessary return type. - Use `Select()` to fetch only the necessary fields (`id` and `password`) from the database. - Replace `Save()` with `Update()` for more efficient password update operation. Note: use `Save(&user)` to update the whole user record, which will cover other unchanged fields as well, causing data inconsistency when data race conditions. * feat(menu): 版本更新为2.8.4,给菜单增加按钮和参数的预制打包 * feat(menu): 恢复空白的配置文件 * Remove unused `SideMode` field from `ChangeUserInfo` struct Remove unused and deprecated `SideMode` field from user request model. * feat(automation): 增加可以自动生成CURD和续写方法的MCP * fix(mcp): 确保始终返回目录结构信息 * fix(mcp): 当不需要创建模块时提前返回目录结构信息 * feat(automation): 增加可以自动生成CURD和续写方法的MCP * feat(mcp): 添加GAG工具用户确认流程和自动字典创建功能 实现三步工作流程:分析、确认、执行 新增自动字典创建功能,当字段使用字典类型时自动检查并创建字典 添加用户确认机制,确保创建操作前获得用户明确确认 * feat(version): 新增版本管理功能,支持创建、导入、导出和下载版本数据 新增版本管理模块,包含以下功能: 1. 版本数据的增删改查 2. 版本创建功能,可选择关联菜单和API 3. 版本导入导出功能 4. 版本JSON数据下载 5. 相关前端页面和接口实现 * refactor(version): 简化版本管理删除逻辑并移除无用字段 移除版本管理中的状态、创建者、更新者和删除者字段 简化删除和批量删除方法的实现,去除事务和用户ID参数 更新自动生成配置的默认值说明 * feat(版本管理): 新增版本管理功能模块 * fix(menu): 修复递归创建菜单时关联数据未正确处理的问题 * feat(mcp): 添加预设计模块扫描功能以支持代码自动生成 在自动化模块分析器中添加对预设计模块的扫描功能,包括: - 新增PredesignedModuleInfo结构体存储模块信息 - 实现scanPredesignedModules方法扫描plugin和model目录 - 在分析响应中添加predesignedModules字段 - 更新帮助文档说明预设计模块的使用方式 这些修改使系统能够识别并利用现有的预设计模块,提高代码生成效率并减少重复工作。 * feat(mcp): 新增API、菜单和字典生成工具并优化自动生成模块 * docs(mcp): 更新菜单和API创建工具的描述信息 * feat(mcp): 添加字典查询工具用于AI生成逻辑时了解可用字典选项 * feat: 在创建菜单/API/模块结果中添加权限分配提醒 为菜单创建、API创建和模块创建的结果消息添加权限分配提醒,帮助用户了解后续需要进行的权限配置步骤 * refactor(mcp): 统一使用WithBoolean替换WithBool并优化错误处理 * docs(mcp): 更新API创建工具的说明和错误处理日志 * feat(mcp): 添加插件意图检测功能并增强验证逻辑 --------- Co-authored-by: Azir <2075125282@qq.com> Co-authored-by: Feng.YJ <jxfengyijie@gmail.com> Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com>
198 lines
5.5 KiB
Go
198 lines
5.5 KiB
Go
package mcpTool
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"errors"
|
||
"fmt"
|
||
|
||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
||
"github.com/flipped-aurora/gin-vue-admin/server/service"
|
||
"github.com/mark3labs/mcp-go/mcp"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
// 注册工具
|
||
func init() {
|
||
RegisterTool(&ApiCreator{})
|
||
}
|
||
|
||
// ApiCreateRequest API创建请求结构
|
||
type ApiCreateRequest struct {
|
||
Path string `json:"path"` // API路径
|
||
Description string `json:"description"` // API中文描述
|
||
ApiGroup string `json:"apiGroup"` // API组
|
||
Method string `json:"method"` // HTTP方法
|
||
}
|
||
|
||
// ApiCreateResponse API创建响应结构
|
||
type ApiCreateResponse struct {
|
||
Success bool `json:"success"`
|
||
Message string `json:"message"`
|
||
ApiID uint `json:"apiId"`
|
||
Path string `json:"path"`
|
||
Method string `json:"method"`
|
||
}
|
||
|
||
// ApiCreator API创建工具
|
||
type ApiCreator struct{}
|
||
|
||
// New 创建API创建工具
|
||
func (a *ApiCreator) New() mcp.Tool {
|
||
return mcp.NewTool("create_api",
|
||
mcp.WithDescription("创建后端API记录,用于在生成后端接口时自动创建对应的API权限记录,只要创建了API层,router下的文件产生了路径变化等,都需要调用此mcp。"),
|
||
mcp.WithString("path",
|
||
mcp.Required(),
|
||
mcp.Description("API路径,如:/user/create"),
|
||
),
|
||
mcp.WithString("description",
|
||
mcp.Required(),
|
||
mcp.Description("API中文描述,如:创建用户"),
|
||
),
|
||
mcp.WithString("apiGroup",
|
||
mcp.Required(),
|
||
mcp.Description("API组名称,用于分类管理,如:用户管理"),
|
||
),
|
||
mcp.WithString("method",
|
||
mcp.Description("HTTP方法"),
|
||
mcp.DefaultString("POST"),
|
||
),
|
||
mcp.WithString("apis",
|
||
mcp.Description("批量创建API的JSON字符串,格式:[{\"path\":\"/user/create\",\"description\":\"创建用户\",\"apiGroup\":\"用户管理\",\"method\":\"POST\"}]"),
|
||
),
|
||
)
|
||
}
|
||
|
||
// Handle 处理API创建请求
|
||
func (a *ApiCreator) Handle(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
args := request.GetArguments()
|
||
|
||
var apis []ApiCreateRequest
|
||
|
||
// 检查是否是批量创建
|
||
if apisStr, ok := args["apis"].(string); ok && apisStr != "" {
|
||
if err := json.Unmarshal([]byte(apisStr), &apis); err != nil {
|
||
return nil, fmt.Errorf("apis 参数格式错误: %v", err)
|
||
}
|
||
} else {
|
||
// 单个API创建
|
||
path, ok := args["path"].(string)
|
||
if !ok || path == "" {
|
||
return nil, errors.New("path 参数是必需的")
|
||
}
|
||
|
||
description, ok := args["description"].(string)
|
||
if !ok || description == "" {
|
||
return nil, errors.New("description 参数是必需的")
|
||
}
|
||
|
||
apiGroup, ok := args["apiGroup"].(string)
|
||
if !ok || apiGroup == "" {
|
||
return nil, errors.New("apiGroup 参数是必需的")
|
||
}
|
||
|
||
method := "POST"
|
||
if val, ok := args["method"].(string); ok && val != "" {
|
||
method = val
|
||
}
|
||
|
||
apis = append(apis, ApiCreateRequest{
|
||
Path: path,
|
||
Description: description,
|
||
ApiGroup: apiGroup,
|
||
Method: method,
|
||
})
|
||
}
|
||
|
||
if len(apis) == 0 {
|
||
return nil, errors.New("没有要创建的API")
|
||
}
|
||
|
||
// 创建API记录
|
||
apiService := service.ServiceGroupApp.SystemServiceGroup.ApiService
|
||
var responses []ApiCreateResponse
|
||
successCount := 0
|
||
|
||
for _, apiReq := range apis {
|
||
api := system.SysApi{
|
||
Path: apiReq.Path,
|
||
Description: apiReq.Description,
|
||
ApiGroup: apiReq.ApiGroup,
|
||
Method: apiReq.Method,
|
||
}
|
||
|
||
err := apiService.CreateApi(api)
|
||
if err != nil {
|
||
global.GVA_LOG.Warn("创建API失败",
|
||
zap.String("path", apiReq.Path),
|
||
zap.String("method", apiReq.Method),
|
||
zap.Error(err))
|
||
|
||
responses = append(responses, ApiCreateResponse{
|
||
Success: false,
|
||
Message: fmt.Sprintf("创建API失败: %v", err),
|
||
Path: apiReq.Path,
|
||
Method: apiReq.Method,
|
||
})
|
||
} else {
|
||
// 获取创建的API ID
|
||
var createdApi system.SysApi
|
||
err = global.GVA_DB.Where("path = ? AND method = ?", apiReq.Path, apiReq.Method).First(&createdApi).Error
|
||
if err != nil {
|
||
global.GVA_LOG.Warn("获取创建的API ID失败", zap.Error(err))
|
||
}
|
||
|
||
responses = append(responses, ApiCreateResponse{
|
||
Success: true,
|
||
Message: fmt.Sprintf("成功创建API %s %s", apiReq.Method, apiReq.Path),
|
||
ApiID: createdApi.ID,
|
||
Path: apiReq.Path,
|
||
Method: apiReq.Method,
|
||
})
|
||
successCount++
|
||
}
|
||
}
|
||
|
||
// 构建总体响应
|
||
var resultMessage string
|
||
if len(apis) == 1 {
|
||
resultMessage = responses[0].Message
|
||
} else {
|
||
resultMessage = fmt.Sprintf("批量创建API完成,成功 %d 个,失败 %d 个", successCount, len(apis)-successCount)
|
||
}
|
||
|
||
result := map[string]interface{}{
|
||
"success": successCount > 0,
|
||
"message": resultMessage,
|
||
"totalCount": len(apis),
|
||
"successCount": successCount,
|
||
"failedCount": len(apis) - successCount,
|
||
"details": responses,
|
||
}
|
||
|
||
resultJSON, err := json.MarshalIndent(result, "", " ")
|
||
if err != nil {
|
||
return nil, fmt.Errorf("序列化结果失败: %v", err)
|
||
}
|
||
|
||
// 添加权限分配提醒
|
||
permissionReminder := "\n\n⚠️ 重要提醒:\n" +
|
||
"API创建完成后,请前往【系统管理】->【角色管理】中为相关角色分配新创建的API权限," +
|
||
"以确保用户能够正常访问新接口。\n" +
|
||
"具体步骤:\n" +
|
||
"1. 进入角色管理页面\n" +
|
||
"2. 选择需要授权的角色\n" +
|
||
"3. 在API权限中勾选新创建的API接口\n" +
|
||
"4. 保存权限配置"
|
||
|
||
return &mcp.CallToolResult{
|
||
Content: []mcp.Content{
|
||
mcp.TextContent{
|
||
Type: "text",
|
||
Text: fmt.Sprintf("API创建结果:\n\n%s%s", string(resultJSON), permissionReminder),
|
||
},
|
||
},
|
||
}, nil
|
||
}
|