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

305 lines
6.8 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 (
"database/sql"
"fmt"
"dd_fiber_api/internal/admin_auth"
"dd_fiber_api/pkg/database"
"dd_fiber_api/pkg/snowflake"
"github.com/didi/gendry/builder"
)
// RoleDAO 角色数据访问对象
type RoleDAO struct {
client *database.MySQLClient
}
// NewRoleDAO 创建角色DAO
func NewRoleDAO(client *database.MySQLClient) *RoleDAO {
return &RoleDAO{
client: client,
}
}
// List 列出角色(支持分页和搜索)
func (d *RoleDAO) List(keyword string, page, pageSize int) ([]*admin_auth.AdminRole, int, error) {
table := "admin_roles"
// 构建查询条件
where := map[string]any{}
if keyword != "" {
where["_or"] = []map[string]any{
{"name like": "%" + keyword + "%"},
{"code like": "%" + keyword + "%"},
{"description like": "%" + keyword + "%"},
}
}
// 查询总数
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", "description", "status", "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 created_at DESC 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 roles []*admin_auth.AdminRole
for rows.Next() {
var role admin_auth.AdminRole
var description sql.NullString
err := rows.Scan(
&role.ID,
&role.Name,
&role.Code,
&description,
&role.Status,
&role.CreatedAt,
&role.UpdatedAt,
)
if err != nil {
continue
}
if description.Valid {
role.Description = description.String
}
roles = append(roles, &role)
}
return roles, total, nil
}
// GetByID 根据ID获取角色
func (d *RoleDAO) GetByID(id string) (*admin_auth.AdminRole, error) {
query := `SELECT id, name, code, description, status, created_at, updated_at
FROM admin_roles WHERE id = ?`
var role admin_auth.AdminRole
var description sql.NullString
err := d.client.DB.QueryRow(query, id).Scan(
&role.ID,
&role.Name,
&role.Code,
&description,
&role.Status,
&role.CreatedAt,
&role.UpdatedAt,
)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("查询角色失败: %v", err)
}
if description.Valid {
role.Description = description.String
}
return &role, nil
}
// GetByCode 根据代码获取角色
func (d *RoleDAO) GetByCode(code string) (*admin_auth.AdminRole, error) {
query := `SELECT id, name, code, description, status, created_at, updated_at
FROM admin_roles WHERE code = ?`
var role admin_auth.AdminRole
var description sql.NullString
err := d.client.DB.QueryRow(query, code).Scan(
&role.ID,
&role.Name,
&role.Code,
&description,
&role.Status,
&role.CreatedAt,
&role.UpdatedAt,
)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("查询角色失败: %v", err)
}
if description.Valid {
role.Description = description.String
}
return &role, nil
}
// Create 创建角色
func (d *RoleDAO) Create(role *admin_auth.AdminRole) error {
table := "admin_roles"
data := []map[string]any{
{
"id": role.ID,
"name": role.Name,
"code": role.Code,
"description": role.Description,
"status": role.Status,
},
}
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 *RoleDAO) Update(role *admin_auth.AdminRole) error {
table := "admin_roles"
where := map[string]any{
"id": role.ID,
}
data := map[string]any{
"name": role.Name,
"code": role.Code,
"description": role.Description,
"status": role.Status,
}
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 *RoleDAO) Delete(id string) error {
where := map[string]any{
"id": id,
}
data := map[string]any{
"status": 0, // 禁用状态
}
cond, vals, err := builder.BuildUpdate("admin_roles", 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
}
// GetRolePermissions 获取角色的权限列表
func (d *RoleDAO) GetRolePermissions(roleID string) ([]string, error) {
query := `SELECT permission_id FROM admin_role_permissions WHERE role_id = ?`
rows, err := d.client.DB.Query(query, roleID)
if err != nil {
return nil, fmt.Errorf("查询角色权限失败: %v", err)
}
defer rows.Close()
var permissionIDs []string
for rows.Next() {
var permissionID string
if err := rows.Scan(&permissionID); err != nil {
continue
}
permissionIDs = append(permissionIDs, permissionID)
}
return permissionIDs, nil
}
// SetRolePermissions 设置角色的权限
func (d *RoleDAO) SetRolePermissions(roleID string, permissionIDs []string) error {
// 先删除原有权限
deleteQuery := `DELETE FROM admin_role_permissions WHERE role_id = ?`
_, err := d.client.DB.Exec(deleteQuery, roleID)
if err != nil {
return fmt.Errorf("删除角色权限失败: %v", err)
}
// 插入新权限
if len(permissionIDs) > 0 {
table := "admin_role_permissions"
data := make([]map[string]any, 0, len(permissionIDs))
for _, permissionID := range permissionIDs {
// 生成关联ID
id, err := d.generateID()
if err != nil {
return fmt.Errorf("生成ID失败: %v", err)
}
data = append(data, map[string]any{
"id": id,
"role_id": roleID,
"permission_id": permissionID,
})
}
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
}
// generateID 生成ID使用雪花算法
func (d *RoleDAO) generateID() (string, error) {
return snowflake.GenerateID(), nil
}