From 5851cc6403f5a876d96f7d14128eb21671bcd9d9 Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 2 Feb 2026 17:12:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(permission):=20=E4=B8=BA=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=A0=91=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0=E5=92=8C=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PermissionTreeRequest DTO 支持 status 查询参数 - PermissionTreeNode 返回值新增 status 字段 - Store 层 GetAll 方法支持状态过滤 - Handler 层使用 QueryParser 解析请求参数 --- internal/handler/admin/permission.go | 11 ++++------- internal/model/dto/permission_dto.go | 7 +++++++ internal/routes/permission.go | 2 +- internal/service/auth/service.go | 2 +- internal/service/permission/service.go | 5 +++-- internal/store/postgres/permission_store.go | 6 +++++- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/internal/handler/admin/permission.go b/internal/handler/admin/permission.go index a5191ba..92efcf7 100644 --- a/internal/handler/admin/permission.go +++ b/internal/handler/admin/permission.go @@ -109,15 +109,12 @@ func (h *PermissionHandler) List(c *fiber.Ctx) error { // GetTree 获取权限树 // GET /api/admin/permissions/tree func (h *PermissionHandler) GetTree(c *fiber.Ctx) error { - var availableForRoleType *int - if roleTypeStr := c.Query("available_for_role_type"); roleTypeStr != "" { - roleType, err := strconv.Atoi(roleTypeStr) - if err == nil && (roleType == 1 || roleType == 2) { - availableForRoleType = &roleType - } + var req dto.PermissionTreeRequest + if err := c.QueryParser(&req); err != nil { + return errors.New(errors.CodeInvalidParam, "请求参数解析失败") } - tree, err := h.service.GetTree(c.UserContext(), availableForRoleType) + tree, err := h.service.GetTree(c.UserContext(), &req) if err != nil { return err } diff --git a/internal/model/dto/permission_dto.go b/internal/model/dto/permission_dto.go index 54f95cd..01d2e43 100644 --- a/internal/model/dto/permission_dto.go +++ b/internal/model/dto/permission_dto.go @@ -67,6 +67,12 @@ type PermissionPageResult struct { Size int `json:"size" description:"每页数量"` } +// PermissionTreeRequest 权限树查询请求 +type PermissionTreeRequest struct { + AvailableForRoleType *int `json:"available_for_role_type" query:"available_for_role_type" validate:"omitempty,min=1,max=2" minimum:"1" maximum:"2" description:"可用角色类型 (1:平台角色, 2:客户角色)"` + Status *int `json:"status" query:"status" validate:"omitempty,min=0,max=1" minimum:"0" maximum:"1" description:"状态 (0:禁用, 1:启用)"` +} + // PermissionTreeNode 权限树节点(用于层级展示) type PermissionTreeNode struct { ID uint `json:"id" description:"权限ID"` @@ -77,5 +83,6 @@ type PermissionTreeNode struct { AvailableForRoleTypes string `json:"available_for_role_types" description:"可用角色类型 (1:平台角色, 2:客户角色)"` URL string `json:"url,omitempty" description:"请求路径"` Sort int `json:"sort" description:"排序值"` + Status int `json:"status" description:"状态 (0:禁用, 1:启用)"` Children []*PermissionTreeNode `json:"children,omitempty" description:"子权限列表"` } diff --git a/internal/routes/permission.go b/internal/routes/permission.go index 5454769..c019971 100644 --- a/internal/routes/permission.go +++ b/internal/routes/permission.go @@ -33,7 +33,7 @@ func registerPermissionRoutes(api fiber.Router, h *admin.PermissionHandler, doc Register(permissions, doc, groupPath, "GET", "/tree", h.GetTree, RouteSpec{ Summary: "获取权限树", Tags: []string{"权限"}, - Input: nil, // 无参数或 Query 参数 + Input: new(dto.PermissionTreeRequest), Output: new([]*dto.PermissionTreeNode), Auth: true, }) diff --git a/internal/service/auth/service.go b/internal/service/auth/service.go index e06a48b..8ef3f12 100644 --- a/internal/service/auth/service.go +++ b/internal/service/auth/service.go @@ -301,7 +301,7 @@ func (s *Service) getUserPermissionsAndMenus(ctx context.Context, userID uint, u } func (s *Service) getAllPermissionsForSuperAdmin(ctx context.Context, device string) ([]string, []dto.MenuNode, []string, error) { - permissions, err := s.permissionStore.GetAll(ctx, nil) + permissions, err := s.permissionStore.GetAll(ctx, nil, nil) if err != nil { return nil, nil, nil, errors.Wrap(errors.CodeInternalError, err, "查询所有权限失败") } diff --git a/internal/service/permission/service.go b/internal/service/permission/service.go index 9549710..badb603 100644 --- a/internal/service/permission/service.go +++ b/internal/service/permission/service.go @@ -230,8 +230,8 @@ func (s *Service) List(ctx context.Context, req *dto.PermissionListRequest) ([]* } // GetTree 获取权限树 -func (s *Service) GetTree(ctx context.Context, availableForRoleType *int) ([]*dto.PermissionTreeNode, error) { - permissions, err := s.permissionStore.GetAll(ctx, availableForRoleType) +func (s *Service) GetTree(ctx context.Context, req *dto.PermissionTreeRequest) ([]*dto.PermissionTreeNode, error) { + permissions, err := s.permissionStore.GetAll(ctx, req.AvailableForRoleType, req.Status) if err != nil { return nil, errors.Wrap(errors.CodeInternalError, err, "获取权限列表失败") } @@ -252,6 +252,7 @@ func buildPermissionTree(permissions []*model.Permission) []*dto.PermissionTreeN AvailableForRoleTypes: p.AvailableForRoleTypes, URL: p.URL, Sort: p.Sort, + Status: p.Status, Children: make([]*dto.PermissionTreeNode, 0), } } diff --git a/internal/store/postgres/permission_store.go b/internal/store/postgres/permission_store.go index 539ba2f..a3aadac 100644 --- a/internal/store/postgres/permission_store.go +++ b/internal/store/postgres/permission_store.go @@ -121,7 +121,7 @@ func (s *PermissionStore) GetByIDs(ctx context.Context, ids []uint) ([]*model.Pe } // GetAll 获取所有权限(用于构建权限树) -func (s *PermissionStore) GetAll(ctx context.Context, availableForRoleType *int) ([]*model.Permission, error) { +func (s *PermissionStore) GetAll(ctx context.Context, availableForRoleType *int, status *int) ([]*model.Permission, error) { var permissions []*model.Permission query := s.db.WithContext(ctx) @@ -130,6 +130,10 @@ func (s *PermissionStore) GetAll(ctx context.Context, availableForRoleType *int) query = query.Where("available_for_role_types LIKE ?", "%"+roleTypeStr+"%") } + if status != nil { + query = query.Where("status = ?", *status) + } + if err := query.Order("sort ASC, id ASC").Find(&permissions).Error; err != nil { return nil, err }