duidui_fiber/internal/admin_auth/dao/permission_dao.go
2026-03-27 10:34:03 +08:00

264 lines
6.2 KiB
Go

package dao
import (
"database/sql"
"fmt"
"dd_fiber_api/internal/admin_auth"
"dd_fiber_api/pkg/database"
"github.com/didi/gendry/builder"
)
// PermissionDAO 权限数据访问对象
type PermissionDAO struct {
client *database.MySQLClient
}
// NewPermissionDAO 创建权限DAO
func NewPermissionDAO(client *database.MySQLClient) *PermissionDAO {
return &PermissionDAO{
client: client,
}
}
// List 列出权限(支持分页和搜索)
func (d *PermissionDAO) List(keyword, resource string, page, pageSize int) ([]*admin_auth.AdminPermission, int, error) {
table := "admin_permissions"
// 构建查询条件
where := map[string]any{}
if keyword != "" {
where["_or"] = []map[string]any{
{"name like": "%" + keyword + "%"},
{"code like": "%" + keyword + "%"},
{"description like": "%" + keyword + "%"},
}
}
if resource != "" {
where["resource"] = resource
}
// 查询总数
countFields := []string{"COUNT(*) as total"}
countCond, countVals, err := builder.BuildSelect(table, where, countFields)
if err != nil {
return nil, 0, fmt.Errorf("构建统计查询失败: %v", err)
}
var total int
err = d.client.DB.QueryRow(countCond, countVals...).Scan(&total)
if err != nil {
return nil, 0, fmt.Errorf("查询权限总数失败: %v", err)
}
// 查询数据
selectFields := []string{"id", "name", "code", "resource", "action", "description", "created_at", "updated_at"}
cond, vals, err := builder.BuildSelect(table, where, selectFields)
if err != nil {
return nil, 0, fmt.Errorf("构建查询失败: %v", err)
}
// 添加排序和分页
offset := (page - 1) * pageSize
cond += " ORDER BY resource, action ASC LIMIT ? OFFSET ?"
vals = append(vals, pageSize, offset)
rows, err := d.client.DB.Query(cond, vals...)
if err != nil {
return nil, 0, fmt.Errorf("查询权限列表失败: %v", err)
}
defer rows.Close()
var permissions []*admin_auth.AdminPermission
for rows.Next() {
var permission admin_auth.AdminPermission
var description sql.NullString
err := rows.Scan(
&permission.ID,
&permission.Name,
&permission.Code,
&permission.Resource,
&permission.Action,
&description,
&permission.CreatedAt,
&permission.UpdatedAt,
)
if err != nil {
continue
}
if description.Valid {
permission.Description = description.String
}
permissions = append(permissions, &permission)
}
return permissions, total, nil
}
// GetByID 根据ID获取权限
func (d *PermissionDAO) GetByID(id string) (*admin_auth.AdminPermission, error) {
query := `SELECT id, name, code, resource, action, description, created_at, updated_at
FROM admin_permissions WHERE id = ?`
var permission admin_auth.AdminPermission
var description sql.NullString
err := d.client.DB.QueryRow(query, id).Scan(
&permission.ID,
&permission.Name,
&permission.Code,
&permission.Resource,
&permission.Action,
&description,
&permission.CreatedAt,
&permission.UpdatedAt,
)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("查询权限失败: %v", err)
}
if description.Valid {
permission.Description = description.String
}
return &permission, nil
}
// GetByCode 根据代码获取权限
func (d *PermissionDAO) GetByCode(code string) (*admin_auth.AdminPermission, error) {
query := `SELECT id, name, code, resource, action, description, created_at, updated_at
FROM admin_permissions WHERE code = ?`
var permission admin_auth.AdminPermission
var description sql.NullString
err := d.client.DB.QueryRow(query, code).Scan(
&permission.ID,
&permission.Name,
&permission.Code,
&permission.Resource,
&permission.Action,
&description,
&permission.CreatedAt,
&permission.UpdatedAt,
)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("查询权限失败: %v", err)
}
if description.Valid {
permission.Description = description.String
}
return &permission, nil
}
// Create 创建权限
func (d *PermissionDAO) Create(permission *admin_auth.AdminPermission) error {
table := "admin_permissions"
data := []map[string]any{
{
"id": permission.ID,
"name": permission.Name,
"code": permission.Code,
"resource": permission.Resource,
"action": permission.Action,
"description": permission.Description,
},
}
cond, vals, err := builder.BuildInsert(table, data)
if err != nil {
return fmt.Errorf("构建插入语句失败: %v", err)
}
_, err = d.client.DB.Exec(cond, vals...)
if err != nil {
return fmt.Errorf("创建权限失败: %v", err)
}
return nil
}
// Update 更新权限
func (d *PermissionDAO) Update(permission *admin_auth.AdminPermission) error {
table := "admin_permissions"
where := map[string]any{
"id": permission.ID,
}
data := map[string]any{
"name": permission.Name,
"code": permission.Code,
"resource": permission.Resource,
"action": permission.Action,
"description": permission.Description,
}
cond, vals, err := builder.BuildUpdate(table, where, data)
if err != nil {
return fmt.Errorf("构建更新语句失败: %v", err)
}
_, err = d.client.DB.Exec(cond, vals...)
if err != nil {
return fmt.Errorf("更新权限失败: %v", err)
}
return nil
}
// Delete 删除权限
func (d *PermissionDAO) Delete(id string) error {
// 先删除角色权限关联
deleteRolePermQuery := `DELETE FROM admin_role_permissions WHERE permission_id = ?`
_, err := d.client.DB.Exec(deleteRolePermQuery, id)
if err != nil {
return fmt.Errorf("删除角色权限关联失败: %v", err)
}
// 删除权限
deleteQuery := `DELETE FROM admin_permissions WHERE id = ?`
_, err = d.client.DB.Exec(deleteQuery, id)
if err != nil {
return fmt.Errorf("删除权限失败: %v", err)
}
return nil
}
// GetResources 获取所有资源列表
func (d *PermissionDAO) GetResources() ([]string, error) {
query := `SELECT DISTINCT resource FROM admin_permissions ORDER BY resource`
rows, err := d.client.DB.Query(query)
if err != nil {
return nil, fmt.Errorf("查询资源列表失败: %v", err)
}
defer rows.Close()
var resources []string
for rows.Next() {
var resource string
if err := rows.Scan(&resource); err != nil {
continue
}
resources = append(resources, resource)
}
return resources, nil
}