201 lines
5.4 KiB
Go
201 lines
5.4 KiB
Go
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"` // 角色等级
|
||
}
|