@@ -134,10 +134,52 @@ func (menuService *MenuService) getBaseChildrenList(menu *system.SysBaseMenu, tr
134
134
//@return: error
135
135
136
136
func (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
+ })
141
183
}
142
184
143
185
//@author: [piexlmax](https://github.com/piexlmax)
0 commit comments