@microi.net/cli 6.0.9 → 6.1.1

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 (122) 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 +5 -5
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +116 -116
  10. package/scripts/microi-cli.js +1 -1
  11. package/scripts/microi-skills.meta.json +312 -312
  12. package/skills/.microi-skills-version.json +2 -2
  13. package/skills/.progressive-disclosure-manifest.json +45 -45
  14. package/skills/README.md +1 -1
  15. package/skills/ai-engine/SKILL.md +2 -2
  16. package/skills/ai-engine/references/ai-employees.md +48 -48
  17. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  18. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +2 -2
  19. package/skills/app-store/SKILL.md +531 -531
  20. package/skills/business-blueprint/SKILL.md +193 -193
  21. package/skills/datasource-engine/SKILL.md +93 -93
  22. package/skills/dos-orm/SKILL.md +105 -105
  23. package/skills/dos-orm/references/api-reference.md +229 -229
  24. package/skills/email-engine/SKILL.md +81 -81
  25. package/skills/email-engine/references/v8-email.md +34 -34
  26. package/skills/job-engine/SKILL.md +176 -176
  27. package/skills/message-notification/SKILL.md +156 -156
  28. package/skills/message-notification/references/contracts.md +102 -102
  29. package/skills/microi/SKILL.md +14 -14
  30. package/skills/microi-ai-app-auth.js +1 -1
  31. package/skills/microi-ai-application/SKILL.md +115 -115
  32. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  33. 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 +10 -10
  34. 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 +10 -10
  35. 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 +10 -10
  36. package/skills/microi-codex/SKILL.md +130 -130
  37. package/skills/microi-codex-installer/SKILL.md +1 -1
  38. package/skills/microi-datasource-mapping/SKILL.md +131 -122
  39. package/skills/microi-db-schema/SKILL.md +175 -175
  40. package/skills/microi-db-schema/references/core-tables.md +695 -695
  41. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  42. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  43. package/skills/microi-db-schema/references/schema.md +646 -646
  44. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  45. package/skills/microi-deployment/SKILL.md +260 -260
  46. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  47. package/skills/microi-docs-coverage/SKILL.md +133 -133
  48. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  49. package/skills/microi-form-engine/SKILL.md +338 -338
  50. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  51. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  52. package/skills/microi-left-right-layout/SKILL.md +141 -141
  53. package/skills/microi-microservice/SKILL.md +6 -1
  54. package/skills/microi-microservice/references/runtime-delivery.md +282 -282
  55. package/skills/microi-solution-quotation/SKILL.md +78 -78
  56. package/skills/microi-sso/SKILL.md +102 -102
  57. package/skills/microi-sso/references/acceptance.md +1 -1
  58. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  59. package/skills/microi-sso/references/inbound.md +53 -53
  60. package/skills/microi-sso/references/outbound.md +43 -43
  61. package/skills/microi-system-delivery/SKILL.md +102 -100
  62. package/skills/microi-system-delivery/references/context-quality.md +56 -56
  63. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +11 -11
  64. 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 +12 -12
  65. package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +71 -71
  66. package/skills/module-engine/SKILL.md +297 -297
  67. package/skills/module-engine/references/module-config.md +204 -204
  68. package/skills/ocr-engine/SKILL.md +113 -113
  69. 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 +10 -10
  70. 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 +12 -12
  71. package/skills/performance-testing/SKILL.md +227 -227
  72. package/skills/playwright-e2e/SKILL.md +2 -0
  73. package/skills/print-engine/SKILL.md +259 -259
  74. package/skills/production-readonly-audit/SKILL.md +41 -41
  75. package/skills/report-engine/SKILL.md +83 -83
  76. package/skills/search-engine/SKILL.md +75 -75
  77. package/skills/spider-engine/SKILL.md +190 -190
  78. package/skills/system-observability/SKILL.md +264 -264
  79. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  80. package/skills/translate-engine/SKILL.md +140 -140
  81. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  82. package/skills/ui-design/references/design-pattern-library.md +184 -184
  83. package/skills/ui-design/references/mci-design-contract.md +163 -163
  84. package/skills/ui-design/references/motion-and-media.md +78 -78
  85. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  86. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  87. package/skills/unity-integration/SKILL.md +178 -178
  88. package/skills/unity-integration/references/ai-app-delivery.md +1 -1
  89. package/skills/unity-integration/references/sdk-api.md +82 -82
  90. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  91. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  92. package/skills/v8-api-config/SKILL.md +400 -400
  93. package/skills/v8-cache-pattern/SKILL.md +320 -320
  94. package/skills/v8-debugging/SKILL.md +284 -284
  95. package/skills/v8-explorer-tree/SKILL.md +228 -228
  96. package/skills/v8-file-upload/SKILL.md +1 -1
  97. package/skills/v8-file-upload/references/cdn-alias-repair.md +13 -13
  98. package/skills/v8-formengine-http/SKILL.md +1 -1
  99. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  100. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  101. package/skills/v8-image-processing/SKILL.md +190 -190
  102. package/skills/v8-image-processing/references/api-reference.md +623 -623
  103. package/skills/v8-mongodb/SKILL.md +201 -201
  104. package/skills/v8-mq-mqtt/references/mqtt-production.md +352 -352
  105. package/skills/v8-saas-multi-tenant/SKILL.md +4 -0
  106. package/skills/v8-security/SKILL.md +2 -0
  107. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +9 -3
  108. package/skills/v8-sql-query/SKILL.md +302 -302
  109. package/skills/v8-tcp-integration/SKILL.md +69 -2
  110. package/skills/v8-template-engine/SKILL.md +167 -167
  111. package/skills/v8-utilities/SKILL.md +1 -0
  112. package/skills/v8-utilities/references/client-api-index.md +143 -143
  113. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  114. package/skills/v8-utilities/references/server-api-index.md +2 -1
  115. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  116. package/skills/vision-engine/SKILL.md +160 -160
  117. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  118. package/skills/workspace-conventions/SKILL.md +168 -162
  119. 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 +2 -2
  120. 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 +34 -34
  121. 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 +6 -6
  122. package/skills/workspace-conventions/references/progressive-04-/345/267/245/344/275/234/345/214/272/344/270/216/345/271/263/345/217/260/344/270/223/351/241/271/344/277/235/351/232/234.md +188 -188
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: v8-tcp-integration
3
- description: Microi 后端 V8 TCP 原始字节集成规范。用于通过 V8.Tcp.Send/SendAsync/SendAndReceive/SendAndReceiveAsync 连接网络小票机、串口服务器、PLC 或其它 TCP 设备,处理 Byte/Base64/Hex/Text 载荷、GBK/GB18030、超时、响应、幂等与出站安全。
3
+ description: Microi 后端 TCP 与通用 IoT 集成规范。用于 V8.Tcp 一次性客户端、V8.IoT.Send 设备原连接下行、可配置拆帧/校验、跨节点路由,以及 MQTT/HTTP 能力选择、设备权限、幂等和真实验收。
4
4
  ---
