305 lines
6.8 KiB
Go
305 lines
6.8 KiB
Go
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
|
||
}
|
||
|