1.6 KiB
1.6 KiB
本次后台表查询接入的可复用经验
需求落点
- 后台“总览”页的表统计仍保留,只把每张表的表名改成可点击跳转到
#tables?table=<name>。 - 新增独立
#tables页承载表选择、关键词搜索、JSON filters、limit、行详情弹窗。
后端实现要点
- 新增只读接口:
GET /admin/api/database/tablesGET /admin/api/database/tables/{table_name}/rows
- 表名必须来自 schema 白名单;再加一层 identifier 校验,避免任意 SQL 表名注入。
limit必须 clamp;本次实现使用默认 100、最大 500。search/filters不进入 SQL 字符串:- SQL 只负责
SELECT * FROM {table_name} LIMIT {limit} - 返回后在 api-server 内存中过滤
filters仅接受 JSON object,按列名匹配;非 object 直接 400
- SQL 只负责
- SpacetimeDB HTTP SQL 返回可能是 statement array + rows,解析时要兼容这一层结构。
前端实现要点
adminRoutes必须新增tables,AdminShell.routeIcons也要同步覆盖。AdminApp需要显式渲染AdminDatabaseTablesPage。- worktree 下可能没有本地
node_modules/typescript/bin/tsc,而根目录有依赖;在验证前可以临时把根目录node_modules软链到 worktree 再执行npm run admin-web:typecheck,验证后删除软链,避免污染 git 状态。
验证结果
cargo test -p api-server admin_database -- --nocapture通过。cargo fmt --manifest-path Cargo.toml -p api-server -p shared-contracts --check通过。npm run admin-web:typecheck通过。npm run admin-web:build通过。npm run check:encoding通过。