@microi.net/cli 4.9.6 → 4.9.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.
Files changed (93) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +6 -5
  7. package/package.json +1 -1
  8. package/scripts/mcp-server.js +83 -83
  9. package/scripts/microi-cli.js +55 -85
  10. package/scripts/microi-codex-broker.js +418 -0
  11. package/scripts/microi-codex-router.js +129 -65
  12. package/scripts/microi-skills.meta.json +310 -151
  13. package/skills/.microi-skills-version.json +2 -2
  14. package/skills/.progressive-disclosure-manifest.json +3566 -0
  15. package/skills/ai-platform-governance/SKILL.md +21 -166
  16. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -0
  17. package/skills/microi-client-frontend/SKILL.md +17 -434
  18. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -0
  19. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +178 -0
  20. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +144 -0
  21. package/skills/microi-db-schema/SKILL.md +3 -3
  22. package/skills/microi-db-schema/references/schema-overview.md +1 -1
  23. package/skills/microi-db-schema/references/schema.md +1 -1
  24. package/skills/microi-db-schema/references/table-catalog.md +1 -1
  25. package/skills/microi-form-engine/SKILL.md +1 -1
  26. package/skills/microi-form-layout/SKILL.md +19 -225
  27. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -0
  28. package/skills/microi-frontend-sdk/SKILL.md +17 -151
  29. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +171 -0
  30. package/skills/microi-mobile-app-quality/SKILL.md +22 -288
  31. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +209 -0
  32. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +117 -0
  33. package/skills/microi-system-delivery/SKILL.md +16 -380
  34. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +186 -0
  35. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +210 -0
  36. package/skills/microi-ui/SKILL.md +19 -169
  37. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -0
  38. package/skills/microi-uniapp-frontend/SKILL.md +26 -335
  39. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -0
  40. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -0
  41. package/skills/page-engine/SKILL.md +23 -271
  42. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -0
  43. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -0
  44. package/skills/playwright-e2e/SKILL.md +24 -590
  45. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -0
  46. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -0
  47. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -0
  48. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -0
  49. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -0
  50. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -0
  51. package/skills/scripts/validate-progressive-disclosure.mjs +52 -0
  52. package/skills/ui-design/SKILL.md +26 -1461
  53. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -0
  54. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +155 -0
  55. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -0
  56. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -0
  57. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -0
  58. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -0
  59. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -0
  60. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -0
  61. package/skills/v8-crud-api/SKILL.md +20 -245
  62. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -0
  63. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -0
  64. package/skills/v8-export-import/SKILL.md +15 -425
  65. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -0
  66. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -0
  67. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -0
  68. package/skills/v8-file-upload/SKILL.md +16 -354
  69. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +227 -0
  70. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +149 -0
  71. package/skills/v8-frontend-events/SKILL.md +19 -205
  72. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -0
  73. package/skills/v8-http-integration/SKILL.md +14 -236
  74. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -0
  75. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -0
  76. package/skills/v8-menu-buttons/SKILL.md +15 -511
  77. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +221 -0
  78. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +224 -0
  79. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -0
  80. package/skills/v8-mq-mqtt/SKILL.md +11 -175
  81. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -0
  82. package/skills/v8-security/SKILL.md +16 -329
  83. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +199 -0
  84. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -0
  85. package/skills/v8-table-event/SKILL.md +16 -236
  86. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +216 -0
  87. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -0
  88. package/skills/v8-workflow/SKILL.md +19 -160
  89. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -0
  90. package/skills/workspace-conventions/SKILL.md +29 -361
  91. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +208 -0
  92. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +196 -0
  93. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -0
