136 lines
3.2 KiB
Go
136 lines
3.2 KiB
Go
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)
|
||
}
|
||
|