first commit
This commit is contained in:
196
services/pms_service.go
Normal file
196
services/pms_service.go
Normal file
@@ -0,0 +1,196 @@
|
||||
// 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)
|
||||
}
|
||||
Reference in New Issue
Block a user