264 lines
6.2 KiB
Go
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
|
|
}
|
|
|