5
5
 
6
6
  > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
@@ -20,6 +20,7 @@ description: Microi 后端 V8 TCP 原始字节集成规范。用于通过 V8.Tcp
20
20
  | RabbitMQ/MQTT | `V8.MQ` 或 MQTT 引擎 |
21
21
  | 浏览器/5+App 蓝牙或 SPP 打印 | 前端 `V8.Print`,读取 `v8-frontend-events/references/bluetooth-print.md` |
22
22
  | 设备原始 TCP 上报并保持连接等待应答 | API 宿主可选的 `TcpIngressRulesJson` 入站监听;固定租户与接口引擎,协议帧交给接口引擎处理 |
23
+ | 设备已主动连接平台,需要发送控制命令 | `V8.IoT.Send`,沿已授权原连接下行;不依赖某个厂家 |
23
24
  | TLS、任意协议、可由 V8 动态开端口、自定义连接池 | 当前不提供;单独评估安全边界和传输实现 |
24
25
 
25
26
  平台已经提供可复用原子能力后,打印模板、设备选择、订单状态、幂等和审计优先写在接口引擎/表单事件;不要为单个打印业务再写 C# Controller。
@@ -34,7 +35,73 @@ description: Microi 后端 V8 TCP 原始字节集成规范。用于通过 V8.Tcp
34
35
 
