From 6e27e3a1147e64f730858ea3c07afcb637c59da5 Mon Sep 17 00:00:00 2001 From: pixelmaxQM Date: Thu, 10 Jul 2025 23:36:27 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(menus):=20=E5=9C=A8=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E8=8F=9C=E5=8D=95=E4=BB=A5=E5=90=8E=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=BD=93=E5=89=8D=E8=8F=9C=E5=8D=95=E7=BB=93=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E9=98=B2=E6=AD=A2=E6=8A=8A=E6=97=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E8=AE=BE=E7=BD=AE=E4=B8=BA=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=B3=BB=E7=BB=9F=E6=AD=BB=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/view/superAdmin/authority/components/menus.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/view/superAdmin/authority/components/menus.vue b/web/src/view/superAdmin/authority/components/menus.vue index 65b35d77..2dd571dc 100644 --- a/web/src/view/superAdmin/authority/components/menus.vue +++ b/web/src/view/superAdmin/authority/components/menus.vue @@ -132,7 +132,7 @@ defaultRouter: data.name }) if (res.code === 0) { - ElMessage({ type: 'success', message: '设置成功' }) + relation() emit('changeRow', 'defaultRouter', res.data.authority.defaultRouter) } } From 857ba194e554c52c2158eda007ed80b06b1b8043 Mon Sep 17 00:00:00 2001 From: pixelmaxQM Date: Fri, 11 Jul 2025 00:14:14 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix(menu):=20=E6=9B=B4=E6=96=B0=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E6=B6=88=E6=81=AF=E6=8F=90=E7=A4=BA=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=A7=92=E8=89=B2=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=88=86=E9=85=8D=E8=AF=B4=E6=98=8E=EF=BC=9B?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=8F=9C=E5=8D=95=E6=B7=BB=E5=8A=A0=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=88=B6=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E6=80=A7=E5=92=8C=E6=9D=83=E9=99=90=E6=A3=80?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/v1/system/sys_menu.go | 2 +- server/service/system/sys_menu.go | 50 ++++++++++++++++++++++++--- web/src/view/superAdmin/api/api.vue | 2 +- web/src/view/superAdmin/menu/menu.vue | 2 +- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/server/api/v1/system/sys_menu.go b/server/api/v1/system/sys_menu.go index 864b61f3..30859621 100644 --- a/server/api/v1/system/sys_menu.go +++ b/server/api/v1/system/sys_menu.go @@ -143,7 +143,7 @@ func (a *AuthorityMenuApi) AddBaseMenu(c *gin.Context) { err = menuService.AddBaseMenu(menu) if err != nil { global.GVA_LOG.Error("添加失败!", zap.Error(err)) - response.FailWithMessage("添加失败", c) + response.FailWithMessage("添加失败:"+err.Error(), c) return } response.OkWithMessage("添加成功", c) diff --git a/server/service/system/sys_menu.go b/server/service/system/sys_menu.go index 4d5a0ea7..0a411129 100644 --- a/server/service/system/sys_menu.go +++ b/server/service/system/sys_menu.go @@ -134,10 +134,52 @@ func (menuService *MenuService) getBaseChildrenList(menu *system.SysBaseMenu, tr //@return: error func (menuService *MenuService) AddBaseMenu(menu system.SysBaseMenu) error { - if !errors.Is(global.GVA_DB.Where("name = ?", menu.Name).First(&system.SysBaseMenu{}).Error, gorm.ErrRecordNotFound) { - return errors.New("存在重复name,请修改name") - } - return global.GVA_DB.Create(&menu).Error + return global.GVA_DB.Transaction(func(tx *gorm.DB) error { + // 检查name是否重复 + if !errors.Is(tx.Where("name = ?", menu.Name).First(&system.SysBaseMenu{}).Error, gorm.ErrRecordNotFound) { + return errors.New("存在重复name,请修改name") + } + + if menu.ParentId != 0 { + // 检查父菜单是否存在 + var parentMenu system.SysBaseMenu + if err := tx.First(&parentMenu, menu.ParentId).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return errors.New("父菜单不存在") + } + return err + } + + // 检查父菜单下现有子菜单数量 + var existingChildrenCount int64 + err := tx.Model(&system.SysBaseMenu{}).Where("parent_id = ?", menu.ParentId).Count(&existingChildrenCount).Error + if err != nil { + return err + } + + // 如果父菜单原本是叶子菜单(没有子菜单),现在要变成枝干菜单,需要清空其权限分配 + if existingChildrenCount == 0 { + // 检查父菜单是否被其他角色设置为首页 + var defaultRouterCount int64 + err := tx.Model(&system.SysAuthority{}).Where("default_router = ?", parentMenu.Name).Count(&defaultRouterCount).Error + if err != nil { + return err + } + if defaultRouterCount > 0 { + return errors.New("父菜单已被其他角色的首页占用,请先释放父菜单的首页权限") + } + + // 清空父菜单的所有权限分配 + err = tx.Where("sys_base_menu_id = ?", menu.ParentId).Delete(&system.SysAuthorityMenu{}).Error + if err != nil { + return err + } + } + } + + // 创建菜单 + return tx.Create(&menu).Error + }) } //@author: [piexlmax](https://github.com/piexlmax) diff --git a/web/src/view/superAdmin/api/api.vue b/web/src/view/superAdmin/api/api.vue index 21e971c3..db0d21ab 100644 --- a/web/src/view/superAdmin/api/api.vue +++ b/web/src/view/superAdmin/api/api.vue @@ -531,7 +531,7 @@ if (res.code === 0) { ElMessage({ type: 'success', - message: '添加成功', + message: '添加成功,请到角色管理页面分配权限', showClose: true }) syncApiData.value.newApis = syncApiData.value.newApis.filter( diff --git a/web/src/view/superAdmin/menu/menu.vue b/web/src/view/superAdmin/menu/menu.vue index f0f1b3b9..c32c1c93 100644 --- a/web/src/view/superAdmin/menu/menu.vue +++ b/web/src/view/superAdmin/menu/menu.vue @@ -700,7 +700,7 @@ if (res.code === 0) { ElMessage({ type: 'success', - message: isEdit.value ? '编辑成功' : '添加成功!' + message: isEdit.value ? '编辑成功' : '添加成功,请到角色管理页面分配权限' }) getTableData() } From 23f9227da1884a50a5581ebcc98a7f2287ebf305 Mon Sep 17 00:00:00 2001 From: pixelmaxQM Date: Fri, 11 Jul 2025 00:20:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix(table):=20=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E5=88=97=E7=9A=84=E6=A8=A1=E6=9D=BF=E8=AF=AD=E6=B3=95?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E5=88=9B=E5=BB=BA=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/resource/package/web/view/table.vue.tpl | 2 +- server/resource/plugin/web/view/view.vue.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/resource/package/web/view/table.vue.tpl b/server/resource/package/web/view/table.vue.tpl index 91479d11..b6e23de9 100644 --- a/server/resource/package/web/view/table.vue.tpl +++ b/server/resource/package/web/view/table.vue.tpl @@ -161,7 +161,7 @@ getDataSourceFunc() > {{ if .GvaModel }} - + {{ end }} diff --git a/server/resource/plugin/web/view/view.vue.tpl b/server/resource/plugin/web/view/view.vue.tpl index 6880840a..832cf29b 100644 --- a/server/resource/plugin/web/view/view.vue.tpl +++ b/server/resource/plugin/web/view/view.vue.tpl @@ -158,7 +158,7 @@ getDataSourceFunc() > {{ if .GvaModel }} - + {{ end }}