diff --git a/server/api/v1/system/sys_version.go b/server/api/v1/system/sys_version.go index 7f441c7c..1e228089 100644 --- a/server/api/v1/system/sys_version.go +++ b/server/api/v1/system/sys_version.go @@ -267,6 +267,17 @@ func (sysVersionApi *SysVersionApi) ExportVersion(c *gin.Context) { } } + // 获取选中的字典数据 + var dictData []system.SysDictionary + if len(req.DictIds) > 0 { + dictData, err = sysVersionService.GetDictionariesByIds(ctx, req.DictIds) + if err != nil { + global.GVA_LOG.Error("获取字典数据失败!", zap.Error(err)) + response.FailWithMessage("获取字典数据失败:"+err.Error(), c) + return + } + } + // 处理菜单数据,构建递归的children结构 processedMenus := buildMenuTree(menuData) @@ -282,6 +293,34 @@ func (sysVersionApi *SysVersionApi) ExportVersion(c *gin.Context) { processedApis = append(processedApis, cleanApi) } + // 处理字典数据,清除ID和时间戳字段,包含字典详情 + processedDicts := make([]system.SysDictionary, 0, len(dictData)) + for _, dict := range dictData { + cleanDict := system.SysDictionary{ + Name: dict.Name, + Type: dict.Type, + Status: dict.Status, + Desc: dict.Desc, + } + + // 处理字典详情数据,清除ID和时间戳字段 + cleanDetails := make([]system.SysDictionaryDetail, 0, len(dict.SysDictionaryDetails)) + for _, detail := range dict.SysDictionaryDetails { + cleanDetail := system.SysDictionaryDetail{ + Label: detail.Label, + Value: detail.Value, + Extend: detail.Extend, + Status: detail.Status, + Sort: detail.Sort, + // 不复制 ID, CreatedAt, UpdatedAt, SysDictionaryID + } + cleanDetails = append(cleanDetails, cleanDetail) + } + cleanDict.SysDictionaryDetails = cleanDetails + + processedDicts = append(processedDicts, cleanDict) + } + // 构建导出数据 exportData := systemRes.ExportVersionResponse{ Version: systemReq.VersionInfo{ @@ -290,8 +329,9 @@ func (sysVersionApi *SysVersionApi) ExportVersion(c *gin.Context) { Description: req.Description, ExportTime: time.Now().Format("2006-01-02 15:04:05"), }, - Menus: processedMenus, - Apis: processedApis, + Menus: processedMenus, + Apis: processedApis, + Dictionaries: processedDicts, } // 转换为JSON @@ -418,6 +458,15 @@ func (sysVersionApi *SysVersionApi) ImportVersion(c *gin.Context) { } } + // 导入字典数据 + if len(importData.ExportDictionary) > 0 { + if err := sysVersionService.ImportDictionaries(importData.ExportDictionary); err != nil { + global.GVA_LOG.Error("导入字典失败!", zap.Error(err)) + response.FailWithMessage("导入字典失败: "+err.Error(), c) + return + } + } + // 创建导入记录 jsonData, _ := json.Marshal(importData) version := system.SysVersion{ diff --git a/server/model/system/request/sys_version.go b/server/model/system/request/sys_version.go index 23dd665b..3d6d7ff2 100644 --- a/server/model/system/request/sys_version.go +++ b/server/model/system/request/sys_version.go @@ -20,13 +20,15 @@ type ExportVersionRequest struct { Description string `json:"description"` // 版本描述 MenuIds []uint `json:"menuIds"` // 选中的菜单ID列表 ApiIds []uint `json:"apiIds"` // 选中的API ID列表 + DictIds []uint `json:"dictIds"` // 选中的字典ID列表 } // ImportVersionRequest 导入版本请求结构体 type ImportVersionRequest struct { - VersionInfo VersionInfo `json:"version" binding:"required"` // 版本信息 - ExportMenu []system.SysBaseMenu `json:"menus"` // 菜单数据,直接复用SysBaseMenu - ExportApi []system.SysApi `json:"apis"` // API数据,直接复用SysApi + VersionInfo VersionInfo `json:"version" binding:"required"` // 版本信息 + ExportMenu []system.SysBaseMenu `json:"menus"` // 菜单数据,直接复用SysBaseMenu + ExportApi []system.SysApi `json:"apis"` // API数据,直接复用SysApi + ExportDictionary []system.SysDictionary `json:"dictionaries"` // 字典数据,直接复用SysDictionary } // VersionInfo 版本信息结构体 diff --git a/server/model/system/response/sys_version.go b/server/model/system/response/sys_version.go index b1509b89..b207ddc8 100644 --- a/server/model/system/response/sys_version.go +++ b/server/model/system/response/sys_version.go @@ -7,7 +7,8 @@ import ( // ExportVersionResponse 导出版本响应结构体 type ExportVersionResponse struct { - Version request.VersionInfo `json:"version"` // 版本信息 - Menus []system.SysBaseMenu `json:"menus"` // 菜单数据,直接复用SysBaseMenu - Apis []system.SysApi `json:"apis"` // API数据,直接复用SysApi -} \ No newline at end of file + Version request.VersionInfo `json:"version"` // 版本信息 + Menus []system.SysBaseMenu `json:"menus"` // 菜单数据,直接复用SysBaseMenu + Apis []system.SysApi `json:"apis"` // API数据,直接复用SysApi + Dictionaries []system.SysDictionary `json:"dictionaries"` // 字典数据,直接复用SysDictionary +} diff --git a/server/service/system/sys_version.go b/server/service/system/sys_version.go index 56894102..68d5ae2d 100644 --- a/server/service/system/sys_version.go +++ b/server/service/system/sys_version.go @@ -86,6 +86,12 @@ func (sysVersionService *SysVersionService) GetApisByIds(ctx context.Context, id return } +// GetDictionariesByIds 根据ID列表获取字典数据 +func (sysVersionService *SysVersionService) GetDictionariesByIds(ctx context.Context, ids []uint) (dictionaries []system.SysDictionary, err error) { + err = global.GVA_DB.Where("id in ?", ids).Preload("SysDictionaryDetails").Find(&dictionaries).Error + return +} + // ImportMenus 导入菜单数据 func (sysVersionService *SysVersionService) ImportMenus(ctx context.Context, menus []system.SysBaseMenu) error { return global.GVA_DB.Transaction(func(tx *gorm.DB) error { @@ -194,3 +200,31 @@ func (sysVersionService *SysVersionService) ImportApis(apis []system.SysApi) err return nil }) } + +// ImportDictionaries 导入字典数据 +func (sysVersionService *SysVersionService) ImportDictionaries(dictionaries []system.SysDictionary) error { + return global.GVA_DB.Transaction(func(tx *gorm.DB) error { + for _, dict := range dictionaries { + // 检查字典是否已存在 + var existingDict system.SysDictionary + if err := tx.Where("type = ?", dict.Type).First(&existingDict).Error; err == nil { + // 字典已存在,跳过 + continue + } + + // 创建新字典 + newDict := system.SysDictionary{ + Name: dict.Name, + Type: dict.Type, + Status: dict.Status, + Desc: dict.Desc, + SysDictionaryDetails: dict.SysDictionaryDetails, + } + + if err := tx.Create(&newDict).Error; err != nil { + return err + } + } + return nil + }) +} diff --git a/server/source/system/dictionary_detail.go b/server/source/system/dictionary_detail.go index 938cbc23..8a2bd2b6 100644 --- a/server/source/system/dictionary_detail.go +++ b/server/source/system/dictionary_detail.go @@ -66,7 +66,7 @@ func (i *initDictDetail) InitializeData(ctx context.Context) (context.Context, e } dicts[2].SysDictionaryDetails = []sysModel.SysDictionaryDetail{ - {Label: "date", Status: &True}, + {Label: "date", Value: "0", Status: &True, Extend: "mysql", Sort: 0}, {Label: "time", Value: "1", Status: &True, Extend: "mysql", Sort: 1}, {Label: "year", Value: "2", Status: &True, Extend: "mysql", Sort: 2}, {Label: "datetime", Value: "3", Status: &True, Extend: "mysql", Sort: 3}, @@ -74,7 +74,7 @@ func (i *initDictDetail) InitializeData(ctx context.Context) (context.Context, e {Label: "timestamptz", Value: "6", Status: &True, Extend: "pgsql", Sort: 5}, } dicts[3].SysDictionaryDetails = []sysModel.SysDictionaryDetail{ - {Label: "float", Status: &True}, + {Label: "float", Value: "0", Status: &True, Extend: "mysql", Sort: 0}, {Label: "double", Value: "1", Status: &True, Extend: "mysql", Sort: 1}, {Label: "decimal", Value: "2", Status: &True, Extend: "mysql", Sort: 2}, {Label: "numeric", Value: "3", Status: &True, Extend: "pgsql", Sort: 3}, @@ -82,7 +82,7 @@ func (i *initDictDetail) InitializeData(ctx context.Context) (context.Context, e } dicts[4].SysDictionaryDetails = []sysModel.SysDictionaryDetail{ - {Label: "char", Status: &True}, + {Label: "char", Value: "0", Status: &True, Extend: "mysql", Sort: 0}, {Label: "varchar", Value: "1", Status: &True, Extend: "mysql", Sort: 1}, {Label: "tinyblob", Value: "2", Status: &True, Extend: "mysql", Sort: 2}, {Label: "tinytext", Value: "3", Status: &True, Extend: "mysql", Sort: 3}, diff --git a/web/src/view/systemTools/version/version.vue b/web/src/view/systemTools/version/version.vue index b0ff9247..6f483826 100644 --- a/web/src/view/systemTools/version/version.vue +++ b/web/src/view/systemTools/version/version.vue @@ -117,9 +117,9 @@ -
+
-
+
选择菜单
@@ -140,7 +140,7 @@
-
+
选择API
@@ -153,7 +153,7 @@ -