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 }