@microi.net/cli 5.5.8 → 5.6.0

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 (166) 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/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/README.md +71 -71
  8. package/assets/build-meta.json +5 -5
  9. package/assets/feature-matrix.json +129 -129
  10. package/cordis.patch.yml +1 -1
  11. package/package.json +1 -1
  12. package/scripts/codex-marketplace.json +20 -20
  13. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  14. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  15. package/scripts/microi-cli-mcp.js +7 -7
  16. package/scripts/microi-codex-broker.js +447 -447
  17. package/scripts/microi-codex-router.js +582 -582
  18. package/scripts/microi-skills.meta.json +336 -336
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  21. package/skills/README.md +3 -3
  22. package/skills/ai-engine/SKILL.md +45 -43
  23. package/skills/ai-platform-governance/SKILL.md +177 -177
  24. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  25. package/skills/app-store/SKILL.md +177 -177
  26. package/skills/business-blueprint/SKILL.md +85 -85
  27. package/skills/datasource-engine/SKILL.md +91 -91
  28. package/skills/dos-orm/SKILL.md +81 -81
  29. package/skills/dos-orm/references/api-reference.md +229 -229
  30. package/skills/email-engine/SKILL.md +80 -80
  31. package/skills/email-engine/references/v8-email.md +34 -34
  32. package/skills/job-engine/SKILL.md +154 -143
  33. package/skills/message-notification/SKILL.md +126 -126
  34. package/skills/message-notification/agents/openai.yaml +5 -5
  35. package/skills/message-notification/references/contracts.md +102 -102
  36. package/skills/microi-ai-app-auth.js +652 -652
  37. package/skills/microi-ai-application/SKILL.md +102 -94
  38. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  39. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  40. package/skills/microi-client-frontend/SKILL.md +43 -43
  41. 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 +2 -2
  42. 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 +28 -28
  43. 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 +56 -56
  44. package/skills/microi-codex/SKILL.md +46 -46
  45. package/skills/microi-codex-installer/SKILL.md +216 -216
  46. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  47. package/skills/microi-datasource-mapping/SKILL.md +67 -67
  48. package/skills/microi-db-schema/SKILL.md +6 -6
  49. package/skills/microi-db-schema/references/core-tables.md +18 -18
  50. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  51. package/skills/microi-db-schema/references/schema-overview.md +11 -11
  52. package/skills/microi-db-schema/references/schema.md +46 -46
  53. package/skills/microi-db-schema/references/table-catalog.md +57 -57
  54. package/skills/microi-deployment/SKILL.md +18 -1
  55. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  56. package/skills/microi-docs-coverage/SKILL.md +123 -123
  57. package/skills/microi-docs-coverage/references/capability-map.md +1 -0
  58. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  59. package/skills/microi-form-engine/SKILL.md +50 -50
  60. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  61. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  62. package/skills/microi-form-layout/SKILL.md +13 -13
  63. 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 -235
  64. package/skills/microi-frontend-sdk/SKILL.md +4 -4
  65. 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 +175 -175
  66. package/skills/microi-left-right-layout/SKILL.md +141 -141
  67. package/skills/microi-microservice/SKILL.md +12 -10
  68. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  69. 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 +213 -213
  70. package/skills/microi-solution-quotation/SKILL.md +78 -78
  71. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  72. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  73. package/skills/microi-sso/SKILL.md +85 -85
  74. package/skills/microi-sso/references/acceptance.md +49 -49
  75. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  76. package/skills/microi-sso/references/inbound.md +53 -53
  77. package/skills/microi-sso/references/outbound.md +39 -39
  78. 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 +20 -20
  79. package/skills/microi-ui/SKILL.md +7 -2
  80. package/skills/microi-uniapp-frontend/SKILL.md +134 -134
  81. 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 +136 -136
  82. 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 +124 -124
  83. package/skills/module-engine/SKILL.md +16 -16
  84. package/skills/ocr-engine/SKILL.md +2 -2
  85. package/skills/ocr-engine/agents/openai.yaml +1 -1
  86. package/skills/page-engine/SKILL.md +28 -28
  87. 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 +126 -126
  88. 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 +42 -42
  89. package/skills/performance-testing/SKILL.md +120 -120
  90. package/skills/playwright-e2e/SKILL.md +84 -84
  91. 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 +68 -68
  92. 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 +64 -64
  93. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
  94. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
  95. package/skills/print-engine/SKILL.md +36 -36
  96. package/skills/production-readonly-audit/SKILL.md +41 -41
  97. package/skills/report-engine/SKILL.md +71 -71
  98. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  99. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  100. package/skills/scripts/validate-progressive-disclosure.mjs +52 -52
  101. package/skills/search-engine/SKILL.md +75 -75
  102. package/skills/spider-engine/SKILL.md +190 -190
  103. package/skills/system-observability/SKILL.md +162 -162
  104. package/skills/system-observability/references/memory-incident-triage.md +73 -73
  105. package/skills/translate-engine/SKILL.md +1 -1
  106. package/skills/ui-design/SKILL.md +3 -1
  107. package/skills/uniapp-mall-assets/SKILL.md +170 -170
  108. package/skills/unity-integration/SKILL.md +155 -155
  109. package/skills/unity-integration/agents/openai.yaml +4 -4
  110. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  111. package/skills/unity-integration/references/sdk-api.md +82 -82
  112. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  113. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  114. package/skills/v8-api-config/SKILL.md +378 -378
  115. package/skills/v8-cache-pattern/SKILL.md +306 -306
  116. package/skills/v8-crud-api/SKILL.md +29 -29
  117. 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 +56 -56
  118. package/skills/v8-debugging/SKILL.md +143 -143
  119. package/skills/v8-explorer-tree/SKILL.md +64 -64
  120. 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 +201 -201
  121. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
  122. 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 +32 -32
  123. package/skills/v8-file-upload/SKILL.md +154 -154
  124. 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 +133 -133
  125. 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 +138 -138
  126. package/skills/v8-formengine-http/SKILL.md +107 -107
  127. package/skills/v8-frontend-events/SKILL.md +22 -22
  128. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  129. package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
  130. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
  131. package/skills/v8-http-integration/SKILL.md +106 -106
  132. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
  133. 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 +5 -5
  134. package/skills/v8-image-processing/SKILL.md +190 -190
  135. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  136. package/skills/v8-image-processing/references/api-reference.md +623 -623
  137. package/skills/v8-menu-buttons/SKILL.md +103 -103
  138. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
  139. 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 +228 -228
  140. 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 +43 -43
  141. package/skills/v8-mongodb/SKILL.md +65 -65
  142. package/skills/v8-mq-mqtt/SKILL.md +175 -175
  143. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  144. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
  145. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  146. package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
  147. package/skills/v8-security/SKILL.md +25 -25
  148. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
  149. package/skills/v8-sql-query/SKILL.md +127 -127
  150. package/skills/v8-table-event/SKILL.md +20 -20
  151. 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 +18 -18
  152. 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 +15 -15
  153. package/skills/v8-tcp-integration/SKILL.md +1 -1
  154. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  155. package/skills/v8-template-engine/SKILL.md +59 -59
  156. package/skills/v8-utilities/SKILL.md +92 -92
  157. package/skills/v8-utilities/references/client-api-index.md +143 -143
  158. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  159. package/skills/v8-utilities/references/server-api-index.md +74 -74
  160. package/skills/v8-workflow/SKILL.md +44 -44
  161. package/skills/vision-engine/SKILL.md +19 -19
  162. package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
  163. package/skills/workspace-conventions/SKILL.md +236 -236
  164. 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 -208
  165. 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 +179 -179
  166. 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 +21 -21