@@ -0,0 +1,207 @@
1
+ # ui-design 详细参考 7
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=ui-design-020 sha256=25aa81a39c664b1873ff5e7a3c5d0e8ad2b929824c90e16bd020f64c98a34b54 -->
6
+ ## 速查:从头搭建一个移动端页面
7
+
8
+ ```vue
9
+ <template>
10
+ <div class="mci-mobile-page">
11
+ <!-- 顶部导航 -->
12
+ <header class="mci-navbar">
13
+ <h1 class="mci-navbar__title">{{ title }}</h1>
14
+ </header>
15
+
16
+ <!-- 主内容 -->
17
+ <main class="page-content">
18
+ <section
19
+ v-for="(item, i) in list"
20
+ :key="item.id"
21
+ class="mci-card mci-stagger-item"
22
+ :style="{ '--mci-index': i }"
23
+ >
24
+ <span class="mci-tag mci-tag--hot">HOT</span>
25
+ <h3>{{ item.name }}</h3>
26
+ <p class="mci-text-gradient price">{{ item.price }}</p>
27
+ <button class="mci-btn">立即查看</button>
28
+ </section>
29
+ </main>
30
+
31
+ <!-- 底部 Tabbar -->
32
+ <nav class="mci-tabbar">
33
+ <a class="mci-tabbar__item mci-tabbar__item--active"><svg class="mci-tabbar__icon" aria-hidden="true"><use href="#icon-home" /></svg><span>首页</span></a>
34
+ <a class="mci-tabbar__item"><svg class="mci-tabbar__icon" aria-hidden="true"><use href="#icon-message" /></svg><span>消息</span></a>
35
+ <a class="mci-tabbar__item"><svg class="mci-tabbar__icon" aria-hidden="true"><use href="#icon-user" /></svg><span>我的</span></a>
36
+ </nav>
37
+ </div>
38
+ </template>
39
+
40
+ <style lang="scss" scoped>
41
+ .page-content {
42
+ padding: var(--mci-space-4);
43
+ padding-bottom: calc(var(--mci-touch-target) + var(--mci-safe-bottom) + var(--mci-space-8));
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: var(--mci-space-4);
47
+ }
48
+ .price {
49
+ font-size: var(--mci-text-2xl);
50
+ font-weight: var(--mci-font-bold);
51
+ }
52
+ </style>
53
+ ```
54
+
55
+
56
+ ---
57
+
58
+ <!-- /microi-progressive:chunk -->
59
+ <!-- microi-progressive:chunk id=ui-design-021 sha256=8a8884b0b064e7805cd03d904541b12da4539e73172d31f00d32c1ecfaee32f6 -->
60
+ ## 🚨 移动端低代码项目落地踩坑(必读,2026.5)
61
+
62
+ 实战中频繁出现的 7 类问题,统一按以下规则处理。
63
+
64
+ ### 1. 路由前缀不要硬编码租户名
65
+
66
+ - 错误:在 `manifest.json` 写死 `"router": { "base": "/fixed-tenant/" }`。
67
+ - 正确:默认使用 `"router": { "base": "/" }`;租户由运行配置、`OsClient` 和请求头/参数确定。
68
+ - 不要自行把租户名拼进 API 路径。平台接口使用 `/api/...`、`/apiengine/...` 等标准路由。
69
+
70
+ ### 2. tabBar 使用本地静态 PNG 图标
71
+
72
+ - uni-app/微信小程序 tabBar 的 `iconPath`、`selectedIconPath` 使用项目内静态 PNG。
73
+ - 不使用 emoji、字体图标、远程 URL;SVG 仅在目标端明确支持并已做真实设备验证时使用。
74
+ - 普通态与选中态保持相同画布和轮廓,推荐 60×60 至 81×81 px,并验证深浅色背景可读性。
75
+
76
+ ### 3. 字号样式不要通配所有 `text`
77
+
78
+ Scoped SCSS 中的 `.entry text { font-size: 40rpx; }` 会同时放大图标文字和子标签。图标、标题、说明必须使用独立 class:
79
+
80
+ ```scss
81
+ .entry .entry-icon { font-size: 40rpx; }
82
+ .entry .entry-label { font-size: 22rpx; }
83
+ ```
84
+
85
+ ### 4. 个人中心/详情入口按信息层级选布局
86
+
87
+ - 高频资产、订单状态、服务入口适合 4~5 列网格。
88
+ - 设置、安全、协议等低频入口适合纵向列表。
89
+ - 单元格须有稳定触控区域、清晰标签和一致间距;不要为了追求密度牺牲可读性。
90
+
91
+ ### 5. 每个可点击元素都要有反馈
92
+
93
+ ```scss
94
+ .cell, .entry-item, .product-card, .zone-card {
95
+ position: relative;
96
+ transition: transform .2s ease, box-shadow .2s ease;
97
+ }
98
+ .cell:active, .entry-item:active {
99
+ transform: scale(.94);
100
+ }
101
+ @keyframes fadein-up {
102
+ from { opacity: 0; transform: translateY(16rpx); }
103
+ to { opacity: 1; transform: translateY(0); }
104
+ }
105
+ .animate-fadein { animation: fadein-up .45s ease both; }
106
+ @media (prefers-reduced-motion: reduce) {
107
+ .animate-fadein { animation: none; }
108
+ }
109
+ ```
110
+
111
+ 动效只表达状态,不承担业务完成事实;提交、支付、安装等动作仍以服务端返回和可恢复状态为准。
112
+
113
+ ### 6. 品牌名和 Logo 的用户可见位置保持一致
114
+
115
+ 同步检查 `manifest.json` 的 `name/h5.title`、`pages.json` 的导航标题、登录/注册/首页品牌区、空状态和分享标题。控制台中的技术标识可保留,但用户可见文案必须统一。
116
+
117
+ ### 7. 接口地址由标准引擎工具维护
118
+
119
+ - `microi_create_engine`/`microi_upsert_engine` 会维护 `ApiEngineKey`、`ApiAddress` 和路由缓存。
120
+ - 写入超时先用标准 get/list 工具回读,不得立即重复创建。
121
+ - 禁止通过手工 SQL、直接修改 `sys_apiengine` 或自行拼 Redis Key 修补路由;这会绕过租户、审计、缓存失效和控制面权限。
122
+ - 长任务使用后台任务并持久化进度;普通接口写入后以远端回读为最终依据。
123
+
124
+ <!-- /microi-progressive:chunk -->
125
+ <!-- microi-progressive:chunk id=ui-design-022 sha256=4962a1ec7bc49ae1a2706c58fb6f929304ca254e3fd4d8b626fefbc17067bce2 -->
126
+ ## 🔗 关联字段:保存真实 Id,界面展示可读标签
127
+
128
+ 关联字段的数据库事实值通常是 `XxxId`。表单使用 `JoinForm`、`OpenTable` 或带数据源的 `Select` 显示名称,`SelectSaveField` 保存 `Id`,`SelectLabel` 展示名称。不要因为列表默认显示 Id,就强制所有业务表冗余一对可编辑的 `XxxId/XxxName` 字段。
129
+
130
+ ### Select 数据源示例
131
+
132
+ ```json
133
+ {
134
+ "DataSource": "Sql",
135
+ "Sql": "select Id, Name from mall_category where Name like '%$Keyword$%' limit 0,20",
136
+ "SelectLabel": "Name",
137
+ "SelectSaveField": "Id",
138
+ "SelectSaveFormat": "Text",
139
+ "EnableSearch": true,
140
+ "DataSourceSqlRemote": true
141
+ }
142
+ ```
143
+
144
+ - `$Keyword$` 是平台数据源占位符,不要把浏览器输入直接拼进任意 SQL。
145
+ - 关联表、字段和数据源必须来自当前租户,并受当前表单/菜单的授权与数据范围约束。
146
+ - 大表使用远程搜索和分页,不一次性把全表拉到浏览器。
147
+ - 列表展示名称优先配置 Join/模块关联字段或受控数据源,不把隐藏 Id 暴露给用户。
148
+
149
+ ### 什么时候增加 `XxxName` 快照字段
150
+
151
+ 只有在业务明确要求“保存当时名称”、离线展示、历史审计或高频报表需要时才增加 `XxxName`。它是快照/冗余字段,不是外键事实源,并遵守:
152
+
153
+ 1. 后端 SubmitBefore/接口引擎在同一事务内根据 `XxxId` 校验并写入名称。
154
+ 2. 前端 V8 可以即时回显,但不能作为唯一一致性保障。
155
+ 3. 关联名称后续变化时,先明确历史快照是否应随之更新。
156
+ 4. 批量回填必须参数化、可恢复、可幂等,并经过明确写入确认。
157
+
158
+ ### MCP 建模流程
159
+
160
+ 1. 先用 `microi_get_db_schema` 获取真实表和字段。
161
+ 2. 使用 `microi_build_field_config` 生成 JoinForm/OpenTable/Select 配置。
162
+ 3. 使用 `microi_add_field` 或 `microi_update_field` 写入字段。
163
+ 4. 修改 KeyValue/Config 后回读 `microi_get_field_list`,并执行 `microi_refresh_schema_cache`。
164
+ 5. 在真实菜单下验证普通角色能看到标签,但不能借数据源越权读取其它表或行。
165
+ ---
166
+
167
+ <!-- /microi-progressive:chunk -->
168
+ <!-- microi-progressive:chunk id=ui-design-023 sha256=1c731f6915dae4de788e84af3f6a59cf5d116a4de1f9ca5541f13b55110521ca -->
169
+ ## 表单布局规范(Column)
170
+
171
+ > 平台默认设计标准:所有 `diy_table` **应使用双列布局** (`Column = 2`),更紧凑现代,符合主流后台 SaaS 视觉密度。
172
+
173
+ ### 创建表时
174
+
175
+ ```jsonc
176
+ microi_create_table {
177
+ "name": "Crm_Customer",
178
+ "description": "客户",
179
+ "column": 2 // ✅ 默认就是 2,无需显式传,但推荐写明
180
+ }
181
+ ```
182
+
183
+ ### 修复存量表(一次性把所有 `Column=null` 改成 2)
184
+
185
+ ```jsonc
186
+ microi_update_table {
187
+ "name": "Crm_Customer",
188
+ "column": 2
189
+ }
190
+ ```
191
+
192
+ ### 何时使用 Column=1(单列)
193
+
194
+ - 工作流审批表单(字段少且需要专注)
195
+ - 移动端优先表单(手机宽度不够双列)
196
+ - 含大量富文本/长文本字段的内容编辑表
197
+
198
+ ### 何时使用 Column=3(三列)
199
+
200
+ - 字段≥18 的"基础档案"类大表(员工、商品 SKU、设备清单)
201
+ - 桌面分辨率≥1920px 的内部管理后台
202
+
203
+ > 修改 `Column` 后会自动清缓存(`microi_update_table` 后端走 `UptFormData('diy_table')` + 主动 `RefreshSchemaCache`),前端硬刷新(Ctrl+Shift+R)即可看到效果。
204
+
205
+ ---
206
+
207
+ <!-- /microi-progressive:chunk -->
@@ -0,0 +1,142 @@
1
+ # ui-design 详细参考 8
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=ui-design-024 sha256=7af53d03d0828232aaf7ab54d6527f5e2cf292d8eb493d75d9ab42adc3030ba3 -->
6
+ ## 表单分组规范:Tabs vs CollapseGroup(强制)
7
+
8
+ > **核心原则**:默认**不分组** → 小业务域用 **`CollapseGroup` 折叠分组** → 只有足够长或强任务隔离的业务域才用 **`Tabs` 分页**。禁止只按字段数判断:双列布局中 8 个短字段约占 4 行,仍不应独占 Tab;普通业务域通常达到 6 个有效表单行才考虑 Tab。
9
+
10
+ ### 三种分组方式
11
+
12
+ | 方式 | 存储位置 | 控件 | 适用场景 |
13
+ |------|---------|------|---------|
14
+ | **A. 表级 Tab** | `diy_table.Tabs` + 字段 `Tab` | 表单顶部 Tab 条 | 大表单拆 2~5 个业务域,每域通常 ≥6 个有效表单行,或属于扫码/子表/代码编辑等强任务模式 |
15
+ | **B. 字段级 CollapseGroup** | `diy_field.Component='CollapseGroup'` + `Config.CollapseGroup` | 折叠面板标题 | 小业务域(≤5 个有效表单行),**所有分组同屏可见、可同时展开** |
16
+ | **C. 字段级 Tabs 控件** | `diy_field.Component='Tabs'` + `Config.FieldTabs` | 字段是 Tab 容器 | 嵌套 Tab 场景(不推荐优先用) |
17
+
18
+ ### 表单规模与分组决策表
19
+
20
+ | 有效表单行与任务特征 | 推荐方案 |
21
+ |---------|---------|
22
+ | ≤ 6 行且无复杂控件 | **不分组**(直接平铺) |
23
+ | 7 ~ 12 行且无强任务隔离 | `CollapseGroup` 收起次要字段,或直接平铺 |
24
+ | > 12 行且至少两个业务域各 ≥ 6 行 | `diy_table.Tabs`(大域)或混合(Tab + 嵌套 CollapseGroup) |
25
+ | 扫码、报工、大型子表、代码编辑等强任务模式 | 可独立使用 `diy_table.Tabs`,不受普通行数阈值限制 |
26
+
27
+ ### CollapseGroup Config 示例
28
+
29
+ ```jsonc
30
+ // diy_field 必要字段
31
+ {
32
+ "Component": "CollapseGroup",
33
+ "Type": "varchar(50)",
34
+ "Visible": 1,
35
+ "AppVisible": 1,
36
+ "Config": "{\"CollapseGroup\":{\"DefaultCollapsed\":false,\"ScopeMode\":\"UntilNextGroup\",\"Description\":\"MRP 运算状态、批次号与时间\",\"Icon\":\"fas fa-calculator\",\"Theme\":\"primary\",\"ShowFieldCount\":true}}"
37
+ }
38
+ ```
39
+
40
+ ### 必做与禁止
41
+
42
+ - ✅ 任何 Tab / CollapseGroup 必须有 `Description` 解释分组用途。
43
+ - ✅ CollapseGroup 必须设 `Icon`(如 `fas fa-calculator`、`fas fa-info-circle`),不默认空白。
44
+ - ✅ 修改 Tab/CollapseGroup 配置后必须 `microi_refresh_schema_cache`。
45
+ - ❌ **禁止**为 ≤5 个有效表单行的业务域单独建 Tab;8~10 个双列短字段通常也应使用 CollapseGroup。
46
+ - ❌ **禁止**仅凭 13~30 个原始字段决定平铺或分 Tab;总有效行超过 6 且存在明确业务域时,至少使用 CollapseGroup 分组。
47
+ - ❌ **禁止**给 Tabs/CollapseGroup/Divider/Alert 等布局控件设 `FormWidth=24`(天然占整行)。
48
+ - ❌ **禁止**只创建 Tab 不写字段的 `Tab` 归属。
49
+ - ❌ 布局优化不得顺带覆盖字段 `Config/V8Code/KeyupV8Code` 或表级 V8 事件;修改前后必须回读比较,发现 Tab 显隐 API 时先适配再迁移。
50
+
51
+ 完整规范、Config JSON 模板、回读验收清单和反例参考见 `microi-form-layout/SKILL.md`。
52
+
53
+ ---
54
+
55
+ <!-- /microi-progressive:chunk -->
56
+ <!-- microi-progressive:chunk id=ui-design-025 sha256=e6e11a8153bc5d1a1c5e9f1868aaae9a101843961fcf94dba42681b0a6091ad7 -->
57
+ ## 缓存刷新(解决"我改了字段但页面不变"问题)
58
+
59
+ 平台对 `diy_field` 的字段列表有 Redis 缓存,键格式 `Microi:{OsClient}:FormData:diy_table_field_list:{TableId|TableName}`。
60
+
61
+ **何时缓存会失效**:
62
+ - ✅ 通过 `microi_add_field` / `microi_update_field` / `microi_update_table` 走原生 API → 自动清
63
+ - ✅ 通过低代码后台界面操作(diy_table 表单事件触发)→ 自动清
64
+ - ❌ 直接 `V8.FormEngine.UptFormData('diy_field', ...)` → **不会触发清缓存**(这是历史 bug)
65
+
66
+ **何时手动清**:
67
+ ```jsonc
68
+ microi_refresh_schema_cache { "tables": ["mall_address", "mall_member"] }
69
+ ```
70
+ 该工具会清除每张表的 6 个 key 变种(`diy_table` / `Diy_Table` / `diy_table_field_list` × `id|name`)。
71
+
72
+ ---
73
+
74
+ <!-- /microi-progressive:chunk -->
75
+ <!-- microi-progressive:chunk id=ui-design-026 sha256=3d53780b3ae17dabba22a2567d0d6e2c51e4dbce504d6e341b737881a3c4e749 -->
76
+ ## 接口引擎匿名访问
77
+
78
+ 登录、注册、首页公共数据等接口必须 `AllowAnonymous=1`,否则未登录用户调用会拿到 `null`:
79
+
80
+ ```jsonc
81
+ microi_set_engine_anonymous {
82
+ "apiEngineKeys": ["mall_member_login", "mall_member_register", "mall_home_data"],
83
+ "allowAnonymous": 1
84
+ }
85
+ ```
86
+
87
+
88
+ <!-- /microi-progressive:chunk -->
89
+ <!-- microi-progressive:chunk id=ui-design-027 sha256=e6e15cc34871821da89f70cb2a5326942d9d90fe99ed5c5a315415ac57f1532c -->
90
+ ## MCI-UI 与第三方组件库策略
91
+
92
+ Microi 的 UI 规范不应该只停留在 skills 文档。面向品牌长期建设时,应形成可复用的 MCI-UI 体系:设计变量、基础样式、组件约定、示例站点、移动端与 PC 网站组件库。
93
+
94
+ - **默认规则**:当用户没有主动指定 UI 风格、UI 库或品牌视觉时,AI 必须默认采用 Microi吾码UI(Microi.UI / MCI-UI)作为移动端、PC 官网、企业网站、产品站、活动页和响应式网站的设计基础。
95
+ - **自动识别**:只要项目属于 Microi 生态、吾码源码、吾码客户项目,或需求中出现“移动端项目、网站、企业站、商城、会员中心、资产页、官网、H5、uni-app、Vue3”等关键词,即使用户没有单独说明 UI 风格,也应自动套用本规范与 `Microi.UI/` 组件。
96
+ - **落地要求**:业务页面优先使用 `MciPage`、`MciSection`、`MciButton`、`MciCard`、`MciCell`、`MciTabs`、`MciSkeleton`、`MciDataState`、`MciThemePanel` 等组件或项目级 `mci-*` 封装;不要重新发明一套分散样式。
97
+ - **例外场景**:后台管理系统继续使用 Element Plus + Microi theme;强行业 UI 或客户指定视觉可以定制主题 token,但仍优先保留 `--mci-*` 变量、骨架屏、安全区和动效规范。
98
+ - UniApp 项目不强制业务页面直接依赖某一个第三方 UI 库。推荐把 `uni-ui` 作为官方跨端基础组件底座之一,但业务视觉必须通过 `MCI-UI Mobile` 或项目级 `mci-*` 组件封装承载,避免页面直接散落 `uni-ui/uView/FirstUI/TDesign` 风格。
99
+ - PC 后台管理系统继续使用 Element Plus,不替换选型;但主题变量、间距、骨架屏、空态、安全区、表单密度和品牌色必须服从 `--mci-*` 设计变量。
100
+ - PC 官网、产品站、文档站、营销页和响应式网站应优先使用 `MCI-UI Web` 的设计变量与轻量组件。只有当页面是强表单、强数据录入或后台化工具时,才引入 Element Plus、TDesign Vue、Naive UI、Arco Design Vue 等成熟组件库作为底座。
101
+ - MCI-UI 应分层建设:`@microi/theme` 负责 tokens;`@microi/v8` 负责前端 SDK;`@microi/ui-mobile` 面向 UniApp;`@microi/ui-web` 面向官网和响应式站点;`Microi.Client` 后台则用 Element Plus + MCI theme。
102
+ - `microi.doc` 作为 VitePress 官方文档站,应逐步成为 MCI-UI 的展示入口:组件演示、设计变量、移动端骨架屏、安全区、富文本、上传资源、主题切换都应该有可查看示例,而不是只写在 skill 中。
103
+
104
+ <!-- /microi-progressive:chunk -->
105
+ <!-- microi-progressive:chunk id=ui-design-028 sha256=eee54b657b766f1d1ef137fb1df07fc8eec0b5363502838475eda81f9d031512 -->
106
+ ## MCI-UI 源码落地位置
107
+
108
+ MCI-UI 已在吾码源码根目录落地:`Microi.UI/`。
109
+
110
+ - 新的移动端 UniApp/H5 项目应优先使用 `Microi.UI/src/uniapp` 中的 `MciPage`、`MciNavbar`、`MciButton`、`MciCard`、`MciCell`、`MciSection`、`MciTabs`、`MciMetricCard`、`MciActionBar`、`MciAvatar`、`MciProductCard`、`MciSkeleton`、`MciDataState`、`MciRichText`,再按业务补项目组件。
111
+ - 新的 PC 官网、产品站、文档站、响应式网站应优先使用 `Microi.UI/src/web` 和 `Microi.UI/src/theme`,不要直接套后台 Element Plus 风格。
112
+ - `Microi.UI/src/theme/tokens.css` 是品牌 token 源头;新组件颜色、圆角、阴影、间距、安全区、骨架屏都必须走 `--mci-*` 变量。
113
+ - `Microi.UI/src/theme/runtime.js` 是主题运行时入口;项目应通过 `initMciDesign()`、`setMciPalette()`、`setMciShape()`、`setMciTheme()` 统一设置黑白红橙黄绿青蓝紫主色、圆角/扁平、亮暗主题和动效偏好。
114
+ - `MciPage` 默认带页面入场动效;业务页如果有特殊路由转场,可以关闭 `animated` 后使用项目级转场,但不能让动态页面无反馈地直接闪现。
115
+ - `MciButton`、`MciCard` 必须保留 hover/pressed/focus/sheen 等基础反馈;业务组件可以封装样式,但不能删掉交互状态。
116
+ - 第三方 UI 库只能作为底层能力或局部补充,不能绕过 MCI-UI 直接决定产品视觉。
117
+
118
+ <!-- /microi-progressive:chunk -->
119
+ <!-- microi-progressive:chunk id=ui-design-029 sha256=470bda7401f3a1d6713872d89370bb89785e693b9e94862a7df4808db0200065 -->
120
+ ## VitePress 中文文档布局规范
121
+
122
+ `microi.doc` 不是纯文本仓库,而是 Microi 产品体验的一部分。创建或重构
123
+ `docs/doc`、`docs/case` 中文阅读页时:
124
+
125
+ - 页面首屏使用标题、简短价值说明和 2–4 个关键能力视觉分组,避免打开后先看到十几段连续正文。
126
+ - 正文阅读宽度控制在约 `86ch`,代码、表格、架构图和案例截图可使用全宽;标题间距必须明显大于段落间距。
127
+ - 卡片用于并列能力、选择和案例,表格用于精确对比,流程带用于阶段关系,截图用于真实结果;不要把相同信息在四种视觉里重复一遍。
128
+ - 使用 MCI 主题变量,不在 Markdown 中散落硬编码颜色;亮/暗主题均保证文字、边框、代码和状态对比度。
129
+ - 页面专属 CSS 独立存放并以 marker 限定范围;全站字体、段落、列表、`details`、图片与焦点样式归整站主题层。
130
+ - 桌面使用多列时,980px 以下要能降为单列;表格和代码可横向滚动,普通正文与图片不得产生页面级横向滚动。
131
+ - 图片必须有语义化 `alt` 与图注;纯装饰图标设置 `aria-hidden`。交互控件保留键盘焦点,动画遵守 `prefers-reduced-motion`。
132
+ - 完成后同时跑中文文档可读性门禁、VitePress 构建,并用真实浏览器查看桌面/移动、亮色/暗色。只看 Markdown 源码或构建日志不能算视觉验收。
133
+
134
+ 全站文档视觉改造还必须遵守:
135
+
136
+ - 清单必须覆盖 `/doc` 和 `/case` 中文阅读路由;首页、应用广场、应用详情、用户中心、登录与联系页采用专用交互布局,应显式登记后按自己的组件契约验收,不能漏扫,也不能强套正文档卡片样式。英文生成页与受保护更新日志按项目规则排除。
137
+ - 为每个中文路由维护显式视觉类型,至少区分概览、指南、参考、规范和展示页;同一主题契约按类型调节信息密度,不能把 API 参考页机械改造成营销卡片。
138
+ - 所有自定义面板都先定义“表面 + 主文字 + 次文字 + 边框”的亮暗成对 token,再使用 token 组合背景。禁止浅色硬编码背景继续继承暗色全局文字,也禁止只改背景不改前景。
139
+ - Sass 位于 `html:lang(zh)` 嵌套作用域时,暗色根状态写 `&.dark`,编译结果必须是 `html:lang(zh).dark`;不得写成会生成 `html:lang(zh) .dark` 的后代选择器。单元测试应编译 SCSS 并阻止这一回归。
140
+ - 常规正文和次要文字对其实际面板底色至少满足 WCAG AA 4.5:1,大标题至少 3:1;渐变面板按最不利的实色底计算,不能只看 token 名称推断对比度。
141
+ - “全站扫描”必须输出逐页档案和问题结果;静态通过后仍要遍历全部中文路由做 H1、横向溢出和低对比冒烟,并对五类代表页执行桌面/移动、亮/暗截图矩阵。扫描数量、构建成功或单页截图均不能单独证明全站已经美化。
142
+ <!-- /microi-progressive:chunk -->
@@ -9,6 +9,8 @@ description: Microi V8 CRUD 接口引擎开发。用于编写服务端 JavaScrip
9
9
 
