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) }