|
@@ -286,24 +286,46 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
|
|
|
systemRoleList := make([]*model.SystemRole, 0)
|
|
|
if err = s.DB.Where("id IN ?", systemUser.GetRoleIds()).
|
|
|
Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
+ Where("is_delete = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("is_show = ?", pasturePb.IsShow_Ok).
|
|
|
Find(&systemRoleList).Error; err != nil {
|
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
return nil, xerr.Custom("该用户角色不存在")
|
|
|
}
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
- // 获取用户菜单
|
|
|
- systemMenuList := make([]*model.SystemMenu, 0)
|
|
|
- if err = s.DB.Table(fmt.Sprintf("%s as a", new(model.SystemRoleMenu).TableName())).
|
|
|
- Select("b.*").
|
|
|
- Joins("LEFT JOIN system_menu AS b ON a.menu_id = b.id").
|
|
|
- Where("a.role_id IN ? and b.is_delete = ?", systemUser.GetRoleIds(), pasturePb.IsShow_Ok).
|
|
|
- Order("b.parent_id ASC,b.id ASC").
|
|
|
- Group("b.id").
|
|
|
- Find(&systemMenuList).Error; err != nil {
|
|
|
+
|
|
|
+ if len(systemRoleList) <= 0 {
|
|
|
+ return nil, xerr.Custom("该用户角色不存在")
|
|
|
+ }
|
|
|
+
|
|
|
+ roleIds := make([]int64, 0)
|
|
|
+ for _, role := range systemRoleList {
|
|
|
+ roleIds = append(roleIds, role.Id)
|
|
|
+ }
|
|
|
+
|
|
|
+ systemRoleMenuList := make([]*model.SystemRoleMenu, 0)
|
|
|
+ if err = s.DB.Model(new(model.SystemRoleMenu)).
|
|
|
+ Where("role_id IN ?", roleIds).
|
|
|
+ Find(&systemRoleMenuList).Error; err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
|
+ if len(systemRoleMenuList) <= 0 {
|
|
|
+ return nil, xerr.Custom("该用户角色没有菜单权限")
|
|
|
+ }
|
|
|
+
|
|
|
+ // 菜单Id
|
|
|
+ menuIds := make([]int64, 0)
|
|
|
+ for _, roleMenu := range systemRoleMenuList {
|
|
|
+ menuIds = append(menuIds, roleMenu.MenuId)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取用户菜单
|
|
|
+ systemMenuList, err := s.GetMenusWithParents(ctx, menuIds)
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
// 获取菜单权限
|
|
|
return &pasturePb.SystemUserMenuTreeResponse{
|
|
|
Code: http.StatusOK,
|
|
@@ -406,245 +428,63 @@ func (s *StoreEntry) SystemUserRoleSave(ctx context.Context, req *pasturePb.Syst
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-// SystemRoleCreateOrUpdate 添加角色
|
|
|
-func (s *StoreEntry) SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error {
|
|
|
- userModel, err := s.GetUserModel(ctx)
|
|
|
- if err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- if req.Id > 0 {
|
|
|
- systemRole := &model.SystemRole{}
|
|
|
- if err = s.DB.Model(systemRole).
|
|
|
- Where("id = ?", req.Id).
|
|
|
- Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
- First(systemRole).Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- if systemRole.IsDelete == pasturePb.IsShow_No {
|
|
|
- return xerr.Custom("角色已删除")
|
|
|
- }
|
|
|
-
|
|
|
- systemRole.RoleUpdate(req)
|
|
|
- if err = s.DB.Model(systemRole).
|
|
|
- Select("name", "remarks", "is_show").
|
|
|
- Where("id = ?", req.Id).
|
|
|
- Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
- Updates(systemRole).Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
- newSystemRole := model.NewSystemRole(userModel.AppPasture.Id, req)
|
|
|
- if err = s.DB.Model(new(model.SystemRole)).Create(newSystemRole).Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
+func (s *StoreEntry) GetMenusWithParents(ctx context.Context, menuIds []int64) ([]*model.SystemMenu, error) {
|
|
|
+ if len(menuIds) <= 0 {
|
|
|
+ return nil, xerr.Customf("菜单id不能为空")
|
|
|
}
|
|
|
+ // 用于存储所有需要查询的菜单ID(包括递归查询的父级ID)
|
|
|
+ allMenuIDs := make(map[int64]struct{})
|
|
|
+ // 用于存储已经处理过的菜单ID,避免重复处理
|
|
|
+ processedIDs := make(map[int64]struct{})
|
|
|
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-// DeleteSystemRole 删除系统角色
|
|
|
-func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
|
|
|
- userModel, err := s.GetUserModel(ctx)
|
|
|
- if err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
- systemRole := &model.SystemRole{}
|
|
|
- if err = s.DB.Model(new(model.SystemRole)).
|
|
|
- Where("id = ? ", roleId).
|
|
|
- Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
- Where("is_delete = ?", pasturePb.IsShow_Ok).
|
|
|
- First(systemRole).Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
+ // 初始化待处理ID队列
|
|
|
+ queue := make([]int64, len(menuIds))
|
|
|
+ copy(queue, menuIds)
|
|
|
|
|
|
- if err = s.DB.Model(systemRole).
|
|
|
- Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
- return nil
|
|
|
-}
|
|
|
+ for len(queue) > 0 {
|
|
|
+ currentID := queue[0]
|
|
|
+ queue = queue[1:]
|
|
|
|
|
|
-// IsShowSystemRole 角色是否启用
|
|
|
-func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error {
|
|
|
- userModel, err := s.GetUserModel(ctx)
|
|
|
- if err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
- systemRole := &model.SystemRole{}
|
|
|
- if err = s.DB.Model(new(model.SystemRole)).
|
|
|
- Where("id = ?", roleId).
|
|
|
- Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
- Where("is_delete = ?", pasturePb.IsShow_Ok).
|
|
|
- First(systemRole).Error; err != nil {
|
|
|
- if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
- return xerr.Custom("该角色不存在")
|
|
|
+ // 如果已经处理过,跳过
|
|
|
+ if _, exists := processedIDs[currentID]; exists {
|
|
|
+ continue
|
|
|
}
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- isShow := pasturePb.IsShow_No
|
|
|
- if systemRole.IsShow == pasturePb.IsShow_No {
|
|
|
- isShow = pasturePb.IsShow_Ok
|
|
|
- }
|
|
|
-
|
|
|
- if err = s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-// SearchSystemRoleList 查询系统角色
|
|
|
-func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchRoleResponse, error) {
|
|
|
- userModel, err := s.GetUserModel(ctx)
|
|
|
- if err != nil {
|
|
|
- return nil, xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- systemRoleList := make([]*model.SystemRole, 0)
|
|
|
- var count int64 = 0
|
|
|
-
|
|
|
- pref := s.DB.Model(new(model.SystemRole)).
|
|
|
- Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
- Where("is_delete = ?", operationPb.IsShow_OK)
|
|
|
- if req.Name != "" {
|
|
|
- pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
|
|
|
- }
|
|
|
|
|
|
- if req.IsShow > 0 {
|
|
|
- pref.Where("is_show = ?", req.IsShow)
|
|
|
- }
|
|
|
-
|
|
|
- if err = pref.Order("is_show asc,id desc").
|
|
|
- Count(&count).
|
|
|
- Limit(int(pagination.PageSize)).
|
|
|
- Offset(int(pagination.PageOffset)).
|
|
|
- Find(&systemRoleList).Error; err != nil {
|
|
|
- return nil, xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- return &pasturePb.SearchRoleResponse{
|
|
|
- Code: http.StatusOK,
|
|
|
- Msg: "ok",
|
|
|
- Data: &pasturePb.SearchRoleData{
|
|
|
- Page: pagination.Page,
|
|
|
- Total: int32(count),
|
|
|
- PageSize: pagination.PageSize,
|
|
|
- List: model.SystemRoleSlice(systemRoleList).ToPB(),
|
|
|
- },
|
|
|
- }, nil
|
|
|
-}
|
|
|
-
|
|
|
-// SearchSystemRoleListByIds 根据id查询角色列表
|
|
|
-func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, pastureId int64, ids []int64) ([]*model.SystemRole, error) {
|
|
|
- systemRoleList := make([]*model.SystemRole, 0)
|
|
|
- if err := s.DB.Model(new(model.SystemRole)).
|
|
|
- Where("pasture_id = ?", pastureId).
|
|
|
- Where("is_show = ?", operationPb.IsShow_OK).
|
|
|
- Find(&systemRoleList, ids).Error; err != nil {
|
|
|
- return nil, xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- return systemRoleList, nil
|
|
|
-}
|
|
|
-
|
|
|
-// GetRoleMenuList 查询系统角色对应的菜单数据
|
|
|
-func (s *StoreEntry) GetRoleMenuList(ctx context.Context, roleId int64) (*pasturePb.SystemRoleMenuResponse, error) {
|
|
|
- systemRole := &model.SystemRole{
|
|
|
- Id: roleId,
|
|
|
- }
|
|
|
- if err := s.DB.First(systemRole).Error; err != nil {
|
|
|
- if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
- return nil, xerr.Custom("该数据不存在")
|
|
|
- }
|
|
|
- return nil, xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- if systemRole.IsDelete == pasturePb.IsShow_No {
|
|
|
- return nil, xerr.Custom("该数据已被删除")
|
|
|
- }
|
|
|
-
|
|
|
- menuList := make([]*model.SystemRoleMenu, 0)
|
|
|
- if err := s.DB.Where("role_id = ?", systemRole.Id).Find(&menuList).Error; err != nil {
|
|
|
- zaplog.Error("GetSystemRoleMenuList", zap.Any("Err", err))
|
|
|
- }
|
|
|
- return &pasturePb.SystemRoleMenuResponse{
|
|
|
- Code: http.StatusOK,
|
|
|
- Msg: "ok",
|
|
|
- Data: model.SystemRoleMenuSlice(menuList).ToPB(),
|
|
|
- }, nil
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// RoleMenuSave 保存系统角色对应的菜单数据
|
|
|
-func (s *StoreEntry) RoleMenuSave(ctx context.Context, res *pasturePb.SystemRoleMenuRequest) error {
|
|
|
- userModel, err := s.GetUserModel(ctx)
|
|
|
- if err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- if len(res.MenuIds) <= 0 {
|
|
|
- return xerr.Custom("请选择菜单")
|
|
|
- }
|
|
|
-
|
|
|
- systemRole := &model.SystemRole{}
|
|
|
- if err = s.DB.Model(new(model.SystemRole)).
|
|
|
- Where("id = ?", res.RoleId).
|
|
|
- Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
- First(systemRole).Error; err != nil {
|
|
|
- if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
- return xerr.Custom("该数据不存在")
|
|
|
- }
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
-
|
|
|
- if systemRole.IsDelete == pasturePb.IsShow_No {
|
|
|
- return xerr.Custom("该数据已删除")
|
|
|
- }
|
|
|
-
|
|
|
- if systemRole.IsShow == pasturePb.IsShow_No {
|
|
|
- return xerr.Custom("该数据已禁用")
|
|
|
- }
|
|
|
-
|
|
|
- if err = s.DB.Transaction(func(tx *gorm.DB) error {
|
|
|
- if err = tx.Model(new(model.SystemRoleMenu)).
|
|
|
- Where("role_id = ?", systemRole.Id).
|
|
|
- Delete(&model.SystemRoleMenu{}).
|
|
|
- Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
+ // 标记为已处理
|
|
|
+ processedIDs[currentID] = struct{}{}
|
|
|
+ allMenuIDs[currentID] = struct{}{}
|
|
|
+
|
|
|
+ // 如果不是顶级菜单,查询其父级ID并加入队列
|
|
|
+ if currentID != 0 { // 0是顶级菜单的parent_id
|
|
|
+ var parentID int64
|
|
|
+ err := s.DB.Model(new(model.SystemMenu)).
|
|
|
+ Where("id = ? AND is_delete = 1", currentID).
|
|
|
+ Pluck("parent_id", &parentID).Error
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("failed to get parent ID for menu %d: %v", currentID, err)
|
|
|
+ }
|
|
|
|
|
|
- newSystemRoleMenuList := model.NewSystemRoleMenu(systemRole.Id, res.MenuIds)
|
|
|
- if err = tx.Model(new(model.SystemRoleMenu)).
|
|
|
- Create(newSystemRoleMenuList).Error; err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
+ if parentID != 0 {
|
|
|
+ queue = append(queue, parentID)
|
|
|
+ }
|
|
|
}
|
|
|
- return nil
|
|
|
- }); err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
}
|
|
|
- return nil
|
|
|
-}
|
|
|
|
|
|
-func (s *StoreEntry) SystemRoleList(ctx context.Context) (*pasturePb.GetRoleListResponse, error) {
|
|
|
- userModel, err := s.GetUserModel(ctx)
|
|
|
- if err != nil {
|
|
|
- return nil, xerr.WithStack(err)
|
|
|
+ // 将map中的ID转换为slice
|
|
|
+ var ids []int64
|
|
|
+ for id := range allMenuIDs {
|
|
|
+ ids = append(ids, id)
|
|
|
}
|
|
|
|
|
|
- systemRoleList := make([]*model.SystemRole, 0)
|
|
|
- if err = s.DB.Model(new(model.SystemRole)).
|
|
|
- Where("is_delete = ?", pasturePb.IsShow_Ok).
|
|
|
- Where("pasture_id = ?", userModel.AppPasture.Id).
|
|
|
- Find(&systemRoleList).Error; err != nil {
|
|
|
- return nil, xerr.WithStack(err)
|
|
|
+ // 查询所有需要的菜单
|
|
|
+ systemMenuList := make([]*model.SystemMenu, 0)
|
|
|
+ if err := s.DB.Model(new(model.SystemMenu)).
|
|
|
+ Where("id IN (?) AND is_delete = 1", ids).
|
|
|
+ Order("parent_id ASC,id ASC").
|
|
|
+ Group("id").
|
|
|
+ Find(&systemMenuList).Error; err != nil {
|
|
|
+ return nil, fmt.Errorf("failed to query menus: %v", err)
|
|
|
}
|
|
|
|
|
|
- return &pasturePb.GetRoleListResponse{
|
|
|
- Code: http.StatusOK,
|
|
|
- Msg: "ok",
|
|
|
- Data: model.SystemRoleSlice(systemRoleList).ToPB(),
|
|
|
- }, nil
|
|
|
+ return systemMenuList, nil
|
|
|
}
|