Files
nl-video-api/internal/dao/role.go
2025-08-03 00:11:15 +08:00

201 lines
5.4 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 dao
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"nl-video-api/internal/model/entity"
)
// RoleDao 角色数据访问对象
type RoleDao struct{}
// TableName 获取表名
func (dao *RoleDao) TableName() string {
return "nl_role"
}
// Create 创建角色
func (dao *RoleDao) Create(ctx context.Context, data *entity.Role) (int, error) {
result, err := g.DB().Model(dao.TableName()).Ctx(ctx).Data(data).Insert()
if err != nil {
return 0, err
}
id, err := result.LastInsertId()
if err != nil {
return 0, err
}
return int(id), nil
}
// GetById 根据ID获取角色
func (dao *RoleDao) GetById(ctx context.Context, id int) (*entity.Role, error) {
var role *entity.Role
err := g.DB().Model(dao.TableName()).Ctx(ctx).Where("id = ? AND deleted_at = 0", id).Scan(&role)
if err != nil {
return nil, err
}
return role, nil
}
// GetByCode 根据角色编码获取角色
func (dao *RoleDao) GetByCode(ctx context.Context, code string) (*entity.Role, error) {
var role *entity.Role
err := g.DB().Model(dao.TableName()).Ctx(ctx).Where("code = ? AND deleted_at = 0", code).Scan(&role)
if err != nil {
return nil, err
}
return role, nil
}
// Update 更新角色
func (dao *RoleDao) Update(ctx context.Context, id int, data g.Map) error {
data["updated_at"] = gtime.Now().Unix()
_, err := g.DB().Model(dao.TableName()).Ctx(ctx).Where("id = ?", id).Data(data).Update()
return err
}
// Delete 删除角色(软删除)
func (dao *RoleDao) Delete(ctx context.Context, id int) error {
data := g.Map{
"deleted_at": gtime.Now().Unix(),
"updated_at": gtime.Now().Unix(),
}
_, err := g.DB().Model(dao.TableName()).Ctx(ctx).Where("id = ?", id).Data(data).Update()
return err
}
// GetList 获取角色列表
func (dao *RoleDao) GetList(ctx context.Context, req *RoleListReq) ([]*entity.Role, int, error) {
model := g.DB().Model(dao.TableName()).Ctx(ctx).Where("deleted_at = 0")
// 条件筛选
if req.Name != "" {
model = model.WhereLike("name", "%"+req.Name+"%")
}
if req.Code != "" {
model = model.WhereLike("code", "%"+req.Code+"%")
}
if req.Status >= 0 {
model = model.Where("status = ?", req.Status)
}
if req.Level > 0 {
model = model.Where("level = ?", req.Level)
}
// 获取总数
total, err := model.Count()
if err != nil {
return nil, 0, err
}
// 分页和排序
if req.Page > 0 && req.PageSize > 0 {
offset := (req.Page - 1) * req.PageSize
model = model.Limit(req.PageSize).Offset(offset)
}
model = model.OrderDesc("sort").OrderDesc("id")
var roles []*entity.Role
err = model.Scan(&roles)
if err != nil {
return nil, 0, err
}
return roles, total, nil
}
// GetAll 获取所有角色
func (dao *RoleDao) GetAll(ctx context.Context) ([]*entity.Role, error) {
var roles []*entity.Role
err := g.DB().Model(dao.TableName()).Ctx(ctx).
Where("deleted_at = 0 AND status = 1").
OrderDesc("sort").OrderDesc("id").
Scan(&roles)
return roles, err
}
// CheckCodeExists 检查角色编码是否存在
func (dao *RoleDao) CheckCodeExists(ctx context.Context, code string, excludeId int) (bool, error) {
model := g.DB().Model(dao.TableName()).Ctx(ctx).Where("code = ? AND deleted_at = 0", code)
if excludeId > 0 {
model = model.Where("id != ?", excludeId)
}
count, err := model.Count()
if err != nil {
return false, err
}
return count > 0, nil
}
// GetRolesByIds 根据ID列表获取角色
func (dao *RoleDao) GetRolesByIds(ctx context.Context, ids []int) ([]*entity.Role, error) {
if len(ids) == 0 {
return []*entity.Role{}, nil
}
var roles []*entity.Role
err := g.DB().Model(dao.TableName()).Ctx(ctx).
Where("id IN (?) AND deleted_at = 0", ids).
OrderDesc("sort").OrderDesc("id").
Scan(&roles)
return roles, err
}
// GetRolePermissions 获取角色的权限列表
func (dao *RoleDao) GetRolePermissions(ctx context.Context, roleId int) ([]*entity.Permission, error) {
var permissions []*entity.Permission
err := g.DB().Model("nl_permission p").Ctx(ctx).
LeftJoin("nl_role_permission rp", "p.id = rp.permission_id").
Where("rp.role_id = ? AND p.deleted_at = 0 AND p.status = 1", roleId).
OrderAsc("p.sort").OrderAsc("p.id").
Scan(&permissions)
return permissions, err
}
// AssignPermissions 为角色分配权限
func (dao *RoleDao) AssignPermissions(ctx context.Context, roleId int, permissionIds []int) error {
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
// 先删除原有权限
_, err := tx.Model("nl_role_permission").Ctx(ctx).Where("role_id = ?", roleId).Delete()
if err != nil {
return err
}
// 添加新权限
if len(permissionIds) > 0 {
data := make([]g.Map, 0, len(permissionIds))
for _, permissionId := range permissionIds {
data = append(data, g.Map{
"role_id": roleId,
"permission_id": permissionId,
"created_at": gtime.Now().Unix(),
})
}
_, err = tx.Model("nl_role_permission").Ctx(ctx).Data(data).Insert()
if err != nil {
return err
}
}
return nil
})
}
// RoleListReq 角色列表请求参数
type RoleListReq struct {
Page int `json:"page" v:"min:1#页码最小为1"`
PageSize int `json:"page_size" v:"min:1,max:100#每页数量范围1-100"`
Name string `json:"name"` // 角色名称
Code string `json:"code"` // 角色编码
Status int `json:"status"` // 状态:-1-全部0-禁用1-启用
Level int `json:"level"` // 角色等级
}