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/resource/package/web/view/table.vue.tpl b/server/resource/package/web/view/table.vue.tpl index 0aac57c6..895ad2d4 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 143a4528..8363bdbd 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 }} 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/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) } } 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() }