@microi.net/cli 4.6.2
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/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/mcp-codex-stdio-adapter.js +189 -0
- package/dist/mcp-server.js +972 -0
- package/dist/mcp-trae-windows-launcher.cmd +21 -0
- package/dist/microi-cli-mcp.js +7 -0
- package/dist/microi-cli.js +1645 -0
- package/dist/microi-skills.meta.json +335 -0
- package/dist/microi.skills/.microi-skills-version.json +6 -0
- package/dist/microi.skills/README.md +276 -0
- package/dist/microi.skills/ai-engine/SKILL.md +140 -0
- package/dist/microi.skills/ai-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/app-store/SKILL.md +105 -0
- package/dist/microi.skills/app-store/agents/openai.yaml +4 -0
- package/dist/microi.skills/business-blueprint/SKILL.md +184 -0
- package/dist/microi.skills/datasource-engine/SKILL.md +89 -0
- package/dist/microi.skills/datasource-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/dos-orm/SKILL.md +76 -0
- package/dist/microi.skills/dos-orm/references/api-reference.md +229 -0
- package/dist/microi.skills/job-engine/SKILL.md +141 -0
- package/dist/microi.skills/job-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/message-notification/SKILL.md +113 -0
- package/dist/microi.skills/message-notification/agents/openai.yaml +6 -0
- package/dist/microi.skills/message-notification/references/contracts.md +99 -0
- package/dist/microi.skills/microi-ai-app-auth.js +651 -0
- package/dist/microi.skills/microi-ai-application/SKILL.md +80 -0
- package/dist/microi.skills/microi-ai-application/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-ai-application/references/frontend-baseline.md +164 -0
- package/dist/microi.skills/microi-client-frontend/SKILL.md +562 -0
- package/dist/microi.skills/microi-datasource-mapping/SKILL.md +108 -0
- package/dist/microi.skills/microi-db-schema/SKILL.md +170 -0
- package/dist/microi.skills/microi-db-schema/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-db-schema/references/core-tables.md +695 -0
- package/dist/microi.skills/microi-db-schema/references/form-component-options.md +256 -0
- package/dist/microi.skills/microi-db-schema/references/schema-overview.md +203 -0
- package/dist/microi.skills/microi-db-schema/references/schema.md +647 -0
- package/dist/microi.skills/microi-db-schema/references/table-catalog.md +1607 -0
- package/dist/microi.skills/microi-deployment/SKILL.md +117 -0
- package/dist/microi.skills/microi-deployment/references/deployment-matrix.md +94 -0
- package/dist/microi.skills/microi-docs-coverage/SKILL.md +91 -0
- package/dist/microi.skills/microi-docs-coverage/references/capability-map.md +65 -0
- package/dist/microi.skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +887 -0
- package/dist/microi.skills/microi-form-engine/SKILL.md +159 -0
- package/dist/microi.skills/microi-form-engine/references/component-catalog.md +116 -0
- package/dist/microi.skills/microi-form-engine/references/data-source-events.md +117 -0
- package/dist/microi.skills/microi-form-layout/SKILL.md +373 -0
- package/dist/microi.skills/microi-frontend-sdk/SKILL.md +304 -0
- package/dist/microi.skills/microi-left-right-layout/SKILL.md +132 -0
- package/dist/microi.skills/microi-microservice/SKILL.md +115 -0
- package/dist/microi.skills/microi-microservice/references/runtime-delivery.md +145 -0
- package/dist/microi.skills/microi-mobile-app-quality/SKILL.md +436 -0
- package/dist/microi.skills/microi-solution-quotation/SKILL.md +76 -0
- package/dist/microi.skills/microi-solution-quotation/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -0
- package/dist/microi.skills/microi-system-delivery/SKILL.md +446 -0
- package/dist/microi.skills/microi-ui/SKILL.md +321 -0
- package/dist/microi.skills/microi-uniapp-frontend/SKILL.md +483 -0
- package/dist/microi.skills/microi.v8.js +1758 -0
- package/dist/microi.skills/module-engine/SKILL.md +131 -0
- package/dist/microi.skills/module-engine/references/module-config.md +174 -0
- package/dist/microi.skills/page-engine/SKILL.md +397 -0
- package/dist/microi.skills/performance-testing/SKILL.md +207 -0
- package/dist/microi.skills/playwright-e2e/SKILL.md +769 -0
- package/dist/microi.skills/print-engine/SKILL.md +237 -0
- package/dist/microi.skills/production-readonly-audit/SKILL.md +39 -0
- package/dist/microi.skills/report-engine/SKILL.md +69 -0
- package/dist/microi.skills/report-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/search-engine/SKILL.md +73 -0
- package/dist/microi.skills/search-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/spider-engine/SKILL.md +188 -0
- package/dist/microi.skills/translate-engine/SKILL.md +91 -0
- package/dist/microi.skills/translate-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/ui-design/SKILL.md +1575 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/app.js +54 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/index.html +163 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/styles.css +311 -0
- package/dist/microi.skills/ui-design/assets/templates/MCI-DESIGN.md +98 -0
- package/dist/microi.skills/ui-design/references/design-pattern-library.md +171 -0
- package/dist/microi.skills/ui-design/references/mci-design-contract.md +84 -0
- package/dist/microi.skills/ui-design/references/motion-and-media.md +71 -0
- package/dist/microi.skills/ui-design/references/product-flow-recipes.md +94 -0
- package/dist/microi.skills/uniapp-mall-assets/SKILL.md +105 -0
- package/dist/microi.skills/v8-api-config/SKILL.md +272 -0
- package/dist/microi.skills/v8-cache-pattern/SKILL.md +286 -0
- package/dist/microi.skills/v8-crud-api/SKILL.md +398 -0
- package/dist/microi.skills/v8-debugging/SKILL.md +279 -0
- package/dist/microi.skills/v8-explorer-tree/SKILL.md +224 -0
- package/dist/microi.skills/v8-export-import/SKILL.md +590 -0
- package/dist/microi.skills/v8-file-upload/SKILL.md +497 -0
- package/dist/microi.skills/v8-formengine-http/SKILL.md +218 -0
- package/dist/microi.skills/v8-frontend-events/SKILL.md +349 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print-api.md +107 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print.md +185 -0
- package/dist/microi.skills/v8-http-integration/SKILL.md +379 -0
- package/dist/microi.skills/v8-image-processing/SKILL.md +187 -0
- package/dist/microi.skills/v8-image-processing/agents/openai.yaml +4 -0
- package/dist/microi.skills/v8-image-processing/references/api-reference.md +620 -0
- package/dist/microi.skills/v8-menu-buttons/SKILL.md +661 -0
- package/dist/microi.skills/v8-mongodb/SKILL.md +149 -0
- package/dist/microi.skills/v8-mq-mqtt/SKILL.md +227 -0
- package/dist/microi.skills/v8-saas-multi-tenant/SKILL.md +193 -0
- package/dist/microi.skills/v8-security/SKILL.md +417 -0
- package/dist/microi.skills/v8-sql-query/SKILL.md +290 -0
- package/dist/microi.skills/v8-table-event/SKILL.md +385 -0
- package/dist/microi.skills/v8-template-engine/SKILL.md +165 -0
- package/dist/microi.skills/v8-utilities/SKILL.md +79 -0
- package/dist/microi.skills/v8-utilities/references/client-api-index.md +136 -0
- package/dist/microi.skills/v8-utilities/references/platform-http-routes.md +80 -0
- package/dist/microi.skills/v8-utilities/references/server-api-index.md +129 -0
- package/dist/microi.skills/v8-workflow/SKILL.md +322 -0
- package/dist/microi.skills/workspace-conventions/SKILL.md +479 -0
- package/package.json +40 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: microi-datasource-mapping
|
|
3
|
+
description: Microi 选项类字段的数据源 Key/Value 映射规范。用于 Select、Radio、Checkbox、UniApp 枚举显示、KeyValue 配置、数据迁移和接口返回标签映射。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# microi-datasource-mapping — 数据源 Key/Value 映射规范
|
|
7
|
+
|
|
8
|
+
## 一、后台字段数据源的两种模式
|
|
9
|
+
|
|
10
|
+
Microi 低代码平台中,`Select / Radio / Checkbox` 等选项组件支持两种数据源配置方式:
|
|
11
|
+
|
|
12
|
+
| 模式 | 格式 | DB 存储值 | 前端显示值 | 示例 |
|
|
13
|
+
|------|------|-----------|-----------|------|
|
|
14
|
+
| **Key ≠ Value**(推荐) | `"key1\|label1,key2\|label2"` | key (如 `"VIP"`) | label (如 `"VIP会员"`) | `"VIP\|VIP会员,普通会员\|普通会员"` |
|
|
15
|
+
| **Key = Value**(简单) | `"值1,值2,值3"` | 原始值 (如 `"普通会员"`) | 原始值 (如 `"普通会员"`) | `"普通会员,VIP"` |
|
|
16
|
+
|
|
17
|
+
> ⚠️ 注意:若误将 Key 与 Value 设置为相同中文,后台和 DB 中存的就是中文字符串(如 `Level='普通会员'`)。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 二、移动端前端显示枚举值的规范
|
|
22
|
+
|
|
23
|
+
移动端(UniApp)不应假定页面已经加载后台 `diy_field.Config`。优先由接口返回当前租户可用的 `Key/Value` 选项,或复用项目内的共享字典模块;只有不会被租户配置动态修改的协议枚举,才适合在前端维护映射函数:
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
// ✅ 正确做法:手写完整的枚举映射
|
|
27
|
+
function statusLabel(status) {
|
|
28
|
+
return ({
|
|
29
|
+
Draft: '草稿',
|
|
30
|
+
Enabled: '启用',
|
|
31
|
+
Disabled: '停用'
|
|
32
|
+
})[status] || status; // 未知值显示原始 key
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ✅ 动态选项:后端返回 [{ Key, Value }] 后建立映射
|
|
36
|
+
export function createOptionLabel(options = []) {
|
|
37
|
+
const map = new Map(options.map(x => [String(x.Key), x.Value]));
|
|
38
|
+
return key => map.get(String(key ?? '')) || String(key ?? '');
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**原则**:
|
|
43
|
+
- 映射函数兜底返回原始 key,方便发现新枚举值或配置漂移
|
|
44
|
+
- **不要** 用 `|| '未知'` 作为兜底,否则后台新增类型后移动端会显示"未知"而不是英文 key(更难排查)
|
|
45
|
+
- 租户可配置的 Select/Radio/Checkbox 选项不得复制成官方 Skill 中的固定业务字典
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 三、历史遗留数据迁移
|
|
50
|
+
|
|
51
|
+
从第三方数据库迁移枚举前,先用 `microi_inspect_external_database` 确认真实字段类型和说明,再用受限 `microi_query_external_database` 抽样唯一值。第三方显示文字不能直接成为吾码协议 Key;建立明确的“源值 -> 稳定 Key -> 展示 Value”映射,未识别值进入失败清单,禁止静默写成“未知”。持续同步应把映射版本写入任务配置,并保证同一源记录重投不会重复新增。
|
|
52
|
+
|
|
53
|
+
当后台 Select 字段的 Key 发生变更时(如从英文 `Normal` 改为中文 `普通会员`),DB 中已存入的旧 key 不会自动更新。需要手动执行迁移:
|
|
54
|
+
|
|
55
|
+
```js
|
|
56
|
+
// 接口引擎:一次性数据迁移
|
|
57
|
+
var affected = V8.Db.FromSql(
|
|
58
|
+
'UPDATE biz_member SET Level = @p0, UpdateTime = @p1 WHERE Level = @p2'
|
|
59
|
+
)
|
|
60
|
+
.AddInParameter('@p0', 'NormalMember')
|
|
61
|
+
.AddInParameter('@p1', DateNow('yyyy-MM-dd HH:mm:ss'))
|
|
62
|
+
.AddInParameter('@p2', 'Normal')
|
|
63
|
+
.ExecuteNonQuery();
|
|
64
|
+
return { Code: 1, Msg: '迁移完成,共更新 ' + affected + ' 条', Data: { Updated: affected } };
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**最佳实践**:
|
|
68
|
+
1. 执行前先 `SELECT COUNT(*)` 确认受影响行数
|
|
69
|
+
2. 迁移接口默认 `StopHttp=1`,仅管理员可运行;保留版本和审计记录
|
|
70
|
+
3. 新字段应从一开始就统一使用 Key≠Value 格式(英文 key + 中文 label),避免后续迁移
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 四、租户与项目映射隔离
|
|
75
|
+
|
|
76
|
+
官方 Skill 只维护平台通用机制,不记录任何客户名称、真实 `OsClient`、客户表名、接口 Key 或业务枚举。项目专有映射应保存在对应应用源码、租户私有配置或项目级 Skill 中,并遵循以下规则:
|
|
77
|
+
|
|
78
|
+
1. 每个映射注明事实源(字段 KeyValue、数据源引擎或接口引擎)和更新时间。
|
|
79
|
+
2. 动态选项优先实时读取;允许缓存时,缓存 Key 必须包含 `OsClient` 和配置版本。
|
|
80
|
+
3. 后台字段配置修改后刷新字段/数据源缓存,前端不得长期保留另一份无版本的硬编码字典。
|
|
81
|
+
4. 历史值兼容只放在受影响项目中;迁移完成后仍保留审计与回滚说明。
|
|
82
|
+
5. 示例统一使用 `demo`、`biz_*` 等虚构名称,禁止把客户项目复制进官方文档、官方 Skill 或平台 AI 公共知识库。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 五、接口引擎 OsClient 传递规范
|
|
87
|
+
|
|
88
|
+
### UniApp 调用 `/apiengine/xxx` 时
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
// ✅ 正确:OsClient 通过请求头传递,URL 不需要附加 --OsClient-- 后缀
|
|
92
|
+
function withOsClient(url) {
|
|
93
|
+
if (url.includes('/apiengine/')) {
|
|
94
|
+
return url; // OsClient 已在 header 中
|
|
95
|
+
}
|
|
96
|
+
const sep = url.includes('?') ? '&' : '?';
|
|
97
|
+
return `${url}${sep}OsClient=${encodeURIComponent(OS_CLIENT)}`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 请求头中包含:
|
|
101
|
+
// { OsClient: OS_CLIENT, Token: 'xxx', ... }
|
|
102
|
+
|
|
103
|
+
// ❌ 不要在已经携带租户请求头时,再把租户写死到 URL
|
|
104
|
+
// /apiengine/order-query--OsClient--demo--
|
|
105
|
+
// 这种写法在路由匹配时可能出错,导致 404 或参数丢失
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**结论**:`callEngine()` 系列函数已在请求头中传递 `OsClient` 时,无需在 URL 中重复传递。对于需要 query 参数识别租户的端点,使用运行期变量 `?OsClient=${encodeURIComponent(OS_CLIENT)}`,不得写死真实租户。
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: microi-db-schema
|
|
3
|
+
description: Microi 吾码数据库结构与字典指南。用于检查或解释 AI-Project/microi/db.json 中的 Microi 平台表,梳理 diy_table/diy_field/sys_menu 关系,定位 V8 事件存储字段,生成安全的系统表 V8 FormEngine 查询,或分析工作流、SaaS、权限、菜单、接口引擎、数据源和系统配置结构。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Microi DB Schema
|
|
7
|
+
|
|
8
|
+
使用本 skill 回答数据库结构问题,并编写依赖 Microi 吾码平台表名、字段名和关系的代码。
|
|
9
|
+
|
|
10
|
+
## 快速流程
|
|
11
|
+
|
|
12
|
+
1. 阅读 `references/schema.md` 获取完整数据库结构:固定字段、核心关系、V8 事件字段、全部表分类,以及每张核心表的字段明细。
|
|
13
|
+
2. 编写感知结构的 V8 代码时,优先使用带 `_Where` 的 `V8.FormEngine`。只有联表、聚合或 FormEngine 无法表达的场景才使用 `V8.Db.FromSql`,并且必须参数化动态值。
|
|
14
|
+
3. 将 `AI-Project/microi/db.json` 视为当前导出字段列表的权威来源。它列出可配置字段;DIY 表还带有导出中未列出的固定系统字段(`Id`、`CreateTime`、`UpdateTime`、`UserId`、`UserName`、`IsDeleted`)。
|
|
15
|
+
|
|
16
|
+
## 核心模型
|
|
17
|
+
|
|
18
|
+
- `diy_table` 存储表单/表元数据和表级 V8 事件。
|
|
19
|
+
- `diy_field` 存储每张 DIY 表的字段,包括组件类型、校验、可见性、数据源、字段事件和模板 V8。
|
|
20
|
+
- `sys_menu` 将 DIY 表转换为菜单/模块页面,并存储查询、按钮、导入导出、卡片/移动端、工作流和权限相关的模块配置。
|
|
21
|
+
- `sys_apiengine` 存储接口引擎定义;通过 `V8.ApiEngine.Run(ApiEngineKey, params)` 调用。
|
|
22
|
+
- `sys_datasource` 存储组件和页面可复用的数据源。
|
|
23
|
+
- `microi_database` 将扩展数据库 key 映射到 `V8.Dbs.<DbKey>`。
|
|
24
|
+
- `wf_*` 表存储工作流设计、节点、连线、实例、待办和历史。
|
|
25
|
+
|
|
26
|
+
### 外部数据库结构发现
|
|
27
|
+
|
|
28
|
+
- `microi_get_db_schema` 只读取当前吾码租户自身的 DIY/物理表结构,不接受第三方连接串。
|
|
29
|
+
- 用户提供 MySQL、SQL Server、Oracle、PostgreSQL、达梦或人大金仓连接信息时,先用 `microi_list_database_types` 归一化类型,再用 `microi_inspect_external_database` 读取表、字段、类型、空值、默认值、主键和说明。
|
|
30
|
+
- 临时读取不等于保存连接。只有用户明确确认后才能调用 `microi_save_database_connection`;结果与工作记录不得回显连接字符串。
|
|
31
|
+
- 默认抽样使用只读的 `microi_query_external_database`。用户明确要求数据库管理级操作时,可使用独立的 `microi_execute_external_database` 执行 DML、DDL、存储过程和多语句;该接口必须由后端验证当前用户 `Level >= 9999`、显式确认并写脱敏审计。
|
|
32
|
+
- 外部结构映射到吾码时仍需走 Manifest 计划、`dryRun:true`、确认写入和 `microi_validate_system`,不能把第三方物理 DDL 直接复制到吾码主库。
|
|
33
|
+
- 大批量同步使用稳定业务键、唯一约束和 upsert;MCP 适合结构发现和抽样,持续搬运应生成接口引擎、Job 或 MQ 消费者。
|
|
34
|
+
|
|
35
|
+
## AI 应用持久化表创建规则(强制)
|
|
36
|
+
|
|
37
|
+
- AI 创建的应用、业务模块或演示项目,只要需要持久化业务数据,默认必须通过 `microi_create_table`、Manifest + `microi_generate_system` 等 MCP 标准建模入口创建表,确保物理表、`diy_table` 和 `diy_field` 同步落地。不得只执行 `CREATE TABLE`、只导入物理表,或只写 `diy_table` 元数据。
|
|
38
|
+
- 这样创建的业务表必须能在表单引擎中查看,并能由 `V8.FormEngine` / FormEngine HTTP API 正常查询和写入。接口引擎应优先通过 FormEngine 操作这些表;只有联表、聚合或 FormEngine 无法表达的场景才使用参数化 SQL。
|
|
39
|
+
- 平台框架表、第三方组件自维护表、迁移中间表、数据库运维表等确实不适合表单引擎的物理表可以例外,但必须在交付记录中说明用途和例外原因,不能把普通 AI 应用业务表归入例外。
|
|
40
|
+
- 建模完成后必须回读验收:`microi_get_db_schema` 能看到物理表及字段;`diy_table.Name` 唯一对应物理表;`diy_field.TableId` 均正确关联;至少执行一次 FormEngine 查询或可回滚 CRUD 验证。发现“物理表存在、表单引擎不可见”时,应补齐标准元数据或删除孤儿物理表,不能把它当作已交付。
|
|
41
|
+
- 统计表数量时必须区分三个口径:物理表总数、有效 `diy_table` 元数据数、应用安装包内表引用数。安装包引用数可能包含平台基础表并跨应用重复,不能直接相加后当成租户实际唯一表数。
|
|
42
|
+
|
|
43
|
+
## 数据库索引建模与 MCP 执行规则(强制)
|
|
44
|
+
|
|
45
|
+
数据库索引是低代码数据模型的一部分,不是上线后的临时 SQL 调优。只要需求、蓝图、接口、Job、工作流或评审明确指出“某表的某些字段需要索引/唯一约束”,就必须把索引写入 Manifest 的 `tables[].indexes`,并通过 `microi_create_table_index` 创建;禁止用 `V8.Db`、接口引擎、原生 FormEngine、一次性维护引擎或手写 `CREATE INDEX` 绕过 MCP。
|
|
46
|
+
|
|
47
|
+
标准流程:
|
|
48
|
+
|
|
49
|
+
1. `microi_get_db_schema` 核对表和字段。
|
|
50
|
+
2. `microi_get_table_indexes(tableName)` 读取真实物理索引,不能根据 `diy_field.Unique` 或源码猜测。
|
|
51
|
+
3. 根据真实查询的 `WHERE / JOIN / ORDER BY / GROUP BY` 设计有序字段,先写入 Manifest `tables[].indexes`。
|
|
52
|
+
4. `microi_plan_system` / `microi_generate_system(dryRun:true)` 检查字段引用;单独变更时直接调用 `microi_create_table_index`,并传 `confirmExecution=tableName`。
|
|
53
|
+
5. 再次调用 `microi_get_table_indexes` 回读;DIY 表还必须在 `Microi.Client` 的“开发设计 → 索引管理”中看到同名索引、正确字段顺序和唯一性。
|
|
54
|
+
6. 删除前先回读精确名称,只能用 `microi_drop_table_index`;主键索引禁止删除,删除确认值使用 `tableName:indexName`。
|
|
55
|
+
|
|
56
|
+
必须评估并通常建立索引的字段组合:
|
|
57
|
+
|
|
58
|
+
- 租户业务表:所有租户内高频查询的组合索引通常以 `OsClient` 开头,例如 `(OsClient, Status, CreateTime)`;不能只给 `Status` 建低选择性单列索引。
|
|
59
|
+
- 业务唯一键和幂等键:订单号、外部流水号、`EventId`、`IdempotencyKey` 等必须按真实隔离边界建立唯一索引,例如 `(OsClient, OrderNo)`,不能只做“先查再新增”。
|
|
60
|
+
- 外键和子表回查:高频 `JOIN`、`TableChildFkFieldName`、`XxxId` 明细列表必须覆盖关联字段;如果查询同时固定租户和状态,按等值字段在前、范围/排序字段在后的顺序设计组合索引。
|
|
61
|
+
- 待办、Job、outbox/inbox、重试队列:按实际抢占语句建立 `(OsClient, Status, NextRetryTime)`、`(OsClient, JobKey, ScheduleTime)` 等索引,并为稳定事件/任务键增加唯一索引。
|
|
62
|
+
- 高频时间范围列表:常用租户/类型/状态等值条件在前,`CreateTime`、`UpdateTime` 等范围或排序字段在后。
|
|
63
|
+
|
|
64
|
+
禁止机械建索引:
|
|
65
|
+
|
|
66
|
+
- 不得把 `SearchFieldIds`、`SortFieldIds`、`StatisticsFields` 中每个字段都自动变成单列索引;必须结合真实查询与选择性。
|
|
67
|
+
- `Status`、开关、性别、删除标记等低基数字段通常不能单独建索引;只有作为高频组合索引的一部分才有价值。
|
|
68
|
+
- `LIKE '%keyword%'`、富文本、长文本、JSON、上传、地图、布局、子表控件等不能靠普通 B-tree 索引解决;应改为前缀查询、专用搜索引擎、生成列或其它明确方案。
|
|
69
|
+
- 组合索引遵守最左前缀;重复/被更长索引左前缀完全覆盖的索引应合并。索引过多会增加写放大和锁等待,必须在交付中说明查询依据。
|
|
70
|
+
- 唯一索引是业务约束。创建前必须检查并处理历史重复数据与 `NULL` 语义;不得为了让 DDL 通过而静默删改生产数据。
|
|
71
|
+
|
|
72
|
+
平台核心表的发布变更还必须同步正式升级资源/迁移,确保新租户和旧租户升级一致;但对指定在线租户的实际创建、修复和回读仍必须通过上述 MCP 索引工具完成,不能只提交迁移源码便宣称线上已生效。
|
|
73
|
+
|
|
74
|
+
## diy_table 命名规则
|
|
75
|
+
|
|
76
|
+
创建或修复 `diy_table` 时必须区分三个字段职责:
|
|
77
|
+
|
|
78
|
+
- `Name`:英文物理表名或表 Key,例如 `edu_exam_question`、`mci_spider_rule`。不要写中文,不要写长说明。
|
|
79
|
+
- `Description`:简短中文表名,例如 `商品`、`订单`、`采集规则`。不要写一整段用途说明。
|
|
80
|
+
- `Remark`:备注/表详细说明,用于写业务用途、维护规则、交付说明、注意事项等长文本。
|
|
81
|
+
|
|
82
|
+
AI 或 MCP 生成低代码系统时,必须默认遵守此规则。发现已有数据把长说明写进 `Description` 时,应将短中文名保留在 `Description`,把详细说明迁移到 `Remark`,并回读 `diy_table` 验证。
|
|
83
|
+
|
|
84
|
+
## sys_menu 生成默认配置
|
|
85
|
+
|
|
86
|
+
后台菜单默认必须是有分类的树形结构。AI/MCP 创建真实业务后台时,先创建业务域或系统域父菜单,再把 CRUD、报表、规则、任务、日志、设置等叶子模块挂到父级;不要把一批叶子模块直接创建到根级。改造已有菜单时必须回读 `sys_menu`,更新 `ParentId`/`Sort`,补管理员角色权限,并再次回读验证最终树结构。
|
|
87
|
+
|
|
88
|
+
通过自然语言 + MCP 创建后端菜单时,不能只写 `Name`、`DiyTableId` 和基础路由。绑定 `diyTableId` 的 CRUD 菜单应显式配置,或允许 MCP/后端自动推断以下字段:
|
|
89
|
+
|
|
90
|
+
- `TableDiyFieldIds` / `SelectFields`:列表列优先选择名称、标题、编号、状态、类型、负责人、金额、数量、时间等业务可读字段。
|
|
91
|
+
- `SearchFieldIds`:默认选择名称/标题/编号、状态/类型/分类、负责人/部门/客户、日期时间等常用筛选字段;`Select`、`Radio`、`Checkbox`、`Switch`、`Department`、树/级联/地址等控件默认按等值筛选。
|
|
92
|
+
- `NotShowFields`:默认隐藏 `Id`、`XxxId`、`XxxIds`、租户/系统字段、布局控件,以及富文本、上传、地图、子表、代码编辑器等不适合表格展示的重字段。
|
|
93
|
+
- `SortFieldIds` / `DefaultOrderBy`:默认包含日期时间、`Sort`、金额/数量等排序字段,并优先按 `CreateTime DESC`。
|
|
94
|
+
- `StatisticsFields`:金额、价格、数量、积分、余额、人数、总计等数值字段默认配置 `Sum` 统计。
|
|
95
|
+
- `MobileListFields` / `CardTitleTagFields` / `CardBottomTagFields`:移动端或卡片列表默认保留 3-4 个高信息密度字段,标题标签优先状态/类型/分类,底部标签优先金额/数量/时间。
|
|
96
|
+
|
|
97
|
+
显式配置优先级最高;未指定时由 MCP 生成器或后端 `CreateModule` 兜底补齐,避免空白菜单配置。
|
|
98
|
+
|
|
99
|
+
隐藏子表菜单规则:用于 `TableChild`、附件明细、微服务页面/路由子表等表单内嵌承载的 `sys_menu`,必须设置 `Display=0`、`AppDisplay=0`、`HasChild=0`。隐藏菜单不应再开启“是否有子集”,否则 PC/移动端菜单树会把上级业务菜单误判为空父菜单。
|
|
100
|
+
|
|
101
|
+
## 表单控件与布局
|
|
102
|
+
|
|
103
|
+
表单控件以 `Microi.Client/src/views/form-engine/diy-field-component/` 和 `diy-component-list.json` 为事实源。当前常用组件包括:`Text`、`Guid`、`Textarea`、`NumberText`、`DateTime`、`Select`、`MultipleSelect`、`Radio`、`Checkbox`、`Switch`、`Rate`、`Progress`、`Slider`、`ColorPicker`、`AutoNumber`、`Button`、`Divider`、`CollapseGroup`、`Tabs`、`Alert`、`StaticText`、`Html`、`RichText`、`CodeEditor`、`JsonTable`、`ImgUpload`、`FileUpload`、`Autocomplete`、`TagInput`、`Transfer`、`Cascader`、`Address`、`Department`、`SelectTree`、`TreeCheckbox`、`OpenTable`、`JoinTable`、`JoinForm`、`TableChild`、`Map`、`MapArea`、`Qrcode`、`FontAwesome`、`DevComponent`。
|
|
104
|
+
|
|
105
|
+
字段较多的表单不要全部堆在一页:优先设置 `diy_table.Tabs`,并给字段写入 `diy_field.Tab`,常见分组为基础信息、联系信息、业务信息、附件备注、扩展信息。局部区域再用 `CollapseGroup` 或字段级 `Tabs` 控件做折叠/分段;`Textarea`、`RichText`、`CodeEditor`、上传、地图、子表、布局/自定义控件等使用 `FormWidth=24` 独占整行。
|
|
106
|
+
|
|
107
|
+
### 1:N 子表建模门禁
|
|
108
|
+
|
|
109
|
+
- “子表、明细、清单、条目、行项目、多个记录”默认表示主表 1:N 子表;必须创建独立子表,
|
|
110
|
+
并把真实外键放在子表。不得创建主表 `XxxId` 后用 `JoinForm` 冒充子表。
|
|
111
|
+
- `JoinForm` 仅用于主表保存一个目标 Id 并嵌入一条独立目标记录;目标表不能与当前表相同。
|
|
112
|
+
关系基数不明确时,MCP 写入前必须询问,不能把 `JoinForm` 当安全默认值。
|
|
113
|
+
- 子表外键通常建立 `(OsClient, ParentId)` 组合索引。子表还要有绑定同一子表的隐藏菜单,
|
|
114
|
+
`Display=0`、`AppDisplay=0`、`HasChild=0`。
|
|
115
|
+
- Manifest/蓝图审查时,只要发现 1:N 关系对应 `JoinForm`、缺少子表外键、缺少隐藏子菜单
|
|
116
|
+
或缺少回查索引,就必须判定计划不合格,停止写入。
|
|
117
|
+
- 新建子表的 `diy_table.Id` / `sys_menu.Id` 尚未回读时,分两阶段创建并用
|
|
118
|
+
`microi_update_field` 补 `TableChild` Config;不得猜 Id,也不得为了单次生成而换成
|
|
119
|
+
`JoinForm`。
|
|
120
|
+
|
|
121
|
+
`TableChild` 配置中的表、菜单和外键位于 `diy_field.Config` 根节点;主表列名和导入选项
|
|
122
|
+
位于 `diy_field.Config.TableChild`。例如:
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"TableChildTableId": "子表 diy_table.Id",
|
|
127
|
+
"TableChildSysMenuId": "子表 sys_menu.Id",
|
|
128
|
+
"TableChildSysMenuName": "项目成品清单",
|
|
129
|
+
"TableChildFkFieldName": "XiangmuId",
|
|
130
|
+
"TableChild": {
|
|
131
|
+
"PrimaryTableFieldName": "Id",
|
|
132
|
+
"ImportAutoFillFk": true,
|
|
133
|
+
"FieldRelations": [
|
|
134
|
+
["Code", "XiangmuBM", true],
|
|
135
|
+
["Name", "XiangmuMC"]
|
|
136
|
+
],
|
|
137
|
+
"DisablePagination": false
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`FieldRelations` 每项依次为 `[主表字段, 子表字段, 是否参与导入匹配]`。全部关系用于新增子表时回写父表值,也用于导入找到父表后回填空的子表字段;只有第三项为 `true` 的关系才用子表/Excel 值反查主表,多项为 `true` 时表示组合匹配。典型场景是 `Code -> XiangmuBM` 参与匹配,而 `Name -> XiangmuMC` 只回填,因此不能把全部关系无条件当作组合匹配。
|
|
143
|
+
|
|
144
|
+
后端继续读取旧版 `TableChildCallbackField`、`ImportRelations`、`ImportBackfillFields` 和单字段匹配配置。新版前端加载 TableChild 字段时按字段对去重合并为 `FieldRelations`,删除内存中的旧键,并在下一次正常保存字段配置时持久化新格式,避免重复合并。修改后按现有流程刷新结构缓存。
|
|
145
|
+
|
|
146
|
+
更多表单组件配置项见 `references/form-component-options.md`。新增或修改 `Microi.Client/src/views/form-engine/diy-field-component/` 组件配置时,同步更新该参考文档和官方表单组件文档。
|
|
147
|
+
|
|
148
|
+
## 简单枚举统一使用 Key-Value(强制)
|
|
149
|
+
|
|
150
|
+
- 只要字段会跨 PC、UniApp、小程序、Web、接口或多语言使用,`Select`、`Radio`、`MultipleSelect`、`Checkbox` 的简单枚举默认必须使用 `KeyValue`,不得把中文展示文字同时当作数据库值。
|
|
151
|
+
- `Key` 使用稳定、简短、大小写固定的英文或 ASCII 标识,不随界面语言和文案调整;`Value` 是给用户展示的中文或当前语言文字。
|
|
152
|
+
- 字段配置必须保持 `DataSource:"KeyValue"`、`SelectLabel:"Value"`、`SelectSaveField:"Key"`;数据库、URL 查询参数和接口筛选条件统一保存/传递 `Key`,界面只展示 `Value`。
|
|
153
|
+
- 客户端不得各自硬编码另一套中文到英文映射。由字段元数据或业务接口返回公开的 `{Key,Value}` 投影,客户端按 `Value` 渲染、按 `Key` 提交和筛选。
|
|
154
|
+
- 旧表若已经保存中文 `Value`,上线时必须提供明确的 `Value -> Key` 数据迁移,并在过渡期让读取接口兼容 Key 和 Value;迁移后回读确认数据库只剩合法 Key,并刷新字段缓存。
|
|
155
|
+
- 只有展示值与存储值永远相同、无需搜索筛选、无需多语言且不会跨客户端使用的纯静态字段,才允许使用简单 `Data` 数组。
|
|
156
|
+
|
|
157
|
+
### 复盘:Key-Value 展示值与筛选值混用
|
|
158
|
+
|
|
159
|
+
当字段元数据已改为 Key-Value、但历史记录仍保存中文 Value 时,界面按钮传英文 Key 会造成等值筛选全部为 0。修复不能只改按钮文案或只加前端映射,必须同时核对字段 Data/Config、存量物理数据、接口入参归一化和接口返回值;以“数据库存 Key、接口筛 Key、界面显 Value”的端到端回读为验收标准。
|
|
160
|
+
|
|
161
|
+
## 安全注意
|
|
162
|
+
|
|
163
|
+
- 不要假设 `_Fields` 中列出的每个字段都是物理数据库列。`TableChild`、`Button`、`Divider`、`DevComponent`、`OpenTable` 和 `PhoneSMS` 是配置或交互组件。
|
|
164
|
+
- 记住 DIY 表固定字段:`Id`、`CreateTime`、`UpdateTime`、`UserId`、`UserName`、`IsDeleted`。
|
|
165
|
+
- 使用原生 SQL 时,默认只查询未删除数据(`IsDeleted != 1`)。
|
|
166
|
+
- 修改结构元数据时,要考虑缓存失效和物理表变化;改动范围保持收敛。
|
|
167
|
+
- 新增或更新低代码字段时,优先使用 `microi_add_field` / `microi_update_field` 等 MCP 原生工具,不要临时手写 V8 元数据。`diy_field.TableId = null` 的字段行可能导致物理列存在,但 FormEngine/表结构加载不可见。
|
|
168
|
+
- 修改业务枚举字段时,将 `diy_field.Data` 和 `diy_field.Config` 视为事实源元数据。确认 KeyValue 键与接口引擎、前端筛选使用的值一致,刷新结构缓存,并回读字段行,不要只相信本地常量。
|
|
169
|
+
- 普通生成字段的 `diy_field.FormWidth` 保持 null/省略。只有 `CodeEditor`、`Textarea`、`RichText`、上传、`TableChild`、地图/布局或自定义组件等整行控件才使用 `24`。
|
|
170
|
+
- 结构变更后,用 `microi_get_db_schema` 验证,并在需要时用 `microi_refresh_schema_cache` 刷新 `diy_table_field_list` 缓存。
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Microi DB Schema"
|
|
3
|
+
short_description: "Use the Microi database dictionary and core table relationships."
|
|
4
|
+
default_prompt: "Use the Microi DB schema skill to inspect platform tables, fields, V8 event storage, menu configuration, workflow metadata, and system table relationships."
|