字段联动
本章以“分类 → 子分类”为例。字典表和保存校验由业务工程实现,ApiTable 不会根据字段名自动推断联动关系。
手动创建字典表
CREATE TABLE IF NOT EXISTS app_dictionary (
id BIGINT PRIMARY KEY,
parent_id BIGINT,
code VARCHAR(64) NOT NULL,
label VARCHAR(100) NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
creator VARCHAR(64) NOT NULL DEFAULT '',
create_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) NOT NULL DEFAULT '',
update_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted SMALLINT NOT NULL DEFAULT 0,
tenant_id BIGINT NOT NULL DEFAULT 0
);
CREATE UNIQUE INDEX IF NOT EXISTS app_dictionary_active_code
ON app_dictionary (tenant_id, code) WHERE deleted = 0;
CREATE INDEX IF NOT EXISTS app_dictionary_parent
ON app_dictionary (tenant_id, parent_id, sort, id) WHERE deleted = 0;
这是 PostgreSQL 示例,parent_id 使用逻辑关联,没有外键。写入与删除时须校验父记录和引用关系。表前缀按项目替换,SQL 由用户手动执行。
前端状态流程
父项改变时先清空子项值和列表,再加载新子项。查询按当前租户、parent_id、deleted 过滤,并按 sort/id 排序。加载中禁用子项,只接收最后一次请求的响应,避免快速切换父项时旧响应覆盖新值。
编辑时先读取父项、加载子项,再恢复仍有效的子项值。字典失效时提示重新选择,不能默认为第一项。失败状态应支持重试,不能继续提交旧子项。
服务端再次校验
保存时验证子项存在、未删除、属于同一租户且 parent_id 等于当前父项。前端联动不提供数据库一致性或权限保证,必要时在事务中处理并发字典修改。
前端按所用 ApiTable 版本的表单扩展点连接上述状态逻辑,网络调用示例见 06.md。普通用户应使用限定范围的业务字典接口,不能暴露后台任意表查询。
