@lark-base-open/base-database-cli 1.1.1 → 1.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -0
- package/LICENSE +6 -0
- package/README.md +47 -27
- package/dist/ai-functions.d.ts +53 -0
- package/dist/ai-functions.d.ts.map +1 -0
- package/dist/ai-functions.js +436 -0
- package/dist/ai-functions.js.map +1 -0
- package/dist/archive.d.ts +21 -0
- package/dist/archive.d.ts.map +1 -1
- package/dist/archive.js +69 -10
- package/dist/archive.js.map +1 -1
- package/dist/auth.d.ts +5 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +26 -3
- package/dist/auth.js.map +1 -1
- package/dist/check.d.ts +74 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +283 -0
- package/dist/check.js.map +1 -0
- package/dist/dependency-policy.d.ts +10 -0
- package/dist/dependency-policy.d.ts.map +1 -0
- package/dist/dependency-policy.js +162 -0
- package/dist/dependency-policy.js.map +1 -0
- package/dist/deploy.d.ts +5 -0
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +141 -176
- package/dist/deploy.js.map +1 -1
- package/dist/environment-variables.d.ts +52 -0
- package/dist/environment-variables.d.ts.map +1 -0
- package/dist/environment-variables.js +563 -0
- package/dist/environment-variables.js.map +1 -0
- package/dist/environment.d.ts +1 -1
- package/dist/environment.js +1 -1
- package/dist/environment.js.map +1 -1
- package/dist/function-input-types.d.ts +10 -0
- package/dist/function-input-types.d.ts.map +1 -0
- package/dist/function-input-types.js +160 -0
- package/dist/function-input-types.js.map +1 -0
- package/dist/function-schema.d.ts.map +1 -1
- package/dist/function-schema.js +89 -36
- package/dist/function-schema.js.map +1 -1
- package/dist/init-field-retry.d.ts +17 -0
- package/dist/init-field-retry.d.ts.map +1 -0
- package/dist/init-field-retry.js +127 -0
- package/dist/init-field-retry.js.map +1 -0
- package/dist/init-journal.d.ts +98 -0
- package/dist/init-journal.d.ts.map +1 -0
- package/dist/init-journal.js +492 -0
- package/dist/init-journal.js.map +1 -0
- package/dist/init-schema.d.ts +8 -0
- package/dist/init-schema.d.ts.map +1 -0
- package/dist/init-schema.js +423 -0
- package/dist/init-schema.js.map +1 -0
- package/dist/init.d.ts +15 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +884 -261
- package/dist/init.js.map +1 -1
- package/dist/lark-cli-error.d.ts +47 -0
- package/dist/lark-cli-error.d.ts.map +1 -0
- package/dist/lark-cli-error.js +201 -0
- package/dist/lark-cli-error.js.map +1 -0
- package/dist/lark-cli.d.ts +1 -1
- package/dist/lark-cli.d.ts.map +1 -1
- package/dist/lark-cli.js +78 -18
- package/dist/lark-cli.js.map +1 -1
- package/dist/mutation-schema.d.ts +146 -0
- package/dist/mutation-schema.d.ts.map +1 -0
- package/dist/mutation-schema.js +153 -0
- package/dist/mutation-schema.js.map +1 -0
- package/dist/mutation.d.ts +10 -0
- package/dist/mutation.d.ts.map +1 -0
- package/dist/mutation.js +131 -0
- package/dist/mutation.js.map +1 -0
- package/dist/npm.d.ts +1 -0
- package/dist/npm.d.ts.map +1 -1
- package/dist/npm.js +2 -2
- package/dist/npm.js.map +1 -1
- package/dist/preview-receipt.d.ts.map +1 -1
- package/dist/preview-receipt.js +15 -5
- package/dist/preview-receipt.js.map +1 -1
- package/dist/process.d.ts +3 -1
- package/dist/process.d.ts.map +1 -1
- package/dist/process.js +16 -4
- package/dist/process.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +246 -42
- package/dist/program.js.map +1 -1
- package/dist/project-build.d.ts +25 -0
- package/dist/project-build.d.ts.map +1 -0
- package/dist/project-build.js +229 -0
- package/dist/project-build.js.map +1 -0
- package/dist/project-context.d.ts +344 -0
- package/dist/project-context.d.ts.map +1 -0
- package/dist/project-context.js +485 -0
- package/dist/project-context.js.map +1 -0
- package/dist/project-layout.d.ts +5 -0
- package/dist/project-layout.d.ts.map +1 -0
- package/dist/project-layout.js +24 -0
- package/dist/project-layout.js.map +1 -0
- package/dist/public-sql-error.d.ts +25 -0
- package/dist/public-sql-error.d.ts.map +1 -0
- package/dist/public-sql-error.js +65 -0
- package/dist/public-sql-error.js.map +1 -0
- package/dist/pull.d.ts +1 -0
- package/dist/pull.d.ts.map +1 -1
- package/dist/pull.js +67 -15
- package/dist/pull.js.map +1 -1
- package/dist/site-readme.d.ts +3 -0
- package/dist/site-readme.d.ts.map +1 -0
- package/dist/site-readme.js +83 -0
- package/dist/site-readme.js.map +1 -0
- package/dist/workspace-fingerprint.d.ts +21 -1
- package/dist/workspace-fingerprint.d.ts.map +1 -1
- package/dist/workspace-fingerprint.js +81 -2
- package/dist/workspace-fingerprint.js.map +1 -1
- package/package.json +2 -1
- package/skills/lark-base-database/SKILL.md +86 -52
- package/skills/lark-base-database/references/ai-function.md +479 -0
- package/skills/lark-base-database/references/base-capability-routing.md +7 -7
- package/skills/lark-base-database/references/base-sql-errors.generated.md +403 -0
- package/skills/lark-base-database/references/database-function-limitations.md +29 -0
- package/skills/lark-base-database/references/database-function.md +323 -0
- package/skills/lark-base-database/references/development.md +166 -33
- package/skills/lark-base-database/references/environment-variables.md +55 -0
- package/skills/lark-base-database/references/faas.md +46 -53
- package/skills/lark-base-database/references/file-transfer.md +25 -25
- package/skills/lark-base-database/references/frontend-design-guide.md +151 -65
- package/skills/lark-base-database/references/mutations.md +295 -0
- package/skills/lark-base-database/references/notifications.md +9 -9
- package/skills/lark-base-database/references/permission-design.md +24 -24
- package/skills/lark-base-database/references/release.md +57 -30
- package/skills/lark-base-database/references/style-guide.md +10 -67
- package/skills/lark-base-database/references/verification.md +19 -13
- package/skills/lark-base-database/references/workspace.md +57 -17
- package/templates/database-starter/README.md +34 -4
- package/templates/database-starter/database-functions/README.md +8 -0
- package/templates/database-starter/gitignore +7 -0
- package/templates/database-starter/mutations/README.md +19 -0
- package/templates/database-starter/page/README.md +25 -19
- package/templates/database-starter/page/package-lock.json +8 -16
- package/templates/database-starter/page/package.json +2 -3
- package/templates/database-starter/page/src/App.tsx +23 -3
- package/templates/database-starter/page/src/components/UserSelectorEditor/index.tsx +32 -4
- package/templates/database-starter/page/src/components/UserSelectorPanel/index.tsx +104 -34
- package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.test.ts +55 -11
- package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.ts +68 -25
- package/templates/database-starter/page/src/components/database-runtime-ready.tsx +1 -1
- package/templates/database-starter/page/src/components/database-user-menu/index.tsx +4 -7
- package/templates/database-starter/page/src/components/feedback/page-state.tsx +40 -5
- package/templates/database-starter/page/src/components/floating-button/assets/edit-active.svg +3 -0
- package/templates/database-starter/page/src/components/floating-button/assets/edit-default.svg +3 -0
- package/templates/database-starter/page/src/components/floating-button/assets/toast-close.svg +3 -0
- package/templates/database-starter/page/src/components/floating-button/assets/toast-info.svg +5 -0
- package/templates/database-starter/page/src/components/floating-button/assets/tooltip-caret.svg +3 -0
- package/templates/database-starter/page/src/components/floating-button/index.tsx +193 -113
- package/templates/database-starter/page/src/components/floating-button/utils/project-meta.test.ts +107 -37
- package/templates/database-starter/page/src/components/floating-button/utils/project-meta.ts +13 -50
- package/templates/database-starter/page/src/components/ui-language.test.tsx +101 -0
- package/templates/database-starter/page/src/examples/ai-function/ImageTaskOperation.tsx +202 -0
- package/templates/database-starter/page/src/examples/ai-function/README.md +14 -0
- package/templates/database-starter/page/src/examples/ai-function/TextStreamOperation.tsx +184 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-copy.ts +173 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-delta.test.ts +30 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-delta.ts +26 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-language.test.tsx +86 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-media-panel.test.ts +201 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-media-panel.tsx +382 -0
- package/templates/database-starter/page/src/lib/attachment-image.tsx +144 -0
- package/templates/database-starter/page/src/lib/database-function-inputs.generated.ts +4 -0
- package/templates/database-starter/page/src/lib/database-runtime-attachment.test.ts +180 -76
- package/templates/database-starter/page/src/lib/database-runtime.test.ts +130 -10
- package/templates/database-starter/page/src/lib/database-runtime.ts +484 -51
- package/templates/database-starter/page/src/lib/date-time.ts +61 -0
- package/templates/database-starter/page/src/lib/ui-language.ts +86 -0
- package/templates/database-starter/page/src/main.tsx +1 -1
- package/templates/database-starter/page/tsconfig.json +2 -2
- package/templates/database-starter/page/vite.config.ts +1 -2
- package/templates/database-starter/prettierignore +1 -1
- package/templates/database-starter/server-functions/README.md +2 -2
- package/templates/database-starter/server-functions/package-lock.json +4 -4
- package/templates/database-starter/server-functions/package.json +1 -1
- package/dist/agent-guide.d.ts +0 -19
- package/dist/agent-guide.d.ts.map +0 -1
- package/dist/agent-guide.js +0 -31
- package/dist/agent-guide.js.map +0 -1
- package/dist/database-skill.d.ts +0 -24
- package/dist/database-skill.d.ts.map +0 -1
- package/dist/database-skill.js +0 -148
- package/dist/database-skill.js.map +0 -1
- package/skills/lark-base-database/references/base-sql-unsupported.md +0 -42
- package/skills/lark-base-database/references/database-capability-skill.md +0 -40
- package/skills/lark-base-database/references/sql-function.md +0 -289
- package/templates/database-capability/SKILL.md.tmpl +0 -58
- package/templates/database-starter/page/src/components/floating-button/chatbot-entry.test.ts +0 -23
- package/templates/database-starter/page/src/components/floating-button/chatbot-entry.tsx +0 -873
- package/templates/database-starter/page/src/components/floating-button/local-chat-panel.test.ts +0 -25
- package/templates/database-starter/page/src/components/floating-button/local-chat-panel.tsx +0 -197
- package/templates/database-starter/page/src/components/floating-button/utils/env.ts +0 -18
- package/templates/database-starter/sql/README.md +0 -8
|
@@ -1,97 +1,183 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 前端设计指南
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
用于首次实现页面、视觉改版和设计评审。本文件包含所需设计规则,无需继续读取其他设计文档或组件参考源码。目标是让页面任务清楚、比例协调、控件精致,并通过复用减少搭建工作。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 1. 按任务范围设计
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
用户明确要求、正式品牌及现有应用规范优先;starter 占位页、组件库演示页、本轮刚生成的样式和未处理的库默认外观都不算应用规范。使用主流程已经取得的目标、内容、数据模式和工程约束;设计环节不增加需求问答、风格确认或业务规则。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
- 新建或整体改版:确定页面主次、主题、字体和控件基准,直接落实到共享样式及组件。
|
|
10
|
+
- 新增页面:复用应用规范,只决定新页面的内容组织。局部修改只处理受影响的布局或变体;纯数据逻辑修改不触发设计工作。
|
|
11
|
+
- 只实现当前用到的组件和状态。默认不额外创建设计文档、token 清单或选择报告,不为应用预建完整组件库。
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
2. **排版**:确定标题、正文、辅助文字的字号、字重、行高与数字格式。
|
|
13
|
-
3. **布局与密度**:高频列表与工作台优先信息效率,表单与登记页优先阅读和输入空间;相同任务采用一致密度。
|
|
14
|
-
4. **业务辨识度**:用业务内容、导航结构、品牌色或关键状态表达建立特征。需要视觉强调时集中在少数位置,不让装饰占用核心操作区域。
|
|
15
|
-
5. **交互与动效**:确定控件状态、焦点、过渡时长和响应式策略,落实为可复用组件与设计变量。
|
|
13
|
+
## 2. 先组织内容,再决定装饰
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
根据当前页面的主要任务分配注意力和空间,不按行业名称套模板:
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
| 页面任务 | 优先组织 |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| 业务操作 | 当前对象、必要输入、列表/表格/日历和下一步;统计与说明作辅助 |
|
|
20
|
+
| 数据分析 | 关键读数、趋势与比较、异常及必要明细;范围与单位清楚 |
|
|
21
|
+
| 内容展示 | 品牌、素材和阅读顺序;按内容形成画廊、目录或连续叙事 |
|
|
22
|
+
| 活动参与 | 活动对象、参与路径和当前资格;次数、库存、结果状态与数据模式一致,不能参与、提交中、未知结果、已到账分别表达 |
|
|
23
|
+
| 成果叙事 | 每段有当前数据支持,示例成果不冒充真实业绩;节奏服务叙事,滚动后内容不消失 |
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
同一应用可包含不同页面。混合或模糊任务按已知内容组织,保持共用视觉语言,不新增分类问答。不同任务的结构差异来自内容,不靠随机换色或固定“四个 KPI + 两张图”制造设计。
|
|
26
|
+
|
|
27
|
+
业务系统的美感优先来自对齐、文字层级、合适的信息密度和稳定的操作位置。列表、日历、输入等工作区应占据主要空间;普通统计用紧凑摘要,需要处理的异常才局部突出。避免大摘要卡、多行说明和高工具栏把核心内容挤到首屏之外。
|
|
28
|
+
|
|
29
|
+
下面是内容顺序的起点,只使用任务实际需要的部分:
|
|
30
|
+
|
|
31
|
+
| 具体页面 | 建议组织 |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| 列表、台账 | 页头与新增动作 → 搜索/筛选 → 记录与行操作 → 分页;批量动作在选中后突出 |
|
|
34
|
+
| 编辑、设置 | 标题 → 按含义分组的字段 → 保存/取消;短字段有真实关联时并排,长输入独占一行 |
|
|
35
|
+
| 排班、计划 | 紧凑摘要 → 范围与筛选 → 日历/人员网格;避免两排高指标卡把日历推到首屏之外 |
|
|
36
|
+
| 创作、快速记录 | 必要对象选择与输入 → 提交 → 可辨产物;快捷示例用轻量文字行,不逐条套大卡片 |
|
|
37
|
+
| 看板、报告 | 看板便于扫描和比较;报告按结论与证据连续阅读,不因有数字就补齐筛选器与指标卡 |
|
|
38
|
+
|
|
39
|
+
### 页面默认直接排版,卡片按用途添加
|
|
40
|
+
|
|
41
|
+
**普通业务页从“一个页面背景 + 透明布局容器”开始。** 列表、编辑、设置、详情、排班与创作页的页头、筛选、字段组、工具栏直接排在页面上;不包整页卡片,也不把每个区块分别包成卡片。页面可直接用白色或协调的浅色背景,不必先铺灰底再垫白板。
|
|
42
|
+
|
|
43
|
+
- `main`、`section`、Grid/Flex 容器负责宽度、间距与对齐,默认不带卡片底色、圆角、外框或投影。不要把 `Card` 当通用布局组件。白色圆角底板即使无边框、无阴影,也仍是卡片。
|
|
44
|
+
- 卡片只用于确实需要独立边界的内容单元,例如可整体选择的方案、可预览的作品,或需与相邻内容区分的分析模块。**有标题、属于一个分组、包含按钮或需要留白,都不足以成为加卡片的理由。** Dashboard 也不自动给每个模块套卡片。
|
|
45
|
+
- 加卡片前判断:去掉底板后,对象边界、选择关系或阅读是否真的变得不清楚?留白、对齐、局部分隔已能表达时直接排版。这个判断在实现时完成,不输出额外设计报告。
|
|
46
|
+
- 输入框、表格/日历网格、菜单、弹窗和抽屉保留自身必要表面与边界;它们的存在不要求外面再包一层卡片。确需使用的普通内容卡默认无描边、无投影,避免同一内容重复套壳。
|
|
47
|
+
- 新建时替换 starter 的占位外壳;其中 `max-w-2xl rounded-3xl border bg-card … shadow-sm` 等示例组合不作为页面模板沿用。检查已有页面时,删除多余外壳的表面样式及重复内边距,保留必要布局;仅调淡灰边或去掉阴影不算去掉底板。
|
|
48
|
+
|
|
49
|
+
例如“一个输入区 + 三条快捷示例”:页面下直接排两列,输入保留自己的边界,示例使用文字行与 hover/focus 反馈。不要形成“灰色页面 → 白色大面板 → 输入区卡片 / 示例卡片”的层级。
|
|
50
|
+
|
|
51
|
+
页头、工具栏和内容共用对齐线,靠面积、字体和间距突出主任务。同排同级、同结构卡片统一列宽、内边距和高度,并对齐标题、数值及动作;用共享槽位处理长标题,不逐卡补 margin 或空话。间距以 4px 基数、8px 节奏为起点,组内小于组间;窄屏堆叠后释放无用留白。图片保持可辨比例,缺图用紧凑回退,不以巨大色块或 emoji 冒充素材;品牌图片、字体或特效加载失败时页面仍可理解与操作。
|
|
52
|
+
|
|
53
|
+
### 页面尺寸与组件空间不足时的处理
|
|
54
|
+
|
|
55
|
+
表格、日历和工作台利用扣除导航与边距后的可用宽度;长文、单列表单和专注输入区可局部限宽。检查根节点和父容器的固定宽度、嵌套 `max-width` 与大 padding,避免全屏只铺背景、内容始终挤在中间。
|
|
56
|
+
|
|
57
|
+
宽屏增加有效列宽、比较空间或合适列数,不等比放大所有控件。**所有区域按自身可用宽度适配**,包括页头、导航、工具栏、表单、卡片、表格、日历和弹层;扣除侧栏、相邻区域及内边距后放不下,就需要重排。宽屏里的窄面板、长文本、项目增多和文字放大也会触发拥挤,不能只处理手机断点。
|
|
58
|
+
|
|
59
|
+
常规桌面页边距可从 24–32px、窄屏 16px 起;控件组间距约 8px、字段组 16px、区块 24–32px。沿用工程断点,必要时依据容器宽度调整。侧栏后的主区可用 `flex: 1; min-width: 0`,网格用流式轨道;不要用 `100vw` 绕过侧栏和宿主宽度。
|
|
60
|
+
|
|
61
|
+
先分清哪些内容可收缩、可换行、必须保留可读尺寸。长标题和说明自然换行;图标与短操作标签不被挤成逐字竖排。`min-width: 0` 用于可收缩内容,`nowrap` / `flex-shrink: 0` 只用于需保持完整的局部元素,并给父容器提供换行或折叠方案,不全局套用。文本换行后容器随内容增高;不用缩小字号、固定高度或 `overflow: hidden` 掩盖溢出。次要长文本需要省略时提供可达的完整查看方式,关键金额、日期和操作保持可读。
|
|
62
|
+
|
|
63
|
+
| 区域 | 空间不足时 |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| 页头、导航 | 限制品牌与账号区占宽,去掉无用副标题、装饰徽标;导航独占一行或收进菜单,保留当前页标识与所有入口 |
|
|
66
|
+
| 工具栏、筛选、操作组 | 整组换行或堆叠,输入保留可用宽度;主动作可达,次要动作可收进“更多”,筛选条件折叠后仍有状态提示与展开入口 |
|
|
67
|
+
| 表单、卡片、详情 | 减少列数,空间不足时改单列;长字段标签可换行。并排同结构内容用共享槽位对齐,堆叠后按内容自然增高 |
|
|
68
|
+
| 表格、日历、弹层 | 必须保持二维关系时只在所属区域滚动,不挤扁单元内容;弹层受可用宽高限制,长内容内部滚动,关闭和提交动作始终可达 |
|
|
69
|
+
|
|
70
|
+
响应式处理后不得出现文字重叠、单字竖排、不可达操作或整页意外横向滚动;折叠的业务内容和操作保留可达入口。
|
|
71
|
+
|
|
72
|
+
## 3. 共用配色与字体
|
|
73
|
+
|
|
74
|
+
已有规范可用就直接继承。缺少规范时,自主选定一套实际值,写入现有主题、CSS 类或组件变体并在页面调用;不逐页重新取值。
|
|
75
|
+
|
|
76
|
+
**配色按角色分工**:业务界面以协调的中性面为主体,选择一个主动作色及其前景;错误、警告、成功使用独立语义色。没有品牌色时按产品内容选色,颜色不与 A/B/C 配方绑定。普通指标不一项一种颜色,状态色只标记相关状态或异常,不顺带染满整张卡片;图表需要分类色时保持映射与图例一致。默认浅色,已有主题或明确需求支持暗色时沿用,不为单主题任务新增切换器。
|
|
77
|
+
|
|
78
|
+
常规业务控件与摘要使用平面样式,不叠加彩色渐变、彩边、投影、光晕和图标底板。图标默认跟随文字或当前状态,不逐项配彩色方块;渐变只在明确的品牌素材或内容表达中局部使用。主动作、真实异常和普通统计有不同强调程度,避免同屏多个高饱和实底按钮争夺注意力。
|
|
79
|
+
|
|
80
|
+
主次文字在实际背景上均须清楚,浅色标签配清楚的深色文字,亮色按钮不默认配白字。历史、已完成记录仍保留必要可读性,不给整行或整张日历统一降低 opacity。hover、轻量选中面从现有主题派生;把颜色映射到工程的页面/内容/浮层、文字、`input`、`ring` 等角色,Portal 也继承主题。例如选定紫色主动作色后,菜单和选中日期沿用同一色,不为弹层另配一套颜色。主题变量若保存的是 HSL 片段,先拼成完整颜色再赋给组件;弹层经 Portal 挂到 `body` 时,把同一组变量映射到 Portal 根节点,否则弹层会丢失主题。
|
|
81
|
+
|
|
82
|
+
**字体**:沿用工程可用字体;无品牌字体时采用系统字体栈。下面是常规中文业务页的起点,选定后统一使用,品牌展示可调整整组比例:
|
|
83
|
+
|
|
84
|
+
| 角色 | 字号/行高 | 字重 |
|
|
22
85
|
| --- | --- | --- |
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
86
|
+
| 页面标题 | 24/32px | 600 |
|
|
87
|
+
| 区块标题 | 16/24px | 600 |
|
|
88
|
+
| 正文、列表值 | 14/22px | 400 |
|
|
89
|
+
| 标签、表头 | 14/20px | 500 |
|
|
90
|
+
| 辅助文字 | 12/18px | 400 |
|
|
91
|
+
| 指标数值 | 28/36px | 600 |
|
|
29
92
|
|
|
30
|
-
|
|
93
|
+
字重使用字体实际支持的值。正文和必要说明保持对比度,不把所有次要文字降为极浅灰;中文强调不用默认斜体或负字距。数字与单位靠近并对齐,需要比较的数值用 `tabular-nums`,表格数值右对齐。长内容通过换行或布局处理,不逐条缩字。
|
|
31
94
|
|
|
32
|
-
|
|
95
|
+
页面标题与正文同属一套字体,标签和正文可以同字号,通过位置、字重和间距区分。品牌首屏或报告封面可单独扩展较大的标题角色,局部使用,不放大全站导航和控件。长中文标题保留足够行高;数字单位以正文级字号紧邻数值,不靠空格手工对齐。只使用当前可用字体,不为普通工具页增加字体下载步骤。
|
|
33
96
|
|
|
34
|
-
|
|
97
|
+
## 4. 控件采用一套基准
|
|
35
98
|
|
|
36
|
-
|
|
99
|
+
优先复用工程中可靠的组件及主题接口。新建基准时按任务选择下表;目标不明确用 A。应用内保持一个基础配方,必要时增加紧凑/触控尺寸变体,不逐页换配方。
|
|
100
|
+
|
|
101
|
+
| 规格 | A 常规 | B 密集操作 | C 舒展输入 |
|
|
37
102
|
| --- | --- | --- | --- |
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
103
|
+
| 适用 | 常规表单、列表 | 连续处理记录、多筛选、排班 | 少字段、需要较大输入空间 |
|
|
104
|
+
| 单行最小高度 | 36px | 32px | 40px |
|
|
105
|
+
| 控件字号/行高 | 14/20px | 13/20px | 14/20px |
|
|
106
|
+
| 水平内边距 | 12px | 10px | 14px |
|
|
107
|
+
| 圆角 | 6px | 4px | 10px |
|
|
108
|
+
| 输入常态 | 干净表面、1px 轻描边 | 轻填充、透明边框占位 | 轻填充、透明边框占位 |
|
|
109
|
+
|
|
110
|
+
表中数值是起点,调整时保持整组比例。按钮字重 500、输入值 400;常规图标从 16px 起,图文间距 6px。B 的 13px 只用于密集控件,不把全站正文同步缩小;触控命中区通常至少 44×44px,可扩展命中范围。
|
|
111
|
+
|
|
112
|
+
- 一个操作组突出当前主动作:主题实底主按钮、轻填充次按钮、透明文字按钮。多个并列动作按当前任务分主次,不给每个动作分配一种鲜艳实底色;危险色仅表示真实危险,发布、生成等普通动作不借用警告色。清空和取消保持较轻层级。
|
|
113
|
+
- **普通按钮和输入默认无投影**,避免灰底、灰边、阴影叠加。输入表面干净、边界可辨,浮层可用必要轻投影。
|
|
114
|
+
- 同密度按钮、输入和选择触发器等高;图标、前后缀与文字分槽对齐。状态变化不改变几何占位或让相邻内容跳动。
|
|
115
|
+
- 普通输入聚焦在原位置用单层细边界表达,通常从 1px 变色开始;不叠加 border、outline 与 ring。组合输入由一个外壳画边界,内部按钮仍有可辨的键盘位置。不得全局移除焦点样式。
|
|
116
|
+
|
|
117
|
+
采用 `border-box`,透明边框也保留占位;尺寸以最小高度处理,长按钮文字调整操作组或换行,不硬裁。主按钮 hover 轻微改变原有色,次按钮用浅填充与清楚文字,文字按钮保留稳定命中区;不在 hover 时加大字重、描边或阴影。图标按钮居中并提供可访问名称;金额、步进等组合输入由一个外壳容纳前后缀和按钮,不在内部重复画框。
|
|
43
118
|
|
|
44
|
-
|
|
45
|
-
- 中文强调使用字重,不默认使用斜体或负字距。金额、编号和统计数字使用 `font-variant-numeric: tabular-nums`。
|
|
46
|
-
- 默认系统字体栈;特殊字体经允许的依赖或资源打包进入产物,仅加载所需字重,不引入运行时外链字体 CDN。
|
|
47
|
-
- 间距以 4px 基数和 8px 节奏组织;组间距大于组内间距。表格行高可从紧凑 40px、常规 48px、舒展 56px 选择,相同场景一致。
|
|
119
|
+
选中、展开和焦点分别表达:已有值不代表持续聚焦,选中项可用轻填充与勾选;键盘移动项有自己的位置提示。loading 时保留按钮宽度并阻止重复提交;disabled 保留标签可读性,不响应操作。清理默认样式应在共享组件内完成,避免每个页面追加一组覆盖类。
|
|
48
120
|
|
|
49
|
-
##
|
|
121
|
+
## 5. 展开面板也是组件的一部分
|
|
50
122
|
|
|
51
|
-
|
|
52
|
-
- 空值表达一致,例如“-”;长内容截断时提供键盘和触屏可用的完整查看方式,不仅依赖 hover。
|
|
53
|
-
- 行分隔使用细线或斑马纹,避免冗余边框;列表同时设计加载、空、失败、部分数据和无权限状态。
|
|
54
|
-
- 表单标签明确且与控件关联,占位符只提供示例。必填与错误提示一致,提交失败定位首个错误字段。
|
|
55
|
-
- 主按钮、次按钮与文字按钮层级清晰,同一操作区域突出一个主要动作;危险动作写明对象和后果,不作为默认焦点。
|
|
56
|
-
- 提交期间阻止重复操作;成功反馈对应真实业务结果,部分成功明确哪些操作需要继续处理。
|
|
123
|
+
下拉、日期、时间与菜单须同时处理触发器和展开面板,面板、选项及选中/禁用/焦点状态继承当前主题,Portal 也不能丢失配色。
|
|
57
124
|
|
|
58
|
-
|
|
125
|
+
**本地、mock、不发布和省开发时间都不能成为使用未经设计的系统弹层的理由。** 除用户明确要求或平台硬约束外,不用浏览器原生 `select`、日期/时间弹层作为可见选择界面。先复用现有可主题化组件;缺失时按工程依赖规则采用成熟实现,不为统一外观重写完整日历、定位或焦点管理内核。补充组件时优先选择与现有 React、Tailwind、CVA 兼容的无头原语或轻量实现(如 Popover、Listbox、日历类组件),不引入第二套完整组件库或另一套 CSS 体系;只加当前用到的组件。默认组件栈与 starter 一致:Radix 无头原语(`@radix-ui/react-popover`、`@radix-ui/react-select`)负责弹层、定位与焦点,`react-day-picker` 负责日历;把工程主题变量映射到这些组件的 className,不为它们另写一套颜色。
|
|
59
126
|
|
|
60
|
-
|
|
127
|
+
| 组件 | 当前用到时保留 |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| 下拉、多选 | 当前值、选项层级、选中与禁用、必要的搜索/清空;长列表局部滚动,长标签不撑破布局 |
|
|
130
|
+
| 日期、时间 | 清楚的值格式、切换、选中与必要禁用状态;边界、精度、时段来自业务,遵循主流程日期协议 |
|
|
131
|
+
| 菜单、弹窗、抽屉 | 正确定位、关闭与焦点恢复;面板不越出视口,模态交互保留焦点约束 |
|
|
61
132
|
|
|
62
|
-
|
|
63
|
-
- 下拉、菜单、弹窗、Tooltip 等优先复用 starter 的组件模式,按需使用 Radix 无头原语、Tailwind token 与 CVA 变体。日期选择可使用 react-day-picker 配 Popover,不手写复杂日历或定位内核。
|
|
64
|
-
- 移动端原生日期选择器等有明确体验收益时可以保留;同类使用场景保持一致。不要为视觉统一损害键盘或触屏体验。
|
|
65
|
-
- 修改既有项目沿用组件库和主题;新建默认不为单个控件引入第二套完整组件库。确需替换时统一全站主题和设计变量。
|
|
66
|
-
- 图标沿用 starter 的 lucide-react 线性风格,不混用不一致的图标库与 emoji。
|
|
133
|
+
### 面板的具体起点
|
|
67
134
|
|
|
68
|
-
|
|
135
|
+
下面的参数用于缺少现成规范时,映射到成熟组件的样式接口,不要求新建实现:
|
|
69
136
|
|
|
70
|
-
|
|
137
|
+
- **下拉与操作菜单**:触发器与输入同高;面板与触发器保持约 4–8px 间距,内边距 4–6px,选项高度从 32–36px 起。单选面板通常不窄于触发器,操作菜单按内容确定宽度;长列表局部滚动并受视口约束。hover 用轻填充,选中可加勾选,禁用项不能点击;空结果给简短提示,不展示虚构选项。
|
|
138
|
+
- **搜索多选**:选项状态与触发器中的值同步;长值可摘要为“已选 N 项”并提供可达的查看/移除入口,不无限增加触发器高度。搜索无匹配与没有任何选项分别表达,清空遵循业务允许的行为。
|
|
139
|
+
- **日期与时间**:单月日历可从约 304–336px 宽、日期格 32–36px 高起,星期与日期七列对齐,月份和前后月操作同排。今天、选中、键盘位置和禁用分别表达;今天不能覆盖选中状态。月份切换、选择和清空真实更新值,范围选择按业务需要采用成熟范围组件。日期值的解析、时区和提交格式遵循[日期与时区](development.md#日期与时区)。固定时段用同主题列表,自由时间输入沿用业务精度,不擅自改成预设时段。
|
|
140
|
+
- **弹窗与抽屉**:标题、内容和动作有共同边距,常规内边距可从 20–24px 起;高度限制在视口内,长内容内部滚动,动作可达。紧凑确认窗不套整页表单宽度,抽屉按详情内容分配宽度;窄屏保留边距或使用合适的全屏变体。
|
|
71
141
|
|
|
72
|
-
|
|
142
|
+
保留成熟组件的键盘和触屏行为。面板内搜索融入面板,不额外画输入框;点击搜索时不新增矩形框、底线或整行填充。鼠标展开默认不自动聚焦搜索;键盘进入仍有局部可辨的焦点提示。
|
|
73
143
|
|
|
74
|
-
|
|
144
|
+
键盘可打开并移动选项、确认选择、用 Escape 关闭,关闭后焦点合理返回;日期支持跨月导航。鼠标点击搜索用插入光标表达位置,键盘进入可用搜索图标旁的短标记提示,不全局删除 `focus-visible`。状态不能仅靠颜色;浮层渲染到页面外时也必须继承主题。
|
|
75
145
|
|
|
76
|
-
|
|
77
|
-
- 窄屏重新组织网格和导航;宽表放入独立横向滚动区域,页面整体不溢出。
|
|
78
|
-
- 触控目标默认至少 44×44px;固定控件考虑安全区,hover 有触屏替代反馈。
|
|
79
|
-
- 桌面高频业务保持信息密度,移动端保证核心任务可完成;不能仅缩小桌面页面。
|
|
80
|
-
- 工具页面动效用于反馈和状态过渡,默认 150–250ms;表达页才按内容需要增加入场编排。统一缓动并尊重 prefers-reduced-motion。
|
|
146
|
+
Textarea 设置 `resize: none`,隐藏右下角拖拽斜线;随内容增高至合理上限后内部滚动,预填、粘贴和窄屏换行后仍能编辑完整内容。
|
|
81
147
|
|
|
82
|
-
|
|
148
|
+
字段有明确标签,placeholder 只给示例。错误恢复后去掉相应错误,正常字段不补“已填写”、成功勾选或空帮助行;真实保存与校验结果区别表达。按任务处理加载、空、失败、禁用和提交状态,失败保留输入,提交防重复,不增加假等待或假成功。筛选、分页与切换实际改变内容,数值限制由业务提供。
|
|
83
149
|
|
|
84
|
-
|
|
150
|
+
复选、单选、开关、分段、标签、分页与进度沿用同一文字、颜色和状态规则,不强行使用按钮高度。分段选中用轻底色或底部指示,标签表示状态或筛选条件,不能让每个状态都像按钮;移除动作可辨。进度只在有实际分母时显示,分页反映真实页码与可用动作。
|
|
85
151
|
|
|
86
|
-
|
|
152
|
+
## 6. 文案、身份与内容
|
|
153
|
+
|
|
154
|
+
页面头默认只放标题、必要范围和动作。只有缺少文字会影响当前选择、输入、读数或后果理解,且标题、控件、图例尚未表达时,才就近补充说明;不要把功能清单搬成副标题。
|
|
155
|
+
|
|
156
|
+
- 删除“查看各门店班次分布,点击班次查看详情”等操作复述;图例和坐标已说明时间与指标时,不重复补一句。必要的单位、不同统计口径和错误恢复信息保留。
|
|
157
|
+
- 不默认添加“演示环境 / Mock 数据 / 操作仅保存在本地”等横幅或页脚,通常在交付时说明;可能让人误认真实付款、奖励等结果时,就近保留最小辨识信息。不得改写用户录入内容来追求简洁。
|
|
158
|
+
- 正式名称与 Logo 沿用。没有 Logo 的业务工具默认用文字名称,不自动生成“彩色首字方块 + 阴影 + 功能口号”,不另造品牌名。顶部不堆叠技术底座标识、功能口号及无当前任务用途的徽标。功能图标沿用同套风格,AI 功能不默认加机器人或星光。
|
|
159
|
+
- 不为凑版面增加 KPI、素材或进度。图表服务比较:趋势用线、数量用条、精确值用表;零值不画非零长度,缺失不当零,变化须有比较依据。数据模式与统计口径沿用主流程。
|
|
160
|
+
|
|
161
|
+
用删掉说明后的页面检验必要性:字段名和按钮已表达“排班需求 → 生成草稿”,无需再介绍系统如何结合营业时间、休假和工时限制;但限制会导致本次提交失败且界面尚未告知时,应在相关字段旁保留。图表已有“近 7 个月”坐标与系列图例时,删除重复副标题;不同筛选口径仍需标明。同一指标的数值、比例和徽标只保留有额外信息的表达,不为装饰重复强调。按钮直接写“保存修改”“生成草稿”等实际结果,不用泛化的“开启高效体验”。
|
|
162
|
+
|
|
163
|
+
业务内容承担视觉重点:素材预览应能辨认产物,结果缺图时展示名称、类型与真实状态;不要用机器人图标和重复标题填满预览。
|
|
164
|
+
|
|
165
|
+
### 业务界面默认静止
|
|
166
|
+
|
|
167
|
+
卡片、指标、Logo、AI 入口及告警不使用循环跳动、上下漂浮、缩放呼吸、光晕闪烁或流动渐变;包括 `animate-bounce`、`animate-pulse`、`animate-ping` 及同类自定义动画。告警用稳定的文字、语义色和图标表达。卡片 hover 不抬升或缩放,不给静态内容加数字滚动、逐项入场或装饰轮播。
|
|
168
|
+
|
|
169
|
+
动效只响应用户操作,或表示真实进行中的任务。hover/focus、展开和关闭可用短促过渡(约 100–180ms),不改变布局占位;加载指示限定在实际忙碌的按钮或区域,完成或失败后立即停止。首屏内容直接可用,数据刷新保留布局与已有内容,避免整块反复卸载造成闪跳。尊重 `prefers-reduced-motion`,减少动效时仍保留清楚的文字和状态反馈。
|
|
87
170
|
|
|
88
171
|
## 交付前自检
|
|
89
172
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
173
|
+
在主流程已有检查中核对本次涉及的实现:
|
|
174
|
+
|
|
175
|
+
1. 工作区获得主要空间,摘要紧凑;颜色按动作、状态和数据含义分工,没有逐卡换色或装饰叠加。
|
|
176
|
+
2. 检查本次页面的外壳及区块容器:仅为布局分组添加的卡片表面已移除,包括无边无影的白色圆角底板;必要控件边界保留。
|
|
177
|
+
3. 页面实际使用共用控件及主题;核对页面调用中不再有 `select`、`input[type=date]`、`input[type=time]` 或其封装作为可见选择界面,本地、mock、不发布不构成豁免;确属用户要求或平台硬约束时记录依据。
|
|
178
|
+
4. 没有重复功能说明、装饰性占位 Logo、无用徽标、双重焦点或“已填写”补句。
|
|
179
|
+
5. 根节点及本次涉及的导航、工具栏、表单、内容区和弹层按可用空间收缩或重排;长值、窄容器下不重叠、不逐字竖排、不裁掉必要内容,操作始终可达。
|
|
180
|
+
6. 字体、必要边界、状态和交互清楚,真实内容与长值没有被布局隐藏。
|
|
181
|
+
7. 本次实现的动画和过渡符合上文用途,没有循环跳动、呼吸光晕、hover 位移或重复入场;加载反馈随真实任务结束。
|
|
96
182
|
|
|
97
|
-
|
|
183
|
+
设计指南不额外启动浏览器巡检、逐页截图或多轮美化流程。检查范围与方法沿用用户任务和主 Skill。结论注明证据层级:实现已核对、运行效果已验证、未验证。截图只证明其对应的页面、尺寸和状态;没有运行证据时不声称交互或视觉通过,也不为消除“未验证”自行扩大检查。有明确问题时修复对应实现,其余工作继续主流程。
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# Mutation Function
|
|
2
|
+
|
|
3
|
+
Mutation 是固定单表的基础写入声明。读取继续用 Database Function;写入使用 `mutations/<functionId>/{meta.json,spec.json}`,Page 只传位置参数。表、可写字段、固定值和记录 ID 参数来源由发布者声明,不能由调用者扩展。写入方式按下节选择。
|
|
4
|
+
|
|
5
|
+
CLI 的 `deploy` 自动校验、打包并注册声明,`pull` 恢复 `mutations/`。全部类型共享 Function ID 和最多 200 个 Function 的限制。保存成功不代表写入一定成功,调用后仍需检查错误与部分完成结果。
|
|
6
|
+
|
|
7
|
+
## 写入方式选择
|
|
8
|
+
|
|
9
|
+
**读取使用 Database Function;声明能完整表达的普通单表创建、按记录 ID 更新和删除(含批量及附件写入)优先使用 Mutation;需要声明之外的服务端业务校验、计算或编排时使用 FaaS。按业务动作选择,已有 FaaS 无需主动迁移。**
|
|
10
|
+
|
|
11
|
+
| 业务要求 | 选择 |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| 固定单表、固定字段的创建,或按记录 ID 更新/删除;只需类型、缺失/null、长度、列表数量等声明内约束 | Mutation;支持一次改多个字段、批量记录和附件增量 |
|
|
14
|
+
| 需要校验记录归属、当前状态、查重、非空白等业务规则,或基于旧值计算、跨表写入、多个业务写入存在依赖 | FaaS;按 [FaaS 协议](faas.md)实现 |
|
|
15
|
+
|
|
16
|
+
例如修改指定任务的标题和状态、批量设置为完成属于基础写入;“只能修改自己的草稿”需要 FaaS。具体参数限制见[声明与参数](#声明与参数)。需要 FaaS 校验的动作不能另行暴露可绕过校验的 Mutation,也不经 FaaS 调用 Mutation。“上传文件 → 取得 token → Mutation 挂载”属于页面附件流程,本身不需要 FaaS;如需服务端业务校验再按上述边界选择。两条链路均不额外提供事务或 CAS。
|
|
17
|
+
|
|
18
|
+
## 声明与参数
|
|
19
|
+
|
|
20
|
+
`meta.json`:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{"name":"创建任务","description":"提交一条待处理任务"}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Mutation 不声明角色;调用仍需通过应用统一准入。记录 ID 仅限定操作范围,不代表记录归属或行权限校验。
|
|
27
|
+
|
|
28
|
+
`spec.json` 中 `param` 是 **从 1 开始的位置编号**。记录条件的 `param: 2` 表示从第 2 个参数读取 ID,和“修改两条”没有关系。目标参数必须是必填的单值 `RECORD_ID`,不能设置 `list: true`;多条记录通过 `batch` 逐条传参。
|
|
29
|
+
|
|
30
|
+
支持 `TEXT / INT / DOUBLE / BOOL / TIMESTAMP / DURATION / USER_ID / GROUP_ID / RECORD_ID / ATTACHMENT`;`required` 默认 true,`list` 默认 false。`TEXT.max_length` 默认 100000,列表 `max_items` 默认 200。`required` 只拒绝缺失/null;TEXT 允许空字符串和纯空白,当前没有 `min_length`、正则或数字范围参数。不能额外传参、动态表/字段或任意 patch。
|
|
31
|
+
|
|
32
|
+
可选参数传 null 或省略末尾位置表示不修改。文本传 `""` 写入空文本;多选及 `list:true` 的人员参数按完整数组替换,`[]` 清空,单人字段最多一个 ID。其他清空使用固定 `{ "clear": true }`;需要在一次保存中动态选择写入或清空日期时,当前声明无法直接表达,可使用 FaaS。
|
|
33
|
+
|
|
34
|
+
`set` 每个字段只可选择一种来源:`const`、`param`、`current_user: true`、`now: true`、`clear: true`。人员参数使用内部数字 ID 字符串;调用者不能覆盖服务端注入的当前用户和时间。选项用 Catalog 中已有的选项名称,字段使用真实 field ID。附件的参数、整格替换与增量操作见[附件写入](#附件写入)。不要将公式、lookup、系统等不可写字段放入 `set`;调用后按下文检查 `ignored_fields` 等部分结果。
|
|
35
|
+
|
|
36
|
+
电话、邮箱和超链接使用 `TEXT` 参数或字符串 `const`,支持 create/update、批量写入及 `clear`。电话传完整号码字符串。超链接传地址(如 `https://example.com`)或 `[展示文字](https://example.com)`,不传对象。`returning` 保留本次提交的字符串;超链接可通过原生 Base 记录接口回读。
|
|
37
|
+
|
|
38
|
+
`TIMESTAMP` 参数接受毫秒整数或含时区的 RFC3339,保留毫秒精度。日期 `const` 使用含时区的字符串,例如 `{"const":"2026-09-15T08:00:00+08:00"}`,不要使用数字时间常量。`now` 使用服务端当前时间。验收日期写入时,通过 Database Function 回读核对实际时间,不能只检查 `returning`。
|
|
39
|
+
|
|
40
|
+
## 记录范围
|
|
41
|
+
|
|
42
|
+
`create` 不带 `precondition`。`update`、`delete`、`append_attachments`、`remove_attachments` 必须带 `precondition`,固定为 `conjunction: "and"`,`conditions` 中仅允许一个 `{"field_id":"rec_id","operator":"is","param":N}` 条件。`is` 表示等于单个记录 ID,每组参数只定位一条记录,不接受 ID 数组。
|
|
43
|
+
|
|
44
|
+
当前 `precondition` 只定位记录,不读取记录做业务预检,不支持其他字段、多个条件、嵌套 `groups`、`or` 或其他操作符;旧 `record_id_param/record_ids_param`、`target` 和 `on_error` 也会在保存时被拒绝。需要服务端检查归属、状态或其他业务条件时使用 FaaS。
|
|
45
|
+
|
|
46
|
+
不支持省略 ID 按条件修改或删除。可先通过 Database Function 查询 ID,再调用 Mutation;查询结果不保证写入时状态仍相同。
|
|
47
|
+
|
|
48
|
+
## 创建单条与批量创建
|
|
49
|
+
|
|
50
|
+
`mutations/createTask/spec.json` 示例;`tblTasks` / `fldTitle` 等替换成 Catalog 中的真实 ID。
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"table":{"table_id":"tblTasks"},
|
|
55
|
+
"operation":"create",
|
|
56
|
+
"params":[{"kind":"TEXT","max_length":100}],
|
|
57
|
+
"set":{
|
|
58
|
+
"fldTitle":{"param":1},
|
|
59
|
+
"fldStatus":{"const":"待处理"},
|
|
60
|
+
"fldOwner":{"current_user":true},
|
|
61
|
+
"fldCreatedAt":{"now":true}
|
|
62
|
+
},
|
|
63
|
+
"returning":["rec_id","fldTitle"]
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
调用单条:`{"params":["准备评审"]}`。创建多条、每条内容不同:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{"batch":[{"params":["准备评审"]},{"params":["补充文档"]}]}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 多条记录设置相同值
|
|
74
|
+
|
|
75
|
+
`mutations/renameTasks/spec.json`:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"table":{"table_id":"tblTasks"},
|
|
80
|
+
"operation":"update",
|
|
81
|
+
"params":[{"kind":"TEXT"},{"kind":"RECORD_ID"}],
|
|
82
|
+
"precondition":{"conjunction":"and","conditions":[{"field_id":"rec_id","operator":"is","param":2}]},
|
|
83
|
+
"set":{"fldTitle":{"param":1}},
|
|
84
|
+
"returning":["rec_id","fldTitle"]
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
调用:
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{"batch":[{"params":["统一标题","recA"]},{"params":["统一标题","recB"]}]}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
每组的第 2 个参数都是单个记录 ID。
|
|
95
|
+
|
|
96
|
+
## 多条记录设置不同值
|
|
97
|
+
|
|
98
|
+
复用上例声明,分别传入每条记录的标题和 ID:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{"batch":[{"params":["标题 A","recA"]},{"params":["标题 B","recB"]}]}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
批量模式按同一个声明解释每组参数,每组操作一条记录。同一请求最多 200 组,不允许重复目标 ID。`batch` 与顶层 `params` 互斥,不支持在一批中混合不同表、操作或 Function。
|
|
105
|
+
|
|
106
|
+
## 删除多条
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"table":{"table_id":"tblTasks"},
|
|
111
|
+
"operation":"delete",
|
|
112
|
+
"params":[{"kind":"RECORD_ID"}],
|
|
113
|
+
"precondition":{"conjunction":"and","conditions":[{"field_id":"rec_id","operator":"is","param":1}]},
|
|
114
|
+
"returning":["rec_id"]
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
调用:`{"batch":[{"params":["recA"]},{"params":["recB"]}]}`。delete 不接受 `set`,返回只能包含 record ID。
|
|
119
|
+
|
|
120
|
+
## 附件写入
|
|
121
|
+
|
|
122
|
+
附件上传仍使用 [文件传输](file-transfer.md#上传) 中的 `siteRuntime.uploadAttachment()`;上传成功后复用已有 `fileToken` 和本地图片宽高调用 Mutation。基础追加使用 `append_attachments`,不先查询并重写旧列表。只有创建新记录时随记录提交附件,或业务明确要求替换整个单元格时,才使用 `create` / `update`。
|
|
123
|
+
|
|
124
|
+
### 参数与操作边界
|
|
125
|
+
|
|
126
|
+
`ATTACHMENT` 参数单项是附件对象,例如:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{"file_token":"fileNew","image_width":640,"image_height":480}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
将上传返回的 `fileToken` 映射为 `file_token`;非图片只传 token,图片附本地读取的原始宽高,见[图片宽高](file-transfer.md#图片宽高)。
|
|
133
|
+
|
|
134
|
+
`{"kind":"ATTACHMENT"}` 接收一个对象,`{"kind":"ATTACHMENT","list":true}` 接收对象数组。附件 `const` 使用数组,例如 `{"const":[{"file_token":"fileNew"}]}`。以下示例使用列表参数。
|
|
135
|
+
|
|
136
|
+
| 操作 | 声明与语义 |
|
|
137
|
+
| --- | --- |
|
|
138
|
+
| `create` | 附件字段的 `set` 使用 `param` 或 `const`,随新记录写入完整附件列表 |
|
|
139
|
+
| `update` | 附件字段的 `set` 使用 `param` 或 `const`,替换整格;`{"clear":true}` 清空该字段 |
|
|
140
|
+
| `append_attachments` / `remove_attachments` | `precondition` 与非空 `set` 必填,`set` 只包含附件字段,来源只允许 `param` / `const`;禁止 `clear`、`current_user`、`now` |
|
|
141
|
+
|
|
142
|
+
增量操作的每个目标字段必须有非空附件列表。**一次调用跨 batch、目标记录和字段展开后,附件条目累计最多 50 个**;例如 2 个附件追加到 10 条记录计 20 个。同一文件可以用于不同目标,但每个目标都计数。记录批量限制同样生效。50 条仅是附件增量操作的请求限制;普通 create/update 仍遵守 Mutation 的列表预算与目标平台附件限制。
|
|
143
|
+
|
|
144
|
+
### 追加已上传附件
|
|
145
|
+
|
|
146
|
+
建立 `mutations/appendTaskAttachments/meta.json`:
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
{"name":"追加任务附件"}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`mutations/appendTaskAttachments/spec.json`(ID 替换为 Catalog 中的真实值):
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"table":{"table_id":"tblTasks"},
|
|
157
|
+
"operation":"append_attachments",
|
|
158
|
+
"params":[
|
|
159
|
+
{"kind":"RECORD_ID"},
|
|
160
|
+
{"kind":"ATTACHMENT","list":true,"max_items":50}
|
|
161
|
+
],
|
|
162
|
+
"precondition":{"conjunction":"and","conditions":[{"field_id":"rec_id","operator":"is","param":1}]},
|
|
163
|
+
"set":{"fldFiles":{"param":2}},
|
|
164
|
+
"returning":["rec_id","fldFiles"]
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
继续上传示例中的 `newAttachment`,Page 传记录 ID 和本次新增列表:
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
const result = await invokeDatabaseFunction('appendTaskAttachments', ['recA', [newAttachment]])
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
对应调用 JSON 为:
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{"params":["recA",[{"file_token":"fileNew","image_width":640,"image_height":480}]]}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
假设原单元格已有 `fileOld`,成功响应是本次操作后的完整列表:
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"code":0,
|
|
185
|
+
"msg":"success",
|
|
186
|
+
"data":{
|
|
187
|
+
"record_ids":["recA"],
|
|
188
|
+
"records":[{
|
|
189
|
+
"rec_id":"recA",
|
|
190
|
+
"fldFiles":[
|
|
191
|
+
{"file_token":"fileOld","name":"需求.pdf","size":1200},
|
|
192
|
+
{"file_token":"fileNew","name":"设计.png","size":8000}
|
|
193
|
+
]
|
|
194
|
+
}]
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Page 检查一次顶层 `code`;成功后从 `data.records` 找到对应 `rec_id`,用 `fldFiles` 更新本地附件列表。这里的 `returning` 是操作后的完整附件列表,包含保留下来的旧附件;旧数据的 `name` 可以为空字符串,`size` 可以为 0。不能把请求中的增量列表当成最终列表,也不能把 FaaS 原始路由的 `data.attachments` 当成 Mutation 响应。
|
|
200
|
+
|
|
201
|
+
### 移除附件引用
|
|
202
|
+
|
|
203
|
+
`meta.json` 沿用追加示例,将名称改为“移除任务附件”。
|
|
204
|
+
|
|
205
|
+
`mutations/removeTaskAttachments/spec.json`:
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"table":{"table_id":"tblTasks"},
|
|
210
|
+
"operation":"remove_attachments",
|
|
211
|
+
"params":[
|
|
212
|
+
{"kind":"RECORD_ID"},
|
|
213
|
+
{"kind":"ATTACHMENT","list":true,"max_items":50}
|
|
214
|
+
],
|
|
215
|
+
"precondition":{"conjunction":"and","conditions":[{"field_id":"rec_id","operator":"is","param":1}]},
|
|
216
|
+
"set":{"fldFiles":{"param":2}},
|
|
217
|
+
"returning":["rec_id","fldFiles"]
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Page 只提交待移除 token;若来自 Database Function 的附件对象,将其 `token` 填入 `file_token`:
|
|
222
|
+
|
|
223
|
+
```ts
|
|
224
|
+
const result = await invokeDatabaseFunction('removeTaskAttachments', ['recA', [{ file_token: 'fileNew' }]])
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
对应调用 JSON 与移除 `fileNew` 后的成功响应:
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{"params":["recA",[{"file_token":"fileNew"}]]}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
```json
|
|
234
|
+
{"code":0,"msg":"success","data":{"record_ids":["recA"],"records":[{"rec_id":"recA","fldFiles":[{"file_token":"fileOld","name":"需求.pdf","size":1200}]}]}}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
移除仅删除单元格中的引用,不删除文件;移除后没有附件时返回该字段的空数组。多条记录使用 `invokeDatabaseMutationBatch`,每组传单个记录 ID,受上述附件总数限制。
|
|
238
|
+
|
|
239
|
+
附件增量操作不保证原子性、并发不丢项或重试去重。部分结果的判断见[调用与结果](#调用与结果)。超时后保留 token 和宽高,按[结果未知的处理](file-transfer.md#超时与结果未知)做有限只读核对,不自动重传、重试或用旧列表整格覆盖。
|
|
240
|
+
|
|
241
|
+
## 调用与结果
|
|
242
|
+
|
|
243
|
+
响应 `code=0` 后仍须检查 `record_not_found` 和 `ignored_fields`:非空表示未全部完成,展示缺失记录或被忽略字段及原因。删除结果的 `record_ids` 可能包含未找到的 ID,不能仅按其长度统计成功数。`records` 不包含缺失记录或被忽略字段的请求值。非零业务错误、无说明的结果缺失、重复或陌生 ID 仍报错;超时或结果异常先只读核对,不自动重试整批。部分完成时也刷新数据,避免页面仍显示写入前的状态。批量调用不额外提供事务或 CAS。
|
|
244
|
+
|
|
245
|
+
`returning` 仅允许 `rec_id` 和声明 `set` 中的字段。普通 create/update/delete 回显未被忽略字段的提交值(参数经过声明类型转换,常量保留原值),可选字段本次没提供时省略;append/remove 返回操作后的完整附件列表,见[附件写入](#附件写入)。普通 CRUD 的 `returning` 是提交值回显;需要最终存储值时在操作后重新查询。普通 CRUD 示例结果:
|
|
246
|
+
|
|
247
|
+
```json
|
|
248
|
+
{"code":0,"msg":"success","data":{"record_ids":["recA"],"records":[{"rec_id":"recA","fldTitle":"准备评审"}]}}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Page 结果类型与检查(单次、批量共用):
|
|
252
|
+
|
|
253
|
+
```ts
|
|
254
|
+
type MutationResult = {
|
|
255
|
+
record_ids: string[]
|
|
256
|
+
record_not_found?: string[]
|
|
257
|
+
ignored_fields?: {id: string; name: string; reason: string}[]
|
|
258
|
+
}
|
|
259
|
+
function assertComplete(result: MutationResult) {
|
|
260
|
+
const missing = result.record_not_found ?? []
|
|
261
|
+
const ignored = result.ignored_fields ?? []
|
|
262
|
+
if (missing.length || ignored.length) {
|
|
263
|
+
throw new Error([
|
|
264
|
+
missing.length ? `记录不存在:${missing.join('、')}` : '',
|
|
265
|
+
...ignored.map(field => `${field.name}:${field.reason}`),
|
|
266
|
+
].filter(Boolean).join(';'))
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Page 一组参数调用(对应上文 `renameTasks`,一组参数修改一条记录):
|
|
272
|
+
|
|
273
|
+
```ts
|
|
274
|
+
const result = await invokeDatabaseFunction<MutationResult>('renameTasks', ['统一标题', 'recA'])
|
|
275
|
+
if (result.code !== 0) throw new Error(result.msg || '写入失败')
|
|
276
|
+
if (!result.data) throw new Error('写入结果缺失,请刷新核对')
|
|
277
|
+
assertComplete(result.data)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Page 多组参数调用(对应上文 `createTask`,每组创建一条记录):
|
|
281
|
+
|
|
282
|
+
```ts
|
|
283
|
+
const result = await invokeDatabaseMutationBatch<MutationResult>('createTask', [['准备评审'], ['补充文档']])
|
|
284
|
+
if (result.code !== 0) throw new Error(result.msg || '写入失败')
|
|
285
|
+
if (!result.data) throw new Error('写入结果缺失,请刷新核对')
|
|
286
|
+
assertComplete(result.data)
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
两个 helper 均来自 starter 的 `page/src/lib/database-runtime.ts`,返回 `{code, data?, msg?}`。先检查顶层业务码,再检查 `data` 中的部分结果,不重复解包。
|
|
290
|
+
|
|
291
|
+
CLI 调用沿用项目级路由:
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
base-database-cli lark-cli -- api POST '/open-apis/base/v3/sites/<site-token>/invoke_function/<function-id>' --params '{"env":"preview"}' --data '{"batch":[{"params":["准备评审"]},{"params":["补充文档"]}]}' --json
|
|
295
|
+
```
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
# 原生通知集成
|
|
2
2
|
|
|
3
|
-
需求包含原生 workflow
|
|
3
|
+
需求包含原生 workflow 向使用者发送应用业务通知时读取。通知应属于用户明确要求的流程;先确认接收人范围、触发条件和业务动作。workflow JSON 按[原生能力路由](base-capability-routing.md)读取当前 CLI 文档,不推测 steps 协议。
|
|
4
4
|
|
|
5
5
|
## 入口策略
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
按用户明确要求优先判定,默认保持应用业务对象的操作入口:
|
|
8
8
|
|
|
9
9
|
| 策略 | 条件 | 入口要求 |
|
|
10
10
|
| --- | --- | --- |
|
|
11
|
-
| `base_action` | 用户明确要求进入多维表格 | 可使用 Base URL 或 `recordLink
|
|
11
|
+
| `base_action` | 用户明确要求进入多维表格 | 可使用 Base URL 或 `recordLink`,不称为应用入口 |
|
|
12
12
|
| `informational` | 用户明确要求纯展示、无需点击入口 | 可用 `btn_list=[]`,记录该要求;说明平台仍可能提供默认 Base 跳转 |
|
|
13
|
-
| `site_action` |
|
|
13
|
+
| `site_action` | 其余与应用业务对象关联的通知 | 显式 `openLink`,进入 Page 已实现的业务路由并定位对象 |
|
|
14
14
|
|
|
15
|
-
正文已包含业务信息,不构成选择 informational
|
|
15
|
+
正文已包含业务信息,不构成选择 informational 的依据。访客通知默认进入该登记详情,考试通知进入相应考试详情或答题页;这些是规则示例,不改变用户明确的入口要求。不能用应用首页冒充对象详情。
|
|
16
16
|
|
|
17
|
-
`site_action` 使用本次 deploy 返回的顶层 `baseAppUrl`,保留已有查询参数,增加 Page 实际实现的功能定位参数与 workflow 上下文中的最小稳定对象标识。不能使用内部 `staticUrl`、Base URL/recordLink
|
|
17
|
+
`site_action` 使用本次 deploy 返回的顶层 `baseAppUrl`,保留已有查询参数,增加 Page 实际实现的功能定位参数与 workflow 上下文中的最小稳定对象标识。不能使用内部 `staticUrl`、Base URL/recordLink、管理后台或根据应用 appToken 猜测地址。
|
|
18
18
|
|
|
19
19
|
`btn_list=[]` 仅表示没有显式按钮,不保证整卡不可点击。用户要求任何点击都不能进入 Base 时,先发现可满足要求的方案;没有相应能力则报告限制,不用 informational 规避要求。
|
|
20
20
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
2. 新 workflow 延后到 Preview 发布成功、且新建 Base 示例验证通过后创建,避免示例记录触发真实通知。当前 CLI 的新建 workflow 默认禁用;创建前仍检查当前 `+workflow-create --help`,传入稳定的本次 `client_token`。
|
|
25
25
|
3. 取得最终 `baseAppUrl` 后构造完整定义并 create,再 get 核验。已有 workflow 先 get 当前定义和使用范围;正在服务生产用户的流程按[生产入口切换](#生产入口切换)保留原链接,其他流程只修改本次授权字段,用完整 read-modify-write update 后 get。不把旧样例或部分响应当完整配置。
|
|
26
26
|
4. 逐个核对通知动作的入口策略、按钮链接、功能参数、对象标识及状态。site_action 必须定位到真实业务路由;其他策略需有明确需求依据。
|
|
27
|
-
5. 按下表决定启停,必要时启用后再次 get。记录实际结果后返回[发布与交付](release.md)
|
|
27
|
+
5. 按下表决定启停,必要时启用后再次 get。记录实际结果后返回[发布与交付](release.md),不能把应用发布成功等同通知完成。
|
|
28
28
|
|
|
29
29
|
## 状态与失败处理
|
|
30
30
|
|
|
@@ -43,6 +43,6 @@
|
|
|
43
43
|
|
|
44
44
|
应用 Prod 发布成功后,使用本次返回的生产 `baseAppUrl`,按 Preview 清单逐一 get → 必要的完整 update → get。site_action 只替换环境入口,保留功能定位参数、动态对象参数、其他步骤和启停状态;最终链接不含 `mode=edit`。已有链接正确时仍回读核对,不做无变化写入。其他策略保留入口意图并复核状态。
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
已有生产应用的 Preview 迭代不得把正在服务生产用户的 workflow 链接改为 owner-only Preview。先核对原链接与使用范围:保留生产入口,将新 Preview 的功能参数列入待切换清单;需要独立通知测试时,仅在用户授权的隔离测试流程中执行。
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
任一切换失败时分别报告应用发布与通知切换状态;修复后只恢复失败步骤。发布应用不会自动迁移外部 workflow,也不授权发送额外测试通知。
|