10
10
  你正在开发 Microi 吾码平台的 V8 接口引擎。接口引擎是运行在服务端的 JavaScript 函数,通过 `V8.FormEngine` 操作数据库,通过 `V8.Result` 或 `return` 返回结果。
11
11
 
12
+ <!-- microi-progressive:begin -->
13
+ <!-- microi-progressive:chunk id=v8-crud-api-000 sha256=bfeaae480ebf6028fe98904cc6f8feb630b140b99551fefcc551c8038a2ca078 -->
12
14
  ## 本地优先与版本头(必做)
13
15
 
14
16
  AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目>/接口引擎/.../*.js` 本地文件,再通过 MCP 或 VS Code 插件同步到数据库。插件提示“本地和远端不一致”时,必须先读取本地与远端代码并合并有效差异,不能盲目用任一侧覆盖另一侧。
@@ -35,6 +37,8 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
35
37
 
36
38
  生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
37
39
 
40
+ <!-- /microi-progressive:chunk -->
41
+ <!-- microi-progressive:chunk id=v8-crud-api-001 sha256=86768d106f68593e51beb29bcff1ee0291c483706431181da34984b22228ff21 -->
38
42
  ## 核心规则
39
43
 
40
44
  - 接口引擎文件是纯 JavaScript(Jint 引擎,非 Node.js)
@@ -46,6 +50,8 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
46
50
  - 服务端调用 FormEngine 默认**不触发**表单 V8 事件,加 `_InvokeType: 'Client'` 才触发
47
51
  - 接口内 `return Code=1` 自动提交事务、`Code≠1` 自动回滚事务,**禁止**手动 Commit/Rollback
48
52
 
53
+ <!-- /microi-progressive:chunk -->
54
+ <!-- microi-progressive:chunk id=v8-crud-api-002 sha256=9f10ab278468f292b5e26679b7a7ab2ea91bb6d4094e2bff8adb7cb15e39adce -->
49
55
  ## 性能底线(必须自检)
50
56
 
51
57
  - 写接口引擎前必须先做数据访问计划:需要哪些表、哪些字段、预计数据量、是否分页、是否需要缓存。
@@ -64,6 +70,8 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
64
70
  - 面向个人中心的流水接口必须按 `V8.CurrentUser.Id` 强制隔离,并返回 `PageIndex`、`PageSize`、`TotalCount`;列表只取页面需要的审计字段。
65
71
  - 为便于用户核对,可以保存经过空白归一化的用户输入短摘要;摘要按 Unicode 文本元素截取,不能截断 emoji 或代理对,也不要把完整请求 JSON 当摘要。
66
72
 
73
+ <!-- /microi-progressive:chunk -->
74
+ <!-- microi-progressive:chunk id=v8-crud-api-003 sha256=d46768bbaaf8b2ebfdd38e09d11e886b135cb65e78984dbfa67d75ec5f947175 -->
67
75
  ## DosResult 状态码
68
76
 
69
77
  | Code | 含义 |
@@ -82,6 +90,8 @@ if (r.Code !== 1) return r;
82
90
  // r.Data 才是真实数据
83
91
  ```
84
92
 
93
+ <!-- /microi-progressive:chunk -->
94
+ <!-- microi-progressive:chunk id=v8-crud-api-004 sha256=6d58584cabd1659ae3af6cbddb797df2c0844c99fd8d2627d02a9c0eae98e8c2 -->
85
95
  ## 全局日期函数
86
96
 
87
97
  ```javascript
@@ -90,82 +100,8 @@ DateFormat(new Date(), 'yyyy-MM-dd') // 格式化
90
100
  DateAdd(new Date(), 'd', 7, 'yyyy-MM-dd') // 加减(s/m/h/d/w/q/M/y)
91
101
  ```
92
102
 
93
- ## 查询列表(分页)
94
-
95
- ```javascript
96
- var result = V8.FormEngine.GetTableData('SysUser', {
97
- _Where: [
98
- ['Status', '=', 1],
99
- ['AND', 'Name', 'Like', V8.Param.keyword || '']
100
- ],
101
- _SelectFields: ['Id', 'Account', 'Name', 'Phone', 'CreateTime'],
102
- _OrderBy: 'CreateTime',
103
- _OrderByType: 'DESC',
104
- _PageIndex: V8.Param.pageIndex || 1,
105
- _PageSize: V8.Param.pageSize || 20
106
- });
107
-
108
- return { Code: 1, Data: result.Data, DataCount: result.DataCount, Msg: '成功' };
109
- ```
110
-
111
- ### 请求内异步查询
112
-
113
- 后端接口引擎可在本次请求内使用真实异步查询;前端 V8 不使用这个方法名:
114
-
115
- ```javascript
116
- var result = await V8.FormEngine.GetTableDataAsync('SysUser', {
117
- _Where: [['Status', '=', 1]],
118
- _SelectFields: ['Id', 'Account', 'Name'],
119
- _PageIndex: 1,
120
- _PageSize: 20
121
- });
122
-
123
- return { Code: 1, Data: result.Data, DataCount: result.DataCount };
124
- ```
125
-
126
- 必须 `await` 结果。需要接口先返回、后续再批量处理时,应改用平台后台任务、Job、MQ 或 outbox,而不是丢弃 Promise。
127
-
128
- ### 多字段排序
129
-
130
- ```javascript
131
- var result = V8.FormEngine.GetTableData('SysUser', {
132
- _Where: [['Status', '=', 1]],
133
- _OrderBys: { 'CreateTime': 'desc', 'Name': 'asc' }
134
- });
135
- ```
136
-
137
- ### 匿名查询(无需登录)
138
-
139
- ```javascript
140
- var result = V8.FormEngine.GetTableDataAnonymous('Article', {
141
- _Where: [['IsPublished', '=', 1]],
142
- _PageSize: 10
143
- });
144
- ```
145
-
146
- 匿名新增的公开入口是
147
- `POST /api/formengine/AddFormDataAnonymous`,且目标表必须显式允许匿名新增。
148
- 当前后端 `V8.FormEngine` 接口不公开
149
- `V8.FormEngine.AddFormDataAnonymous`;接口引擎内部仍使用
150
- `V8.FormEngine.AddFormData(...)` 并遵守可信执行身份。不要仅因为历史文档出现
151
- 该名称就为匿名业务接口关闭服务端校验。
152
-
153
- ### 获取树形数据
154
-
155
- ```javascript
156
- // 表单属性需开启【树形结构】
157
- var result = V8.FormEngine.GetTableDataTree('Department', {});
158
- ```
159
-
160
- ### 仅获取数据条数
161
-
162
- ```javascript
163
- var result = V8.FormEngine.GetTableDataCount('SysUser', {
164
- _Where: [['Status', '=', 1]]
165
- });
166
- // result.DataCount 为总数
167
- ```
168
-
103
+ <!-- /microi-progressive:chunk -->
104
+ <!-- microi-progressive:chunk id=v8-crud-api-005 sha256=35220022799bbed7f9b3d82fe14dc0855aa8f77d0640ac411c61d222d02b0eda -->
169
105
  ## 查询单条
170
106
 
171
107
  ```javascript
@@ -186,6 +122,8 @@ if (result.Code !== 1 || !result.Data) {
186
122
  return { Code: 1, Data: result.Data };
187
123
  ```
188
124
 
125
+ <!-- /microi-progressive:chunk -->
126
+ <!-- microi-progressive:chunk id=v8-crud-api-006 sha256=510588ad14503caff0a92c614f0e7453bdd343a1e22711c6c5a2b3f8893b5a8d -->
189
127
  ## 新增
190
128
 
191
129
  ```javascript
@@ -227,174 +165,11 @@ for (var i = 0; i < V8.Param.items.length; i++) {
227
165
  var result = V8.FormEngine.AddTableData(addList);
228
166
  ```
229
167
 
230
- ## 更新
231
-
232
- ```javascript
233
- if (!V8.Param.Id) {
234
- return { Code: 0, Msg: 'Id 不能为空' };
235
- }
236
-
237
- var result = V8.FormEngine.UptFormData('SysUser', {
238
- Id: V8.Param.Id, // 必传
239
- Name: V8.Param.Name,
240
- Phone: V8.Param.Phone,
241
- _NotSaveField: ['Account'], // 可选:忽略这些字段不更新
242
- _NoLineForAdd: true, // 可选:数据不存在时自动插入
243
- _ForceUpt: true // 可选:强制修改自动编号字段
244
- });
245
-
246
- return { Code: result.Code, Msg: result.Code === 1 ? '更新成功' : result.Msg };
247
- ```
248
-
249
- ### 批量更新
250
-
251
- ```javascript
252
- var uptList = [];
253
- for (var i = 0; i < V8.Param.items.length; i++) {
254
- uptList.push({
255
- FormEngineKey: 'SysUser',
256
- Id: V8.Param.items[i].Id,
257
- Status: V8.Param.items[i].Status
258
- });
259
- }
260
- V8.FormEngine.UptTableData(uptList);
261
- ```
262
-
263
- ## 删除
264
-
265
- ```javascript
266
- // 删除单条
267
- var result = V8.FormEngine.DelFormData('SysUser', { Id: V8.Param.Id });
268
-
269
- // 批量删除(传 Ids 数组)
270
- var result = V8.FormEngine.DelFormData('SysUser', { Ids: V8.Param.Ids });
271
-
272
- return { Code: result.Code, Msg: result.Code === 1 ? '删除成功' : result.Msg };
273
- ```
274
-
275
- ### 批量删除(跨表)
276
-
277
- ```javascript
278
- var delList = [];
279
- delList.push({ FormEngineKey: 'OrderDetail', Id: V8.Param.detailId });
280
- delList.push({ FormEngineKey: 'OrderHeader', Id: V8.Param.orderId });
281
- V8.FormEngine.DelTableData(delList);
282
- ```
283
-
284
- ## 按条件批量操作
285
-
286
- ```javascript
287
- // 按条件更新
288
- V8.FormEngine.UptFormDataByWhere('SysUser', {
289
- _Where: [['DeptId', '=', V8.Param.deptId]],
290
- Status: 0,
291
- _NoLineForAdd: true // 可选:不存在时插入
292
- });
293
-
294
- // 按条件删除(不支持 _Where 以外的删除方式)
295
- V8.FormEngine.DelFormDataByWhere('SysUser', {
296
- _Where: [['Status', '=', 0], ['AND', 'CreateTime', '<', '2024-01-01']]
297
- });
298
- ```
299
-
300
- ## 事务处理
301
-
302
- ```javascript
303
- // 接口引擎中 V8.Db 自动开启事务:
304
- // 返回DosResult/带Code对象:仅Code=1提交,其他值回滚
305
- // 返回对象但没有Code:回滚
306
- // 返回字符串/数字/数组/布尔/null且未异常:提交
307
- // 手动调用 V8.DbTrans.Commit() 或 Rollback() 无效,由平台统一管理
308
-
309
- // FormEngine 可传入事务对象(第三个参数)
310
- V8.FormEngine.AddFormData('Table1', { Name: '测试' }, V8.DbTrans);
311
- V8.FormEngine.UptFormData('Table2', { Id: 'xxx', Status: 1 }, V8.DbTrans);
312
-
313
- // 调用其他接口引擎也可共享事务
314
- V8.ApiEngine.Run('other-engine-key', { Id: 'xxx' }, V8.DbTrans);
315
- ```
316
-
317
- ## 请求内异步与后台处理
318
-
319
- ```javascript
320
- // 本次请求必须拿到结果时,使用真实Async API并await
321
- var resp = await V8.Http.PostResponseAsync({
322
- Url: 'https://other.com/notify',
323
- PostParam: { Id: V8.Param.id },
324
- Timeout: 10
325
- });
326
- return resp.StatusCode >= 200 && resp.StatusCode < 300
327
- ? { Code: 1 }
328
- : { Code: 0, Msg: '通知失败' };
329
- ```
330
-
331
- 禁止用 `setTimeout` / `Task.Run` 实现“立即返回、后台继续”:接口返回后 Jint Engine、租户上下文、事务和执行租约会释放。脱离请求的任务使用后台任务、Job、MQ 或 outbox,并按 `EventId` 幂等处理与恢复。
332
-
333
- ## 动态加字段(运行时改表结构)
334
-
335
- ```javascript
336
- V8.FormEngine.AddField({
337
- TableName: 'diy_test',
338
- Name: 'Age',
339
- Type: 'int', // 仅使用平台允许的varchar(N)/mediumtext/longtext/int/bigint/decimal(18,N)
340
- Label: '年龄',
341
- Component: 'NumberText',
342
- TableWidth: '100',
343
- Visible: 1
344
- });
345
- ```
346
-
347
- > 风险:会执行 DDL(ALTER TABLE)。仅在低代码自定义配置场景使用,业务运行时**不要**频繁调用。
348
-
349
- 日期时间字段统一使用 `varchar(25)` 保存 `yyyy-MM-dd HH:mm:ss`,组件使用 `DateTime`。禁止 `datetime/date/timestamp/float/double/boolean/string/text/nvarchar` 等平台不允许的物理类型。动态表/字段属于控制面能力,只允许 `Level >= 9999` 的可信管理脚本使用。
350
-
351
- ## 旧版 _Where 兼容
352
-
353
- ```javascript
354
- // 老版本前端 / 老接口可能传旧格式 _Where:[{ Name, Value, Type, AndOr, Group }, ...]
355
- // 转换成新格式:
356
- var newWhere = V8.Method.ParseWhere(V8.Param._Where);
357
- V8.FormEngine.GetTableData('Table', { _Where: newWhere });
358
- ```
359
-
360
- ## _Where 条件语法速查
361
-
362
- ```javascript
363
- // 等于
364
- [['Field', '=', value]]
365
-
366
- // 模糊查询
367
- [['Name', 'Like', '张']] // %张%
368
- [['Name', 'StartLike', '张']] // 张%
369
- [['Name', 'EndLike', '三']] // %三
370
-
371
- // AND / OR
372
- [['A', '=', 1], ['AND', 'B', '>', 10]]
373
- [['A', '=', 1], ['OR', 'B', '=', 2]]
374
-
375
- // IN / NotIn
376
- [['Id', 'In', ['id1', 'id2', 'id3']]]
377
- [['Status', 'NotIn', [0, -1]]]
378
-
379
- // NULL
380
- [['Field', '=', null]] // IS NULL
381
- [['Field', '<>', null]] // IS NOT NULL
382
-
383
- // 分组(括号)
384
- [['Name', 'Like', '张'], ['AND', '(', 'Age', '>', 18], ['OR', 'Status', '=', 1, ')']]
385
-
386
- // 日期范围
387
- [['CreateTime', '>=', '2024-01-01'], ['AND', 'CreateTime', '<', '2024-02-01']]
388
- ```
389
-
390
- **支持的操作符:** `=`, `==`, `<>`, `!=`, `>`, `>=`, `<`, `<=`, `Like`, `NotLike`, `StartLike`, `EndLike`, `In`, `NotIn`
168
+ <!-- /microi-progressive:chunk -->
169
+ ## 详细参考路由(渐进披露)
391
170
 
392
- ## 注意事项
171
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
393
172
 
394
- - `_Where` 是参数化查询,自动防 SQL 注入,**不要拼接 SQL 字符串**
395
- - `AddFormData` 不需要传 `Id`,后端自动生成 GUID
396
- - `UptFormData` 必须包含 `Id` 字段
397
- - 如需触发表单 V8 事件,在参数中加 `_InvokeType: 'Client'`
398
- - 返回值中 `Code: 1` 表示成功,`Code: 0` 表示失败,`Code: 2` 表示数据不存在
399
- - 分页参数使用 `_PageIndex` 和 `_PageSize`(带下划线前缀)
400
- - 列表返回总数字段为 `result.DataCount`(非 Total)
173
+ - [references/progressive-01-查询列表-分页.md](references/progressive-01-查询列表-分页.md):查询列表(分页);更新;删除;按条件批量操作;事务处理;请求内异步与后台处理;动态加字段(运行时改表结构);旧版 _Where 兼容
174
+ - [references/progressive-02-where-条件语法速查.md](references/progressive-02-where-条件语法速查.md):_Where 条件语法速查;注意事项
175
+ <!-- microi-progressive:end -->