Files
nl-video-api/internal/service/auth/permission.go
2025-08-03 00:11:15 +08:00

234 lines
7.1 KiB
Go
Raw Permalink 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 auth
import (
"context"
"errors"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
"nl-video-api/internal/dao"
"nl-video-api/internal/model/entity"
)
// PermissionService 权限服务
type PermissionService struct{}
var Permission = &PermissionService{}
// PermissionCreateReq 创建权限请求
type PermissionCreateReq struct {
Name string `json:"name" v:"required|length:2,50#权限名称不能为空|权限名称长度为2-50位"`
Slug string `json:"slug" v:"required|length:2,100#权限标识不能为空|权限标识长度为2-100位"`
Type string `json:"type" v:"required|in:1,2,3#权限类型不能为空|权限类型只能是1,2,3"`
ParentId int `json:"parent_id" v:"min:0#父级ID不能小于0"`
Path string `json:"path"` // 路由路径
Component string `json:"component"` // 组件路径
Icon string `json:"icon"` // 图标
ApiPath string `json:"api_path"` // API路径
Method string `json:"method"` // 请求方法
Description string `json:"description"` // 权限描述
Sort int `json:"sort"` // 排序
Status int `json:"status" v:"in:0,1#状态只能为0或1"`
}
// PermissionUpdateReq 更新权限请求
type PermissionUpdateReq struct {
Id int `json:"id" v:"required|min:1#权限ID不能为空"`
Name string `json:"name" v:"required|length:2,50#权限名称不能为空|权限名称长度为2-50位"`
Slug string `json:"slug" v:"required|length:2,100#权限标识不能为空|权限标识长度为2-100位"`
Type string `json:"type" v:"required|in:1,2,3#权限类型不能为空|权限类型只能是1,2,3"`
ParentId int `json:"parent_id" v:"min:0#父级ID不能小于0"`
Path string `json:"path"` // 路由路径
Component string `json:"component"` // 组件路径
Icon string `json:"icon"` // 图标
ApiPath string `json:"api_path"` // API路径
Method string `json:"method"` // 请求方法
Description string `json:"description"` // 权限描述
Sort int `json:"sort"` // 排序
Status int `json:"status" v:"in:0,1#状态只能为0或1"`
}
// Create 创建权限
func (s *PermissionService) Create(ctx context.Context, req *PermissionCreateReq) (int, error) {
// 检查权限标识是否存在
exists, err := dao.Permission.CheckCodeExists(ctx, req.Slug, 0)
if err != nil {
return 0, err
}
if exists {
return 0, errors.New("权限标识已存在")
}
// 如果有父级ID检查父级是否存在
if req.ParentId > 0 {
parent, err := dao.Permission.GetById(ctx, req.ParentId)
if err != nil {
return 0, err
}
if parent == nil {
return 0, errors.New("父级权限不存在")
}
}
// 创建权限数据
permission := &entity.Permission{
Name: req.Name,
Slug: req.Slug,
Type: gconv.Int(req.Type),
ParentId: req.ParentId,
Path: req.Path,
Component: req.Component,
Icon: req.Icon,
ApiPath: req.ApiPath,
Method: req.Method,
Description: req.Description,
Sort: req.Sort,
Status: req.Status,
CreatedAt: gtime.Now().String(),
UpdatedAt: gtime.Now().String(),
}
return dao.Permission.Create(ctx, permission)
}
// Update 更新权限
func (s *PermissionService) Update(ctx context.Context, req *PermissionUpdateReq) error {
// 检查权限是否存在
permission, err := dao.Permission.GetById(ctx, req.Id)
if err != nil {
return err
}
if permission == nil {
return errors.New("权限不存在")
}
// 检查权限标识是否存在(排除自己)
exists, err := dao.Permission.CheckCodeExists(ctx, req.Slug, req.Id)
if err != nil {
return err
}
if exists {
return errors.New("权限标识已存在")
}
// 如果有父级ID检查父级是否存在
if req.ParentId > 0 {
parent, err := dao.Permission.GetById(ctx, req.ParentId)
if err != nil {
return err
}
if parent == nil {
return errors.New("父级权限不存在")
}
// 不能将自己设为父级
if req.ParentId == req.Id {
return errors.New("不能将自己设为父级")
}
}
// 更新数据
updateData := g.Map{
"name": req.Name,
"slug": req.Slug,
"type": gconv.Int(req.Type),
"parent_id": req.ParentId,
"path": req.Path,
"component": req.Component,
"icon": req.Icon,
"api_path": req.ApiPath,
"method": req.Method,
"description": req.Description,
"sort": req.Sort,
"status": req.Status,
"updated_at": gtime.Now().String(),
}
return dao.Permission.Update(ctx, req.Id, updateData)
}
// GetById 获取权限详情
func (s *PermissionService) GetById(ctx context.Context, id int) (*entity.Permission, error) {
return dao.Permission.GetById(ctx, id)
}
// GetList 获取权限列表
func (s *PermissionService) GetList(ctx context.Context, req *dao.PermissionListReq) ([]*entity.Permission, int, error) {
return dao.Permission.GetList(ctx, req)
}
// GetTree 获取权限树形结构
func (s *PermissionService) GetTree(ctx context.Context) ([]*entity.Permission, error) {
return dao.Permission.GetTree(ctx)
}
// Delete 删除权限
func (s *PermissionService) Delete(ctx context.Context, id int) error {
// 检查权限是否存在
permission, err := dao.Permission.GetById(ctx, id)
if err != nil {
return err
}
if permission == nil {
return errors.New("权限不存在")
}
// 检查是否有子权限
children, err := dao.Permission.GetByParentId(ctx, id)
if err != nil {
return err
}
if len(children) > 0 {
return errors.New("存在子权限,无法删除")
}
return dao.Permission.Delete(ctx, id)
}
// GetMenuPermissions 获取菜单权限
func (s *PermissionService) GetMenuPermissions(ctx context.Context) ([]*entity.Permission, error) {
return dao.Permission.GetMenuPermissions(ctx)
}
// GetApiPermissions 获取API权限
func (s *PermissionService) GetApiPermissions(ctx context.Context) ([]*entity.Permission, error) {
return dao.Permission.GetApiPermissions(ctx)
}
// GetUserPermissions 获取用户权限
func (s *PermissionService) GetUserPermissions(ctx context.Context, userId int) ([]*entity.Permission, error) {
return dao.Permission.GetUserPermissions(ctx, userId)
}
// CheckUserPermission 检查用户是否有指定权限
func (s *PermissionService) CheckUserPermission(ctx context.Context, userId int, permissionSlug string) (bool, error) {
permissions, err := s.GetUserPermissions(ctx, userId)
if err != nil {
return false, err
}
for _, permission := range permissions {
if permission.Slug == permissionSlug {
return true, nil
}
}
return false, nil
}
// CheckApiPermission 检查API权限
func (s *PermissionService) CheckApiPermission(ctx context.Context, userId int, apiPath, method string) (bool, error) {
permissions, err := s.GetUserPermissions(ctx, userId)
if err != nil {
return false, err
}
for _, permission := range permissions {
if permission.Type == 3 && permission.ApiPath == apiPath && permission.Method == method {
return true, nil
}
}
return false, nil
}