Files
Quincy_admin/services/pms_service.go
2026-03-26 22:13:03 +08:00

197 lines
5.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package services/pms_service.go
package services
import (
"Quincy_admin/repositories"
"Quincy_admin/schemas"
)
type PermissionService struct {
pmsRepo *repositories.PermissionRepository
}
func NewPermissionService(repo *repositories.PermissionRepository) *PermissionService {
return &PermissionService{pmsRepo: repo}
}
// GetRoutesByID 获取侧边栏菜单权限
func (s *PermissionService) GetRoutesByID(roleID int) (*schemas.Routes, error) {
// 从仓库获取菜单数据
var menuItems []*schemas.MenuItems
var err error
// 超级管理员ID为1(超管),获取所有菜单数据
if roleID == 1 {
menuItems, err = s.pmsRepo.GetRoutes()
} else {
// 从仓库获取菜单数据
menuItems, err = s.pmsRepo.GetRoutesByID(roleID)
}
if err != nil {
return nil, err
}
// 构建树形结构
var rootNodes []*schemas.Routes
// 存储所有节点的映射,便于查找子节点
nodeMap := make(map[int]*schemas.Routes)
for _, item := range menuItems {
node := &schemas.Routes{
ID: item.ID,
ParentID: item.ParentID,
Title: item.Title,
Path: item.Path,
Component: item.Component,
Icon: item.Icon,
Sort: item.Sort,
Visible: item.Visible,
Status: item.Status,
}
nodeMap[item.ID] = node
// 如果是根节点parent_id = 0
if item.ParentID == 0 {
rootNodes = append(rootNodes, node)
}
}
// 为每个节点添加子节点
for _, node := range nodeMap {
if node.ParentID != 0 {
parentNode, exists := nodeMap[node.ParentID]
if exists {
if parentNode.Children == nil {
parentNode.Children = []*schemas.Routes{}
}
parentNode.Children = append(parentNode.Children, node)
}
}
}
// 返回根节点数组
return &schemas.Routes{Children: rootNodes}, nil
}
// GetMenuList 获取菜单列表
func (s *PermissionService) GetMenuList(page, pageSize int) ([]*schemas.MenuItems, int64, error) {
return s.pmsRepo.GetMenuList(page, pageSize)
}
// UpdateMenuStatus 启用/停用菜单
func (s *PermissionService) UpdateMenuStatus(id int, status int) error {
return s.pmsRepo.UpdateMenuStatus(id, status)
}
// GetPermission 获取权限信息
func (s *PermissionService) GetPermission(roleID int, typeStr string) (*[]string, error) {
// 超级管理员ID为1(超管),获取所有菜单数据
if roleID == 1 {
return s.pmsRepo.GetAllPermission(typeStr)
} else {
return s.pmsRepo.GetPermission(roleID, typeStr)
}
}
// GetAllPermission 获取系统所有权限信息
func (s *PermissionService) GetAllPermission() (*schemas.PermissionItems, error) {
// 获取所有权限数据
items, err := s.pmsRepo.GetAllNewPermission()
if err != nil {
return nil, err
}
// 构建树形结构
root := &schemas.PermissionItems{
ID: 0,
Name: "root",
Title: "根节点",
Children: make([]*schemas.PermissionItems, 0), // 使用指针切片
}
nodeMap := make(map[int64]*schemas.PermissionItems)
// 先建立映射
for i := range items {
nodeMap[items[i].ID] = items[i] // 直接使用指针
}
// 遍历所有节点,挂载到父节点下
for _, item := range items {
if item.ParentID == 0 {
root.Children = append(root.Children, item) // 使用指针
} else {
if parent, exists := nodeMap[item.ParentID]; exists {
parent.Children = append(parent.Children, item) // 使用指针
}
}
}
return root, nil
}
// GetRolePermission 获取角色权限信息
func (s *PermissionService) GetRolePermission(roleID int, typeStr string) (*[]int, error) {
return s.pmsRepo.GetRolePermission(roleID, typeStr)
}
// AssignPermission 为角色分配权限
func (s *PermissionService) AssignPermission(roleID int, permissionIDs []int) error {
// 获取角色现有的权限ID列表
existingPermIDs, err := s.GetRolePermissionIDs(roleID)
if err != nil {
return err
}
// 构建现有权限ID映射
existingPermMap := make(map[int]bool)
for _, pid := range existingPermIDs {
existingPermMap[pid] = true
}
// 构建请求权限ID映射
requestPermMap := make(map[int]bool)
for _, pid := range permissionIDs {
requestPermMap[pid] = true
}
// 分离需要新增和需要删除的权限ID
var toInsert []int
var toDelete []int
// 找出需要新增的权限(存在于请求中但不存在于现有权限中)
for _, pid := range permissionIDs {
if !existingPermMap[pid] {
toInsert = append(toInsert, pid)
}
}
// 找出需要删除的权限(存在于现有权限中但不存在于请求中)
for _, pid := range existingPermIDs {
if !requestPermMap[pid] {
toDelete = append(toDelete, pid)
}
}
// 执行插入操作
if len(toInsert) > 0 {
if err := s.pmsRepo.InsertRolePermissions(roleID, toInsert); err != nil {
return err
}
}
// 执行删除操作
if len(toDelete) > 0 {
if err := s.pmsRepo.DeleteRolePermissions(roleID, toDelete); err != nil {
return err
}
}
return nil
}
// GetRolePermissionIDs 获取角色已有的权限ID列表
func (s *PermissionService) GetRolePermissionIDs(roleID int) ([]int, error) {
return s.pmsRepo.GetRolePermissionIDs(roleID)
}