duidui_fiber/internal/admin_auth/service/role_service.go
2026-03-27 10:34:03 +08:00

136 lines
3.2 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 service
import (
"fmt"
"regexp"
"strings"
"dd_fiber_api/internal/admin_auth"
"dd_fiber_api/internal/admin_auth/dao"
"dd_fiber_api/pkg/snowflake"
)
// RoleService 角色服务
type RoleService struct {
roleDAO *dao.RoleDAO
}
// NewRoleService 创建角色服务
func NewRoleService(roleDAO *dao.RoleDAO) *RoleService {
return &RoleService{
roleDAO: roleDAO,
}
}
// ListRoles 列出角色
func (s *RoleService) ListRoles(keyword string, page, pageSize int) ([]*admin_auth.AdminRole, int, error) {
if page < 1 {
page = 1
}
if pageSize < 1 {
pageSize = 10
}
if pageSize > 100 {
pageSize = 100
}
return s.roleDAO.List(keyword, page, pageSize)
}
// GetRole 获取角色详情
func (s *RoleService) GetRole(id string) (*admin_auth.AdminRole, error) {
return s.roleDAO.GetByID(id)
}
// generateRoleCode 根据角色名称生成角色代码
func (s *RoleService) generateRoleCode(name string) string {
// 转换为小写
code := strings.ToLower(name)
// 移除所有非字母数字字符,用下划线替换空格和特殊字符
reg := regexp.MustCompile(`[^a-z0-9]+`)
code = reg.ReplaceAllString(code, "_")
// 移除开头和结尾的下划线
code = strings.Trim(code, "_")
// 如果为空,使用默认值
if code == "" {
code = "role"
}
// 确保代码唯一添加时间戳后缀使用雪花ID的一部分
uniqueSuffix := snowflake.GenerateID()[:8]
code = fmt.Sprintf("%s_%s", code, uniqueSuffix)
return code
}
// CreateRole 创建角色
func (s *RoleService) CreateRole(role *admin_auth.AdminRole) error {
// 如果代码为空,自动生成
if role.Code == "" {
role.Code = s.generateRoleCode(role.Name)
} else {
// 检查代码是否已存在
existing, err := s.roleDAO.GetByCode(role.Code)
if err != nil {
return fmt.Errorf("检查角色代码失败: %v", err)
}
if existing != nil {
return fmt.Errorf("角色代码已存在: %s", role.Code)
}
}
// 生成ID
role.ID = snowflake.GenerateID()
// 设置默认值
if role.Status == 0 {
role.Status = 1 // 默认启用
}
return s.roleDAO.Create(role)
}
// UpdateRole 更新角色
func (s *RoleService) UpdateRole(role *admin_auth.AdminRole) error {
// 检查角色是否存在
existing, err := s.roleDAO.GetByID(role.ID)
if err != nil {
return fmt.Errorf("查询角色失败: %v", err)
}
if existing == nil {
return fmt.Errorf("角色不存在")
}
// 如果修改了代码,检查新代码是否已存在
if role.Code != existing.Code {
codeExists, err := s.roleDAO.GetByCode(role.Code)
if err != nil {
return fmt.Errorf("检查角色代码失败: %v", err)
}
if codeExists != nil {
return fmt.Errorf("角色代码已存在: %s", role.Code)
}
}
return s.roleDAO.Update(role)
}
// DeleteRole 删除角色
func (s *RoleService) DeleteRole(id string) error {
return s.roleDAO.Delete(id)
}
// GetRolePermissions 获取角色的权限列表
func (s *RoleService) GetRolePermissions(roleID string) ([]string, error) {
return s.roleDAO.GetRolePermissions(roleID)
}
// SetRolePermissions 设置角色的权限
func (s *RoleService) SetRolePermissions(roleID string, permissionIDs []string) error {
return s.roleDAO.SetRolePermissions(roleID, permissionIDs)
}