227 lines
6.8 KiB
Go
227 lines
6.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"cms-api/internal/dao"
|
|
"cms-api/internal/model"
|
|
"encoding/json"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
)
|
|
|
|
type sRole struct{}
|
|
|
|
func Role() *sRole {
|
|
return &sRole{}
|
|
}
|
|
|
|
// GetById 根据ID获取角色信息
|
|
func (s *sRole) GetById(ctx context.Context, id int) (*model.Role, error) {
|
|
return dao.Role.GetById(ctx, id)
|
|
}
|
|
|
|
// List 获取角色列表
|
|
func (s *sRole) List(ctx context.Context, req *model.RoleListRequest) (*model.PageResponse, error) {
|
|
var (
|
|
page = req.Page
|
|
pageSize = req.PageSize
|
|
)
|
|
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
if pageSize <= 0 {
|
|
pageSize = 10
|
|
}
|
|
|
|
// 设置分页参数
|
|
req.Page = page
|
|
req.PageSize = pageSize
|
|
|
|
// 获取列表
|
|
roles, total, err := dao.Role.List(ctx, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &model.PageResponse{
|
|
List: roles,
|
|
Total: total,
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
TotalPages: (total + pageSize - 1) / pageSize,
|
|
}, nil
|
|
}
|
|
|
|
// GetAll 获取所有启用的角色
|
|
func (s *sRole) GetAll(ctx context.Context) ([]*model.Role, error) {
|
|
return dao.Role.GetAll(ctx)
|
|
}
|
|
|
|
// Create 创建角色
|
|
func (s *sRole) Create(ctx context.Context, req *model.CreateRoleRequest) error {
|
|
// 检查角色名称是否存在
|
|
existRole, err := dao.Role.GetByName(ctx, req.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if existRole != nil {
|
|
return gerror.New("角色名称已存在")
|
|
}
|
|
|
|
// 序列化权限列表
|
|
permissionsJson, err := json.Marshal(req.Permissions)
|
|
if err != nil {
|
|
return gerror.New("权限数据格式错误")
|
|
}
|
|
|
|
// 创建角色
|
|
role := &model.Role{
|
|
Name: req.Name,
|
|
Description: req.Description,
|
|
Permissions: string(permissionsJson),
|
|
Status: req.Status,
|
|
CreatedAt: gtime.Now(),
|
|
UpdatedAt: gtime.Now(),
|
|
}
|
|
|
|
_, err = dao.Role.Create(ctx, role)
|
|
return err
|
|
}
|
|
|
|
// Update 更新角色
|
|
func (s *sRole) Update(ctx context.Context, id int, req *model.UpdateRoleRequest) error {
|
|
// 检查角色是否存在
|
|
role, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if role == nil {
|
|
return gerror.New("角色不存在")
|
|
}
|
|
|
|
// 检查角色名称是否被其他角色使用
|
|
existRole, err := dao.Role.GetByName(ctx, req.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if existRole != nil && existRole.Id != id {
|
|
return gerror.New("角色名称已被使用")
|
|
}
|
|
|
|
// 序列化权限列表
|
|
permissionsJson, err := json.Marshal(req.Permissions)
|
|
if err != nil {
|
|
return gerror.New("权限数据格式错误")
|
|
}
|
|
|
|
// 更新角色
|
|
updateData := g.Map{
|
|
"name": req.Name,
|
|
"description": req.Description,
|
|
"permissions": string(permissionsJson),
|
|
"status": req.Status,
|
|
"updated_at": gtime.Now(),
|
|
}
|
|
|
|
return dao.Role.Update(ctx, id, updateData)
|
|
}
|
|
|
|
// Delete 删除角色
|
|
func (s *sRole) Delete(ctx context.Context, id int) error {
|
|
// 检查角色是否存在
|
|
role, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if role == nil {
|
|
return gerror.New("角色不存在")
|
|
}
|
|
|
|
// TODO: 检查是否有用户使用该角色
|
|
// 这里可以添加检查逻辑,防止删除正在使用的角色
|
|
|
|
return dao.Role.Delete(ctx, id)
|
|
}
|
|
|
|
// UpdateStatus 更新角色状态
|
|
func (s *sRole) UpdateStatus(ctx context.Context, id int, status int) error {
|
|
// 检查角色是否存在
|
|
role, err := s.GetById(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if role == nil {
|
|
return gerror.New("角色不存在")
|
|
}
|
|
|
|
return dao.Role.UpdateStatus(ctx, id, status)
|
|
}
|
|
|
|
// GetPermissions 获取所有可用权限
|
|
func (s *sRole) GetPermissions(ctx context.Context) ([]model.PermissionGroup, error) {
|
|
// 定义系统权限
|
|
permissions := []model.PermissionGroup{
|
|
{
|
|
Name: "用户管理",
|
|
Description: "用户相关权限",
|
|
Permissions: []model.Permission{
|
|
{Key: "user.list", Name: "查看用户列表", Description: "查看用户列表权限", Group: "用户管理"},
|
|
{Key: "user.create", Name: "创建用户", Description: "创建用户权限", Group: "用户管理"},
|
|
{Key: "user.update", Name: "编辑用户", Description: "编辑用户权限", Group: "用户管理"},
|
|
{Key: "user.delete", Name: "删除用户", Description: "删除用户权限", Group: "用户管理"},
|
|
{Key: "user.status", Name: "管理用户状态", Description: "管理用户状态权限", Group: "用户管理"},
|
|
},
|
|
},
|
|
{
|
|
Name: "角色管理",
|
|
Description: "角色权限相关权限",
|
|
Permissions: []model.Permission{
|
|
{Key: "role.list", Name: "查看角色列表", Description: "查看角色列表权限", Group: "角色管理"},
|
|
{Key: "role.create", Name: "创建角色", Description: "创建角色权限", Group: "角色管理"},
|
|
{Key: "role.update", Name: "编辑角色", Description: "编辑角色权限", Group: "角色管理"},
|
|
{Key: "role.delete", Name: "删除角色", Description: "删除角色权限", Group: "角色管理"},
|
|
},
|
|
},
|
|
{
|
|
Name: "内容管理",
|
|
Description: "内容相关权限",
|
|
Permissions: []model.Permission{
|
|
{Key: "article.list", Name: "查看文章列表", Description: "查看文章列表权限", Group: "内容管理"},
|
|
{Key: "article.create", Name: "创建文章", Description: "创建文章权限", Group: "内容管理"},
|
|
{Key: "article.update", Name: "编辑文章", Description: "编辑文章权限", Group: "内容管理"},
|
|
{Key: "article.delete", Name: "删除文章", Description: "删除文章权限", Group: "内容管理"},
|
|
{Key: "news.list", Name: "查看新闻列表", Description: "查看新闻列表权限", Group: "内容管理"},
|
|
{Key: "news.create", Name: "创建新闻", Description: "创建新闻权限", Group: "内容管理"},
|
|
{Key: "news.update", Name: "编辑新闻", Description: "编辑新闻权限", Group: "内容管理"},
|
|
{Key: "news.delete", Name: "删除新闻", Description: "删除新闻权限", Group: "内容管理"},
|
|
},
|
|
},
|
|
{
|
|
Name: "附件管理",
|
|
Description: "附件相关权限",
|
|
Permissions: []model.Permission{
|
|
{Key: "attachment.list", Name: "查看附件列表", Description: "查看附件列表权限", Group: "附件管理"},
|
|
{Key: "attachment.upload", Name: "上传附件", Description: "上传附件权限", Group: "附件管理"},
|
|
{Key: "attachment.delete", Name: "删除附件", Description: "删除附件权限", Group: "附件管理"},
|
|
},
|
|
},
|
|
{
|
|
Name: "系统管理",
|
|
Description: "系统相关权限",
|
|
Permissions: []model.Permission{
|
|
{Key: "config.list", Name: "查看系统配置", Description: "查看系统配置权限", Group: "系统管理"},
|
|
{Key: "config.update", Name: "修改系统配置", Description: "修改系统配置权限", Group: "系统管理"},
|
|
},
|
|
},
|
|
}
|
|
|
|
return permissions, nil
|
|
}
|
|
|
|
// CheckPermission 检查权限
|
|
func (s *sRole) CheckPermission(ctx context.Context, roleId int, permission string) (bool, error) {
|
|
return dao.Role.CheckPermission(ctx, roleId, permission)
|
|
} |