@@ -1,229 +1,229 @@
1
- # Dos.ORM API 参考
2
-
3
- ## 数据库 Provider
4
-
5
- | DatabaseType | Provider |
6
- |---|---|
7
- | `SqlServer` | SQL Server 2000 |
8
- | `SqlServer9` | SQL Server 2005+ |
9
- | `MySql` | MySQL |
10
- | `Oracle` | Oracle |
11
- | `PostgreSql` | PostgreSQL |
12
- | `DaMeng` | 达梦 |
13
- | `KingBase` | 人大金仓 |
14
- | `Sqlite3` | SQLite |
15
- | `MsAccess` | Access |
16
-
17
- 兼容协议数据库仍需目标库实测,不能只凭协议名称判定所有 DDL、分页和 BulkCopy 一致。
18
-
19
- 默认会话入口是 `DbSession.Default`;多数据库、读写分离和分片场景使用明确的
20
- `DbSession` 实例,避免把默认连接误用于其它租户或数据库。
21
-
22
- ## 实体
23
-
24
- ```csharp
25
- [TableName("sys_user")]
26
- public class SysUser : Entity
27
- {
28
- public string Id { get; set; }
29
- public string Account { get; set; }
30
- public DateTime CreateTime { get; set; }
31
-
32
- public override Field[] GetFields() => new[] { _.Id, _.Account, _.CreateTime };
33
- public override object[] GetValues() => new object[] { Id, Account, CreateTime };
34
- public override Field GetIdentityField() => _.Id;
35
-
36
- public sealed class _
37
- {
38
- public static readonly Field Id = new Field("Id", "sys_user");
39
- public static readonly Field Account = new Field("Account", "sys_user");
40
- public static readonly Field CreateTime = new Field("CreateTime", "sys_user");
41
- }
42
- }
43
- ```
44
-
45
- `Entity.GetFields()` 的字段顺序也是批量写入和 CodeFirst 映射依据;实体声明、
46
- 字段数组与数据库列变更必须同步。
47
-
48
- ## 查询链
49
-
50
- | API | 作用 |
51
- |---|---|
52
- | `From<T>()` / `From("table")` | 查询入口 |
53
- | `Where(predicate)` / `Where(WhereClip)` | 条件 |
54
- | `OrderBy` / `OrderByDescending` | 排序 |
55
- | `GroupBy` / `Having` | 分组 |
56
- | `Select` / `AddSelect` | 选择字段 |
57
- | `Distinct` / `Top` / `Page` | 去重、Top、分页 |
58
- | `InnerJoin/LeftJoin/RightJoin/CrossJoin/FullJoin` | Join |
59
- | `Union/UnionAll` | 集合联合 |
60
- | `SetCacheTimeOut` / `Refresh` | 查询缓存/绕过缓存 |
61
- | `ToList/ToListAsync` | 列表 |
62
- | `ToFirst/ToFirstAsync` | 第一条或 null |
63
- | `ToFirstDefault` | 第一条或 new 实体 |
64
- | `ToScalar/ToScalarAsync` | 标量 |
65
- | `ToDataReader` / `ToDataTable/ToDataTableAsync` | Reader/DataTable |
66
- | `ToEnumerable` | 流式枚举 |
67
- | `Count/CountAsync` | 计数 |
68
- | `ExecuteNonQuery/ExecuteNonQueryAsync` | 非查询 |
69
-
70
- 查询缓存入口的完整成员名是 `FromSection.SetCacheTimeOut`。缓存 Key 包含 SQL
71
- 与参数值,但写后失效、租户隔离和多节点一致性仍由业务负责。
72
-
73
- ```csharp
74
- var users = await dbSession.From<SysUser>()
75
- .Where(u => u.Account == account)
76
- .OrderByDescending(u => u.CreateTime)
77
- .Page(20, 1)
78
- .ToListAsync();
79
- ```
80
-
81
- ## WhereClip
82
-
83
- ```csharp
84
- var where = new Where<SysUser>();
85
- where.And(u => u.Status == 1);
86
- if (!string.IsNullOrWhiteSpace(keyword))
87
- where.And(u => u.Name.Like(keyword));
88
- if (deptIds?.Any() == true)
89
- where.And(u => u.DeptId.In(deptIds));
90
-
91
- var list = dbSession.From<SysUser>()
92
- .Where(where.ToWhereClip())
93
- .ToList();
94
- ```
95
-
96
- 支持比较、`Like/NotLike/StartsWith/EndsWith`、`In/NotIn` 和 NULL。
97
-
98
- ## 原生 SQL
99
-
100
- ```csharp
101
- var users = dbSession
102
- .FromSql("SELECT Id,Account FROM sys_user WHERE Status=@p0")
103
- .AddInParameter("@p0", 1)
104
- .ToList<SysUser>();
105
- ```
106
-
107
- 动态值只走参数;动态标识符先从固定白名单映射。
108
- Provider 的标识符替换最终由 `DataUtils.FormatSQL` 完成;不要绕过该步骤手工
109
- 拼接用户输入的表名或字段名。
110
-
111
- ## 写入
112
-
113
- ```csharp
114
- dbSession.Insert(entity);
115
- dbSession.Insert(list);
116
- dbSession.Update<SysUser>(u => u.Status, 0, u => u.Id == id);
117
- dbSession.Delete<SysUser>(u => u.Id == id);
118
- ```
119
-
120
- 批量:
121
-
122
- ```csharp
123
- var affected = dbSession.BulkInsert(list, batchSize: 5000, bulkCopyTimeoutSeconds: 600);
124
- var affectedAsync = await dbSession.BulkInsertAsync(list, batchSize: 5000, ct: token);
125
- ```
126
-
127
- 原生优选:
128
-
129
- - SQL Server:SqlBulkCopy
130
- - MySQL:MySqlBulkCopy
131
- - PostgreSQL/KingBase:Binary COPY
132
- - Oracle/达梦/SQLite/Access:多行参数化 INSERT 回退
133
-
134
- 批大小 5000 只是起点;按行宽、索引、日志、网络和数据库负载测量。
135
-
136
- ## Upsert
137
-
138
- ```csharp
139
- dbSession.Upsert(user, SysUser._.Account);
140
- await dbSession.UpsertAsync(
141
- user,
142
- ct: token,
143
- conflictFields: new[] { SysUser._.Account });
144
- ```
145
-
146
- 各 Provider 使用 `ON DUPLICATE KEY`、`ON CONFLICT`、`MERGE` 或更新后插入回退。
147
- 冲突字段必须有数据库唯一约束。
148
-
149
- ## SqlFunc 与子查询
150
-
151
- `SqlFunc` 提供 `SqlFunc.IfNull`、`SqlFunc.IIF`、`SqlFunc.Length`、
152
- `SqlFunc.Substring`、`SqlFunc.Now`、`SqlFunc.DateDiff`、
153
- `SqlFunc.JsonValue`、`SqlFunc.Concat`、`SqlFunc.Upper`、`SqlFunc.Lower`、
154
- `SqlFunc.Trim`、`SqlFunc.Abs`、`SqlFunc.Round`、`SqlFunc.Count`、
155
- `SqlFunc.Sum`、`SqlFunc.Avg`、`SqlFunc.Min`、`SqlFunc.Max` 的 Provider 方言。
156
-
157
- `SqlSubQuery` 提供 `SqlSubQuery.Exists`、`SqlSubQuery.NotExists`、
158
- `SqlSubQuery.In`、`SqlSubQuery.NotIn`、`SqlSubQuery.Scalar` 和
159
- `SqlSubQuery.Count`。
160
- 返回的是 SQL 片段,数据值仍要参数化。
161
-
162
- ## 导航属性
163
-
164
- `[Navigate]` 支持 `NavigateType.OneToOne`、`NavigateType.OneToMany`、
165
- `NavigateType.ManyToMany`;加载入口:
166
-
167
- - `IncludeOne`
168
- - `IncludeMany`
169
- - `IncludeManyToMany`
170
-
171
- 实现使用批量 IN,避免逐行 N+1。仍要限制主结果规模。
172
-
173
- ## CodeFirst
174
-
175
- ```csharp
176
- dbSession.CreateTable<SysUser>();
177
- dbSession.SyncSchema(typeof(SysUser), typeof(Order));
178
- var exists = dbSession.TableExists("sys_user");
179
- ```
180
-
181
- `CreateTable<T>(dropIfExists: true)` 是破坏性操作,只可在明确授权的隔离环境使用。
182
- 实体索引可用 `[Index]` 声明;Microi 低代码业务表的运行时索引仍必须走 Manifest/MCP。
183
-
184
- ## 读写分离
185
-
186
- ```csharp
187
- var router = new ReadWriteRouter(master);
188
- router.AddSlave(slave1, weight: 1);
189
- router.AddSlave(slave2, weight: 2);
190
-
191
- var read = router.GetReadSession();
192
- var write = router.GetWriteSession();
193
-
194
- using (router.ForceMaster())
195
- {
196
- var latest = router.GetReadSession().From<SysUser>().ToList();
197
- }
198
- ```
199
-
200
- 支持加权轮询、摘除和回退。事务与读自己刚写的数据必须读主。
201
-
202
- ## 分库分表
203
-
204
- 表名路由:
205
-
206
- - `ShardingRouter.MonthlyTable`
207
- - `ShardingRouter.HashModTable`
208
- - `ShardingRouter.ModTable`
209
-
210
- 数据库路由:
211
-
212
- - `DbShardingRouter.AddNode`
213
- - `RouteByHash`
214
- - `AllNodes`
215
-
216
- 稳定 Hash 使用 FNV-1a。跨分片事务、全局唯一键、分页排序和聚合需要业务层明确设计。
217
-
218
- ## 监控与缓存
219
-
220
- ```csharp
221
- Dos.ORM.Section.SlowSqlThresholdMs = 1000;
222
- Dos.ORM.Section.OnSlowSql = (cmd, elapsed, operation) =>
223
- {
224
- // 记录脱敏 SQL 模板、耗时和关联 Id;不要记录密钥参数
225
- };
226
- ```
227
-
228
- 反序列化器、实体元数据和字段名缓存是进程内优化,允许节点重启后重建;
229
- 不能作为跨节点业务事实。查询缓存使用滑动过期,写后按业务失效。
1
+ # Dos.ORM API 参考
2
+
3
+ ## 数据库 Provider
4
+
5
+ | DatabaseType | Provider |
6
+ |---|---|
7
+ | `SqlServer` | SQL Server 2000 |
8
+ | `SqlServer9` | SQL Server 2005+ |
9
+ | `MySql` | MySQL |
10
+ | `Oracle` | Oracle |
11
+ | `PostgreSql` | PostgreSQL |
12
+ | `DaMeng` | 达梦 |
13
+ | `KingBase` | 人大金仓 |
14
+ | `Sqlite3` | SQLite |
15
+ | `MsAccess` | Access |
16
+
17
+ 兼容协议数据库仍需目标库实测,不能只凭协议名称判定所有 DDL、分页和 BulkCopy 一致。
18
+
19
+ 默认会话入口是 `DbSession.Default`;多数据库、读写分离和分片场景使用明确的
20
+ `DbSession` 实例,避免把默认连接误用于其它租户或数据库。
21
+
22
+ ## 实体
23
+
24
+ ```csharp
25
+ [TableName("sys_user")]
26
+ public class SysUser : Entity
27
+ {
28
+ public string Id { get; set; }
29
+ public string Account { get; set; }
30
+ public DateTime CreateTime { get; set; }
31
+
32
+ public override Field[] GetFields() => new[] { _.Id, _.Account, _.CreateTime };
33
+ public override object[] GetValues() => new object[] { Id, Account, CreateTime };
34
+ public override Field GetIdentityField() => _.Id;
35
+
36
+ public sealed class _
37
+ {
38
+ public static readonly Field Id = new Field("Id", "sys_user");
39
+ public static readonly Field Account = new Field("Account", "sys_user");
40
+ public static readonly Field CreateTime = new Field("CreateTime", "sys_user");
41
+ }
42
+ }
43
+ ```
44
+
45
+ `Entity.GetFields()` 的字段顺序也是批量写入和 CodeFirst 映射依据;实体声明、
46
+ 字段数组与数据库列变更必须同步。
47
+
48
+ ## 查询链
49
+
50
+ | API | 作用 |
51
+ |---|---|
52
+ | `From<T>()` / `From("table")` | 查询入口 |
53
+ | `Where(predicate)` / `Where(WhereClip)` | 条件 |
54
+ | `OrderBy` / `OrderByDescending` | 排序 |
55
+ | `GroupBy` / `Having` | 分组 |
56
+ | `Select` / `AddSelect` | 选择字段 |
57
+ | `Distinct` / `Top` / `Page` | 去重、Top、分页 |
58
+ | `InnerJoin/LeftJoin/RightJoin/CrossJoin/FullJoin` | Join |
59
+ | `Union/UnionAll` | 集合联合 |
60
+ | `SetCacheTimeOut` / `Refresh` | 查询缓存/绕过缓存 |
61
+ | `ToList/ToListAsync` | 列表 |
62
+ | `ToFirst/ToFirstAsync` | 第一条或 null |
63
+ | `ToFirstDefault` | 第一条或 new 实体 |
64
+ | `ToScalar/ToScalarAsync` | 标量 |
65
+ | `ToDataReader` / `ToDataTable/ToDataTableAsync` | Reader/DataTable |
66
+ | `ToEnumerable` | 流式枚举 |
67
+ | `Count/CountAsync` | 计数 |
68
+ | `ExecuteNonQuery/ExecuteNonQueryAsync` | 非查询 |
69
+
70
+ 查询缓存入口的完整成员名是 `FromSection.SetCacheTimeOut`。缓存 Key 包含 SQL
71
+ 与参数值,但写后失效、租户隔离和多节点一致性仍由业务负责。
72
+
73
+ ```csharp
74
+ var users = await dbSession.From<SysUser>()
75
+ .Where(u => u.Account == account)
76
+ .OrderByDescending(u => u.CreateTime)
77
+ .Page(20, 1)
78
+ .ToListAsync();
79
+ ```
80
+
81
+ ## WhereClip
82
+
83
+ ```csharp
84
+ var where = new Where<SysUser>();
85
+ where.And(u => u.Status == 1);
86
+ if (!string.IsNullOrWhiteSpace(keyword))
87
+ where.And(u => u.Name.Like(keyword));
88
+ if (deptIds?.Any() == true)
89
+ where.And(u => u.DeptId.In(deptIds));
90
+
91
+ var list = dbSession.From<SysUser>()
92
+ .Where(where.ToWhereClip())
93
+ .ToList();
94
+ ```
95
+
96
+ 支持比较、`Like/NotLike/StartsWith/EndsWith`、`In/NotIn` 和 NULL。
97
+
98
+ ## 原生 SQL
99
+
100
+ ```csharp
101
+ var users = dbSession
102
+ .FromSql("SELECT Id,Account FROM sys_user WHERE Status=@p0")
103
+ .AddInParameter("@p0", 1)
104
+ .ToList<SysUser>();
105
+ ```
106
+
107
+ 动态值只走参数;动态标识符先从固定白名单映射。
108
+ Provider 的标识符替换最终由 `DataUtils.FormatSQL` 完成;不要绕过该步骤手工
109
+ 拼接用户输入的表名或字段名。
110
+
111
+ ## 写入
112
+
113
+ ```csharp
114
+ dbSession.Insert(entity);
115
+ dbSession.Insert(list);
116
+ dbSession.Update<SysUser>(u => u.Status, 0, u => u.Id == id);
117
+ dbSession.Delete<SysUser>(u => u.Id == id);
118
+ ```
119
+
120
+ 批量:
121
+
122
+ ```csharp
123
+ var affected = dbSession.BulkInsert(list, batchSize: 5000, bulkCopyTimeoutSeconds: 600);
124
+ var affectedAsync = await dbSession.BulkInsertAsync(list, batchSize: 5000, ct: token);
125
+ ```
126
+
127
+ 原生优选:
128
+
129
+ - SQL Server:SqlBulkCopy
130
+ - MySQL:MySqlBulkCopy
131
+ - PostgreSQL/KingBase:Binary COPY
132
+ - Oracle/达梦/SQLite/Access:多行参数化 INSERT 回退
133
+
134
+ 批大小 5000 只是起点;按行宽、索引、日志、网络和数据库负载测量。
135
+
136
+ ## Upsert
137
+
138
+ ```csharp
139
+ dbSession.Upsert(user, SysUser._.Account);
140
+ await dbSession.UpsertAsync(
141
+ user,
142
+ ct: token,
143
+ conflictFields: new[] { SysUser._.Account });
144
+ ```
145
+
146
+ 各 Provider 使用 `ON DUPLICATE KEY`、`ON CONFLICT`、`MERGE` 或更新后插入回退。
147
+ 冲突字段必须有数据库唯一约束。
148
+
149
+ ## SqlFunc 与子查询
150
+
151
+ `SqlFunc` 提供 `SqlFunc.IfNull`、`SqlFunc.IIF`、`SqlFunc.Length`、
152
+ `SqlFunc.Substring`、`SqlFunc.Now`、`SqlFunc.DateDiff`、
153
+ `SqlFunc.JsonValue`、`SqlFunc.Concat`、`SqlFunc.Upper`、`SqlFunc.Lower`、
154
+ `SqlFunc.Trim`、`SqlFunc.Abs`、`SqlFunc.Round`、`SqlFunc.Count`、
155
+ `SqlFunc.Sum`、`SqlFunc.Avg`、`SqlFunc.Min`、`SqlFunc.Max` 的 Provider 方言。
156
+
157
+ `SqlSubQuery` 提供 `SqlSubQuery.Exists`、`SqlSubQuery.NotExists`、
158
+ `SqlSubQuery.In`、`SqlSubQuery.NotIn`、`SqlSubQuery.Scalar` 和
159
+ `SqlSubQuery.Count`。
160
+ 返回的是 SQL 片段,数据值仍要参数化。
161
+
162
+ ## 导航属性
163
+
164
+ `[Navigate]` 支持 `NavigateType.OneToOne`、`NavigateType.OneToMany`、
165
+ `NavigateType.ManyToMany`;加载入口:
166
+
167
+ - `IncludeOne`
168
+ - `IncludeMany`
169
+ - `IncludeManyToMany`
170
+
171
+ 实现使用批量 IN,避免逐行 N+1。仍要限制主结果规模。
172
+
173
+ ## CodeFirst
174
+
175
+ ```csharp
176
+ dbSession.CreateTable<SysUser>();
177
+ dbSession.SyncSchema(typeof(SysUser), typeof(Order));
178
+ var exists = dbSession.TableExists("sys_user");
179
+ ```
180
+
181
+ `CreateTable<T>(dropIfExists: true)` 是破坏性操作,只可在明确授权的隔离环境使用。
182
+ 实体索引可用 `[Index]` 声明;Microi 低代码业务表的运行时索引仍必须走 Manifest/MCP。
183
+
184
+ ## 读写分离
185
+
186
+ ```csharp
187
+ var router = new ReadWriteRouter(master);
188
+ router.AddSlave(slave1, weight: 1);
189
+ router.AddSlave(slave2, weight: 2);
190
+
191
+ var read = router.GetReadSession();
192
+ var write = router.GetWriteSession();
193
+
194
+ using (router.ForceMaster())
195
+ {
196
+ var latest = router.GetReadSession().From<SysUser>().ToList();
197
+ }
198
+ ```
199
+
200
+ 支持加权轮询、摘除和回退。事务与读自己刚写的数据必须读主。
201
+
202
+ ## 分库分表
203
+
204
+ 表名路由:
205
+
206
+ - `ShardingRouter.MonthlyTable`
207
+ - `ShardingRouter.HashModTable`
208
+ - `ShardingRouter.ModTable`
209
+
210
+ 数据库路由:
211
+
212
+ - `DbShardingRouter.AddNode`
213
+ - `RouteByHash`
214
+ - `AllNodes`
215
+
216
+ 稳定 Hash 使用 FNV-1a。跨分片事务、全局唯一键、分页排序和聚合需要业务层明确设计。
217
+
218
+ ## 监控与缓存
219
+
220
+ ```csharp
221
+ Dos.ORM.Section.SlowSqlThresholdMs = 1000;
222
+ Dos.ORM.Section.OnSlowSql = (cmd, elapsed, operation) =>
223
+ {
224
+ // 记录脱敏 SQL 模板、耗时和关联 Id;不要记录密钥参数
225
+ };
226
+ ```
227
+
228
+ 反序列化器、实体元数据和字段名缓存是进程内优化,允许节点重启后重建;
229
+ 不能作为跨节点业务事实。查询缓存使用滑动过期,写后按业务失效。
@@ -1,80 +1,80 @@
1
- ---
2
- name: email-engine
3
- description: 开发、安装和使用吾码邮箱系统 mci-email。用于 QQ、163、126、企业或自定义 IMAP/SMTP 邮箱账号维护、自动与手动同步、邮件阅读、草稿、附件、回复转发、发送结果核对,以及邮箱 MCP 工具和 V8.Email 协议原子。
4
- ---
5
-
6
- # 吾码邮箱系统
7
-
8
- > **Codex 非阻塞自动更新:** 先遵循 [工作区约定](../workspace-conventions/SKILL.md),通过 `microi update --background --workspace "<工作区绝对路径>" --json` 投递更新检查;当前任务继续执行,不等待更新或重启现有会话。
9
-
10
- 邮箱系统是使用吾码 UI 的独立 Vue 3 微服务,商城 AppKey 为 `mci-email`,
11
- 后台入口为「系统引擎 → 邮箱系统」,菜单路由 `/mci-email`。
12
-
13
- 先读取 `../workspace-conventions/SKILL.md`;开发或发布时还需读取
14
- `../microi-microservice/SKILL.md`、`../app-store/SKILL.md`。
15
- 先调用 `microi_list_applications`,再读取目标应用完整上下文,禁止覆盖未读取的源码。
16
-
17
- ## 选择正确入口
18
-
19
- | 需求 | 入口 |
20
- | --- | --- |
21
- | 邮箱工作台 | 源码微服务 `mci-email` |
22
- | 账号配置 | 原表 `mic_email_server`,通过宿主 `openForm` 打开吾码表单 |
23
- | 全部业务 HTTP | 接口引擎 `mci-email`,请求参数 `Action` |
24
- | 手动同步 | `Action: Sync` 返回持久后台任务,使用 `SyncStatus` 回读终态 |
25
- | 自动同步 | 定时任务调用 `mci-email-auto-sync`,内部调度 `mci-email-sync-step` |
26
- | 协议、MIME、加密 | 最小后端原子 `V8.Email`,不新增业务 Controller |
27
- | 租户扩展 | `mci-email-hook`,商城策略 `CreateIfMissing` |
28
- | AI 操作 | `microi_email_query`、`microi_email_manage`、`microi_email_send` |
29
-
30
- 当前版本沿用原邮箱配置表的平台管理员权限(`Level >= 9999`),
31
- 并按当前用户检查账号和邮件所有权。不得因 AI 使用而绕过这些约束。
32
- 各运行节点需要包含 `V8.Email` 的平台版本;仅安装前端源码不能补齐 .NET 协议能力。
33
-
34
- ## 配置和同步
35
-
36
- 1. 确认用户拥有或获准使用邮箱;在服务商处开启 IMAP/SMTP,取得客户端授权码。
37
- 2. 打开账号表单,选择 QQ / 163 / 126 / 腾讯企业邮箱 / 自定义,填写地址与授权码。
38
- 3. QQ、163 常用 IMAP 993 / SMTP 465,选择 `SslOnConnect`;
39
- 使用 SMTP 587 时选择 `StartTls`。具体端口以服务商配置为准。
40
- 4. 授权码提交后由可信后端加密。编辑留空保留旧值;列表、导出、源码、日志和截图不含原文。
41
- 5. 先检测连接,再手动同步。首次先显示最新一批邮件,再增量补齐历史并核对状态。
42
- 6. 自动同步由平台定时任务运行,不依赖浏览器开着;每个账号设置同步间隔。
43
-
44
- 目录路径作为服务商的不透明值保存,不能自行翻译或改写。
45
- 去重键必须包含账号、目录、UIDVALIDITY 和 UID;UIDVALIDITY 改变时只重建该目录缓存。
46
- 同步锁使用接口引擎分布式锁,检查点进入数据库;进程重启后继续执行。
47
- 邮件正文按需读取,默认阻止脚本、表单提交与外部图片;不能直接在宿主使用 `v-html`。
48
-
49
- ## MCP 使用
50
-
51
- 先通过 `microi_codex action=profiles` 选择用户指定租户,再按工具 Schema 调用。
52
-
53
- ```json
54
- {"action":"Overview"}
55
- ```
56
-
57
- 以上参数用于 `microi_email_query`,不会回传授权码。
58
- 查询邮件用 `action: Messages`,可传 `accountId`、`folderKind`、`keyword`、
59
- `pageIndex` 和 `pageSize`;只在任务需要时读取正文或附件。
60
-
61
- 维护工具先返回操作预览。用户已有明确授权后,`confirmExecution` 精确填写
62
- `Action:目标Id`;新账号为 `SaveAccount:new`,新草稿为 `SaveDraft:账号Id`。
63
- 同步需要稳定的 `requestId`,恢复同一请求不得生成新值。
64
-
65
- 发信先通过 `microi_email_manage(action: SaveDraft)` 保存确定的收件人、正文与附件,
66
- 然后调用 `microi_email_send(draftId, confirmExecution: draftId)`。
67
- 只有用户已授权发送给这些收件人时才执行;不要把读取邮件的请求当作发送授权。
68
-
69
- ## 发送和结果边界
70
-
71
- - 一次发送意图绑定稳定草稿 Id 和 Message-Id;同一草稿重复请求不能再次 SMTP 投递。
72
- - `Sent` 表示 SMTP 服务器已接受;收件端可见需要实际收件验证。
73
- - `Unknown` 表示连接中断等情况导致结果不确定,保留在发件箱,禁止自动重发。
74
- 先按 Message-Id 检查服务商已发送目录;确需新发时由用户确认新的发送意图。
75
- - 远端已发送副本单独保存;副本或租户 Hook 失败不得回滚已发生的 SMTP 副作用。
76
- - 原子只解密当前租户的凭据,不能向 V8 暴露解密方法;必须校验 TLS 证书。
77
-
78
- 协议方法和参数见 [V8.Email 原子参考](references/v8-email.md)。
79
- 最终分别验证源码/构建、API 权限、连接、实际收件、附件字节、重复发送、
80
- 自动同步、宿主表单、商城包与官网真实截图。
1
+ ---
2
+ name: email-engine
3
+ description: 开发、安装和使用吾码邮箱系统 mci-email。用于 QQ、163、126、企业或自定义 IMAP/SMTP 邮箱账号维护、自动与手动同步、邮件阅读、草稿、附件、回复转发、发送结果核对,以及邮箱 MCP 工具和 V8.Email 协议原子。
4
+ ---
5
+
6
+ # 吾码邮箱系统
7
+
8
+ > **Codex 非阻塞自动更新:** 先遵循 [工作区约定](../workspace-conventions/SKILL.md),通过 `microi update --background --workspace "<工作区绝对路径>" --json` 投递更新检查;当前任务继续执行,不等待更新或重启现有会话。
9
+
10
+ 邮箱系统是使用吾码 UI 的独立 Vue 3 微服务,商城 AppKey 为 `mci-email`,
11
+ 后台入口为「系统引擎 → 邮箱系统」,菜单路由 `/mci-email`。
12
+
13
+ 先读取 `../workspace-conventions/SKILL.md`;开发或发布时还需读取
14
+ `../microi-microservice/SKILL.md`、`../app-store/SKILL.md`。
15
+ 先调用 `microi_list_applications`,再读取目标应用完整上下文,禁止覆盖未读取的源码。
16
+
17
+ ## 选择正确入口
18
+
19
+ | 需求 | 入口 |
20
+ | --- | --- |
21
+ | 邮箱工作台 | 源码微服务 `mci-email` |
22
+ | 账号配置 | 原表 `mic_email_server`,通过宿主 `openForm` 打开吾码表单 |
23
+ | 全部业务 HTTP | 接口引擎 `mci-email`,请求参数 `Action` |
24
+ | 手动同步 | `Action: Sync` 返回持久后台任务,使用 `SyncStatus` 回读终态 |
25
+ | 自动同步 | 定时任务调用 `mci-email-auto-sync`,内部调度 `mci-email-sync-step` |
26
+ | 协议、MIME、加密 | 最小后端原子 `V8.Email`,不新增业务 Controller |
27
+ | 租户扩展 | `mci-email-hook`,商城策略 `CreateIfMissing` |
28
+ | AI 操作 | `microi_email_query`、`microi_email_manage`、`microi_email_send` |
29
+
30
+ 当前版本沿用原邮箱配置表的平台管理员权限(`Level >= 9999`),
31
+ 并按当前用户检查账号和邮件所有权。不得因 AI 使用而绕过这些约束。
32
+ 各运行节点需要包含 `V8.Email` 的平台版本;仅安装前端源码不能补齐 .NET 协议能力。
33
+
34
+ ## 配置和同步
35
+
36
+ 1. 确认用户拥有或获准使用邮箱;在服务商处开启 IMAP/SMTP,取得客户端授权码。
37
+ 2. 打开账号表单,选择 QQ / 163 / 126 / 腾讯企业邮箱 / 自定义,填写地址与授权码。
38
+ 3. QQ、163 常用 IMAP 993 / SMTP 465,选择 `SslOnConnect`;
39
+ 使用 SMTP 587 时选择 `StartTls`。具体端口以服务商配置为准。
40
+ 4. 授权码提交后由可信后端加密。编辑留空保留旧值;列表、导出、源码、日志和截图不含原文。
41
+ 5. 先检测连接,再手动同步。首次先显示最新一批邮件,再增量补齐历史并核对状态。
42
+ 6. 自动同步由平台定时任务运行,不依赖浏览器开着;每个账号设置同步间隔。
43
+
44
+ 目录路径作为服务商的不透明值保存,不能自行翻译或改写。
45
+ 去重键必须包含账号、目录、UIDVALIDITY 和 UID;UIDVALIDITY 改变时只重建该目录缓存。
46
+ 同步锁使用接口引擎分布式锁,检查点进入数据库;进程重启后继续执行。
47
+ 邮件正文按需读取,默认阻止脚本、表单提交与外部图片;不能直接在宿主使用 `v-html`。
48
+
49
+ ## MCP 使用
50
+
51
+ 先通过 `microi_codex action=profiles` 选择用户指定租户,再按工具 Schema 调用。
52
+
53
+ ```json
54
+ {"action":"Overview"}
55
+ ```
56
+
57
+ 以上参数用于 `microi_email_query`,不会回传授权码。
58
+ 查询邮件用 `action: Messages`,可传 `accountId`、`folderKind`、`keyword`、
59
+ `pageIndex` 和 `pageSize`;只在任务需要时读取正文或附件。
60
+
61
+ 维护工具先返回操作预览。用户已有明确授权后,`confirmExecution` 精确填写
62
+ `Action:目标Id`;新账号为 `SaveAccount:new`,新草稿为 `SaveDraft:账号Id`。
63
+ 同步需要稳定的 `requestId`,恢复同一请求不得生成新值。
64
+
65
+ 发信先通过 `microi_email_manage(action: SaveDraft)` 保存确定的收件人、正文与附件,
66
+ 然后调用 `microi_email_send(draftId, confirmExecution: draftId)`。
67
+ 只有用户已授权发送给这些收件人时才执行;不要把读取邮件的请求当作发送授权。
68
+
69
+ ## 发送和结果边界
70
+
71
+ - 一次发送意图绑定稳定草稿 Id 和 Message-Id;同一草稿重复请求不能再次 SMTP 投递。
72
+ - `Sent` 表示 SMTP 服务器已接受;收件端可见需要实际收件验证。
73
+ - `Unknown` 表示连接中断等情况导致结果不确定,保留在发件箱,禁止自动重发。
74
+ 先按 Message-Id 检查服务商已发送目录;确需新发时由用户确认新的发送意图。
75
+ - 远端已发送副本单独保存;副本或租户 Hook 失败不得回滚已发生的 SMTP 副作用。
76
+ - 原子只解密当前租户的凭据,不能向 V8 暴露解密方法;必须校验 TLS 证书。
77
+
78
+ 协议方法和参数见 [V8.Email 原子参考](references/v8-email.md)。
79
+ 最终分别验证源码/构建、API 权限、连接、实际收件、附件字节、重复发送、
80
+ 自动同步、宿主表单、商城包与官网真实截图。