35
36
  启用前优先限制来源网段与云安全组,设置帧长、连接数和空闲时间上限;CRC、设备号都不是身份认证。经 CLB 时核对后端实际看到的源 IP,且当前不解析 Proxy Protocol v2 报头。全网例外必须有业务接口内的设备身份/授权校验、幂等与异常连接监控;如果协议本身没有不可伪造的设备凭据,应明确记录剩余风险,并在能识别来源时收窄规则及云侧放行。Docker 在同一个 API service 显式增加如 `19011:1885/tcp`(宿主机对外端口:容器内端口)的映射;不要把 `/apiengine/...` URL、HTTP 的 `80/1052` 或 `V8.Tcp.Send` 当作设备端 TCP 监听。新执行的在线一键安装器会在 `61600+` 连续宿主端口段末尾追加 MQTT/TCP 映射;离线默认宿主 `7010/7011`,都映射至 API 容器 `1883/1885` 并尝试放行宿主机防火墙。窄来源方案仍需云安全组/CLB 人工限源;已有 Compose 不会自动补映射,SaaS 内部端口改变后须同步 Compose。TCP 配置、引擎安全位或端口失败时仅 TCP 状态为 `Faulted`,HTTP 仍可健康;验收必须确认 TCP `Listening` 状态/监听日志、端口探测和合法心跳应答,再核对设备数据。只连上端口不能证明已回 ACK;当前没有对外的 TCP 状态 HTTP 端点,不能把 HTTP 健康当成 TCP 就绪。配置、回环测试、设备联调的详细步骤见官网中文后端 V8 页面;本地回环不等于客户真机已联网。
36
37
 
37
- ## API 契约
38
+ ## 已建立 IoT 连接的主动下行
39
+
40
+ `V8.IoT` 是受限的设备原连接下行扩展。
41
+ 设备主动连接平台且需要云端控制时,使用 `V8.IoT.Send({DeviceId, CommandId, FrameHex, ExpireSeconds})`,
42
+ 不能用 `V8.Tcp.Send` 新建连接代替原设备连接。须配套 Core、V8Engine 和 API 宿主更新;
43
+ 缺失 `TcpIngressRulesJson.downlink` 或 `enabled:false` 时不启用,修改配置后重启现有 API。
44
+
45
+ `V8.IoT` 负责连接路由与传输状态;操作码、流水号、厂家 HTTP/MQTT 选择、设备权限和回执
46
+ 放在接口引擎。禁止在 Core/V8Engine 中新增按厂家名、业务表名或设备编号分支。
47
+ MQTT 设备继续使用 MQTT 引擎,平台主动连接设备使用 `V8.Tcp`,厂家云接口使用 `V8.Http`。
48
+
49
+ 接入另一协议先读取厂家真实说明,再检查既有 `framing` 描述是否覆盖:
50
+
51
+ - 省略 `framing` 保持历史 U16BE/XMODEM,不改变既有配置含义。
52
+ - 显式 `framing.mode` 支持 `LengthPrefix`、`FixedLength`、`Delimiter`;帧头 0–32 字节、帧尾 0–16 字节。
53
+ - `lengthBytes` 为 1/2/4,`lengthByteOrder` 为 BigEndian/LittleEndian;长度加 `lengthAdjustment` 得总帧长。
54
+ - `fixedLength` 为固定帧总长;结束符模式必须有帧尾且载荷不含未转义结束符。
55
+ - `checksum` 为 Crc16Xmodem/Crc16Modbus/None;`checksumByteOrder` 与 `checksumStartOffset` 可配置。
56
+ - 上报地址由 `deviceOffset/deviceLength` 定义;下行偏移可用 `downlinkDeviceOffset`,地址不能与结构字段重叠。
57
+ - 普通 ACK 关联规则继续严格执行;主动下行用同一结构描述单独核对设备,不通过缩短关联区间绕过校验。
58
+ - 当前每个 API 进程只有一套监听规则;没有单端口多协议自动探测、TLS 或任意转义解码。
59
+ 超出能力时补通用适配器,不声称全部协议均已支持;完整配置示例与限制见官网后端 V8 主文档。
60
+
61
+ ```javascript
62
+ // 已完成设备行权限/操作权限校验,且业务指令已提交;由受权派发接口调用。
63
+ return V8.IoT.Send({
64
+ DeviceId: deviceAddressHex,
65
+ CommandId: committedCommandId,
66
+ FrameHex: completeProtocolFrameHex,
67
+ ExpireSeconds: 30
68
+ });
69
+ ```
70
+
71
+ - `downlink` 必须声明 `deviceOffset`、`deviceLength` 和 `sendApiEngineKeys`;其余队列、有效期、
72
+ 去重、租约和轮询限额见官网中文后端 V8 原页面。新设置继续使用既有 SaaS 规则,不加环境变量。
73
+ - 内部上报引擎确认设备身份和绑定后,每个成功响应显式返回 `Data.IoTDeviceId` 及正常
74
+ `Data.ResponseFrameHex`;地址必须与物理帧匹配。ACK 写入后才登记下行连接;明确免应答消息按下文处理。
75
+ - 控制接口必须校验当前用户的设备与操作权限;原子从可信执行上下文获取租户、接口 Key、
76
+ 登录用户或可信任务身份,并按管理员的 Key 白名单约束调用。禁止透传前端任意报文。
77
+ - `DeviceId` 为定长设备地址十六进制,由业务记录映射;`CommandId` 稳定且长期持久去重。
78
+ `FrameHex` 为无分隔符的完整协议帧。仅四个参数允许传入,租户/Host/Port 不接受。
79
+ - `Code=1` 只表示接受指令或发现同编号既有指令。`Queued`、`Sending`、`Written`、
80
+ `Unknown`、`Expired` 是传输状态;设备执行结果由协议回执确认。`Sending/Unknown` 禁止换号重发。
81
+ - 业务记录/outbox 先提交,再由派发任务调用原子;Redis 和设备动作不能随数据库回滚。
82
+ Redis 队列绑定连接代次,旧连接不能清除新连接租约,已经开始发送的指令不自动重投。
83
+ - 保持正常 ACK 的关联规则;主动下行独立校验目标、结构和 CRC,无需缩短原关联长度。
84
+ 原 ACK 与控制指令串行写入同一 Socket,重连与 Redis 故障必须覆盖。
85
+ - 单元/Socket 回环、真实 Redis 多节点、真实设备回执和物理动作是不同验收层;不得相互替代。
86
+
87
+ ### 多控制功能与免应答回执
88
+
89
+ - `V8.IoT.Send` 不筛选具体命令/操作码。设备开关、温度/阈值、定时数组、模式、报警提示等,
90
+ 共用原子;命令目录、字段宽度/顺序/单位、机型范围和权限由接口引擎编排,不再加厂家专属 C# 方法。
91
+ - 区分“报警上报/恢复”“远程报警提示开关”“消音/故障复位”。协议只有上报时,不能虚构清警指令,
92
+ 也不能以修改平台报警记录代替设备故障消除。
93
+ - 业务记录保存稳定 `CommandId` 与设备流水号映射;回执按设备、回执命令、子码、流水号及长度匹配。
94
+ 不同命令的成功码、流水号位置甚至应答命令可能不同,未知值保持未知,不统一写死。
95
+ - 温度范围、型号/固件语义或报文长度不明确的动作默认拒绝,等待厂家确认后修改可信配置。
96
+ 前端不能上传命令目录、范围、成功码、完整报文或可执行表达式覆盖后端规则。
97
+ - 控制回执无需平台再 ACK 时,受保护规则根节点显式配置 `allowNoResponse:true`,内部接口逐帧返回
98
+ `{Code:1,Data:{IoTDeviceId:authorizedAddressHex,ResponseMode:'None'}}`;不提供 `ResponseFrameHex` 属性。
99
+ 默认关闭且必须布尔值,更新后重启 API;只有数值 Code=1 和有效帧才接受,仍复核设备授权。
100
+ - `None` 表示消息已处理且零字节写回,不能代表设备已执行;缺失响应、空返回、失败或错误模式不能冒充 None。
101
+ 正常应答继续使用 `ResponseFrameHex`(可选 `ResponseMode:'Reply'`);心跳仍按厂家协议正常回 ACK。
102
+ - 回归覆盖可变载荷、不同回执格式、回执后继续心跳/控制、授权撤销、无效模式和存量失败 ACK。
103
+
104
+ ## API 契约:一次性 TCP 客户端
38
105
 
