@@ -134,10 +134,52 @@ func (menuService *MenuService) getBaseChildrenList(menu *system.SysBaseMenu, tr
134134//@return: error
135135
136136func (menuService * MenuService ) AddBaseMenu (menu system.SysBaseMenu ) error {
137- if ! errors .Is (global .GVA_DB .Where ("name = ?" , menu .Name ).First (& system.SysBaseMenu {}).Error , gorm .ErrRecordNotFound ) {
138- return errors .New ("存在重复name,请修改name" )
139- }
140- return global .GVA_DB .Create (& menu ).Error
137+ return global .GVA_DB .Transaction (func (tx * gorm.DB ) error {
138+ // 检查name是否重复
139+ if ! errors .Is (tx .Where ("name = ?" , menu .Name ).First (& system.SysBaseMenu {}).Error , gorm .ErrRecordNotFound ) {
140+ return errors .New ("存在重复name,请修改name" )
141+ }
142+
143+ if menu .ParentId != 0 {
144+ // 检查父菜单是否存在
145+ var parentMenu system.SysBaseMenu
146+ if err := tx .First (& parentMenu , menu .ParentId ).Error ; err != nil {
147+ if errors .Is (err , gorm .ErrRecordNotFound ) {
148+ return errors .New ("父菜单不存在" )
149+ }
150+ return err
151+ }
152+
153+ // 检查父菜单下现有子菜单数量
154+ var existingChildrenCount int64
155+ err := tx .Model (& system.SysBaseMenu {}).Where ("parent_id = ?" , menu .ParentId ).Count (& existingChildrenCount ).Error
156+ if err != nil {
157+ return err
158+ }
159+
160+ // 如果父菜单原本是叶子菜单(没有子菜单),现在要变成枝干菜单,需要清空其权限分配
161+ if existingChildrenCount == 0 {
162+ // 检查父菜单是否被其他角色设置为首页
163+ var defaultRouterCount int64
164+ err := tx .Model (& system.SysAuthority {}).Where ("default_router = ?" , parentMenu .Name ).Count (& defaultRouterCount ).Error
165+ if err != nil {
166+ return err
167+ }
168+ if defaultRouterCount > 0 {
169+ return errors .New ("父菜单已被其他角色的首页占用,请先释放父菜单的首页权限" )
170+ }
171+
172+ // 清空父菜单的所有权限分配
173+ err = tx .Where ("sys_base_menu_id = ?" , menu .ParentId ).Delete (& system.SysAuthorityMenu {}).Error
174+ if err != nil {
175+ return err
176+ }
177+ }
178+ }
179+
180+ // 创建菜单
181+ return tx .Create (& menu ).Error
182+ })
141183}
142184
143185//@author: [piexlmax](https://github.com/piexlmax)
0 commit comments