3.4 KiB
3.4 KiB
Supadb 组件 RPC 支持优化
问题描述
之前的 supadb 组件在使用 RPC 调用时仍然要求 collection 参数不能为空,这是不合理的,因为:
- RPC 函数可能不需要操作特定的数据表
- RPC 函数可以是任意的数据库函数,不一定与某个表相关
- 强制要求 collection 限制了 RPC 的使用场景
解决方案
1. 智能参数验证
// 检查是否为 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 属性
// RPC 参数,用于传递给 RPC 函数的额外参数
params: {
type: UTSJSONObject,
default: () => ({})
}
3. 参数合并优先级
RPC 调用时,参数合并顺序:
- props.params - 基础参数
- props.filter - 过滤条件(可能覆盖同名参数)
- selectOptions - 分页和排序参数
// 首先添加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)
<supadb
rpc="get_analytics_summary"
:params="{ teacher_id: 'abc123' }"
@process-data="handleData"
/>
2. RPC 调用 + 过滤条件
<supadb
rpc="get_student_performance"
:params="{ teacher_id: 'abc123' }"
:filter="{ start_date: '2023-01-01', end_date: '2023-12-31' }"
@process-data="handleData"
/>
3. 传统表查询(仍需 collection)
<supadb
collection="ak_training_records"
:filter="{ status: 'completed' }"
@process-data="handleData"
/>
优势
✅ 灵活性提升
- RPC 调用不再强制要求 collection 参数
- 支持任意 PostgreSQL 函数调用
- 参数传递更加灵活
✅ 向后兼容
- 现有的表查询功能完全不受影响
- 现有的 RPC 调用代码无需修改
✅ 更好的参数管理
- 新增
params属性用于基础参数 filter属性专注于过滤条件- 参数合并优先级清晰
✅ 错误处理改进
- 针对不同使用场景提供准确的错误信息
- RPC 调用和表查询分别验证相关参数
影响的文件
h:\blews\akmon\components\supadb\supadb.uvue- 主要组件文件
测试建议
-
RPC 调用测试
- 测试不带 collection 的纯 RPC 调用
- 测试带参数的 RPC 调用
- 测试参数合并优先级
-
表查询测试
- 确保现有的表查询功能正常
- 验证 collection 参数验证仍然有效
-
错误处理测试
- 测试缺少 rpc 参数时的错误提示
- 测试缺少 collection 参数时的错误提示
这个优化使得 supadb 组件更加灵活,能够更好地支持各种数据库操作场景。