39
106
  | 方法 | 行为 |
40
107
  |---|---|
@@ -1,167 +1,167 @@
1
- ---
2
- name: v8-template-engine
3
- description: Microi V8 模板引擎指南。用于编写表格/表单模板渲染、V8.Result HTML/text 输出、行格式化、徽章、图片和自定义显示逻辑。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi V8 模板引擎(表格/表单 V8 模板)
9
-
10
- 你正在为 Microi 吾码平台编写 **表格 V8 模板引擎**、**表单 V8 模板引擎** 代码。模板引擎用于在数据渲染后自定义最终展示效果(颜色、徽章、图片、HTML),是表单引擎的高级特性。
11
-
12
- ## 核心规则
13
-
14
- - 模板引擎绑定在【表单属性】的【表格 V8 模板引擎】或【表单 V8 模板引擎】
15
- - 通过给 `V8.Result` 赋值字符串(HTML 或纯文本)来控制最终渲染结果
16
- - 在 **表格模板** 中:每行数据都会执行一次,`V8.Form` 是当前行数据
17
- - 注意:`V8.Form` 此时只能访问到【模块引擎】配置的【查询列】字段;若查询列为空则可访问全部字段
18
- - 支持 `bootstrap`、`element-ui` 样式类名
19
- - `V8.EventName` 可能为 `TableTemplateEngine` 或 `FormTemplateEngine`
20
- - 表格模板同步执行,输出优先级是 `V8.Result` → JavaScript `return` → 原字段值;表单模板异步执行并以 `V8.Result` 为输出
21
- - 模板结果通过 `v-safe-html`/DOMPurify 净化。`script`、`iframe`、`on*` 事件属性、`javascript:` 等危险内容会被剥离,禁止依赖内联点击事件
22
- - 业务文本必须 HTML 转义后再拼接;权限、校验、状态写入等业务逻辑必须放后端
23
-
24
- 模板中需要拼 HTML 时,先定义安全转义函数:
25
-
26
- ```javascript
27
- var escapeHtml = function (value) {
28
- return String(value == null ? '' : value)
29
- .replace(/&/g, '&')
30
- .replace(/</g, '&lt;')
31
- .replace(/>/g, '&gt;')
32
- .replace(/"/g, '&quot;')
33
- .replace(/'/g, '&#39;');
34
- };
35
- ```
36
-
37
- ## 状态徽章(Bootstrap 样式)
38
-
39
- ```javascript
40
- var value = V8.Form.Zhuangtai;
41
- if (V8.IsNull(value)) {
42
- V8.Result = '';
43
- } else {
44
- var classStr = 'badge-primary';
45
- if (value === '禁用') classStr = 'badge-danger';
46
- else if (value === '未通过') classStr = 'badge-warning';
47
- else if (value === '待审核') classStr = 'badge-info';
48
- else if (value === '通过') classStr = 'badge-success';
49
- V8.Result = '<span class="badge badge-pill ' + classStr + '">' + escapeHtml(value) + '</span>';
50
- }
51
- ```
52
-
53
- 可用 Bootstrap 徽章类:`badge-primary`, `badge-secondary`, `badge-success`, `badge-danger`, `badge-warning`, `badge-info`, `badge-light`, `badge-dark`
54
-
55
- ## 内联样式(颜色高亮)
56
-
57
- ```javascript
58
- // 不同业务状态显示不同字体颜色
59
- if (V8.Form.XuqiuLX === '合并') {
60
- V8.Result = '<span style="color:blue;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
61
- } else if (V8.Form.HebingID) {
62
- V8.Result = '<span style="color:#999;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
63
- } else {
64
- V8.Result = escapeHtml(V8.Form.XuqiuDDH);
65
- }
66
- ```
67
-
68
- ## 单图列渲染
69
-
70
- ```javascript
71
- var html = '';
72
- var fileServer = V8.SysConfig.FileServer;
73
- if (!V8.IsNull(V8.Form.GongsiLOGO)) {
74
- html = '<img src="' + escapeHtml(fileServer + V8.Form.GongsiLOGO) + '" '
75
- + 'alt="公司Logo" '
76
- + 'style="height:40px;width:40px;object-fit:cover;margin:5px 0;" />';
77
- }
78
- V8.Result = html;
79
- ```
80
-
81
- ## 多图列渲染(带点击放大)
82
-
83
- ```javascript
84
- var html = '';
85
- var fileServer = V8.SysConfig.FileServer;
86
- if (!V8.IsNull(V8.Form.TupianMS) && V8.Form.TupianMS.indexOf('[') !== -1) {
87
- var imgs = JSON.parse(V8.Form.TupianMS);
88
- imgs.forEach(function(item) {
89
- var url = escapeHtml(fileServer + item.Path);
90
- html += '<a href="' + url + '" target="_blank" rel="noopener noreferrer">'
91
- + '<img src="' + url + '" alt="图片" '
92
- + 'style="width:40px;height:40px;object-fit:cover;margin:5px 5px 5px 0;" />'
93
- + '</a>';
94
- });
95
- }
96
- V8.Result = html;
97
- ```
98
-
99
- ## 进度条渲染
100
-
101
- ```javascript
102
- var percent = V8.Form.Progress || 0;
103
- var color = '#67C23A';
104
- if (percent < 30) color = '#F56C6C';
105
- else if (percent < 70) color = '#E6A23C';
106
-
107
- V8.Result =
108
- '<div style="width:100%;background:#eee;border-radius:4px;height:16px;position:relative;">'
109
- + '<div style="width:' + percent + '%;background:' + color + ';height:100%;border-radius:4px;"></div>'
110
- + '<span style="position:absolute;left:50%;top:0;transform:translateX(-50%);color:#333;font-size:12px;line-height:16px;">' + percent + '%</span>'
111
- + '</div>';
112
- ```
113
-
114
- ## 多字段合并显示
115
-
116
- ```javascript
117
- // 联系人姓名 + 电话脱敏
118
- var name = V8.Form.LianxiR || '';
119
- var phone = V8.Form.LianxiPhone || '';
120
- if (phone.length === 11) phone = phone.substring(0, 3) + '****' + phone.substring(7);
121
- V8.Result = '<div><b>' + escapeHtml(name) + '</b><br/><small style="color:#999;">'
122
- + escapeHtml(phone) + '</small></div>';
123
- ```
124
-
125
- 模块引擎已有更轻量的声明式方案:`ViewSchema.Layout.List.Columns` 可用 `Field + Lines +
126
- TrailingFields` 组成多行列,`Layout.Card` 可配置移动端顶部、右侧、正文、元信息和底部字段。
127
- 仅需要多字段排版、图标、`Tone/Color/Prefix/Suffix` 时优先使用声明式配置;需要复杂条件
128
- HTML 时再给被引用的 `diy_field` 配置 `V8TmpEngineTable`。两种方式都会复用净化后的模板
129
- 结果,且所有引用字段仍必须在模块查询列或 `_SelectFields` 中。
130
-
131
- ## 条件性图标
132
-
133
- ```javascript
134
- var html = escapeHtml(V8.Form.Title || '');
135
- if (V8.Form.IsHot === 1) html += ' <i class="fas fa-fire" style="color:#F56C6C;"></i>';
136
- if (V8.Form.IsNew === 1) html += ' <span class="badge badge-danger">NEW</span>';
137
- V8.Result = html;
138
- ```
139
-
140
- ## 与字段值变更事件配合(动态计算)
141
-
142
- ```javascript
143
- // 表格模板中根据多个字段计算
144
- var price = parseFloat(V8.Form.Price) || 0;
145
- var discount = parseFloat(V8.Form.Discount) || 1;
146
- var total = (price * discount).toFixed(2);
147
- var color = total > 1000 ? '#F56C6C' : '#67C23A';
148
- V8.Result = '<span style="color:' + color + ';font-weight:bold;">¥' + total + '</span>';
149
- ```
150
-
151
- ## 常见错误
152
-
153
- ❌ 不要在模板中调用 `V8.FormEngine`(每行都查 → N+1 性能问题);需要关联数据时在查询列、接口引擎或后端 `DataFilterV8` 预取,只有 `DataFilterV8` 才提供 `V8.CacheData`
154
- ❌ 不要依赖对象/数组的隐式字符串化;`V8.Result` 建议显式输出字符串
155
- ❌ 模板中 `V8.Form` 默认只有【查询列】字段;缺字段就要去模块引擎补查询列
156
- ❌ 不要在模板里写复杂业务逻辑(应放到接口引擎或 DataFilterV8)
157
- ❌ 不要输出 `onclick/onerror`、`script/iframe` 或 `javascript:` URL;DOMPurify 会剥离这些内容
158
-
159
- ## 与 DataFilterV8 的区别
160
-
161
- | | DataFilterV8(后端) | 模板引擎(前端) |
162
- |---|---|---|
163
- | 运行端 | 服务器 | 浏览器 |
164
- | 用途 | 加工数据、脱敏、补字段 | 渲染 HTML 样式 |
165
- | 输出 | `V8.Form.字段 = ...` | `V8.Result = '<html>...</html>'` |
166
- | 字段范围 | 全部数据 | 仅查询列 |
167
- | 性能 | 每行执行(可用 `V8.CacheData`) | 浏览器渲染时执行 |
1
+ ---
2
+ name: v8-template-engine
3
+ description: Microi V8 模板引擎指南。用于编写表格/表单模板渲染、V8.Result HTML/text 输出、行格式化、徽章、图片和自定义显示逻辑。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi V8 模板引擎(表格/表单 V8 模板)
9
+
10
+ 你正在为 Microi 吾码平台编写 **表格 V8 模板引擎**、**表单 V8 模板引擎** 代码。模板引擎用于在数据渲染后自定义最终展示效果(颜色、徽章、图片、HTML),是表单引擎的高级特性。
11
+
12
+ ## 核心规则
13
+
14
+ - 模板引擎绑定在【表单属性】的【表格 V8 模板引擎】或【表单 V8 模板引擎】
15
+ - 通过给 `V8.Result` 赋值字符串(HTML 或纯文本)来控制最终渲染结果
16
+ - 在 **表格模板** 中:每行数据都会执行一次,`V8.Form` 是当前行数据
17
+ - 注意:`V8.Form` 此时只能访问到【模块引擎】配置的【查询列】字段;若查询列为空则可访问全部字段
18
+ - 支持 `bootstrap`、`element-ui` 样式类名
19
+ - `V8.EventName` 可能为 `TableTemplateEngine` 或 `FormTemplateEngine`
20
+ - 表格模板同步执行,输出优先级是 `V8.Result` → JavaScript `return` → 原字段值;表单模板异步执行并以 `V8.Result` 为输出
21
+ - 模板结果通过 `v-safe-html`/DOMPurify 净化。`script`、`iframe`、`on*` 事件属性、`javascript:` 等危险内容会被剥离,禁止依赖内联点击事件
22
+ - 业务文本必须 HTML 转义后再拼接;权限、校验、状态写入等业务逻辑必须放后端
23
+
24
+ 模板中需要拼 HTML 时,先定义安全转义函数:
25
+
26
+ ```javascript
27
+ var escapeHtml = function (value) {
28
+ return String(value == null ? '' : value)
29
+ .replace(/&/g, '&amp;')
30
+ .replace(/</g, '&lt;')
31
+ .replace(/>/g, '&gt;')
32
+ .replace(/"/g, '&quot;')
33
+ .replace(/'/g, '&#39;');
34
+ };
35
+ ```
36
+
37
+ ## 状态徽章(Bootstrap 样式)
38
+
39
+ ```javascript
40
+ var value = V8.Form.Zhuangtai;
41
+ if (V8.IsNull(value)) {
42
+ V8.Result = '';
43
+ } else {
44
+ var classStr = 'badge-primary';
45
+ if (value === '禁用') classStr = 'badge-danger';
46
+ else if (value === '未通过') classStr = 'badge-warning';
47
+ else if (value === '待审核') classStr = 'badge-info';
48
+ else if (value === '通过') classStr = 'badge-success';
49
+ V8.Result = '<span class="badge badge-pill ' + classStr + '">' + escapeHtml(value) + '</span>';
50
+ }
51
+ ```
52
+
53
+ 可用 Bootstrap 徽章类:`badge-primary`, `badge-secondary`, `badge-success`, `badge-danger`, `badge-warning`, `badge-info`, `badge-light`, `badge-dark`
54
+
55
+ ## 内联样式(颜色高亮)
56
+
57
+ ```javascript
58
+ // 不同业务状态显示不同字体颜色
59
+ if (V8.Form.XuqiuLX === '合并') {
60
+ V8.Result = '<span style="color:blue;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
61
+ } else if (V8.Form.HebingID) {
62
+ V8.Result = '<span style="color:#999;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
63
+ } else {
64
+ V8.Result = escapeHtml(V8.Form.XuqiuDDH);
65
+ }
66
+ ```
67
+
68
+ ## 单图列渲染
69
+
70
+ ```javascript
71
+ var html = '';
72
+ var fileServer = V8.SysConfig.FileServer;
73
+ if (!V8.IsNull(V8.Form.GongsiLOGO)) {
74
+ html = '<img src="' + escapeHtml(fileServer + V8.Form.GongsiLOGO) + '" '
75
+ + 'alt="公司Logo" '
76
+ + 'style="height:40px;width:40px;object-fit:cover;margin:5px 0;" />';
77
+ }
78
+ V8.Result = html;
79
+ ```
80
+
81
+ ## 多图列渲染(带点击放大)
82
+
83
+ ```javascript
84
+ var html = '';
85
+ var fileServer = V8.SysConfig.FileServer;
86
+ if (!V8.IsNull(V8.Form.TupianMS) && V8.Form.TupianMS.indexOf('[') !== -1) {
87
+ var imgs = JSON.parse(V8.Form.TupianMS);
88
+ imgs.forEach(function(item) {
89
+ var url = escapeHtml(fileServer + item.Path);
90
+ html += '<a href="' + url + '" target="_blank" rel="noopener noreferrer">'
91
+ + '<img src="' + url + '" alt="图片" '
92
+ + 'style="width:40px;height:40px;object-fit:cover;margin:5px 5px 5px 0;" />'
93
+ + '</a>';
94
+ });
95
+ }
96
+ V8.Result = html;
97
+ ```
98
+
99
+ ## 进度条渲染
100
+
101
+ ```javascript
102
+ var percent = V8.Form.Progress || 0;
103
+ var color = '#67C23A';
104
+ if (percent < 30) color = '#F56C6C';
105
+ else if (percent < 70) color = '#E6A23C';
106
+
107
+ V8.Result =
108
+ '<div style="width:100%;background:#eee;border-radius:4px;height:16px;position:relative;">'
109
+ + '<div style="width:' + percent + '%;background:' + color + ';height:100%;border-radius:4px;"></div>'
110
+ + '<span style="position:absolute;left:50%;top:0;transform:translateX(-50%);color:#333;font-size:12px;line-height:16px;">' + percent + '%</span>'
111
+ + '</div>';
112
+ ```
113
+
114
+ ## 多字段合并显示
115
+
116
+ ```javascript
117
+ // 联系人姓名 + 电话脱敏
118
+ var name = V8.Form.LianxiR || '';
119
+ var phone = V8.Form.LianxiPhone || '';
120
+ if (phone.length === 11) phone = phone.substring(0, 3) + '****' + phone.substring(7);
121
+ V8.Result = '<div><b>' + escapeHtml(name) + '</b><br/><small style="color:#999;">'
122
+ + escapeHtml(phone) + '</small></div>';
123
+ ```
124
+
125
+ 模块引擎已有更轻量的声明式方案:`ViewSchema.Layout.List.Columns` 可用 `Field + Lines +
126
+ TrailingFields` 组成多行列,`Layout.Card` 可配置移动端顶部、右侧、正文、元信息和底部字段。
127
+ 仅需要多字段排版、图标、`Tone/Color/Prefix/Suffix` 时优先使用声明式配置;需要复杂条件
128
+ HTML 时再给被引用的 `diy_field` 配置 `V8TmpEngineTable`。两种方式都会复用净化后的模板
129
+ 结果,且所有引用字段仍必须在模块查询列或 `_SelectFields` 中。
130
+
131
+ ## 条件性图标
132
+
133
+ ```javascript
134
+ var html = escapeHtml(V8.Form.Title || '');
135
+ if (V8.Form.IsHot === 1) html += ' <i class="fas fa-fire" style="color:#F56C6C;"></i>';
136
+ if (V8.Form.IsNew === 1) html += ' <span class="badge badge-danger">NEW</span>';
137
+ V8.Result = html;
138
+ ```
139
+
140
+ ## 与字段值变更事件配合(动态计算)
141
+
142
+ ```javascript
143
+ // 表格模板中根据多个字段计算
144
+ var price = parseFloat(V8.Form.Price) || 0;
145
+ var discount = parseFloat(V8.Form.Discount) || 1;
146
+ var total = (price * discount).toFixed(2);
147
+ var color = total > 1000 ? '#F56C6C' : '#67C23A';
148
+ V8.Result = '<span style="color:' + color + ';font-weight:bold;">¥' + total + '</span>';
149
+ ```
150
+
151
+ ## 常见错误
152
+
153
+ ❌ 不要在模板中调用 `V8.FormEngine`(每行都查 → N+1 性能问题);需要关联数据时在查询列、接口引擎或后端 `DataFilterV8` 预取,只有 `DataFilterV8` 才提供 `V8.CacheData`
154
+ ❌ 不要依赖对象/数组的隐式字符串化;`V8.Result` 建议显式输出字符串
155
+ ❌ 模板中 `V8.Form` 默认只有【查询列】字段;缺字段就要去模块引擎补查询列
156
+ ❌ 不要在模板里写复杂业务逻辑(应放到接口引擎或 DataFilterV8)
157
+ ❌ 不要输出 `onclick/onerror`、`script/iframe` 或 `javascript:` URL;DOMPurify 会剥离这些内容
158
+
159
+ ## 与 DataFilterV8 的区别
160
+
161
+ | | DataFilterV8(后端) | 模板引擎(前端) |
162
+ |---|---|---|
163
+ | 运行端 | 服务器 | 浏览器 |
164
+ | 用途 | 加工数据、脱敏、补字段 | 渲染 HTML 样式 |
165
+ | 输出 | `V8.Form.字段 = ...` | `V8.Result = '<html>...</html>'` |
166
+ | 字段范围 | 全部数据 | 仅查询列 |
167
+ | 性能 | 每行执行(可用 `V8.CacheData`) | 浏览器渲染时执行 |
@@ -86,6 +86,7 @@ var clientDecoded = V8.Base64.decode(clientEncoded);
86
86
  | 表单 CRUD、`_Where` | `v8-crud-api`、`v8-sql-query` |
87
87
  | HTTP/第三方接口 | `v8-http-integration` |
88
88
  | TCP 原始字节/网络小票机/设备 | `v8-tcp-integration` |
89
+ | 通用 IoT 设备原连接控制、`V8.IoT.Send`、协议拆帧与跨节点去重 | `v8-tcp-integration`;MQTT 设备使用 `v8-mq-mqtt` |
89
90
  | Redis/Hash | `v8-cache-pattern` |
90
91
  | 文件/HDFS | `v8-file-upload` |
91
92
  | 图片 | `v8-image-processing` |