first commit

This commit is contained in:
何昌清
2026-03-26 22:13:03 +08:00
parent bbe1faa363
commit a2685f7f1e
51 changed files with 11244 additions and 0 deletions

196
services/pms_service.go Normal file
View 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)
}