
* 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>
197 lines
6.0 KiB
Go
197 lines
6.0 KiB
Go
package system
|
||
|
||
import (
|
||
"context"
|
||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
|
||
systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type SysVersionService struct{}
|
||
|
||
// CreateSysVersion 创建版本管理记录
|
||
// Author [yourname](https://github.com/yourname)
|
||
func (sysVersionService *SysVersionService) CreateSysVersion(ctx context.Context, sysVersion *system.SysVersion) (err error) {
|
||
err = global.GVA_DB.Create(sysVersion).Error
|
||
return err
|
||
}
|
||
|
||
// DeleteSysVersion 删除版本管理记录
|
||
// Author [yourname](https://github.com/yourname)
|
||
func (sysVersionService *SysVersionService) DeleteSysVersion(ctx context.Context, ID string) (err error) {
|
||
err = global.GVA_DB.Delete(&system.SysVersion{}, "id = ?", ID).Error
|
||
return err
|
||
}
|
||
|
||
// DeleteSysVersionByIds 批量删除版本管理记录
|
||
// Author [yourname](https://github.com/yourname)
|
||
func (sysVersionService *SysVersionService) DeleteSysVersionByIds(ctx context.Context, IDs []string) (err error) {
|
||
err = global.GVA_DB.Where("id in ?", IDs).Delete(&system.SysVersion{}).Error
|
||
return err
|
||
}
|
||
|
||
// GetSysVersion 根据ID获取版本管理记录
|
||
// Author [yourname](https://github.com/yourname)
|
||
func (sysVersionService *SysVersionService) GetSysVersion(ctx context.Context, ID string) (sysVersion system.SysVersion, err error) {
|
||
err = global.GVA_DB.Where("id = ?", ID).First(&sysVersion).Error
|
||
return
|
||
}
|
||
|
||
// GetSysVersionInfoList 分页获取版本管理记录
|
||
// Author [yourname](https://github.com/yourname)
|
||
func (sysVersionService *SysVersionService) GetSysVersionInfoList(ctx context.Context, info systemReq.SysVersionSearch) (list []system.SysVersion, total int64, err error) {
|
||
limit := info.PageSize
|
||
offset := info.PageSize * (info.Page - 1)
|
||
// 创建db
|
||
db := global.GVA_DB.Model(&system.SysVersion{})
|
||
var sysVersions []system.SysVersion
|
||
// 如果有条件搜索 下方会自动创建搜索语句
|
||
if len(info.CreatedAtRange) == 2 {
|
||
db = db.Where("created_at BETWEEN ? AND ?", info.CreatedAtRange[0], info.CreatedAtRange[1])
|
||
}
|
||
|
||
if info.VersionName != nil && *info.VersionName != "" {
|
||
db = db.Where("version_name LIKE ?", "%"+*info.VersionName+"%")
|
||
}
|
||
if info.VersionCode != nil && *info.VersionCode != "" {
|
||
db = db.Where("version_code = ?", *info.VersionCode)
|
||
}
|
||
err = db.Count(&total).Error
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
if limit != 0 {
|
||
db = db.Limit(limit).Offset(offset)
|
||
}
|
||
|
||
err = db.Find(&sysVersions).Error
|
||
return sysVersions, total, err
|
||
}
|
||
func (sysVersionService *SysVersionService) GetSysVersionPublic(ctx context.Context) {
|
||
// 此方法为获取数据源定义的数据
|
||
// 请自行实现
|
||
}
|
||
|
||
// GetMenusByIds 根据ID列表获取菜单数据
|
||
func (sysVersionService *SysVersionService) GetMenusByIds(ctx context.Context, ids []uint) (menus []system.SysBaseMenu, err error) {
|
||
err = global.GVA_DB.Where("id in ?", ids).Preload("Parameters").Preload("MenuBtn").Find(&menus).Error
|
||
return
|
||
}
|
||
|
||
// GetApisByIds 根据ID列表获取API数据
|
||
func (sysVersionService *SysVersionService) GetApisByIds(ctx context.Context, ids []uint) (apis []system.SysApi, err error) {
|
||
err = global.GVA_DB.Where("id in ?", ids).Find(&apis).Error
|
||
return
|
||
}
|
||
|
||
// ImportMenus 导入菜单数据
|
||
func (sysVersionService *SysVersionService) ImportMenus(ctx context.Context, menus []system.SysBaseMenu) error {
|
||
return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
|
||
// 递归创建菜单
|
||
return sysVersionService.createMenusRecursively(tx, menus, 0)
|
||
})
|
||
}
|
||
|
||
// createMenusRecursively 递归创建菜单
|
||
func (sysVersionService *SysVersionService) createMenusRecursively(tx *gorm.DB, menus []system.SysBaseMenu, parentId uint) error {
|
||
for _, menu := range menus {
|
||
// 检查菜单是否已存在
|
||
var existingMenu system.SysBaseMenu
|
||
if err := tx.Where("name = ? AND path = ?", menu.Name, menu.Path).First(&existingMenu).Error; err == nil {
|
||
// 菜单已存在,使用现有菜单ID继续处理子菜单
|
||
if len(menu.Children) > 0 {
|
||
if err := sysVersionService.createMenusRecursively(tx, menu.Children, existingMenu.ID); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
continue
|
||
}
|
||
|
||
// 保存参数和按钮数据,稍后处理
|
||
parameters := menu.Parameters
|
||
menuBtns := menu.MenuBtn
|
||
children := menu.Children
|
||
|
||
// 创建新菜单(不包含关联数据)
|
||
newMenu := system.SysBaseMenu{
|
||
ParentId: parentId,
|
||
Path: menu.Path,
|
||
Name: menu.Name,
|
||
Hidden: menu.Hidden,
|
||
Component: menu.Component,
|
||
Sort: menu.Sort,
|
||
Meta: menu.Meta,
|
||
}
|
||
|
||
if err := tx.Create(&newMenu).Error; err != nil {
|
||
return err
|
||
}
|
||
|
||
// 创建参数
|
||
if len(parameters) > 0 {
|
||
for _, param := range parameters {
|
||
newParam := system.SysBaseMenuParameter{
|
||
SysBaseMenuID: newMenu.ID,
|
||
Type: param.Type,
|
||
Key: param.Key,
|
||
Value: param.Value,
|
||
}
|
||
if err := tx.Create(&newParam).Error; err != nil {
|
||
return err
|
||
}
|
||
}
|
||
}
|
||
|
||
// 创建菜单按钮
|
||
if len(menuBtns) > 0 {
|
||
for _, btn := range menuBtns {
|
||
newBtn := system.SysBaseMenuBtn{
|
||
SysBaseMenuID: newMenu.ID,
|
||
Name: btn.Name,
|
||
Desc: btn.Desc,
|
||
}
|
||
if err := tx.Create(&newBtn).Error; err != nil {
|
||
return err
|
||
}
|
||
}
|
||
}
|
||
|
||
// 递归处理子菜单
|
||
if len(children) > 0 {
|
||
if err := sysVersionService.createMenusRecursively(tx, children, newMenu.ID); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ImportApis 导入API数据
|
||
func (sysVersionService *SysVersionService) ImportApis(apis []system.SysApi) error {
|
||
return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
|
||
for _, api := range apis {
|
||
// 检查API是否已存在
|
||
var existingApi system.SysApi
|
||
if err := tx.Where("path = ? AND method = ?", api.Path, api.Method).First(&existingApi).Error; err == nil {
|
||
// API已存在,跳过
|
||
continue
|
||
}
|
||
|
||
// 创建新API
|
||
newApi := system.SysApi{
|
||
Path: api.Path,
|
||
Description: api.Description,
|
||
ApiGroup: api.ApiGroup,
|
||
Method: api.Method,
|
||
}
|
||
|
||
if err := tx.Create(&newApi).Error; err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
})
|
||
}
|