# Supadb 组件 RPC 支持优化
## 问题描述
之前的 supadb 组件在使用 RPC 调用时仍然要求 `collection` 参数不能为空,这是不合理的,因为:
1. RPC 函数可能不需要操作特定的数据表
2. RPC 函数可以是任意的数据库函数,不一定与某个表相关
3. 强制要求 collection 限制了 RPC 的使用场景
## 解决方案
### 1. 智能参数验证
```typescript
// 检查是否为 RPC 调用
const isRpcCall = props.rpc != null && props.rpc.length > 0;
// 只有在非 RPC 调用时才检查 collection
if (!isRpcCall && (props.collection == null || props.collection.trim() == '')) {
error.value = 'collection/table 不能为空';
loading.value = false;
return;
}
// RPC 调用时检查 rpc 参数
if (isRpcCall && (props.rpc == null || props.rpc.trim() == '')) {
error.value = 'rpc 函数名不能为空';
loading.value = false;
return;
}
```
### 2. 新增 params 属性
```typescript
// RPC 参数,用于传递给 RPC 函数的额外参数
params: {
type: UTSJSONObject,
default: () => ({})
}
```
### 3. 参数合并优先级
RPC 调用时,参数合并顺序:
1. **props.params** - 基础参数
2. **props.filter** - 过滤条件(可能覆盖同名参数)
3. **selectOptions** - 分页和排序参数
```typescript
// 首先添加props.params中的参数
if (props.params != null) {
// 添加 params 中的所有参数
}
// 然后添加filter中的参数(可能会覆盖params中的同名参数)
if (props.filter != null) {
// 添加 filter 中的所有参数
}
// 最后添加分页和排序参数
if (selectOptions.limit != null) rpcParams.set('limit', selectOptions.limit);
if (selectOptions.order != null) rpcParams.set('order', selectOptions.order);
// ...
```
## 使用示例
### 1. 纯 RPC 调用(无需 collection)
```vue
```
### 2. RPC 调用 + 过滤条件
```vue
```
### 3. 传统表查询(仍需 collection)
```vue
```
## 优势
### ✅ **灵活性提升**
- RPC 调用不再强制要求 collection 参数
- 支持任意 PostgreSQL 函数调用
- 参数传递更加灵活
### ✅ **向后兼容**
- 现有的表查询功能完全不受影响
- 现有的 RPC 调用代码无需修改
### ✅ **更好的参数管理**
- 新增 `params` 属性用于基础参数
- `filter` 属性专注于过滤条件
- 参数合并优先级清晰
### ✅ **错误处理改进**
- 针对不同使用场景提供准确的错误信息
- RPC 调用和表查询分别验证相关参数
## 影响的文件
- `h:\blews\akmon\components\supadb\supadb.uvue` - 主要组件文件
## 测试建议
1. **RPC 调用测试**
- 测试不带 collection 的纯 RPC 调用
- 测试带参数的 RPC 调用
- 测试参数合并优先级
2. **表查询测试**
- 确保现有的表查询功能正常
- 验证 collection 参数验证仍然有效
3. **错误处理测试**
- 测试缺少 rpc 参数时的错误提示
- 测试缺少 collection 参数时的错误提示
这个优化使得 supadb 组件更加灵活,能够更好地支持各种数据库操作场景。