@microi.net/cli 6.1.8 → 6.1.9
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/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +43 -43
- package/.mcp.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +82 -82
- package/scripts/codex-marketplace.json +20 -20
- package/scripts/mcp-codex-stdio-adapter.js +189 -189
- package/scripts/mcp-server.js +100 -96
- package/scripts/mcp-trae-windows-launcher.cmd +21 -21
- package/scripts/microi-cli-mcp.js +7 -7
- package/scripts/microi-skills.meta.json +247 -235
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +72 -66
- package/skills/ai-engine/SKILL.md +303 -293
- package/skills/app-store/SKILL.md +2 -1
- package/skills/microi-client-frontend/SKILL.md +260 -252
- package/skills/microi-datasource-mapping/SKILL.md +4 -0
- package/skills/microi-deployment/SKILL.md +63 -5
- package/skills/microi-deployment/references/deployment-matrix.md +27 -0
- package/skills/microi-deployment/references/offline-installer.md +64 -0
- package/skills/microi-docs-coverage/references/capability-map.md +3 -3
- package/skills/microi-form-engine/SKILL.md +13 -0
- package/skills/microi-form-engine/references/component-catalog.md +1 -1
- package/skills/microi-microservice/SKILL.md +17 -0
- package/skills/microi-system-delivery/SKILL.md +8 -6
- package/skills/microi-system-delivery/references/delivery-pitfalls.md +50 -0
- 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 -9
- package/skills/microi-uniapp-frontend/SKILL.md +18 -3
- package/skills/module-engine/SKILL.md +4 -5
- package/skills/page-engine/SKILL.md +233 -215
- package/skills/print-engine/SKILL.md +5 -0
- package/skills/report-engine/SKILL.md +9 -0
- package/skills/report-engine/scripts/check-demo-coverage.mjs +88 -0
- package/skills/report-engine/scripts/check-demo-coverage.test.mjs +52 -0
- package/skills/scripts/sync-embedded-skills.mjs +4 -1
- package/skills/ui-design/SKILL.md +1 -1
- package/skills/uniapp-mall-assets/SKILL.md +5 -0
- package/skills/v8-file-upload/SKILL.md +18 -4
- package/skills/v8-file-upload/references/hotspot-offload-operations.md +16 -1
- package/skills/v8-saas-multi-tenant/SKILL.md +17 -4
- package/skills/v8-security/SKILL.md +20 -5
- package/skills/vision-engine/SKILL.md +114 -3
- package/skills/vision-engine/references/architecture-and-acceptance.md +8 -0
- package/skills/workspace-conventions/SKILL.md +9 -3
- 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 +4 -4
- 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 +22 -1
|
@@ -9,12 +9,24 @@ description: Microi 吾码 UniApp/H5/App/小程序前端规范。用于创建或
|
|
|
9
9
|
|
|
10
10
|
本 Skill 适用于任何 Microi 吾码 UniApp/H5 项目,包括商城、OA、ERP、MES、CRM、互联网项目、预约项目等。不要把规则写成某一个业务应用专属规范。
|
|
11
11
|
|
|
12
|
+
## 视频选择与开发者工具兼容
|
|
13
|
+
|
|
14
|
+
视频上传必须区分微信开发者工具与真机:只在微信运行时明确返回 `platform='devtools'`
|
|
15
|
+
时,允许使用 `chooseMessageFile({count:1,type:'video'})` 选择电脑视频,绕开工具内部
|
|
16
|
+
视频信息解析失败。优先读取 `getDeviceInfo`,旧基础库兼容 `getSystemInfoSync`;不能
|
|
17
|
+
按模拟器显示的手机型号或窗口宽度判断。真机继续相册/拍摄,取消、权限拒绝或接口缺失
|
|
18
|
+
均不自动切到聊天文件;H5 保留浏览器文件选择。选择结果统一进入现有 SDK 上传和字段
|
|
19
|
+
授权链路。开发工具仍须拒绝误选图片、空结果和复制失败,非权限错误不得提示检查权限,
|
|
20
|
+
保留可诊断的原始错误。回归同时覆盖开发工具、iOS/Android、H5、取消和选错文件。
|
|
21
|
+
|
|
12
22
|
## 图片上传默认参数(强制)
|
|
13
23
|
|
|
14
24
|
UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` / `V8.uploadFiles` 上传图片。调用方省略 `options.preview` 时,SDK 必须发送 `Preview=true` 并默认使用 `img` 路径;只有显式 `preview:false` 才允许关闭。服务端仍是最终事实源:即使旧客户端完全不传该字段,也要默认压缩到约 `500 KB`、最长边约 `1920 px`,并在 HDFS 私有桶保留一份 `_origin` 原图。页面不得为了“上传成功”自行改成 `preview:false`,也不得把私有原图或临时签名地址保存进业务字段。
|
|
15
25
|
|
|
16
26
|
动态表单上传还必须把控件已有的文件访问上下文透传为 `formFieldContext`:至少包含 `FormEngineKey + FieldId + SysMenuId`,编辑时再带 `FormDataId`,TableChild 再带 `_TableChildAuth`。后端回读 `diy_field.Config` 后决定“禁止匿名访问”与真实桶;普通用户不能被一刀切为私有桶,客户端自己传 `Limit=false` 也不能放宽私有字段。没有字段上下文的聊天、打卡、临时业务上传仍按普通私有上传处理。
|
|
17
27
|
|
|
28
|
+
图片安全校验开启时采用简单审核交互:服务端明确通过后才写入表单值;表单和批量操作按 `pendingCount`(包含上传与审核)及 `failedCount` 拦截提交,不能只检查 `uploadingCount`。客户端短轮询预算耗尽不等于服务端审核失败。`waitForContentSecurityBatch` 显式传 `deferContentSecurityReview:true` 时保留 `Pending` 和审核编号,并返回实际 `PendingCount`;该传输选项不授权待审业务保存,默认等待审核的旧调用保持超时失败契约。上传组件应支持有界刷新和历史已保存待审图片的状态恢复,取消/换图/离页后的迟到结果不得回写。只有服务端明确通过才解除审核占位,按原字段权限取预览地址;预览取址失败不能吞掉已确认的审核状态。拒绝、错误或明确超时仍失败关闭。回归覆盖待审提交拦截、通过后保存、终态、网络失败、重复刷新、删除与离页,不通过延长前台计时或把 Pending 改为 Passed 掩盖回调问题。
|
|
29
|
+
|
|
18
30
|
## 平台方通用 App 登录连接器(明确例外)
|
|
19
31
|
|
|
20
32
|
登录页默认不得展示 ApiBase、OsClient 或调试配置;但用户明确要求、且安装包由 Microi 平台方作为多租户聚合客户端发布时,允许仅在 `APP-PLUS` 登录页提供通用连接器。协议必须使用固定 `https://` / `http://` 下拉框,地址框禁止重复输入协议,HTTPS 默认,HTTP 显示明文风险并二次确认;H5、小程序和客户专属包不得因此自动开放。候选地址先匿名读取 `GetSysConfig`,验证成功后再持久化。真正切换时必须清除旧 DiyToken、用户、SignalR、菜单/元数据/页面缓存,按 `ApiBase + OsClient` 隔离记住的账号及 RSA 密文,并用端点代次拒绝切换前的迟到响应。支持任意 HTTP 时,最终 IPA 必须显式包含 ATS 例外,Android 安装包必须显式包含 cleartext 例外;不需要任意 HTTP 的正式包应保持平台默认安全策略,iOS ATS 例外还必须在 App Store 审核中说明。
|
|
@@ -26,7 +38,7 @@ UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` /
|
|
|
26
38
|
创建、重构或修复任何 Microi 移动端项目前,必须同时应用 `microi.skills/microi-mobile-app-quality/SKILL.md`,并读取其[首版交付与外部服务验收](../microi-mobile-app-quality/references/mobile-first-delivery.md)。手机号快捷登录、会话续签、导航几何、真实地图、页面动效和公开发布回读从首版纳入需求与测试,不能先交静态占位版,再等待用户逐页指出问题。涉及后台与第三方服务时按实际业务范围执行,既有授权和租户策略优先。
|
|
27
39
|
|
|
28
40
|
<!-- /microi-progressive:chunk -->
|
|
29
|
-
<!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=
|
|
41
|
+
<!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=8b6124cf7267beae98f0321780bc1aece9494c669e0337a96a61f50f5cbf62e6 -->
|
|
30
42
|
## 标准产品、视图协议与租户扩展
|
|
31
43
|
|
|
32
44
|
地图提供行政区与附近距离两类筛选时,应复用省市区字典,并允许省、市、区逐级选“全部”;省级“全部”须显式启用,不能改变普通地址录入的默认值。行政区域查询不依赖手机定位、不叠加附近半径,空地区仍可保留既有附近模式。范围筛选必须在原有菜单/租户/行权限内执行,分批读取并丢弃迟到响应;来源列表存在同表不同菜单时,地图入口与查询应保留准确的来源菜单和固定业务条件。验收覆盖全国、全省、全市、区县、直辖市、定位拒绝、旧接口兼容和快速切换。
|
|
@@ -45,6 +57,7 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
|
|
|
45
57
|
统一视图协议归属 `sys_menu`。使用 `EnableViewSchema`、`ViewSchema`、`ViewSchemaVersion`、`ViewConfigVersion` 等明确物理字段保存 `List/Card/Detail/Edit`、`PC/Mobile/All`、角色视图、Hero、MetricStrip、ActionGrid 和 ResponsiveSection。`diy_table/diy_field/sys_menu.DiyConfig` 已废弃,禁止继续读取或写入。
|
|
46
58
|
|
|
47
59
|
- 后台新增字段或修改名称、顺序、显隐、组件、校验、数据源和分组后,客户端必须通过版本指纹刷新定义,无需重新发版。
|
|
60
|
+
- 关联表单尚未选择父记录或草稿未就绪时,租户可通过 `getRelatedPresentation.blockedReason` 保留分组标题并显示前置提示,平台延迟挂载关联控件;不要用 `visible:false` 表达暂时不可操作。局部保存必须区分未加载字段与用户明确清空,隐藏关联 Id 的选型变更须通过受控提交钩子携带;回归覆盖不同新增入口、初始化失败/恢复及部分字段投影。
|
|
48
61
|
- 表单元数据必须通过 `V8.FormEngine.GetDiyTableModel/GetDiyFieldList` 访问当前 FormEngine 缓存入口,并携带真实菜单授权上下文;页面和控件不得用普通 `GetFormData/GetTableData` 直查受保护的 `diy_table/diy_field`,也不得散落裸元数据接口 URL。
|
|
49
62
|
- ViewSchema 未配置、配置不完整或网络暂时失败时,必须回退到菜单移动字段和完整 `diy_field` 定义;定制详情还必须把未显式编排的新字段追加到折叠分组,不能静默丢字段。
|
|
50
63
|
- 列表、详情、编辑和保存请求应携带真实授权 `_SysMenuId`;客户端不能自行声明角色、数据范围或表权限,服务端仍是最终权限边界。
|
|
@@ -52,6 +65,8 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
|
|
|
52
65
|
- 原生详情进入编辑后,取消丢弃未保存字段并返回同一详情/Tab,保存成功后回读服务端结果并通知来源列表刷新;直接新增/编辑仍返回来源列表。验收覆盖系统返回、保存/子表失败、迟到响应和权限撤销,不能用重复压入详情页替代原实例恢复。
|
|
53
66
|
- IoT/关联快照的“记录不存在”应展示业务空状态并隐藏表名/SQL,权限与网络失败仍保留真实错误;未知遥测使用占位值,零值和离线不能被当作缺失。依赖租户 V8 的契约测试从授权同步目录按唯一 ApiEngineKey 定位,测试前核验源码完整性与哈希,不靠旧分类文件夹名定位或跳过缺失依赖。
|
|
54
67
|
- 小程序不得下载或执行任意前端 V8,不得使用 `eval/new Function`。字段显隐和联动使用白名单声明式规则,按钮使用 ActionSchema,复杂事务和校验进入 ApiEngine 或后端表单事件。
|
|
68
|
+
- 定时、策略等独立编辑入口须有受控原生适配,遵守字段移动端显隐、角色、只读和后端授权;不能仅因即时控制 Operations 不含该编辑动作而丢弃入口。沿用实际接口参数白名单,不把未经支持的菜单、角色或完整报文塞入请求。计划保存、准备、派发和查询使用同一编号,确认取消不写入,离页阻断后续派发;回归覆盖参数契约、撤权、响应丢失和内容不一致。
|
|
69
|
+
- 关联快照值默认完整换行,长标识、地址和周计划整行展示,短指标可双列;不得用单行省略替代完整数据。租户 `getRelatedPresentation` 可返回 `snapshotSections/snapshotNotes` 精简重复说明,保留原始口径、单位、脱敏、零值和待确认提示;通用组件不写业务字段映射。截图要实际滚动到长值和计划编辑区域,并断言内容、容器尺寸与末尾字段可达。
|
|
55
70
|
- 定制详情的按钮锚点必须从完整表单定义定位所属 Tab/分组,不能回退到当前 Tab 的第一个可见分组,否则关联、二维码等基础动作会串栏。后台 Button 只有受控原生适配才能进入小程序;设备控制同时取字段权限与服务端能力交集,较多动作按业务分组、双列和“更多”展开。涉及物理动作时沿用服务端稳定编号的准备/派发/查询协议,超时只查原编号,离页/切换记录取消后续派发;接口受理、设备回执和遥测复核分别展示。回归覆盖 Tab 往返、权限撤销、取消、连点、响应丢失、旧指令混入和迟到响应。
|
|
56
71
|
- 分片日志的时间筛选复用后台 SearchFieldIds 和统一筛选弹窗,不增加重复的月份、开始日期和结束日期控件。月份从已选时间推导,未筛选时查询当月;虚拟文本时间发送完整边界,缺省精度可按接口能力使用分钟,显式 DateTimeType 优先。草稿确认后生效、关闭取消、重置清空条件;结束包含整个所选精度。服务端在存储层过滤、计数和分页,缓存及迟到响应按已生效条件隔离;接口不支持跨月时在提交前明确提示。
|
|
57
72
|
- ActionSchema 只能描述文字、图标、颜色、确认提示、参数映射、ApiEngineKey、原生 ActionType 和成功后的刷新/跳转;扫码、定位、拍照、拨号、导航等由受控原生适配器执行。
|
|
@@ -118,7 +133,7 @@ Profile 覆盖层回归必须在独占临时夹具中执行,禁止为了测试
|
|
|
118
133
|
- 交付前至少检查 375px 与 430px 宽度首屏截图,确认标题、主按钮、次按钮、浮动面板、第二块内容没有重叠、裁切或不美观换行。
|
|
119
134
|
|
|
120
135
|
<!-- /microi-progressive:chunk -->
|
|
121
|
-
<!-- microi-progressive:chunk id=microi-uniapp-frontend-006 sha256=
|
|
136
|
+
<!-- microi-progressive:chunk id=microi-uniapp-frontend-006 sha256=2e0f32b44149c98ba70b96279fdb9d170dbcb07d48e14056fa9025b163f463e6 -->
|
|
122
137
|
## 资源 URL 必须集中解析
|
|
123
138
|
|
|
124
139
|
数据库中的图片、附件、头像、Logo、卡面图、单据图片等字段常见保存形式:
|
|
@@ -138,7 +153,7 @@ Profile 覆盖层回归必须在独占临时夹具中执行,禁止为了测试
|
|
|
138
153
|
- `http(s)://`、`data:`、`blob:` 原样返回。
|
|
139
154
|
- `/file/...` 走 API 服务。
|
|
140
155
|
- `/tenant/...`、`tenant/...` 等对象存储路径走 `V8.SysConfig.FileServer` 对应的文件服务器/CDN。
|
|
141
|
-
-
|
|
156
|
+
- 私有文件通过平台授权接口携带表单、记录、字段和菜单上下文获取短期地址;字段私有或附件实际 `Limit=true/1` 均须鉴权。签发失败显示受控错误,禁止回退到公开文件服务器路径。文档下载后的临时路径无后缀时,从附件 `Name/Path` 推导并显式传入 `openDocument.fileType`。
|
|
142
157
|
- 第三方占位图、已失效临时地址、空字符串统一清理为空,交给 UI 占位态。
|
|
143
158
|
|
|
144
159
|
<!-- /microi-progressive:chunk -->
|
|
@@ -72,6 +72,8 @@ PC 卡片优先选择当前终端 Card 视图,没有时复用 Mobile Card;
|
|
|
72
72
|
- 主后台侧栏读取 `sys_menu.IconClass`(CSS/组件图标),不是图片字段 `Icon`。优先填写当前前端已注册的 Element Plus 图标名;使用 FontAwesome/CSS 名称时先核对兼容映射,不能填入不存在的类名后让全部菜单回退为 `Document`。
|
|
73
73
|
- 没有贴切图标时,从实际可用图标集合中随机选一个,并将选择结果保存;可以按稳定菜单 Id 生成确定的随机分配,避免每次刷新或重新发布都变图标。同组菜单应有适当差异,不强求不同业务绝对不重复。
|
|
74
74
|
- 通过 `microi_create_module` / `microi_update_module` 或 Manifest 的模块配置写入,并把图标纳入应用包。只修改图片字段、只检查数据库字符串或只改本地 Manifest 不算完成;必须回读 `IconClass`,在真实侧栏检查图标可见且有区别。
|
|
75
|
+
- 创建菜单优先显式传 `iconClass`(Manifest 同名,保存为 `IconClass`);`icon`/`Icon` 保留桌面图片地址语义。历史调用把CSS图标传入 `icon` 时仅作为兼容输入,不能因此漏写侧栏字段。未指定时生成器按业务语义或稳定名称哈希从实际注册图标中补齐,禁止统一退为 `Document`。
|
|
76
|
+
- 同一父菜单下逐项检查图标与功能对应,分类、客户、产品、商机、报价、合同、回款等应可辨识;无法精确匹配时使用稳定差异图标,不追求全系统绝对唯一。幂等重跑保留既有正确图标,只有明确授权修复空值/错误值时才更新。工具成功后独立回读,旧MCP缺参数时先升级工具,不能把不存在的字段当作已经生效。
|
|
75
77
|
|
|
76
78
|
### 新模块表单打开方式(强制默认)
|
|
77
79
|
|
|
@@ -102,11 +104,8 @@ PC 卡片优先选择当前终端 Card 视图,没有时复用 Mobile Card;
|
|
|
102
104
|
记录版本限制并保留可用页面,不写不存在的组件路径,不擅自升级客户容器。占位页填满
|
|
103
105
|
可用内容区,持续动画表达等待,支持明暗主题、
|
|
104
106
|
窄屏及减少动态效果;没有真实任务状态时禁止伪造开发百分比、倒计时或完成量。
|
|
105
|
-
-
|
|
106
|
-
|
|
107
|
-
`Id/ParentId/Url/Sort`、角色/按钮权限和其它关联。刷新菜单、移除旧占位缓存并回读,
|
|
108
|
-
从原菜单和原 URL 最终验收;失败仅恢复该菜单记录的占位/原正确绑定并列为未完成。
|
|
109
|
-
不要求仍占位的原 URL 提前展示候选页面。MicroService 绑定仍遵守四字段完整性。
|
|
107
|
+
- 页面可运行后立即回读资源 Id,在同一 sys_menu.Id 绑定真实页面,供用户从原菜单预览;保留 Id/ParentId/Url/Sort、角色/按钮权限和关联。刷新菜单与旧占位缓存,从原入口边开发边验收,不能只开放候选 URL 而原菜单仍显示开发中。MicroService 先发布并验证运行产物,绑定仍遵守四字段完整性。
|
|
108
|
+
- 蓝图区分可预览/待验收与验收通过。局部缺陷继续修复;白屏、资源不可达或越权时优先恢复最近可运行且授权正确的绑定,确无可运行版本才恢复占位,不将预览可见当成交付完成。
|
|
110
109
|
- 用 `microi_get_module` 回读,再用真实用户逐菜单点击、切换、刷新检查标题、访问标签、
|
|
111
110
|
权限与缓存;开发中或失败菜单列为未完成,不以占位页、隐藏菜单或修改状态文案冒充交付。
|
|
112
111
|
|
|
@@ -1,226 +1,244 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: page-engine
|
|
3
|
-
description: 生成和审查 Microi 界面引擎 Page Engine 页面 JSON。用于创建仪表盘、图表、表格、地图、组件、页面布局,或校验 mic_page formData JSON。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
-
|
|
8
|
-
# Microi 界面引擎(Page Engine)页面 JSON 生成
|
|
9
|
-
|
|
10
|
-
MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_page_design`;版本治理入口见下文。保存工具写入后仍需回读 `mic_page`,不能把生成成功当作持久化成功。
|
|
11
|
-
|
|
12
|
-
## 完整 AI 开发默认报表(强制)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
先把相应入口纳入菜单骨架,再接通真实数据并验收。详细范围与菜单切换流程读取
|
|
16
|
-
[菜单先行与经营报表增补要求](../microi-system-delivery/references/progressive-01-标准工作流.md#菜单先行与经营报表增补要求强制)。
|
|
17
|
-
局部修改只覆盖相关页面/指标,只读分析不创建页面。用户明确的范围优先。
|
|
18
|
-
|
|
19
|
-
- 每个报表服务明确角色与决策任务;业务运营覆盖状态、趋势、效率与异常,经营视角覆盖
|
|
20
|
-
有真实来源的规模、收支/利润、回款及风险,管理视角覆盖部门/人员、任务进展、待办/逾期、
|
|
21
|
-
利用与达成。不存在数据来源的指标标为不适用并说明,不能编造成本、利润或业绩。
|
|
22
|
-
- 每个指标定义来源、公式、单位/精度、状态、时间字段/时区/边界、比较基期、维度与角色。
|
|
23
|
-
当前租户真实数据通过服务端批量聚合,时间/维度筛选和用户数据权限必须在接口中生效。
|
|
24
|
-
禁止演示值、本页合计冒充全量或前端拉取全量明细再统计。
|
|
25
|
-
- 页面包含周期/维度筛选、加载、零/空、无权限和失败状态;请求失败不能显示为正常零值。
|
|
26
|
-
指标/图表穿透到同一口径的授权明细并对账。界面引擎负责看板和图表,分页查询/导出明细
|
|
27
|
-
配合 `report-engine`;列表汇总、Hero 和角标不能替代决策报表。
|
|
28
|
-
- 保存后回读 `mic_page`、菜单绑定、数据源/接口;以管理员、经营/管理角色、普通与无权限
|
|
29
|
-
角色验证时间边界、筛选、隔离、零/空/失败和明细对账,完成电脑/移动、明暗主题截图。
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
- `
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
1
|
+
---
|
|
2
|
+
name: page-engine
|
|
3
|
+
description: 生成和审查 Microi 界面引擎 Page Engine 页面 JSON。用于创建仪表盘、图表、表格、地图、组件、页面布局,或校验 mic_page formData JSON。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
+
|
|
8
|
+
# Microi 界面引擎(Page Engine)页面 JSON 生成
|
|
9
|
+
|
|
10
|
+
MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_page_design`;版本治理入口见下文。保存工具写入后仍需回读 `mic_page`,不能把生成成功当作持久化成功。
|
|
11
|
+
|
|
12
|
+
## 完整 AI 开发默认报表(强制)
|
|
13
|
+
|
|
14
|
+
完整系统开发必须按需求主动设计业务统计、老板经营与领导管理报表,按微服务优先、原生能力满足时选界面引擎、HTML兼容最后的三方式规则选择展示技术,
|
|
15
|
+
先把相应入口纳入菜单骨架,再接通真实数据并验收。详细范围与菜单切换流程读取
|
|
16
|
+
[菜单先行与经营报表增补要求](../microi-system-delivery/references/progressive-01-标准工作流.md#菜单先行与经营报表增补要求强制)。
|
|
17
|
+
局部修改只覆盖相关页面/指标,只读分析不创建页面。用户明确的范围优先。
|
|
18
|
+
|
|
19
|
+
- 每个报表服务明确角色与决策任务;业务运营覆盖状态、趋势、效率与异常,经营视角覆盖
|
|
20
|
+
有真实来源的规模、收支/利润、回款及风险,管理视角覆盖部门/人员、任务进展、待办/逾期、
|
|
21
|
+
利用与达成。不存在数据来源的指标标为不适用并说明,不能编造成本、利润或业绩。
|
|
22
|
+
- 每个指标定义来源、公式、单位/精度、状态、时间字段/时区/边界、比较基期、维度与角色。
|
|
23
|
+
当前租户真实数据通过服务端批量聚合,时间/维度筛选和用户数据权限必须在接口中生效。
|
|
24
|
+
禁止演示值、本页合计冒充全量或前端拉取全量明细再统计。
|
|
25
|
+
- 页面包含周期/维度筛选、加载、零/空、无权限和失败状态;请求失败不能显示为正常零值。
|
|
26
|
+
指标/图表穿透到同一口径的授权明细并对账。界面引擎负责看板和图表,分页查询/导出明细
|
|
27
|
+
配合 `report-engine`;列表汇总、Hero 和角标不能替代决策报表。
|
|
28
|
+
- 保存后回读 `mic_page`、菜单绑定、数据源/接口;以管理员、经营/管理角色、普通与无权限
|
|
29
|
+
角色验证时间边界、筛选、隔离、零/空/失败和明细对账,完成电脑/移动、明暗主题截图。
|
|
30
|
+
页面可运行后立即以回读后的真实页面 Id 绑定原菜单供预览,保留菜单身份、URL 与权限,
|
|
31
|
+
从原入口持续验收;候选入口不能替代原菜单。白屏/不可达/越权时恢复最近可运行且授权正确的绑定,
|
|
32
|
+
确无可用版本才恢复占位。可预览与验收通过分别记录。
|
|
33
|
+
- 报表默认周期的模拟数据覆盖与独立对账按 `../report-engine/SKILL.md` 执行;每个组件的日期控件、
|
|
34
|
+
请求参数、服务端区间和页面结果均需核对。不得只验证静态 JSON 或历史月份有数据。
|
|
35
|
+
|
|
36
|
+
## 紧凑报表与平台主题
|
|
37
|
+
|
|
38
|
+
需要“主指标 + 多行次指标 + 图表 + 排行表 + 资讯”布局时,可读取 [examples/compact-dashboard.json](examples/compact-dashboard.json) 作为原生组件示例。示例数值仅用于视觉排版,交付业务报表前必须替换为当前租户的真实数据源。
|
|
39
|
+
|
|
40
|
+
默认使用 `formConfig.themeMode="system"`、`density="compact"`,卡片背景使用 `var(--el-bg-color)`、页面背景使用 `var(--el-bg-color-page)`,正文使用平台文字变量。不要因为“驾驶舱/大屏”字样就强制深色。显式指定浅色或深色时才使用 `light/dark`。
|
|
41
|
+
|
|
42
|
+
运行容器默认 `wrapperOption.heightMode="content"`,`height` 只保留设计器布局尺寸。仅需固定图形画布时设为 `fixed`;图表自身可以设置 240–320px 高度。不要为一行指标、标题、三行表格预留 200–400px 空容器。紧凑布局的卡片间距建议 10–16px,面板内边距 8–16px;统计组件 `widgetParams[24].value` 支持 `summary`(图标和大数字)、`detail`(多行小指标)及兼容的 `cards`。
|
|
43
|
+
|
|
44
|
+
用户提供参考截图时,先拆出面板行列比例、指标主次、图表与表格高度、标题/筛选位置,再用原生 pannel/statistic/chart/tabel/list 组合配置。不能把所有指标替换成一排大色块,也不能用模板假数据声称已接通客户业务。必须用同一视口截图检查浅色和平台深色,检查页面缩放后的断行与纵向空白;布局接近度和真实数据绑定分别验收。
|
|
45
|
+
|
|
46
|
+
### 平台智能工作首页
|
|
47
|
+
|
|
48
|
+
保留 `aiengine` 原生 AI 创作中心,与 `homeoverview` 工作概览组成桌面首行 14/10 栅格;任务、月历与公告放在下一行,移动端自动切为 24 栅格。不能把任务的完整 15 行列表或未配置日程的大空白块直接堆在首屏。
|
|
49
|
+
|
|
50
|
+
- `homeoverview.widgetParams[0]` 为真实个人统计接口 `platform-home-overview`,`[1].value="compact"` 启用紧凑指标、常用应用与趋势;所有数据仍受当前用户权限过滤。
|
|
51
|
+
- `workcenter.widgetParams` 按索引依次为视图、工作菜单、流程菜单、公告菜单、日历菜单、分页条数;`[5].value=5` 用于首页任务,范围 5–20,不能影响独立“我的工作”页面。
|
|
52
|
+
- `diycalendar.widgetParams[0].value` 应绑定当前账号可访问、关联 `microi_calendar` 的真实模块 Id;`[1].value="compact"` 只压缩月历密度,仍须支持点击日期新增及事件编辑、删除。备注字段为 `Remark`。隐藏菜单也可以是授权入口,旧模块可能没有 `DiyTableName`,此时必须显式绑定实际模块,不把只读日期回退当作日程验收成功。无模块时展示本月日期并明确提示未配置,不伪造任务。
|
|
53
|
+
- `diytable.widgetParams[4].value="NoticeList"` 以只读公告列表展示真实授权公告;表、菜单仍在 `[0]/[1]`,模块缺失时使用 `referencePolicy.onMissing="RemoveWidget"` 移除可选组件及空容器。
|
|
54
|
+
- 修改已有首页前通过 MCP 读取页面及历史 `CurrentHash`,保存传 `expectedCurrentHash`,再回读 JSON 和历史,保留可恢复版本。
|
|
55
|
+
|
|
56
|
+
你正在为 Microi 吾码平台生成界面引擎页面的 JSON 数据。界面引擎页面由 `formData` 对象描述,用户导入 JSON 即可使用。
|
|
57
|
+
|
|
55
58
|
<!-- microi-progressive:begin -->
|
|
56
|
-
<!-- microi-progressive:chunk id=page-engine-000 sha256=
|
|
57
|
-
## 设计器源码事件
|
|
58
|
-
|
|
59
|
-
设计器选中事件只能在 `isDesignMode` 为真时执行 `preventDefault/stopPropagation` 和选中状态写入。运行和预览页面必须保留 HTML 链接、按钮与键盘激活的浏览器默认行为。链接使用实际授权菜单路由,保存后逐一点击验证,不以 JSON 中存在 href 代替跳转验收;回归入口为 `Microi.Client/tests/page-engine-runtime-click.spec.mjs`。
|
|
60
|
-
|
|
61
|
-
每个顶层运行路由必须创建并 provide 独立的 `PAGE_ENGINE_STORE_KEY`,其子组件通过 `usePageEngineStore` 使用当前渲染树的状态。不能让多个 KeepAlive 页面共用应用级 `formData`,否则迟到响应和页面激活会导致错页;验收需覆盖地图与看板往返、迟到响应、移动布局和主题隔离。
|
|
62
|
-
|
|
63
|
-
只有在扩展界面引擎设计器源码时才使用全局事件总线。用
|
|
64
|
-
`EventBus.on(eventName, handler)` 监听保存、日期选择或组件跳转等事件,并在
|
|
65
|
-
组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
|
|
66
|
-
触发多次;普通页面 JSON 生成不需要注册事件总线。
|
|
67
|
-
|
|
59
|
+
<!-- microi-progressive:chunk id=page-engine-000 sha256=c13482f5007ea2aa645d659c95566e0ce9740608d4a615eb494e64fedc8c5108 -->
|
|
60
|
+
## 设计器源码事件
|
|
61
|
+
|
|
62
|
+
设计器选中事件只能在 `isDesignMode` 为真时执行 `preventDefault/stopPropagation` 和选中状态写入。运行和预览页面必须保留 HTML 链接、按钮与键盘激活的浏览器默认行为。链接使用实际授权菜单路由,保存后逐一点击验证,不以 JSON 中存在 href 代替跳转验收;回归入口为 `Microi.Client/tests/page-engine-runtime-click.spec.mjs`。
|
|
63
|
+
|
|
64
|
+
每个顶层运行路由必须创建并 provide 独立的 `PAGE_ENGINE_STORE_KEY`,其子组件通过 `usePageEngineStore` 使用当前渲染树的状态。不能让多个 KeepAlive 页面共用应用级 `formData`,否则迟到响应和页面激活会导致错页;验收需覆盖地图与看板往返、迟到响应、移动布局和主题隔离。
|
|
65
|
+
|
|
66
|
+
只有在扩展界面引擎设计器源码时才使用全局事件总线。用
|
|
67
|
+
`EventBus.on(eventName, handler)` 监听保存、日期选择或组件跳转等事件,并在
|
|
68
|
+
组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
|
|
69
|
+
触发多次;普通页面 JSON 生成不需要注册事件总线。
|
|
70
|
+
|
|
68
71
|
<!-- /microi-progressive:chunk -->
|
|
69
|
-
<!-- microi-progressive:chunk id=page-engine-001 sha256=
|
|
70
|
-
## 核心数据结构
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
72
|
+
<!-- microi-progressive:chunk id=page-engine-001 sha256=9749827d05043d169e0755e03de437b67eed6c6468a907942146a892176297dc -->
|
|
73
|
+
## 核心数据结构
|
|
74
|
+
|
|
75
|
+
### 原生视觉场景 scene
|
|
76
|
+
|
|
77
|
+
需要精确还原渐变、透明重叠、玻璃材质、嵌套 Grid/Flex、悬停和鼠标高光时,可选原生 `scene`;复杂业务交互优先微服务。接口引擎返回 HTML 作为第三种兼容/分享选择。不能以 `browser/iframe/html` 包住完整看板后声称已交付原生界面引擎。选型需核对目标 PC 是否包含该组件,并以同视口截图验证,不承诺任意参考图自动一模一样。
|
|
78
|
+
|
|
79
|
+
- `widgetParams[0]` 仍为 JSON 数据来源,`typeOptions.dataJson` 为静态数据或初始数据;`widgetParams[1]={sort:1,type:"scene",value:节点树}` 保存布局。远端只替换数据域,布局不随请求覆盖。
|
|
80
|
+
- 原生节点:`block/grid/flex/text/icon/image/link/button/badge/metric/progress/chart/table/sparkline/divider`。`children` 嵌套最多 24 层;`repeat:"projects"` 按数组重复,子节点绑定 `$item/$index`;`text/value/option/style` 的 `{{path}}` 只读取自有数据路径,不执行表达式。`chart.option` 为 ECharts 声明或整个对象绑定。
|
|
81
|
+
- 重复节点应声明 `repeatKey:"Id"` 等条目路径(也支持 `$item.Id`);未声明时依次读取条目 `Id/id/key`,均无稳定身份才回退索引。VNode Key 同时包含设计节点身份和条目身份,重复数据键以发生序号消歧;不能让每个实例直接复用同一个设计节点 `id`。刷新与重排必须用真实 Vue renderer 验证原 DOM/组件身份随条目移动。
|
|
82
|
+
- `style` 支持渐变、布局、字体、边界、透明、玻璃与几何;`darkStyle/tabletStyle/mobileStyle` 覆盖主题和 <1100/<768 宽度,`responsive:[{maxWidth,style}]` 配置其它断点。断点依据场景实际容器宽度,不依据保存时设备。`surface:"card/glass/soft/transparent"`、`hover:"lift"`、`pointer:"glow"`、`enter:"rise"` 为通用效果;`motion:"scan/drift/marquee/pulse"` 使用有限 CSS 动效,必须保留静态降级。
|
|
83
|
+
- 场景根 `responsiveReference:"content"`(默认)使用组件内容宽度;需要与 iframe 原页面的 CSS media width 对齐时选 `scrollport`,以最近实际发生纵向滚动的 `overflow-y:auto/scroll` 祖先的 border-box 宽度判断断点,跳过只声明 auto 却随内容撑开的包装层,并在数据加载和尺寸变化后重新选择滚动口。实际节点仍按 100% 内容宽布局,不引入内层滚动、不把断点从 1024 随意改小;回归覆盖内容宽 1021/滚动口宽 1029 的滚动条临界情形。
|
|
84
|
+
- `image.src/link.href` 只接受安全 HTTP(S) 或站内路由,无凭据 URL;样式禁止 `url()`、脚本、HTML。`button.action` 只接受 `refresh/fullscreen`,普通业务动作不要自行扩成可执行字符串。图表提示使用画布富文本,不把业务值解释为 HTML。
|
|
85
|
+
- 需要与参考几何逐项对应时可选 `chart.renderer="vector"`,`option.type="donut/radar/line/hbars/vbars"`,输入 `data` 或 `xAxis/series`,以及可选 `valueScale/round/nameMap/centerLabel/legendA`。原生 SVG 全部由 Vue h 原语构建,不接收 SVG 正文;图标可用白名单 `shapes:[{type:"path",attrs:{d:"..."}}]`。表格列支持 `kind:"badge/code"` 和声明式 `cellStyle`;`dock:"content-bottom"` 限定吸底条在当前场景内容矩形内,不覆盖宿主导航。默认 ECharts 与矢量皮肤分别验收,不能仅凭数据相同声称视觉一致。
|
|
86
|
+
- 场景自己承担表面和留白时设 `wrapperOption.surface="transparent"`,`widgetOption.height=0`,沿用内容高度;旧 pannel/tabs 和既有组件保持兼容。设计器“原生视觉场景”设置器提供节点树、布局/材质/高光、移动覆盖样式与完整节点 JSON。
|
|
87
|
+
- MCP `microi_build_page_design` 的 `scene/dataApi` 参数可以构建完整外壳,`microi_validate_page_design` 校验节点与安全边界,保存仍使用 `microi_save_page_design` 及 CAS。保存成功不代表目标 PC 已升级;旧 PC 必须保留现有 `html` 短升级提示组件并设置 `widgetOption.fallbackFor:["scene"]`,新版能力存在时才隐藏提示。短升级提示不能承载看板正文。
|
|
88
|
+
- 数据失败显式显示错误并保留旧数据,零值/缺失值/失败分开;基于真实 DTO 验证指标、图表、明细和刷新。截图验收同视口对比原参考、桌面/手机、浅/暗主题、键盘、减少动态、隐藏恢复和网络失败。平台回归入口:`Microi.Client/tests/page-engine-scene.spec.mjs`;MCP 协议回归:`microi.mcp/src/page-scene.test.ts`。
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
formData(页面)
|
|
92
|
+
├── Id: string // 页面唯一ID(GUID)
|
|
93
|
+
├── Title: string // 页面标题
|
|
94
|
+
├── Number: string // 页面编号(如 PAGE1)
|
|
95
|
+
├── Desc: string // 页面描述
|
|
96
|
+
└── JsonObj
|
|
97
|
+
├── formConfig // 页面全局配置
|
|
98
|
+
└── wrapperList[] // 容器列表
|
|
99
|
+
├── wrapperOption // 容器配置
|
|
100
|
+
└── widgetList[] // 组件列表
|
|
101
|
+
├── widgetOption // 组件通用配置
|
|
102
|
+
└── widgetParams[] // 组件私有参数
|
|
103
|
+
```
|
|
104
|
+
|
|
87
105
|
<!-- /microi-progressive:chunk -->
|
|
88
|
-
<!-- microi-progressive:chunk id=page-engine-002 sha256=
|
|
89
|
-
## formConfig 页面全局配置
|
|
90
|
-
|
|
91
|
-
```json
|
|
92
|
-
{
|
|
93
|
-
"gutter": 0, "mask": true, "drag": true, "left": true,
|
|
94
|
-
"hover": true, "shadow": true, "link": false, "watermark": false,
|
|
95
|
-
"mobile": false, "dark": false, "autoRefresh": 0, "lastRefreshTime": "",
|
|
96
|
-
"watermarkStyle": {
|
|
97
|
-
"content": "Microi吾码",
|
|
98
|
-
"font": { "fontSize": 16, "color": "rgba(255, 0, 0, 0.15)" },
|
|
99
|
-
"rotate": -22
|
|
100
|
-
},
|
|
101
|
-
"dynamicStyle": { "padding": "4px", "backgroundColor": "", "opacity": 1 }
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
106
|
+
<!-- microi-progressive:chunk id=page-engine-002 sha256=227ecf87086231eee28a9d91fde6a178a437e9196dd8f2ef1d14d53e5c5858df -->
|
|
107
|
+
## formConfig 页面全局配置
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"gutter": 0, "mask": true, "drag": true, "left": true,
|
|
112
|
+
"hover": true, "shadow": true, "link": false, "watermark": false,
|
|
113
|
+
"mobile": false, "dark": false, "autoRefresh": 0, "lastRefreshTime": "",
|
|
114
|
+
"watermarkStyle": {
|
|
115
|
+
"content": "Microi吾码",
|
|
116
|
+
"font": { "fontSize": 16, "color": "rgba(255, 0, 0, 0.15)" },
|
|
117
|
+
"rotate": -22
|
|
118
|
+
},
|
|
119
|
+
"dynamicStyle": { "padding": "4px", "backgroundColor": "", "opacity": 1 }
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
105
123
|
<!-- /microi-progressive:chunk -->
|
|
106
|
-
<!-- microi-progressive:chunk id=page-engine-003 sha256=
|
|
107
|
-
## 容器类型
|
|
108
|
-
|
|
109
|
-
| type | label | 说明 |
|
|
110
|
-
|------|-------|------|
|
|
111
|
-
| `pannel` | 卡片 | 标准容器,包含一个 `widgetList` |
|
|
112
|
-
| `tabs` | 选项卡 | 多标签页容器,使用 `tabWidgetMap` 存储每个 tab 的组件 |
|
|
113
|
-
|
|
114
|
-
### 卡片容器(pannel)关键字段
|
|
115
|
-
|
|
116
|
-
```json
|
|
117
|
-
{
|
|
118
|
-
"type": "pannel",
|
|
119
|
-
"label": "卡片",
|
|
120
|
-
"hidden": false,
|
|
121
|
-
"wrapperOption": {
|
|
122
|
-
"number": 10001, // 随机5位整数,页面内唯一
|
|
123
|
-
"span": 12, // 栅格宽度(1-24,24=满宽)
|
|
124
|
-
"height": 300, // 容器高度(px)
|
|
125
|
-
"margin": "0px 10px 10px 0px",
|
|
126
|
-
"dynamicStyle": { "padding": "10px", "backgroundColor": "" },
|
|
127
|
-
"titleOption": {
|
|
128
|
-
"hidden": true, // true=隐藏标题
|
|
129
|
-
"title": "未命名",
|
|
130
|
-
"dynamicStyle": { "textAlign": "left", "padding": "0px", "height": "20px", "lineHeight": "20px", "fontSize": "14px", "color": "" },
|
|
131
|
-
"moreOption": { "hidden": true, "icon": "More", "iconShow": false, "text": "更多", "linkurl": "/", "linktype": "router", "refresh": "0", "datetime": "0", "autotime": false, "autotimeval": 1, "dynamicStyle": { "color": "", "fontSize": "12px" } }
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
"widgetList": []
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### 选项卡容器(tabs)
|
|
139
|
-
|
|
140
|
-
组件放在 `tabWidgetMap[tabKey][]` 中,**不**放在 `widgetList` 中。
|
|
141
|
-
|
|
142
|
-
```json
|
|
143
|
-
{
|
|
144
|
-
"type": "tabs",
|
|
145
|
-
"wrapperOption": {
|
|
146
|
-
"number": 10002, "span": 24, "height": 400,
|
|
147
|
-
"tabType": "", // '' | 'card' | 'border-card'
|
|
148
|
-
"tabPosition": "top", // 'top' | 'right' | 'bottom' | 'left'
|
|
149
|
-
"tabs": [
|
|
150
|
-
{ "key": "tab_1", "label": "标签页1" },
|
|
151
|
-
{ "key": "tab_2", "label": "标签页2" }
|
|
152
|
-
],
|
|
153
|
-
"activeTab": "tab_1"
|
|
154
|
-
},
|
|
155
|
-
"tabWidgetMap": { "tab_1": [], "tab_2": [] },
|
|
156
|
-
"widgetList": []
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
124
|
+
<!-- microi-progressive:chunk id=page-engine-003 sha256=7bb7cb860f9330002f60748e93de3c639b157cddfd77b63ac8b19f0535306e65 -->
|
|
125
|
+
## 容器类型
|
|
126
|
+
|
|
127
|
+
| type | label | 说明 |
|
|
128
|
+
|------|-------|------|
|
|
129
|
+
| `pannel` | 卡片 | 标准容器,包含一个 `widgetList` |
|
|
130
|
+
| `tabs` | 选项卡 | 多标签页容器,使用 `tabWidgetMap` 存储每个 tab 的组件 |
|
|
131
|
+
|
|
132
|
+
### 卡片容器(pannel)关键字段
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"type": "pannel",
|
|
137
|
+
"label": "卡片",
|
|
138
|
+
"hidden": false,
|
|
139
|
+
"wrapperOption": {
|
|
140
|
+
"number": 10001, // 随机5位整数,页面内唯一
|
|
141
|
+
"span": 12, // 栅格宽度(1-24,24=满宽)
|
|
142
|
+
"height": 300, // 容器高度(px)
|
|
143
|
+
"margin": "0px 10px 10px 0px",
|
|
144
|
+
"dynamicStyle": { "padding": "10px", "backgroundColor": "" },
|
|
145
|
+
"titleOption": {
|
|
146
|
+
"hidden": true, // true=隐藏标题
|
|
147
|
+
"title": "未命名",
|
|
148
|
+
"dynamicStyle": { "textAlign": "left", "padding": "0px", "height": "20px", "lineHeight": "20px", "fontSize": "14px", "color": "" },
|
|
149
|
+
"moreOption": { "hidden": true, "icon": "More", "iconShow": false, "text": "更多", "linkurl": "/", "linktype": "router", "refresh": "0", "datetime": "0", "autotime": false, "autotimeval": 1, "dynamicStyle": { "color": "", "fontSize": "12px" } }
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"widgetList": []
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 选项卡容器(tabs)
|
|
157
|
+
|
|
158
|
+
组件放在 `tabWidgetMap[tabKey][]` 中,**不**放在 `widgetList` 中。
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"type": "tabs",
|
|
163
|
+
"wrapperOption": {
|
|
164
|
+
"number": 10002, "span": 24, "height": 400,
|
|
165
|
+
"tabType": "", // '' | 'card' | 'border-card'
|
|
166
|
+
"tabPosition": "top", // 'top' | 'right' | 'bottom' | 'left'
|
|
167
|
+
"tabs": [
|
|
168
|
+
{ "key": "tab_1", "label": "标签页1" },
|
|
169
|
+
{ "key": "tab_2", "label": "标签页2" }
|
|
170
|
+
],
|
|
171
|
+
"activeTab": "tab_1"
|
|
172
|
+
},
|
|
173
|
+
"tabWidgetMap": { "tab_1": [], "tab_2": [] },
|
|
174
|
+
"widgetList": []
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
160
178
|
<!-- /microi-progressive:chunk -->
|
|
161
|
-
<!-- microi-progressive:chunk id=page-engine-004 sha256=
|
|
162
|
-
## 组件通用结构
|
|
163
|
-
|
|
164
|
-
```json
|
|
165
|
-
{
|
|
166
|
-
"type": "bar",
|
|
167
|
-
"label": "柱状图",
|
|
168
|
-
"category": 0,
|
|
169
|
-
"show": 1,
|
|
170
|
-
"widgetOption": {
|
|
171
|
-
"number": 20001, // 随机5位整数,页面内唯一
|
|
172
|
-
"wrapperNumber": 10001, // 必须等于所在容器的 wrapperOption.number
|
|
173
|
-
"span": 24,
|
|
174
|
-
"height": 280,
|
|
175
|
-
"dynamicStyle": { "padding": "8px", "backgroundColor": "" }
|
|
176
|
-
},
|
|
177
|
-
"widgetParams": []
|
|
178
|
-
}
|
|
179
|
-
```
|
|
180
|
-
|
|
179
|
+
<!-- microi-progressive:chunk id=page-engine-004 sha256=66261254d94455648441bf3519a5c810ede60c64f341dce035f931e284f762ba -->
|
|
180
|
+
## 组件通用结构
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"type": "bar",
|
|
185
|
+
"label": "柱状图",
|
|
186
|
+
"category": 0,
|
|
187
|
+
"show": 1,
|
|
188
|
+
"widgetOption": {
|
|
189
|
+
"number": 20001, // 随机5位整数,页面内唯一
|
|
190
|
+
"wrapperNumber": 10001, // 必须等于所在容器的 wrapperOption.number
|
|
191
|
+
"span": 24,
|
|
192
|
+
"height": 280,
|
|
193
|
+
"dynamicStyle": { "padding": "8px", "backgroundColor": "" }
|
|
194
|
+
},
|
|
195
|
+
"widgetParams": []
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
181
199
|
<!-- /microi-progressive:chunk -->
|
|
182
|
-
<!-- microi-progressive:chunk id=page-engine-005 sha256=
|
|
183
|
-
## widgetParams 参数类型
|
|
184
|
-
|
|
185
|
-
| type | 说明 | value 类型 |
|
|
186
|
-
|------|------|-----------|
|
|
187
|
-
| `textarea` | 多行文本(数据来源) | `string` |
|
|
188
|
-
| `input` | 单行文本 | `string` |
|
|
189
|
-
| `number` | 数字 | `number` |
|
|
190
|
-
| `switch` | 开关 | `boolean` |
|
|
191
|
-
| `slider` | 滑块 | `number` |
|
|
192
|
-
| `color` | 颜色选择 | `string` |
|
|
193
|
-
| `select` | 下拉选择 | `string` |
|
|
194
|
-
| `radio` | 单选组 | `string` |
|
|
195
|
-
|
|
200
|
+
<!-- microi-progressive:chunk id=page-engine-005 sha256=e9667b97462c9089a72d2a407cfde00e873afe7d64593bf33ad49a523255b38d -->
|
|
201
|
+
## widgetParams 参数类型
|
|
202
|
+
|
|
203
|
+
| type | 说明 | value 类型 |
|
|
204
|
+
|------|------|-----------|
|
|
205
|
+
| `textarea` | 多行文本(数据来源) | `string` |
|
|
206
|
+
| `input` | 单行文本 | `string` |
|
|
207
|
+
| `number` | 数字 | `number` |
|
|
208
|
+
| `switch` | 开关 | `boolean` |
|
|
209
|
+
| `slider` | 滑块 | `number` |
|
|
210
|
+
| `color` | 颜色选择 | `string` |
|
|
211
|
+
| `select` | 下拉选择 | `string` |
|
|
212
|
+
| `radio` | 单选组 | `string` |
|
|
213
|
+
|
|
196
214
|
<!-- /microi-progressive:chunk -->
|
|
197
|
-
<!-- microi-progressive:chunk id=page-engine-006 sha256=
|
|
198
|
-
## 数据来源(widgetParams[0])
|
|
199
|
-
|
|
200
|
-
大多数组件的第一个参数(sort=0)是"数据来源":
|
|
201
|
-
- **静态数据**:`value` 为空,数据在 `typeOptions.dataJson` 中
|
|
202
|
-
- **动态接口**:`value` 设为接口地址,运行时请求替换 `dataJson`
|
|
203
|
-
|
|
204
|
-
**接口引擎地址格式:**
|
|
205
|
-
```
|
|
206
|
-
$ApiBase$/apiengine/{ApiEngineKey}
|
|
207
|
-
```
|
|
208
|
-
|
|
215
|
+
<!-- microi-progressive:chunk id=page-engine-006 sha256=7347b2b4290db41ae8c3ef128acc9854a5e17290268b8e274e771de47b8f752a -->
|
|
216
|
+
## 数据来源(widgetParams[0])
|
|
217
|
+
|
|
218
|
+
大多数组件的第一个参数(sort=0)是"数据来源":
|
|
219
|
+
- **静态数据**:`value` 为空,数据在 `typeOptions.dataJson` 中
|
|
220
|
+
- **动态接口**:`value` 设为接口地址,运行时请求替换 `dataJson`
|
|
221
|
+
|
|
222
|
+
**接口引擎地址格式:**
|
|
223
|
+
```
|
|
224
|
+
$ApiBase$/apiengine/{ApiEngineKey}
|
|
225
|
+
```
|
|
226
|
+
|
|
209
227
|
<!-- /microi-progressive:chunk -->
|
|
210
|
-
<!-- microi-progressive:chunk id=page-engine-007 sha256=
|
|
211
|
-
## 运行态布局与滚动规范
|
|
212
|
-
|
|
213
|
-
- 页面只保留一个主滚动容器:仪表盘、首页和嵌套界面优先继承最外层页面滚动;单个 `pannel`、`workcenter`、`diytable`、`diycalendar`、嵌套 `pageengine` 在运行态默认使用内容自适应高度和 `overflow: visible`,不得无条件设置 `overflow: auto`。
|
|
214
|
-
- 经典桌面主滚动容器为路由内容区,导航与 Tab 留在视口内;移动端继续保留外层文档滚动。图表在异步挂载后绑定尺寸观察器,切换导航、收缩侧栏及改变窗口宽度都应重新测量,禁止仅隐藏溢出而保留错误画布宽度。真实回归覆盖两种导航、两种桌面宽度,以及日程创建后刷新、备注编辑和删除。
|
|
215
|
-
- 固定高度只用于设计器拖拽预览、图表画布或确有虚拟滚动需求的组件。设计态可按 `widgetOption.height` 提供滚动,运行态必须先验证内容能完整展开;不能用双滚动条掩盖容器高度不足。
|
|
216
|
-
- 表格型容器通常按 15 条数据验收,表头、工具栏、全部数据行和分页区应同时可见;首页紧凑表格可通过 `diy-table` 的 `PageSizeList` 追加 `[10]`,并在 `sys_menu.DefaultPageSize` 为空时默认选择候选页码中的最小值。空间不足时先压缩统计卡、工具栏、行高和间距,再考虑增加外层页面长度,不隐藏分页、不在卡片内部滚动。
|
|
217
|
-
- 同一行的容器使用一致的左右边距、内边距、标题高度和顶部基线;同层卡片间距必须相同,左右边缘、标题、工具栏和内容区应形成稳定对齐线。推荐使用统一的 8px 基础间距和 8/12/16px 倍数。
|
|
218
|
-
- 成对容器应设置相同的最小高度;内容较少的组件通过内容居中、合理留白或自适应布局消化空间,不能在底部留下明显的大块无意义空白。内容较多时允许容器自然增高并由页面继续向下滚动。
|
|
219
|
-
- 日历和公告应完整展示工具栏、主体和底部操作区;日历优先使用 `height: auto` / `contentHeight: auto`,公告优先使用标准表单引擎分页与权限按钮。
|
|
220
|
-
- 运行态移动端必须按实际视口自动切为 24 栅格,不能只依赖保存 JSON 中的 `formConfig.mobile`;窗口旋转或宽度变化时也要同步。嵌入的 `diytable` 不得渲染独立列表页的固定返回栏和全局 FAB,新增、页面按钮、批量操作应留在当前容器工具栏内;容器标题操作区允许紧凑换行,但不能绝对定位覆盖标题或其它卡片。
|
|
221
|
-
- `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
|
|
222
|
-
- 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
|
|
223
|
-
|
|
228
|
+
<!-- microi-progressive:chunk id=page-engine-007 sha256=5f2ed06aa1e0abbc5f968f026602d92f22f01836d76fdf502fd91ca0f945509b -->
|
|
229
|
+
## 运行态布局与滚动规范
|
|
230
|
+
|
|
231
|
+
- 页面只保留一个主滚动容器:仪表盘、首页和嵌套界面优先继承最外层页面滚动;单个 `pannel`、`workcenter`、`diytable`、`diycalendar`、嵌套 `pageengine` 在运行态默认使用内容自适应高度和 `overflow: visible`,不得无条件设置 `overflow: auto`。
|
|
232
|
+
- 经典桌面主滚动容器为路由内容区,导航与 Tab 留在视口内;移动端继续保留外层文档滚动。图表在异步挂载后绑定尺寸观察器,切换导航、收缩侧栏及改变窗口宽度都应重新测量,禁止仅隐藏溢出而保留错误画布宽度。真实回归覆盖两种导航、两种桌面宽度,以及日程创建后刷新、备注编辑和删除。
|
|
233
|
+
- 固定高度只用于设计器拖拽预览、图表画布或确有虚拟滚动需求的组件。设计态可按 `widgetOption.height` 提供滚动,运行态必须先验证内容能完整展开;不能用双滚动条掩盖容器高度不足。
|
|
234
|
+
- 表格型容器通常按 15 条数据验收,表头、工具栏、全部数据行和分页区应同时可见;首页紧凑表格可通过 `diy-table` 的 `PageSizeList` 追加 `[10]`,并在 `sys_menu.DefaultPageSize` 为空时默认选择候选页码中的最小值。空间不足时先压缩统计卡、工具栏、行高和间距,再考虑增加外层页面长度,不隐藏分页、不在卡片内部滚动。
|
|
235
|
+
- 同一行的容器使用一致的左右边距、内边距、标题高度和顶部基线;同层卡片间距必须相同,左右边缘、标题、工具栏和内容区应形成稳定对齐线。推荐使用统一的 8px 基础间距和 8/12/16px 倍数。
|
|
236
|
+
- 成对容器应设置相同的最小高度;内容较少的组件通过内容居中、合理留白或自适应布局消化空间,不能在底部留下明显的大块无意义空白。内容较多时允许容器自然增高并由页面继续向下滚动。
|
|
237
|
+
- 日历和公告应完整展示工具栏、主体和底部操作区;日历优先使用 `height: auto` / `contentHeight: auto`,公告优先使用标准表单引擎分页与权限按钮。
|
|
238
|
+
- 运行态移动端必须按实际视口自动切为 24 栅格,不能只依赖保存 JSON 中的 `formConfig.mobile`;窗口旋转或宽度变化时也要同步。嵌入的 `diytable` 不得渲染独立列表页的固定返回栏和全局 FAB,新增、页面按钮、批量操作应留在当前容器工具栏内;容器标题操作区允许紧凑换行,但不能绝对定位覆盖标题或其它卡片。
|
|
239
|
+
- `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
|
|
240
|
+
- 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
|
|
241
|
+
|
|
224
242
|
<!-- /microi-progressive:chunk -->
|
|
225
243
|
## 详细参考路由(渐进披露)
|
|
226
244
|
|
|
@@ -257,3 +257,8 @@ return {
|
|
|
257
257
|
}
|
|
258
258
|
};
|
|
259
259
|
```
|
|
260
|
+
|
|
261
|
+
## 真实打印预览验收
|
|
262
|
+
|
|
263
|
+
- 查看/预览先以真实授权单据填充模板,明确显示加载、空数据和失败状态;由用户点击打印后再打开系统打印窗口,避免打开页面即打印而掩盖预览错误。明确的自动打印场景单独保留。
|
|
264
|
+
- 验证模板的实际输出,不把 design() 画布、testData 或接口成功当作打印通过。覆盖发货清单/标签、数量金额、二维码、长表分页、越权拒绝及关闭后清理;没有连接实体打印机时明确仅完成浏览器预览/PDF验收。
|