@microi.net/cli 6.2.4 → 6.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +6 -6
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +118 -118
- package/scripts/microi-cli.js +64 -59
- package/scripts/microi-codex-broker.js +2 -0
- package/scripts/microi-skills.meta.json +318 -279
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +109 -106
- package/skills/ai-engine/SKILL.md +32 -2
- package/skills/ai-engine/references/cpu-timeline-export.md +31 -0
- package/skills/ai-engine/references/local-speech-s2v.md +35 -0
- package/skills/app-store/SKILL.md +567 -553
- package/skills/app-store/references/platform-row-format.md +7 -0
- package/skills/dos-orm/SKILL.md +5 -0
- package/skills/dos-orm/references/oceanbase-mysql.md +8 -0
- package/skills/job-engine/SKILL.md +12 -0
- package/skills/message-notification/SKILL.md +2 -0
- package/skills/microi-ai-application/SKILL.md +1 -0
- package/skills/microi-client-frontend/SKILL.md +13 -49
- 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 +18 -1
- package/skills/microi-client-frontend/references/progressive-04-/345/211/215/347/253/257/346/216/245/345/217/243/344/270/216/347/274/223/345/255/230/346/201/242/345/244/215.md +45 -0
- package/skills/microi-codex/SKILL.md +5 -0
- package/skills/microi-codex-installer/SKILL.md +18 -2
- package/skills/microi-deployment/SKILL.md +376 -366
- package/skills/microi-deployment/references/deployment-matrix.md +167 -145
- package/skills/microi-deployment/references/offline-installer.md +66 -64
- package/skills/microi-docs-coverage/SKILL.md +1 -1
- package/skills/microi-docs-coverage/references/capability-map.md +11 -5
- package/skills/microi-form-engine/references/form-generation-quality.md +12 -0
- package/skills/microi-frontend-sdk/SKILL.md +12 -1
- package/skills/microi-left-right-layout/SKILL.md +176 -163
- package/skills/microi-microservice/SKILL.md +19 -0
- package/skills/microi-microservice/references/runtime-delivery.md +6 -0
- package/skills/microi-microservice/references/v3-committed-status-read.md +13 -0
- package/skills/microi-mobile-app-quality/SKILL.md +2 -0
- package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
- package/skills/microi-system-delivery/SKILL.md +8 -1
- package/skills/microi-system-delivery/references/delivery-pitfalls.md +19 -0
- package/skills/microi-ui/SKILL.md +19 -4
- package/skills/microi-uniapp-frontend/SKILL.md +10 -1
- package/skills/microi.v8.js +17 -3
- package/skills/module-engine/SKILL.md +32 -2
- package/skills/ocr-engine/SKILL.md +30 -0
- package/skills/playwright-e2e/SKILL.md +11 -3
- 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 +4 -4
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +2 -2
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +2 -2
- package/skills/system-observability/SKILL.md +24 -0
- package/skills/system-observability/references/framework-status-widgets.md +51 -0
- package/skills/system-observability/references/memory-incident-triage.md +14 -0
- package/skills/ui-design/SKILL.md +32 -5
- package/skills/ui-design/assets/pattern-showcase/app.js +57 -0
- package/skills/ui-design/assets/pattern-showcase/index.html +35 -4
- package/skills/ui-design/assets/pattern-showcase/scenario-state.js +34 -0
- package/skills/ui-design/assets/pattern-showcase/styles.css +115 -0
- package/skills/ui-design/references/controls-and-motion-research.md +49 -0
- package/skills/ui-design/references/data-workspace-density.md +8 -0
- package/skills/ui-design/references/design-pattern-library.md +50 -1
- package/skills/ui-design/references/media-geometry-and-pointer.md +42 -0
- package/skills/ui-design/references/mobile-product-language.md +95 -0
- package/skills/ui-design/references/motion-and-media.md +4 -2
- package/skills/ui-design/references/product-flow-recipes.md +3 -0
- package/skills/uniapp-mall-assets/SKILL.md +3 -0
- package/skills/v8-api-config/SKILL.md +2 -2
- package/skills/v8-crud-api/SKILL.md +2 -1
- package/skills/v8-file-upload/SKILL.md +2 -2
- package/skills/v8-frontend-events/SKILL.md +2 -1
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +21 -1
- package/skills/v8-security/SKILL.md +22 -5
- package/skills/v8-security/references/payment-gateway.md +25 -0
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +20 -0
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +19 -1
- package/skills/v8-sql-query/SKILL.md +2 -0
- package/skills/v8-table-event/SKILL.md +15 -2
- package/skills/v8-workflow/SKILL.md +8 -0
- package/skills/vision-engine/SKILL.md +284 -280
- package/skills/vision-engine/references/architecture-and-acceptance.md +14 -0
- package/skills/vision-engine/references/realtime-cpu-profiles.md +80 -0
- package/skills/vision-engine/references/video-timeline.md +189 -0
- package/skills/workspace-conventions/SKILL.md +3 -0
- 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 +9 -9
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# 媒体比例、响应式与指针效果门禁
|
|
2
|
+
|
|
3
|
+
适用于含人物、商品、场景、界面截图、图集或鼠标跟随效果的 PC 网站、响应式门户与移动页面。先修复实际 CSS/资产问题,再补规则;页面实现错误不自动证明共享组件有缺陷。已有 `cover/contain` 约定仍有效,本页明确图集、验收与性能的边界。
|
|
4
|
+
|
|
5
|
+
## 图片只能等比缩放,裁切必须有目的
|
|
6
|
+
|
|
7
|
+
- 记录原图的真实像素尺寸、方向和主体焦点;图集还须记录每张子图的边界。照片、人物、圆形星球、Logo 和产品截图禁止分别拉伸宽高,禁止用 `object-fit:fill`、`preserveAspectRatio="none"` 或非等比 `scale(x,y)` 填满卡片。
|
|
8
|
+
- 普通图片优先使用带 intrinsic `width/height` 的 `img/picture`。容器决定构图比例,`object-fit:cover` 等比铺满并裁去边缘,`object-position` 保留脸、商品或关键动作;需要完整内容的界面、图表、海报、证件等用 `contain` 并设计留白。`aspect-ratio` 只约束容器,不能单独保证内容不变形。
|
|
9
|
+
- 背景图可使用单图 `background-size:cover/contain` 或只限定一轴、另一轴 `auto`。禁止用 `100% 100%` 拉满未知比例;多层背景的渐变和图片分别声明尺寸,不能把背景渐变的填充方式套到照片上。
|
|
10
|
+
- **图集反例**:三张方图横排的原图使用 `background-size:300% 100%`,只有展示窗口也为方形时才可能等比;把窗口变为宽屏就会压扁人脸。百分比不是裁切算法。图生图对比也不能改成另一组任意百分比来掩盖失真。
|
|
11
|
+
- 图集应先提取独立资产,或用明确 `viewBox` 的 SVG/嵌套裁切窗口选出子图,再对选出的子图等比 `cover/contain`。SVG 内外层都必须保留比例。禁止在响应式断点继续改变图集宽高的独立缩放率。
|
|
12
|
+
- 几何判定使用同一原始图片/子图的横纵缩放:`sx=实际绘制宽/原始宽`、`sy=实际绘制高/原始高`,通常要求 `abs(sx/sy-1) <= 0.01`。`cover` 的实际绘制尺寸可能超过裁切框,不能拿外框长宽比与原图直接比较而误判;SVG 可检查其 viewBox、preserveAspectRatio 和实际变换。还要检查主体裁切,不把“等比但只剩半张脸”判通过。
|
|
13
|
+
|
|
14
|
+
```css
|
|
15
|
+
.mci-media-frame { position: relative; aspect-ratio: 16 / 9; overflow: hidden; }
|
|
16
|
+
.mci-media-frame > img {
|
|
17
|
+
display: block; width: 100%; height: 100%;
|
|
18
|
+
object-fit: cover; object-position: 50% 40%;
|
|
19
|
+
}
|
|
20
|
+
/* width/height 属性声明原图尺寸;完整界面类内容改用 contain。 */
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 响应式验收以任务和媒体为对象
|
|
24
|
+
|
|
25
|
+
1. 记录请求尺寸与实际 `innerWidth/innerHeight/devicePixelRatio`。网页至少检查 320/360/390/430 CSS px 手机、768px 平板、1366/1440/1920px 桌面,以及一组手机横屏;由实际 CSS 尺寸取样,宿主缩放后的窄截图不能冒充手机验收。真实 iOS/Android 或其工具未检查时明确写“待设备验收”,不能承诺所有设备完美。
|
|
26
|
+
2. 对每类媒体在桌面和手机各检查实际加载、原图尺寸、绘制方式、自然比例、主体焦点与遮罩文字。切换所有媒体型 Tab;人物、圆形物体或已知界面是比例检查的直观参照。保存入场结束、图片加载完成后的代表截图并亲自查看;文件存在不等于视觉通过。
|
|
27
|
+
3. 页面不能有横向溢出,也不能通过 `overflow-x:hidden/clip` 隐藏正文、按钮或导航来伪造通过。局部媒体窗口为裁切而隐藏溢出是允许的;长标题、英文、联系方式与标签仍需自然换行、可读与可达。
|
|
28
|
+
4. 手机导航展开/收起、全部能力项、独立申请/表单页都须操作。控件目标至少 44×44 CSS px,表单输入常用字号至少 16px;焦点、错误提示、验证码刷新与键盘弹起时主动作可达。固定头尾按安全区预留空间,横屏与可变视口高度不遮挡返回、标题或提交。
|
|
29
|
+
5. 避免每个 Tab 切换都改变图片舞台和正文总高;装饰与叠加卡片手机重排到正常信息流或缩减,不能遮脸、挡按钮。浅/暗主题、减少动效以及长文案一并检查。
|
|
30
|
+
6. 无报错、`scrollWidth<=clientWidth`、构建通过、组件使用正确均不能替代以上检查。报告分别列明源码/单测、浏览器几何、人工视觉和真实设备范围;一项失败保留为缺口,不以测试数量抵消。
|
|
31
|
+
|
|
32
|
+
## 鼠标跟随只作低成本增强
|
|
33
|
+
|
|
34
|
+
- 仅在 `(hover:hover) and (pointer:fine)` 启用;触控与粗指针不创建跟随循环。保留系统指针,所有操作不依赖跟随层;装饰使用 `aria-hidden`、`pointer-events:none`,不遮挡表单、焦点或滚动。
|
|
35
|
+
- 使用有限的 1–2 个小型图层,仅改变 `transform/opacity`;不持续更新全页径向渐变、布局尺寸、阴影或滤镜,不为每张卡片/每个指针点生成 DOM、Canvas 或模糊图层。`will-change` 仅限活动图层。
|
|
36
|
+
- `pointermove` 被动监听并只保存最新坐标;同一时刻最多一个待执行 RAF。按需合并,建议上限 30fps;指针停止后在有限帧内收敛并取消调度。禁止用永久空转 RAF、每个事件新建 RAF 或每帧读布局来实现简单跟随。
|
|
37
|
+
- 系统 `prefers-reduced-motion`、用户 reduced、页面隐藏、宿主隐藏、失焦/离开页面和组件卸载都停止调度并隐藏装饰;恢复后不叠加监听与循环。容器视差还需在离开视口时停止。
|
|
38
|
+
- 验收用实际移动/静止前后的帧或位置变化确认效果可见;静止、减少动效、隐藏和触屏下检查帧计数停止或无待调度任务,反复挂载/切页后监听和图层数量不增加。性能工具量测与代码预算分别记录,不能仅凭“使用 RAF”宣称低占用,也不能无实测编造 CPU/FPS 数据。
|
|
39
|
+
|
|
40
|
+
## 交付诊断的归属
|
|
41
|
+
|
|
42
|
+
页面写错媒体样式或漏看截图,应先指出具体实现与漏验项;只有重现到共享组件时才修组件。Skills 已有原则但缺少反例/测量时可补充本门禁,不能把完善文字当成页面已修复、已部署或每台手机已通过。
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# 移动产品设计语言与可执行视觉门禁
|
|
2
|
+
|
|
3
|
+
图片、图集与鼠标增强效果同时执行 [媒体比例、响应式与指针效果门禁](media-geometry-and-pointer.md)。手机检查扩至实际 320/360/390/430 CSS px、平板及手机横屏,并核对媒体等比绘制、主体裁切、安全区、导航和表单键盘可达性;桌面无溢出或截图文件存在不能替代这些验收。
|
|
4
|
+
|
|
5
|
+
适用于 UniApp、H5、App 与小程序的整站设计和重设计。先固定业务路由、权限、状态与交互,再改视觉;参考页只提供设计依据,不授权复制品牌、照片、业务秘密或外部脚本。
|
|
6
|
+
|
|
7
|
+
## 先选择产品表达,避免把后台密度套给手机
|
|
8
|
+
|
|
9
|
+
在 `MCI-DESIGN.md` 同时写清用户任务、主情绪、产品对象、视觉表达强度、动效强度和信息密度。消费会员、生活商城与品牌服务允许更鲜明的构图、具有识别度的产品插画、适度圆角及层次;频繁录入和金融确认保持稳定清楚。用户已明确要求表现性设计时,不得用“默认紧凑”把所有页面降成同色白卡。
|
|
10
|
+
|
|
11
|
+
- 一套产品使用一套语义 token、控件、图标与状态语言;页面按首页、发现/商城、资产、会员、表单、记录、聊天等任务形成不同构图,而非同一张卡片模板重复。
|
|
12
|
+
- 首屏以真实产品对象或核心任务建立识别:业务对象插画、可靠媒体、身份资产或搜索分类。装饰不能伪造优惠、销量、实时状态或经营成果。
|
|
13
|
+
- 字体建立可辨认的标题、正文、辅助与金额层级。手机正文通常 14–16px;辅助文字不承担主任务。金额使用等宽数字,单位弱一级;同一行不混入不必要的标签和英文眉题。
|
|
14
|
+
- 通过色调、版面与有限材质区分品牌首屏、功能入口、商品、资产和表单。保留空/错/无权/禁用/成功状态与焦点,不用渐变和阴影掩盖结构不足。
|
|
15
|
+
- 系统原生控件的交互惯例与返回行为优先;原生导航、触控及安全区原则可吸收,SwiftUI/Compose/React Native 示例不能直接粘贴到 UniApp。
|
|
16
|
+
|
|
17
|
+
## 参考图要转译为构图,不只提取配色
|
|
18
|
+
|
|
19
|
+
用户给出有个性的参考时,先识别主对象占比、标题/正文尺度、图像裁切、色块的语义、留白节奏和主要动作位置,再对应到本业务。人物服务图可启发身份与行动关系,时间表可启发状态轨道;行业照片、名称、数据和交易步骤不能无条件移植。明确哪些是用户审美偏好、哪些只是参考图所属行业。
|
|
20
|
+
|
|
21
|
+
在 `MCI-DESIGN.md` 记录项目设计签名及页面族构图表,按 [项目设计签名与场景配方](design-pattern-library.md#项目设计签名与场景配方) 落地。首页、目录、券包、记录、资料与聊天应共享视觉语法,同时围绕各自任务形成不同阅读顺序;不能47条路由都套同一标题、图标和白卡列表后宣称整站重设计。
|
|
22
|
+
|
|
23
|
+
- 先用主对象和关键任务建立记忆点;可以是有来源的场景图、票券/通行证、资产刻度、服务时间轨道或编辑式内容组合。不是每一页都需要大 Hero、英文眉题、照片或多色背景。
|
|
24
|
+
- 一个主表面与次表面通过面积、色调、排版或材质产生主次,避免每项内容大小相同、白底相同、阴影相同。可比较的同类记录仍保持稳定几何,不能随机排布破坏扫读。
|
|
25
|
+
- 参考里的大标题与留白只有在主任务仍可触达、中文换行稳定时才成立。中文正文/数字/标签分别定义角色,不使用全部加粗或所有字号相近来假装层次。
|
|
26
|
+
- 浮动底部导航可作为一种有业务依据的结构选择,保留文字、图标、选中态、焦点及所有原入口。正文只预留一次导航实测总高度与偏移,弹层/键盘/横屏时检查遮挡;无需中央主动作时不为了造型增加加号。
|
|
27
|
+
- 动效沿用户动作和业务对象建立连续性;入场结束后页面仍应有清楚节奏。图片和插画不能只证明“有图”,应核对来源、主体裁切、真实加载与失败态;通用图形不能冒充不存在的商品实拍。
|
|
28
|
+
|
|
29
|
+
## 图标、Tab 与排序控件必须量测
|
|
30
|
+
|
|
31
|
+
图标加文字统一使用独立节点和 `inline-flex/flex`:`align-items:center; justify-content:center; gap:6px~10px`。图标设置稳定宽高和 `flex-shrink:0`;标签给明确行高。禁止把 `⌄/∨/→` 紧贴业务文案充当唯一图标,禁止靠空格或单个 `padding-top` 修正所有平台。
|
|
32
|
+
|
|
33
|
+
Tab/分段项必须显式设置 `box-sizing:border-box`、触控高度和上下左右居中;不能只增加 `min-height`,保留旧 padding 后就称修复。选择态不能改变边框总厚度、文字基线或触控矩形。滚动分类保留水平可达性,手机不显示桌面风格粗滚动条;不得用 `overflow:hidden` 隐藏无法触达的分类。
|
|
34
|
+
|
|
35
|
+
实际 H5 几何断言至少包括:
|
|
36
|
+
|
|
37
|
+
| 对象 | 可重复检查 |
|
|
38
|
+
|---|---|
|
|
39
|
+
| 图标与文字 | 中心线偏差通常不超过 2 CSS px,真实间距不小于 6px;长文案不推走图标 |
|
|
40
|
+
| 选择/未选择 Tab | 文字行框相对背景上下余量相称,中心偏差通常不超过 2px;触控区至少 44×44px |
|
|
41
|
+
| 分类与排序 | 分类首末项可达,排序触摸区无遮挡,切换实际影响服务端请求及结果 |
|
|
42
|
+
| 全页面 | 375/390/430px 与相关横屏,无页面级横向溢出、孤字标题、重叠和底栏遮挡 |
|
|
43
|
+
|
|
44
|
+
数值为常规基线;字体光学校正例外必须有真实截图和理由,不能把所有偏差都解释为字体问题。
|
|
45
|
+
|
|
46
|
+
## 动效必须被看到,也必须可停
|
|
47
|
+
|
|
48
|
+
- 提交/选择/展开/返回用短反馈说明状态变化;页面入场可用一次 300–450ms 的小位移与透明度。先渲染内容,不等待整段入场才能操作。
|
|
49
|
+
- 用户要求有动效的消费产品,除骨架外至少实现一个与产品对象有关、幅度有限的停留动效;例如连接对象轻浮动。无需在每张卡片上循环,不让正在输入的表单持续跳动。
|
|
50
|
+
- 只动画 `transform/opacity`;不循环改变尺寸、边距、阴影或大面积模糊。隐藏页面、微服务 `afterhidden` 与原生 `onHide` 暂停,恢复不叠加计时器。`prefers-reduced-motion` 和用户 reduced 偏好同时有效。
|
|
51
|
+
- 自动化读取实际动画/计算样式,在两个时间点确认位移或透明度发生变化,再检查暂停及 reduced 时静止。源码存在 `@keyframes`、只有 loading 动起来或截图文件存在,均不足以证明动效验收。
|
|
52
|
+
|
|
53
|
+
## 桌面手机预览与宿主嵌入要保持同一构图
|
|
54
|
+
|
|
55
|
+
呈现目的与是否嵌入是两个维度:声明 `mobile-preview` 或 `workspace`,禁止把 `embedded=true` 等同于“内容拉满桌面”。移动产品预览的外画布填满宿主,内屏仍保持设计手机宽度、移动排版与底栏;真正业务工作台才使用满宽布局。
|
|
56
|
+
|
|
57
|
+
独立与原菜单入口在同一实际 CSS 视口比较内屏宽高、首屏分区、字体、内容、底栏和滚动所有者。使用宿主可用尺寸,不用浏览器外窗减固定常数;iframe 沙箱不能依赖独立 HTML 的 body 规则。覆盖同名原菜单点击、刷新和来回切换,保留 Id/URL/权限。
|
|
58
|
+
|
|
59
|
+
记录请求 viewport、实际 `innerWidth/innerHeight/devicePixelRatio`;宿主 DPI 或浏览器缩放可能使请求值与 CSS 像素不同。以实测矩形验收,不能拿 170px 的页面截图冒充 390px 手机。
|
|
60
|
+
|
|
61
|
+
## 视觉通过与功能通过分别判定
|
|
62
|
+
|
|
63
|
+
按全部路由登记共享壳与页面模式;每类至少检查真实长数据、空态和错误。主要 Tab、详情、表单、资产、设置、聊天覆盖亮/暗及非默认主色;逐页截图后列出并修正最明显的问题。截图必须匹配当前页面标题/身份、等待加载骨架消失、真实内容和媒体出现以及入场动画结束,不能把骨架或半透明入场帧计为已验。业务测试、对比度、几何检查与人工视觉批判共同构成门禁;“无 JS 错误”不能替代设计质量。
|
|
64
|
+
|
|
65
|
+
对明显重设计,在相同视口与内容下保存前后对比,说明主要对象、阅读顺序和不同页面族如何变化。临时忽略品牌色后仍只有同样的卡片墙,说明只是换肤;几何检查通过而构图仍同质时继续记录视觉缺口,不用更多自动化数量关闭它。可运行的原创场景见 [模式实验室](../assets/pattern-showcase/index.html#expressive)。
|
|
66
|
+
|
|
67
|
+
## 方法来源与适用边界
|
|
68
|
+
|
|
69
|
+
2026-11-09 检索 GitHub 与 Gitee。下表为本次核验的设计相关仓库按 GitHub 仓库 star 排序的前五,并非全球完整排名或单个移动 Skill 的 star。Gitee 命中主要为镜像/分支,不把 fork 与原仓 star 相加;技术栈专属内容只吸收可迁移的设计方法。此文为结合吾码容器、UniApp 和真实交付缺陷的原创规则,不分发外部 Skill 正文、命令、资产或默认技术栈。
|
|
70
|
+
|
|
71
|
+
| 原始仓库 | 核验 star | 吸收的方法与边界 |
|
|
72
|
+
|---|---:|---|
|
|
73
|
+
| [Anthropic frontend-design](https://github.com/anthropics/skills/tree/main/skills/frontend-design) | 190079 | 围绕真实产品建立明确视觉意图,渲染后批判;该子 Skill 相邻许可 Apache-2.0 |
|
|
74
|
+
| [UI UX Pro Max](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill) | 147127 | 触控、状态、响应式与设计系统检查;MIT,不执行其外部安装命令 |
|
|
75
|
+
| [Taste Skill](https://github.com/Leonxlnx/taste-skill) | 112256 | 构图、层级及可见交互反馈;MIT,主要针对 Web,不能冒称 UniApp 原生组件能力 |
|
|
76
|
+
| [Impeccable](https://github.com/pbakaus/impeccable) | 106507 | 按页面任务选择表达强度、保留业务事实、实际尺寸批判;Apache-2.0 |
|
|
77
|
+
| [wshobson UI Design](https://github.com/wshobson/agents/tree/main/plugins/ui-design/skills) | 42343 | iOS/Android 的层次、主题与适应式布局;MIT,保留吾码自身栈与权限 |
|
|
78
|
+
|
|
79
|
+
补充核验 [Expo design-system/native-ui](https://github.com/expo/skills)(4098 star、MIT)的单一 token 事实源与平台原生惯例;它是移动专项补充,不因名次较低而遗漏。Gitee 可核对 [UI UX Pro Max 镜像](https://gitee.com/llm_4/ui-ux-pro-max-skill)。star 是当次查询快照,不能证明 Skill 必然产出好设计;仍以本页可执行门禁判断结果。
|
|
80
|
+
|
|
81
|
+
### 2026-11-10 的场景与源码补充
|
|
82
|
+
|
|
83
|
+
研究按“页面任务 → 视觉方法 → 实际可运行示例 → 许可、维护和端适配”筛选,不把高星当作安装建议。下表是原创规则的研究来源;没有把第三方组件、截图、照片或脚本加入吾码分发。代码许可、示例资产许可和维护状态分别核对,聚合组件库的总许可不能覆盖每个上游。
|
|
84
|
+
|
|
85
|
+
| 原始来源 | 可迁移的方法 | 使用边界 |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| [Magic UI BentoGrid](https://github.com/magicuidesign/magicui/blob/main/apps/www/registry/magicui/bento-grid.tsx) 与 Dock | 背景媒体、内容与 CTA 分层;格子跨列有大小语义;触屏动作常显 | MIT正文已核;React/Tailwind实现不直接移入uni-app,hover只能增强不能承载唯一动作 |
|
|
88
|
+
| [Motion Primitives](https://github.com/ibelick/motion-primitives) 的 animated-background、transition-panel | 选中项与背景分开,内容切换保持方向和上下文 | API标记MIT但本轮未找到根许可正文,仅归纳方法,不分发源码 |
|
|
89
|
+
| [ColorUI](https://github.com/weilanwl/coloruicss) 与 [Gitee uv-ui](https://gitee.com/climblee/uv-ui) | 原生移动目录、卡片/时间线及固定导航等高占位、安全区 | MIT正文已核;旧语法、示例照片、营销数值不继承;底栏高度、gap与安全区按自己的容器实测 |
|
|
90
|
+
| [TDesign UniApp](https://github.com/Tencent/tdesign-miniprogram/tree/develop/packages/uniapp-components) | 圆形/标签导航、图标可访问名称、触控基础 | MIT已核;只是控件基础,不能代替产品构图,也不因可用图标就默认去掉导航文字 |
|
|
91
|
+
| [Flutter Responsive Admin](https://github.com/abuanwar072/Flutter-Responsive-Admin-Panel-or-Dashboard) 与 [Tremor](https://github.com/tremorlabs/tremor) | 主工作区与辅助分析分工,移动侧区归入正常信息流,图表数据/图例/尺度各有职责 | 前者MIT、后者Apache-2.0正文已核且部分组件另有MIT说明;只迁移结构和语义,不复用演示统计或把Flutter改成Vue语法 |
|
|
92
|
+
| [Cult UI](https://github.com/nolly-studio/cult-ui) 与 [Kokonut UI](https://github.com/kokonut-labs/kokonutui) | 浮动区域保留触发位置,模块尺寸编码内容层级,动效可减弱 | MIT正文已核;只研究免费公开源码,不复制付费图片/区块,拖动仍要有键盘替代 |
|
|
93
|
+
| [Vue Bits](https://github.com/DavidHDev/vue-bits) / [React Bits](https://github.com/DavidHDev/react-bits)、[Vaul](https://github.com/emilkowalski/vaul)、[Flutter商城示例](https://github.com/abuanwar072/E-commerce-Complete-Flutter-UI) | 表现性媒介、抽屉边界与多章节构图可供批判性比较 | Bits为MIT+Commons Clause,组件/模板/移植再分发受限;Vaul许可MIT但明确未维护;商城未发现LICENSE。这些不是吾码公共组件的拷贝源或默认依赖 |
|
|
94
|
+
|
|
95
|
+
公众号或作品展示不可访问时,只依据已提供并实际看到的截图讨论构图,不声称读完文章;设计者署名不代表素材授权。每次新研究保留实际查询日期、URL与许可事实,失效链接和未取得的正文如实标注,不能编造全量阅读或“全球前五”。
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Microi 动效与媒体规范
|
|
2
2
|
|
|
3
|
+
图片、图集、响应式媒体和鼠标跟随还须执行 [媒体比例、响应式与指针效果门禁](media-geometry-and-pointer.md):图集先选子图再等比裁切,禁止分别拉伸宽高;鼠标跟随只对精细指针按需运行并在静止、减少动效、隐藏与卸载时停止。
|
|
4
|
+
|
|
3
5
|
## 预算先行
|
|
4
6
|
|
|
5
7
|
| 项目 | 桌面建议 | 移动端建议 |
|
|
@@ -49,8 +51,8 @@ idle -> entering -> settled -> interacting -> paused -> reduced
|
|
|
49
51
|
|
|
50
52
|
## 视频
|
|
51
53
|
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
+
- 背景视频和悬停预览必须静音、可暂停、有海报;默认不在移动端自动播放背景视频。
|
|
55
|
+
- 用户点击打开作品播放器属于主动播放,默认开启声音并保留音量控件;不能沿用悬停预览的强制静音状态。若浏览器拒绝有声播放,提供明确开启声音的点击入口,不能悄悄回退静音。提供字幕或文字摘要。具体行为见 [交互控件、动效与有声媒体](controls-and-motion-research.md)。
|
|
54
56
|
- 背景视频不承担唯一信息;失败后页面仍能理解和操作。
|
|
55
57
|
|
|
56
58
|
## 可访问与低性能降级
|
|
@@ -53,6 +53,9 @@
|
|
|
53
53
|
- 提交后锁定重复支付并显示处理中;未知结果进入“正在确认”,不能直接当失败。
|
|
54
54
|
- 支付失败保留订单和输入,提供更换方式、重试和联系客服。
|
|
55
55
|
- 成功页展示订单号、核心信息、查看订单和继续使用。
|
|
56
|
+
- 商户配置继承宿主认证、主题与密度;秘密只在页面内存,空白表示保留,保存后清空,不回填后端原值。走专用HTTPS协议入口,不用MCP/V8/FormEngine代传私钥。
|
|
57
|
+
- 充值恢复稳定RequestId,服务器冻结套餐/金额/积分;未知结果保留原单查单,不能用客户端成功回跳授予积分。未配置商户或未验收时显示未开放,不渲染虚构可用收款码。
|
|
58
|
+
- 付款二维码在浏览器本地生成,不把支付URI交给外部二维码服务;官方付款链接按固定HTTPS主机白名单展示。隐藏、路由切换和卸载停止轮询并清理遮罩,恢复只启一套任务;迟到响应须匹配当前订单与会话。
|
|
56
59
|
|
|
57
60
|
## 搜索、筛选与列表
|
|
58
61
|
|
|
@@ -43,6 +43,7 @@ Microi 上传字段存在四种必须长期兼容的存储形态,不能假设
|
|
|
43
43
|
|
|
44
44
|
- 历史配置的原始 `FileServer` 主地址兼容 HTTP/HTTPS。公有相对路径的兼容回退保留协议、端口和路径前缀,不强制升级 HTTPS,也不改拼 API Base;仅此原始主地址允许 HTTP。备用绑定、源地址映射和别名仍限定 HTTPS 并通过原验证,私有路径、带凭据地址及危险协议的限制不变。
|
|
45
45
|
- 公共解析器以 `Microi.Client/src/utils/public-resource-router.mjs` 为单一事实源;修改后运行 `node microi.skills/scripts/sync-public-resource-router.mjs --write` 同步三份 SDK 生成块并执行 `--check`。PlatformService 的 SDK 属于其源码输入,变更后必须按原生 Bundle 入口重建及更新四个所属应用包,不能只更新 PC 或手改嵌入 Base64。
|
|
46
|
+
- 小程序运行时可能没有 `URL`、`AbortController` 或 `queueMicrotask`。公有资源解析必须在缺少这些能力时保留经过校验的原始 `FileServer` 地址,不得因浏览器 API 异常把有效路径变为空串;备份路由仅在依赖齐全时启用,不向全局伪造浏览器对象。回归需在隔离运行时移除这些 API,覆盖公有图片、端口/路径前缀、私有拒绝、危险路径与租户切换;普通 Node/H5 测试不能代替该兼容检查。只改本地 SDK 不等于应用包已发布。
|
|
46
47
|
|
|
47
48
|
### 跨端上传字段的形态与桶属性
|
|
48
49
|
|
|
@@ -165,6 +166,8 @@ function imageUrl(path) {
|
|
|
165
166
|
|
|
166
167
|
## 上传与预览边界
|
|
167
168
|
|
|
169
|
+
- 微信通过 Base64 导出 PDF 等文档时,`USER_DATA_PATH` 文件不会因预览成功自动回收;不得每次添加时间戳后永久累积。使用统一文件入口、独立命名空间和串行写入;新文档成功打开后再回收上一份,当前文件仍供原生分享菜单使用。写入/打开失败清理本次文件,清理失败须阻止后续无限新增;H5 继续回收本页创建的对象 URL。
|
|
170
|
+
- 本地文件额度错误与服务端生成失败分开处理。只回收确定属于导出器的缓存;旧版无命名空间时仅兼容当前同一报告的已知文件模式及日期版本,不能遍历删除所有 PDF、附件、二维码或业务缓存。确实释放空间后最多用原内容重写一次,仍不足给出中文提示,不重新请求服务端生成。回归覆盖重复/并发导出、旧缓存迁移、部分写入、打开失败、权限错误、当前分享文件保留及 H5 下载。
|
|
168
171
|
- 前端扩展名、大小提示只是体验校验;服务端仍须验证单文件大小、请求总量、租户配额、真实 MIME、魔数和文件名。
|
|
169
172
|
- 对象 Key 必须由服务端生成并包含租户隔离前缀,不能信任客户端提交的完整路径。
|
|
170
173
|
- SVG、HTML、脚本、压缩包和办公文档按风险策略处理;可执行内容不在同源页面直接渲染。
|
|
@@ -276,7 +276,7 @@ return {
|
|
|
276
276
|
|
|
277
277
|
## 7. 日志记录(LogParam / LogResult)
|
|
278
278
|
|
|
279
|
-
|
|
279
|
+
仅对经审查的无秘密业务参数开启;支付通道、商户材料和原始回调关闭参数/结果日志,使用脱敏专用审计:
|
|
280
280
|
|
|
281
281
|
```
|
|
282
282
|
LogParam = true # 记录每次入参
|
|
@@ -319,7 +319,7 @@ Body: {"ApiEngineKey":"your_key","Action":"Bootstrap"}
|
|
|
319
319
|
- `ApiAddress` 不能为空字符串;空字符串可能导致 404。
|
|
320
320
|
- 响应不能是空 body、字符串 `null`、非 JSON;业务接口必须返回标准 DosResult。
|
|
321
321
|
- 普通 `POST/PUT/PATCH/DELETE` 必须使用稳定路径 `/apiengine/{ApiEngineKey}`,租户放在唯一的 `osclient` Header,并可在 JSON/Form Body 中冗余传入;禁止无脑给路径追加 `--OsClient--...--`。普通 GET 优先 Header 或 `?OsClient=`。只有微信/支付等第三方回调(包括 POST)、浏览器直接下载等调用方确实无法设置 Header 或 Query 的场景,才使用 `--OsClient--{OsClient}--` 特殊路径;Query 参数名固定为 `OsClient`,禁止 `o` 等缩写。
|
|
322
|
-
-
|
|
322
|
+
- 一般验签/解密回调使用Managed引擎与精确Key可信原子;后端9.0.2支付原始字节/重复头与独立事务寿命使用已审薄协议Controller,业务仍归固定StopHttp引擎。该引擎先一次消费无参数`RequirePaymentGatewayContext()`,不能由HTTP/JSON或租户Hook建立证明。详情见[支付边界](../v8-security/references/payment-gateway.md)。
|
|
323
323
|
- 更新接口代码时保留 HTTP 元数据,避免只覆盖 JS 代码却把匿名、启用、自定义地址等配置冲掉。
|
|
324
324
|
|
|
325
325
|
### 路由冷缓存与客户端直达头(强制)
|
|
@@ -38,7 +38,7 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
|
|
|
38
38
|
生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
39
|
|
|
40
40
|
<!-- /microi-progressive:chunk -->
|
|
41
|
-
<!-- microi-progressive:chunk id=v8-crud-api-001 sha256=
|
|
41
|
+
<!-- microi-progressive:chunk id=v8-crud-api-001 sha256=2a6abff4cdc1c1f3d163e4cce0c5c3eec63ce254a77bf6f1aca4ff008b103de5 -->
|
|
42
42
|
## 核心规则
|
|
43
43
|
|
|
44
44
|
- 接口引擎文件是纯 JavaScript(Jint 引擎,非 Node.js)
|
|
@@ -47,6 +47,7 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
|
|
|
47
47
|
- 业务接口禁止接收客户端 SQL 并执行,包含改名/嵌套/编码的整段 SQL、表列及 WHERE/JOIN/ORDER BY 片段。SQL 结构必须是可信服务端固定代码或白名单定义;前端只传有界业务值或有限 queryKey,动态值用 `_Where` / `.AddInParameter`。参数绑定不保护不可信 SQL 正文,不能以只读、仅 SELECT 或管理员登录代替此规则。受权设计期 SQL 配置/数据库管理 MCP 不等于业务接口可透传 SQL。发布前按 `../v8-sql-query/SKILL.md` 检查请求到执行点的数据流和拒绝负例。
|
|
48
48
|
- 严格业务字段白名单先逐项排除本入口支持的宿主传输字段:固定 `ApiEngineKey / ApiAddress`、调用类型、设备和 HTTP 请求元数据;不得把整个下划线前缀视为安全字段,不解析 `_RawBody` 重写动作,也不从传输字段取授权。历史调试器的 `TestParam1` 仅兼容 null/undefined、最多 200 字符的字符串、有限数字或布尔值并立即丢弃;对象、数组、超长值和其它未知字段继续拒绝。真实 HTTP 与内部调用都须验收,普通岗位无初始化配置副作用,权限继续读取权威当前用户与目标租户。
|
|
49
49
|
- `V8.Param` 中嵌套 JSON 的 `JObject/JArray` 可能是 Jint 宿主对象,`Array.isArray` 不一定成立。需要严格数组、布尔或结构校验时,在业务入口对有界业务参数使用 `JSON.parse(JSON.stringify(V8.Param || {}))` 转为纯 JSON,再执行原字段白名单、类型、大小与权限校验;不能把只有 `length` 的对象当数组。只规范化业务参数,不复制或信任客户端身份、`V8.CurrentUser`、`V8.DbTrans` 或 `V8.WF`;大文件继续使用专用文件通道。验收须同时覆盖真实 HTTP 宿主集合和离线 JavaScript 数组。
|
|
50
|
+
- 动态 `V8.Param` 的缺失字段可能返回 `null`,同名属性读取也可能命中 CLR 宿主成员(例如 `values`),不能仅用 `V8.Param[name] !== undefined` 或 `!= null` 判断调用方是否提交了字段。先规范化有界业务 JSON,再以 `Object.prototype.hasOwnProperty.call(input, name)` 检查自有键,区分缺失、显式 `null`、`0` 和 `false`,随后执行该字段的类型和白名单规则;不要调用可能被输入覆盖的 `input.hasOwnProperty()`。此转换不产生可信身份,也不替代大小/深度限制、鉴权、事务或数据范围。回归应包含缺失返回 `null`、宿主同名成员、显式空值及普通 JSON 输入。
|
|
50
51
|
- 通过 `V8.CurrentUser` 获取当前登录用户信息
|
|
51
52
|
- 同租户 `V8.ApiEngine.Run` 嵌套调用缺少身份时,后端从本次重新验证的 DiyToken 恢复独立身份副本;不要让客户端补传 `_CurrentUser`。跨租户公开调用清空原租户身份,匿名仍匿名,可信后台任务保留任务身份。旧节点须更新包含修复的后端;实际验收同时覆盖普通账号 HTTP 嵌套调用、跨租户、匿名与后台任务,不能只用离线夹具证明上线。
|
|
52
53
|
- 高精度 `decimal(p,s)` / 带小数位 `number(p,s)` 的金额、数量、换算率使用无分组、英文小数点的十进制字符串,避免先 `Number()` / `parseFloat()` 或浮点运算丢位。后端使用固定文化解析,拒绝逗号分组、本地化逗号小数、指数、非数字和越界;业务层仍须按字段约束精度、小数位、范围和权限。空值兼容不变,不能从舍入后的历史值重建精度或擅自回填。用真实 HTTP、数据库写后读与目标租户验收,不能把 CLR 参数绑定冒充数据库成功。
|
|
@@ -134,9 +134,9 @@ description: Microi V8 与 MCP 文件上传下载指南。用于流式发布、
|
|
|
134
134
|
- 只读验收结合 `VerifiedCheckpointSkipped/RetryBackoffSkipped/NextCheckAtUtc` 与对象存储访问日志,覆盖等待内零重复读取、元数据变更、失败恢复和多个节点。需确认实际 API 节点已部署修复;文档、单测、镜像上传不等于生产节流生效,也不把检查点成功当成正式 V3 发布回执。
|
|
135
135
|
|
|
136
136
|
<!-- microi-progressive:begin -->
|
|
137
|
-
<!-- microi-progressive:chunk id=v8-file-upload-000 sha256=
|
|
137
|
+
<!-- microi-progressive:chunk id=v8-file-upload-000 sha256=a7a4a8bcc549a25112f58dabc79ed44ede5d48d87e3c53dbbe0224548ff3f162 -->
|
|
138
|
+
- V3 发布长时间停在 `Verifying` 且计数、版本行均不前进时,先回读原版本与运行基线;复用原 requestId/fingerprint/冻结正文和初始应用 CAS,仅将 expectedVersionRowVersion 更新为真实回读值。上传幂等命中不等于已通过验证。后台 V3 恢复、历史已发布别名、历史安装别名各自单循环调度,慢存储不能相互阻塞轮次;升级所有运行节点后再观察原任务进度。不得清锁、伪造 Verified、重置指针或绕开完整字节校验;最终仍需 ReleaseVerified、finalize 和公开入口回读。
|
|
138
139
|
## 核心 API
|
|
139
|
-
|
|
140
140
|
| API | 说明 |
|
|
141
141
|
|-----|------|
|
|
142
142
|
| `V8.FilesByteBase64` | 接收上传时携带的文件字典 `{ FileName: base64 }` |
|
|
@@ -14,10 +14,11 @@ description: Microi 前端 V8 事件与客户端能力指南。用于编写浏
|
|
|
14
14
|
> 本文重点是 **字段事件、按钮事件、列表事件、模板引擎、其它前端钩子**。
|
|
15
15
|
|
|
16
16
|
<!-- microi-progressive:begin -->
|
|
17
|
-
<!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=
|
|
17
|
+
<!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=fc639b3e0fbde86aaec6a60839e6e8dc9526e01486da4ec325686cbbbae44527 -->
|
|
18
18
|
## 能力路由
|
|
19
19
|
|
|
20
20
|
- 查询前端 V8 全部上下文、导航、表单、列表、网络、引擎与工具入口时,读取 `../v8-utilities/references/client-api-index.md`。
|
|
21
|
+
- 详情替换使用模块 `sys_menu.DetailPageV8`,已打开表单的字段初始化才用 `InFormV8`;先读 [详情接管边界](references/progressive-01-列表事件.md#detailpagev8-详情替换与-informv8-初始化)。动态赋值后只缺选项名称时使用原生已选值显示补查,不改保存键或重复触发字段事件。
|
|
21
22
|
- 需求包含“蓝牙打印、标签打印、TSC/TSPL、CPCL、ESC/POS、小票打印、佳博/GP-M322、ZICOX/芝柯/CC4、BLE/SPP”时,必须先读取 `references/bluetooth-print.md`;需要完整指令签名、型号转换范围、编码或位图参数时,再读取 `references/bluetooth-print-api.md`。
|
|
22
23
|
- `microi.app` 是 5+ 在线壳,不能假设存在 `uni` 或 Web Bluetooth。BLE 连接、发现和写入必须统一使用 `plus.bluetooth`,禁止用 `uni.writeBLECharacteristicValue` 写入由 `plus.bluetooth` 建立的连接。5+ `V8.Print.getConnectionState()` 的 `mtu/maxWriteBytes/recommendedPacketSize/writeType/packetIntervalMs` 描述本次连接能力。Android GP-M322 在特征支持时优先 `writeNoResponse`,即使协商出 180 字节有效载荷也只采用 100 字节连续发送稳定档,并保留约 8ms 包间保护;不支持无响应写时兼容 `write`,空 MTU 成功、失败、超时或旧壳只用 20 字节。详见蓝牙参考。
|
|
23
24
|
- 浏览器模板打印、PDF/纸张模板、`mic_print`、`PageObj`、`PrintObj` 使用 `print-engine/SKILL.md`,不要与直接蓝牙指令混为一套 API。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=98758a2a95fe35e6c7413d8d6d6e6e0e05d2b9fdd349e8f21d482e4a00c1e3df -->
|
|
6
6
|
## 列表事件
|
|
7
7
|
|
|
8
8
|
### TableRowClick — 行点击
|
|
@@ -14,6 +14,26 @@ console.log('点击行:', V8.Form.Id);
|
|
|
14
14
|
V8.OpenAnyForm({ TableName: 'OrderDetail', Id: V8.Form.Id, FormMode: 'View' });
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
### DetailPageV8 — 详情替换与 InFormV8 初始化
|
|
18
|
+
|
|
19
|
+
- 替换详情写入实际入口模块的 `sys_menu.DetailPageV8`,包括隐藏子表模块;不要写在 `diy_table.InFormV8`。后者在原生表单已打开后初始化字段,直接从中再开微服务会产生先原生后微服务的闪窗。
|
|
20
|
+
- DiyTable 与 `diy-form-full` 统一“配置即替换默认详情”:有 `DetailPageV8` 就等待脚本并由其接管,返回 `undefined` 或 `{ Code: 1 }` 也不自动再开原生。`return false`、`return { Code: 0, Msg: '原因' }` 或将相同值写入 `V8.Result` 表示取消其它 UI。脚本出错结束本次流程并提示,不能悄悄回退原生表单;没有配置详情脚本的普通详情及 Add/Edit 保持原生行为。
|
|
21
|
+
- 脚本需要明确打开原生详情时,调用既有 `V8.OpenForm(V8.Form, 'View')`;该方法传递内部已有的 `isDefaultOpen===true`,避免递归再次执行详情替换。不要新增“继续原生”的业务 flag,也不要把 `undefined` 当作继续原生协议。迁移客户配置时仍显式 `return false`,兼容旧 PC。
|
|
22
|
+
- 新事件对象局部包装 `V8.OpenAppDialog` 并绑定表、记录、菜单、API、租户、用户、初始化/关闭代次及销毁状态;关闭或上下文变化后,迟到脚本不能开旧窗口。不得改写全局或 `ParentV8.OpenAppDialog`。若旧代码用 `ParentV8` 开窗,保留父上下文并显式 `return false`,异步父副作用仍须自行检查当前性。
|
|
23
|
+
- 迁移旧配置只移动 View 接管段,保留 Add/Edit 初始化和原有事件/按钮;不提前执行整段 FormIn。菜单、子表授权和服务端记录权限继续生效,传入 Id、TaskId 不等于授权。验收含列表/子表/嵌套详情、同步/异步取消、正常原生 Hook、异常及关闭/换身份迟到。
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
// 配置在实际模块 sys_menu.DetailPageV8,AppKey/RoutePath先从当前租户在线应用回读。
|
|
27
|
+
V8.OpenAppDialog({
|
|
28
|
+
AppKey: '已发布应用的真实Key',
|
|
29
|
+
RoutePath: '/detail',
|
|
30
|
+
Data: { Id: V8.Form.Id }
|
|
31
|
+
});
|
|
32
|
+
return false;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`await` 用于事件中的异步准备,并不把打开动作变成等待用户关闭的 Promise;表单初始化逻辑仍留在 InFormV8。
|
|
36
|
+
|
|
17
37
|
### OpenTableBefore — 打开列表前(拦截/初始化筛选)
|
|
18
38
|
|
|
19
39
|
```javascript
|
|
@@ -7,6 +7,10 @@ description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆
|
|
|
7
7
|
|
|
8
8
|
# Microi V8 安全最佳实践
|
|
9
9
|
|
|
10
|
+
影视桥、平台管理资格与受控文件流必须读取[网页影视可信协议](references/progressive-01-2-权限校验.md#网页影视可信协议),当前项目的SaaS单一配置事实源以用户AGENTS为准。
|
|
11
|
+
|
|
12
|
+
支付接入先读[原生支付与业务事务边界](references/payment-gateway.md):9.0.2专用原始协议、元数据MCP与秘密入口分离,不向V8传商户材料。
|
|
13
|
+
|
|
10
14
|
你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
|
|
11
15
|
|
|
12
16
|
登录与安全开关只能读取已启用且未删除的 `sys_config`;开关写入后须回读匿名能力和实际登录界面,避免历史停用/软删除行造成数据库与运行状态不一致。
|
|
@@ -125,7 +129,7 @@ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。
|
|
|
125
129
|
- 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
|
|
126
130
|
|
|
127
131
|
<!-- /microi-progressive:chunk -->
|
|
128
|
-
<!-- microi-progressive:chunk id=v8-security-001 sha256=
|
|
132
|
+
<!-- microi-progressive:chunk id=v8-security-001 sha256=516232642128c348947bdd7fcaa359d69e75757eba9a03aa991a49815e48cede -->
|
|
129
133
|
## 0.5 接口引擎配置安全
|
|
130
134
|
|
|
131
135
|
代码以外,接口本身的配置项也是安全防线(详见 `v8-api-config/SKILL.md`):
|
|
@@ -136,10 +140,10 @@ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。
|
|
|
136
140
|
| `StopHttp = true` | 内部接口(核心扣款、内部计算)防止外部直接 HTTP 调用 |
|
|
137
141
|
| `LockKey = ...` | 写操作类接口(对账、补单)防止并发执行 |
|
|
138
142
|
| `RateLimit = 60/m` | 公开接口(验证码、登录)防爬虫 |
|
|
139
|
-
| `LogParam = true` |
|
|
143
|
+
| `LogParam = true` | 仅经审查的无秘密业务参数;原生支付与秘密配置关闭参数/结果日志 |
|
|
140
144
|
| `ResponseType = HTTP` | 标准协议需要状态码、重定向、XML/纯文本或特定响应头 |
|
|
141
145
|
|
|
142
|
-
`ResponseType=HTTP` 不是任意响应头旁路。普通 V8 只能返回安全白名单头,`Location` 经过站内/HTTPS 校验;Host、Content-Length、逐跳头始终禁止。`Set-Cookie` 等高风险头只接受平台可信原子的进程内签名结果,V8
|
|
146
|
+
`ResponseType=HTTP` 不是任意响应头旁路。普通 V8 只能返回安全白名单头,`Location` 经过站内/HTTPS 校验;Host、Content-Length、逐跳头始终禁止。`Set-Cookie` 等高风险头只接受平台可信原子的进程内签名结果,V8 不能获得或伪造签名密钥。通常公开协议由Managed引擎与精确Key的最小原子承担;原始字节/重复头与独立事务寿命无法由V8保真的支付协议按上述专用契约使用薄Controller,禁止扩大为普通业务Controller。
|
|
143
147
|
|
|
144
148
|
`ApiAddress` 使用 `{OsClient}`、`{ConnectionKey}` 路径模板时,模板值是权威值并覆盖同名 Query/Form/JSON 参数;多模板歧义必须失败关闭,防止跨租户或跨连接参数混淆。
|
|
145
149
|
|
|
@@ -189,9 +193,22 @@ V8.Db.FromSql("SELECT * FROM " + V8.Param.table).ToArray();
|
|
|
189
193
|
```
|
|
190
194
|
|
|
191
195
|
<!-- /microi-progressive:chunk -->
|
|
192
|
-
<!-- microi-progressive:chunk id=v8-security-003 sha256=
|
|
196
|
+
<!-- microi-progressive:chunk id=v8-security-003 sha256=d927a6a615a65a697606715b2eef74b977d8a5e28c4aeb62eecd9a0228861052 -->
|
|
193
197
|
## 3. 输入验证
|
|
194
198
|
|
|
199
|
+
### 一次性图形验证码(9.0.0)
|
|
200
|
+
|
|
201
|
+
公开登记等匿名业务使用 `V8.Method.ValidateAndConsumeCaptcha({CaptchaId,CaptchaValue})`。
|
|
202
|
+
它从可信 V8 上下文读取当前租户,在共享 Redis 中原子占用消费标记,再校验平台验证码;
|
|
203
|
+
重复、错误、过期或依赖不可用均失败关闭,错误尝试也会消费,前端须刷新后重试。
|
|
204
|
+
不要自行先读后删缓存,不接受客户端指定租户,不记录验证码原文。
|
|
205
|
+
`Code=1 + Data.Valid=true` 才继续业务写入;验证码成功不代替限流、业务校验或幂等。
|
|
206
|
+
|
|
207
|
+
本机媒体准入接口先执行 `V8.Method.RequireLocalMediaDispatchContext(V8.Param)`,
|
|
208
|
+
并要求 `Code=1`;它核对宿主内部 AsyncLocal 作用域和精确动作/租户/负责人/任务/摘要/栅栏,
|
|
209
|
+
HTTP 参数、普通 V8 嵌套调用及伪造 `_TrustedServerInvocation` 不能建立该上下文。
|
|
210
|
+
业务积分和任务状态仍由受信准入接口事务与唯一约束保证,不能把原生来源证明当业务授权。
|
|
211
|
+
|
|
195
212
|
### 必填校验
|
|
196
213
|
|
|
197
214
|
```javascript
|
|
@@ -259,6 +276,6 @@ V8.FormEngine.AddFormData('Comment', {
|
|
|
259
276
|
|
|
260
277
|
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
261
278
|
|
|
262
|
-
- [references/progressive-01-2-权限校验.md](references/progressive-01-2-权限校验.md):2. 权限校验;5. 防重复提交;6.
|
|
279
|
+
- [references/progressive-01-2-权限校验.md](references/progressive-01-2-权限校验.md):2. 权限校验;5. 防重复提交;6. 敏感数据;网页影视可信协议;9.0.5动态密码/首次改密入口、成对状态列及事故恢复
|
|
263
280
|
- [references/progressive-02-7-日志记录.md](references/progressive-02-7-日志记录.md):7. 日志记录;8. 错误处理;9. Token、终端会话与租户隔离;10. Jint 运行时升级边界;安全检查清单;浏览器访问密钥
|
|
264
281
|
<!-- microi-progressive:end -->
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 原生支付与业务事务边界(9.0.2)
|
|
2
|
+
|
|
3
|
+
后端9.0.2与系统设置v8.6.16提供微信直连Native/H5、支付宝国内电脑/手机网站支付。先部署全部API节点再安装责任应用;商户未就绪保持新订单关闭,不将源码、配置存在或离线测试当成真实支付验收。
|
|
4
|
+
|
|
5
|
+
- `microi_manage_payment_channel`只经固定Managed接口`platform-payment-channel-metadata`执行Inspect/SaveMetadata。当前有效平台管理员重新鉴权,拒绝AccessKey;ExpectedVersion/确认串保护更新。只回安全状态、Ready、版本、指纹和HasSecret。
|
|
6
|
+
- 私钥、APIv3密钥和平台验签材料仅通过专用HTTPS后台窗口录入,不进入MCP、可编辑V8、普通表单、URL或日志。`PaymentGateway.*`由当前租户`mci_system_setting`认证加密、唯一ConfigKey及不可变revision托管,绑定真实租户与键;通用私密工具不能改删或揭示。公开商户元数据与秘密在同一版本化配置原子维护,这是支付协议专属存储,不改变普通公开系统配置的归属规则。
|
|
7
|
+
- `POST /api/payment/admin/channels/{channelKey}`读取有界原始JSON,没有秘密`[FromBody]` DTO。回调固定`POST /api/payment/{tenant}/{channelKey}/{revision}/notify`,先验证完整原始字节、重复头、签名、机构身份和冻结订单,再进入业务。这里`tenant`是回调URL中的租户段,对应Controller的`osClient`,`revision`要求整数;不是请求体可覆盖的当前用户租户。它是薄Controller处理原始协议与独立事务寿命的已审例外,不授权普通业务新建Controller。
|
|
8
|
+
- 业务引擎固定于可信配置,启用且`StopHttp=1`。首行调用无参数`V8.Method.RequirePaymentGatewayContext()`并检查Code=1;宿主证明绑定真实租户和精确引擎、一次消费,不信任JSON中的CurrentUser、Amount、Paid或`_TrustedServerInvocation`。
|
|
9
|
+
- Prepare事务冻结原订单、产品、通道、revision、商户、App、金额及积分→结束事务→机构网络→独立Record/Apply事务。网络不跨订单/钱包锁。回调与查单进入同一Apply;持久提交后才能微信204/支付宝success。
|
|
10
|
+
- inbox、trade、ledger的业务键必须有永久物理唯一约束,不能包含IsDeleted或因软删除重开。实际入账前检查真实索引;订单、钱包、账本、交易证据与outbox同一SQL事务提交。首期数据库适配仅MySQL家族,其它Provider拒绝。
|
|
11
|
+
- 停用新订单不阻断旧单查单/回调。未知结果保留同一订单先查单;不能把未验签404当成机构未创建。需人工核对进入ReconciliationHold,不伪造失败重充;记录调查完成不代表补积分或退款。
|
|
12
|
+
- 普通/慢SQL日志都须按敏感参数标签脱敏,包括密文和支付入口。密码学、真实MySQL原子性、应用安装、原菜单/手机页面、真实商户支付分层留回执;退款、JSAPI、小程序和服务商未实现时明确列为未覆盖。
|
|
13
|
+
|
|
14
|
+
## 专用HTTP协议与身份边界
|
|
15
|
+
|
|
16
|
+
以下路径来自正式 `PaymentGatewayController` 与 `PaymentChannelAdminController`;除机构回调外均以真实DiyToken确定租户,拒绝AccessKey会话。参数名表示路径片段,不接受用户自报金额、积分、owner或付款状态。
|
|
17
|
+
|
|
18
|
+
| 方法与路径 | 授权与请求合同 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| `GET /api/payment/admin/channels/{channelKey}` | 当前有效平台管理员;只读安全配置状态,不回秘密或密文。 |
|
|
21
|
+
| `POST /api/payment/admin/channels/{channelKey}` | 当前有效平台管理员、真实HTTPS、原始JSON白名单与版本CAS;正文ChannelKey须匹配路径。秘密仅在此专用边界录入。 |
|
|
22
|
+
| `GET /api/payment/channels/{channelKey}/availability` | 已登录本人;只读可用性,未就绪返回Available=false,不因此授权创建订单。 |
|
|
23
|
+
| `POST /api/payment/orders/{businessId}/create` | 已登录本人;JSON只允许ChannelKey和Product,订单金额/积分来自可信业务Prepare。未知结果保留原businessId查单。 |
|
|
24
|
+
| `POST /api/payment/orders/{businessId}/query` | 已登录本人;原订单owner校验,只返回状态,不返回买家、机构请求或商户材料。 |
|
|
25
|
+
| `POST /api/payment/{tenant}/{channelKey}/{revision}/notify` | 机构原始回调,不靠浏览器登录;严格验签和订单绑定,持久提交后才应答成功。 |
|
|
@@ -212,3 +212,23 @@ return { Code: 1, Data: user };
|
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
<!-- /microi-progressive:chunk -->
|
|
215
|
+
|
|
216
|
+
## 网页影视可信协议
|
|
217
|
+
|
|
218
|
+
平台管理动作使用无参数 `V8.Method.IsCurrentPlatformAdministrator()`:可信宿主从活动DiyToken和当前租户主库复核账号状态、token与主库等级及有效管理员角色;匿名/访问密钥/失效角色拒绝,账号名admin不能单独提权。函数缺失失败关闭;此检查不替代菜单、表、行、状态和幂等。个人创作固定Owner,即使管理员也仅本人;跨Owner管理必须使用独立受控引擎,不能通过浏览器Scope/OwnerId/isAdmin切换个人入口。
|
|
219
|
+
|
|
220
|
+
网页影视桥只允许固定Managed Key调用 `V8.AI.VideoFlow/VideoFlowStream/ValidateVideoFlowUpload`。会话、JWT Did、已配置Origin、HMAC及地址只在可信后端解析;会话/密钥不得写日志、磁盘、业务表或前端。媒体仅HDFS原生multipart/Range,注册先校验本人原生上传proof再流式读回SHA/大小;V8可信FormEngine写入会跳过外部附件proof,不能把调用成功当来源证据。当前项目用户AGENTS明确的 `sys_osclients` 单一事实源优先于本Skill中通用配置迁移建议。
|
|
221
|
+
|
|
222
|
+
影视桥SaaS配置仅正式 `microi_manage_saas_videoflow` Inspect/Save:当前主租户真实交互管理员、固定六字段、行锁CAS、密钥只写/HasSharedSecret、提交后配置刷新。正文不能覆盖租户或记录Id,普通FormEngine不能读取密钥/改写服务目标;密钥不得借通用表工具、SQL、临时维护引擎或双事实源绕过。保存未知先Inspect;Persisted=true但运行回读待完成不得自动重投,实际后端9.0.8和工具渠道可用性须分别验收。
|
|
223
|
+
|
|
224
|
+
管理文件镜像仅固定 `nz-videoflow-admin-file→V8.AI.VideoFlowMirror`:真实管理员及来源项目主库归属都要复核;目标归当前管理员本人,来源Owner只做溯源。0–100MiB有界流、精确SHA/长度、固定内网端点和永久唯一回执共同约束,未知状态不可自动重新下载;回执不存Token、秘密或短URL。公开Prepare/Register/Resolve分请求提交,已提交后签发原名/MIME且强制attachment的原生HDFS短链,不经V8 Base64。内部模型/文件回执表禁止通用Client CRUD,即使管理员也不能绕过去重。
|
|
225
|
+
|
|
226
|
+
## 动态密码与首次改密(9.0.5 配套能力)
|
|
227
|
+
|
|
228
|
+
可见配置位于系统设置启用配置的【密码强度】Tab,【首次登录强制修改密码】对应可空 int/Switch `PwdForceFirstChange`,默认关闭。缺少入口时先更新系统设置应用(v8.6.17+)与基础 SaaS 包(v8.8.26+),独立系统账号应用与前后端同样须配套;不能仅有可信原子或文档就宣称入口已交付。使用现有字段/Schema/应用发布 MCP 读取、补齐和回读,不另增专用工具,不为验收开启整个生产租户策略或改真实管理员密码。
|
|
229
|
+
|
|
230
|
+
密码写入从当前租户主库唯一活动 sys_config 读取 PwdShortestLength/PwdContainNumber/PwdContainUpperLower/PwdContainSpecial/PwdForceFirstChange;大小写需同时满足,不 trim 或信客户端编码哈希。账号原 SubmitBeforeServerV8 仅通过受保护 PrepareSysUserFormPassword(),保留原事务与业务事件。PwdRevision/PwdChangeRequired 是服务端状态,通用 Client 不得设置。
|
|
231
|
+
|
|
232
|
+
初始密码认证返回1008而非JWT/会话;固定 Managed platform-first-password-change 只支持POST Complete/Inspect,五分钟一次性短票据、稳定RequestId、Redis原子消费、原库CAS与唯一收据。Unknown只核原请求,不重发;票据/密码/请求原文不记日志。内部 mci_password_change_receipt 普通管理员Client也不得CRUD。旧账号无字段或双NULL保留未标记,半配置拒绝;先后端/PC及责任商城资源再开启策略。SQLite/端口测试不能代替真实提供商、Redis、多节点和HTTP验收。
|
|
233
|
+
|
|
234
|
+
`PwdRevision/PwdChangeRequired` 禁止用单字段 MCP 先后新增;半配置会让现有 DiyToken 在主库凭据检查时失败。先更新应用商城 v8.9.15 / 导入器 v3.1.8,再通过责任包成对原子 DDL 安装并回读,重复安装零新增;仅缺一列的事故恢复须使用已授权可信维护入口,保留失败关闭和原账号数据。系统账号/SaaS 包还须携带内部回执表、永久单列唯一 RequestId 索引和可信提交前事件,不能只发布开关或Managed接口。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-security-008 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-security-008 sha256=eccad5f08ca09c3179d0612f9c4d4cc82ff34f7241bbe2592603ce8646344b31 -->
|
|
6
6
|
## 7. 日志记录
|
|
7
7
|
|
|
8
8
|
关键操作必须记录审计日志:
|
|
@@ -22,6 +22,24 @@ V8.Method.AddSysLog({
|
|
|
22
22
|
});
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
+
### 日志副本的统一脱敏边界
|
|
26
|
+
|
|
27
|
+
- 业务审计只投影必要的 Action、BusinessId、目标 Id 与计数,不复制完整 `V8.Param`。
|
|
28
|
+
通用 `microi_run_engine` 的新版工具只审计合法参数键名和数量,不发送参数值;
|
|
29
|
+
`MicroiClient.writeAuditLog` 仍统一处理其它工具的审计副本,不能只改某一个调用点。
|
|
30
|
+
- 后端9.0.3在 MCP 接收、日志队列 Snapshot(包括普通/紧急 spool)和直接 MongoDB
|
|
31
|
+
批量持久化边界再次完整脱敏。`Pwd/Token/ApiKey/Secret/MerchantPrivateKeyPem/ApiV3Key/_UploadProof`
|
|
32
|
+
的嵌套、数组、大小写、下划线/横线变体以及多行 PEM、Bearer/JWT 形式的自由文本均须覆盖。
|
|
33
|
+
- S3/OSS 的签名或凭据查询、固定 `/api/HDFS/OpenPrivateFile` 的 `t` 是短期bearer访问凭据,
|
|
34
|
+
日志隐藏整条地址;不删除普通HTTPS URL或其它路由的普通 `t`,不改变业务FileUrl。
|
|
35
|
+
- 必须先完整脱敏再限制输出长度。超过16,384字符、畸形或截断 JSON、结构超过32层、
|
|
36
|
+
JSON字符串编码超过5层或处理超时,只保留安全原因和输入长度,不记录原始前缀。
|
|
37
|
+
正常非敏感 Action、BusinessId、计数保持,实际业务请求对象不变。
|
|
38
|
+
- 不能用 `EnableLog=0` 证明所有调用链安全,接口慢日志和 MCP 审计有独立入口。
|
|
39
|
+
新版源码、本地测试、CLI/npm正式分发、当前MCP加载版本、客户后端部署分别验收。
|
|
40
|
+
- 此修复不自动清空、重写旧审计,不读取真实凭据做回归,不新增临时诊断接口。
|
|
41
|
+
测试使用合成标记,覆盖发送前/队列/spool/直接持久化、畸形和超长边界,并只输出数量与结果。
|
|
42
|
+
|
|
25
43
|
### 管理员吊销用户全部登录态
|
|
26
44
|
|
|
27
45
|
需要让某个用户所有终端立即退出时,接口引擎必须调用平台统一能力,不要只删除前端 Token,也不要只修改用户状态:
|
|
@@ -108,6 +108,8 @@ V8.FormEngine.GetTableData('Table', { _Where: objectWhere });
|
|
|
108
108
|
|
|
109
109
|
## 次选:V8.Db.FromSql(仅 SQL 字符串 + AddInParameter)
|
|
110
110
|
|
|
111
|
+
支付商户材料不得进入可编辑V8/SQL。原生支付C#的密文和支付入口使用ORM `AddSensitiveInParameter`同时保护普通/慢SQL日志;业务永久幂等键不含IsDeleted,真实唯一索引是入账前提,详见[支付边界](../v8-security/references/payment-gateway.md)。
|
|
112
|
+
|
|
111
113
|
> **⚠️ FormEngine 优先原则:** 增删改操作(INSERT / UPDATE / DELETE)必须**优先**使用 `V8.FormEngine.AddFormData` / `UptFormData` / `UptFormDataByWhere` / `DelFormData` 等方法。只有多表 JOIN、复杂子查询、GROUP BY 聚合等 FormEngine 无法表达的场景,或下文明确要求保留业务修改时间的原子计数,才使用参数化 SQL。
|
|
112
114
|
|
|
113
115
|
> **⚠️ FromSql 调用规则:** `V8.Db.FromSql` 在 V8 中只传 SQL 字符串,不要把动态值作为第二个或后续参数传给 `FromSql`。动态值必须用链式 `.AddInParameter('@p0', value)` 绑定;否则会生成平台不支持的调用签名。
|
|
@@ -51,18 +51,24 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
51
51
|
| `DataFilterV8.js` | **后端** | `DataFilter` | 获取列表/表单数据后 | 每行数据加工、脱敏、补充字段 |
|
|
52
52
|
|
|
53
53
|
<!-- /microi-progressive:chunk -->
|
|
54
|
-
<!-- microi-progressive:chunk id=v8-table-event-002 sha256=
|
|
54
|
+
<!-- microi-progressive:chunk id=v8-table-event-002 sha256=cbcfbe20d02e4dcf34652bdffa9c0b45d25f83d653ea42426c6467a1640bce14 -->
|
|
55
55
|
## 事件触发规则
|
|
56
56
|
|
|
57
57
|
- 后端 V8 事件 / 接口引擎中调用 `V8.FormEngine` 增删改 → **不触发**表单 V8 事件
|
|
58
58
|
- 传入 `_InvokeType: 'Client'` → **触发**表单 V8 事件
|
|
59
59
|
- Postman 等直接调用接口 → 前端事件**不执行**,后端事件**仍执行**
|
|
60
|
+
- 外部 Client 请求不能通过 `_RunV8Event: '0'/'false'` 关闭服务端提交前/后事件;该开关仅供真实可信服务端上下文使用。`_InvokeType`、可信标记和原生元数据标记不能由请求 JSON 建立信任。原生 AddDiyField 的嵌套字段元数据插入有单独的内部标记以避免重复 DDL,该标记不授予管理员权限,也不能用于修改、删除或普通业务表。
|
|
60
61
|
- 服务器端提交前/后 V8 事件在**同一事务**中执行
|
|
62
|
+
- 普通提交的`V8.Form`也可能仅含`Id + 修改字段`,不能假定具有完整`OsClient`或其它归属列。
|
|
63
|
+
需要配置刷新目标时,按当前已授权行Id在同一`V8.DbTrans`回读真实值,校验Form/OldForm身份一致;
|
|
64
|
+
不从调用参数或当前租户猜测记录归属。`ReloadOsClient`等运行配置刷新仍登记到事务提交后,
|
|
65
|
+
缺记录、身份矛盾或缺可信事务时拒绝,不能提前对外发布未提交配置。
|
|
61
66
|
- `diy_table.V8Limit` 是表后端提交前、提交后和数据处理 V8 的正向开关:缺失、`null`、`0/false` 均不设置 Jint 单次超时、语句、函数递归和累计分配预算,只有 `1/true` 才启用这些限制。旧 `V8Unlimited` 仅在新字段不存在时反向推断,新的 MCP、Manifest 和应用资源只写 `V8Limit`。进程常驻内存、取消、并发、接口嵌套深度、权限和数据库保护始终生效。
|
|
62
67
|
|
|
63
68
|
### 日志、评论、数据版本的 12 个写入事件
|
|
64
69
|
|
|
65
70
|
事件仍是顶层 `diy_table` 属性,不属于 `sys_menu`、字段 Config 或临时接口。
|
|
71
|
+
设计器中统一归入已有“事件”Tab,按日志、评论、数据版本以三个元数据 Divider 分区;不得把十二项留在基础信息,也不得给分隔标题创建物理业务列。
|
|
66
72
|
`microi_list_events/get_event_code/save_event_code` 与 Manifest `events[]` 使用相同名称。
|
|
67
73
|
`V8.EventName` 等于属性名去掉末尾 `V8`。
|
|
68
74
|
|
|
@@ -110,7 +116,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
110
116
|
|
|
111
117
|
|
|
112
118
|
<!-- /microi-progressive:chunk -->
|
|
113
|
-
<!-- microi-progressive:chunk id=v8-table-event-003 sha256=
|
|
119
|
+
<!-- microi-progressive:chunk id=v8-table-event-003 sha256=233cfaa83e2ec99359719ad7bbf9b8c718ceffae466dd6c6303b335324c42221 -->
|
|
114
120
|
## ⚠️ 关键陷阱(必读)
|
|
115
121
|
|
|
116
122
|
### 1. 设计模式保护(前端事件必加)
|
|
@@ -159,6 +165,13 @@ V8.ApiEngine.Run('other-engine', { Form: V8.Form }, V8.DbTrans);
|
|
|
159
165
|
- 原生删除事件的权威删除前记录由 `V8.Form` 提供,`V8.OldForm` 可能为空;删除审计、关系清理应按 `FormSubmitAction` 选择上下文。原生删除的 `Form.Version` 来自数据库快照,不能把它当作客户端最后看到的版本。需要拒绝过期删除时,通过受控接口接收期望版本、锁定主库记录并验证,再在同一事务执行删除。
|
|
160
166
|
- 回归必须比较“新增接口返回 Id、主表实际 Id、附属外键、审计 RowId”四者一致,并覆盖唯一冲突时主表及附属记录同时回滚,不能只断言新增接口 `Code=1`。
|
|
161
167
|
|
|
168
|
+
### 7. 读取事件的显式拒绝与旧节点兼容
|
|
169
|
+
|
|
170
|
+
- `ServerDataV8`(`DataFilterV8` 别名)读取授权必须覆盖详情和两种列表分支,缺少归属字段的投影也要失败关闭。列表 `SqlWhere` 不能代替详情或写入授权。
|
|
171
|
+
- 包含读取结果传播修复的后端会把事件显式返回的非 `1` `Code` 作为拒绝,清空数据并终止整个读取;`Code:1`、不含 `Code` 的普通加工返回值保留原行为。脚本正常执行的外层 `Code:1` 不能覆盖脚本自己的 `Code:0`。
|
|
172
|
+
- 历史节点可能忽略读取事件的 `return {Code:0}`。没有真实确认后端修复已部署时,拒绝路径使用 `throw new Error('无权访问此记录')`;不要用管理员 MCP 运行、元数据回读或只测列表声称已授权安全。提交前事件的返回拒绝语义保持独立。
|
|
173
|
+
- 回归使用真实普通会话,至少验证本人允许、他人详情拒绝、只选 Id/名称而缺少归属时拒绝、列表范围、修改/删除和附件上下文;拒绝响应不得携带当前行或已经处理的部分列表。
|
|
174
|
+
|
|
162
175
|
---
|
|
163
176
|
|
|
164
177
|
<!-- /microi-progressive:chunk -->
|
|
@@ -236,6 +236,14 @@ V8.WF.StartWork({
|
|
|
236
236
|
```
|
|
237
237
|
|
|
238
238
|
<!-- /microi-progressive:chunk -->
|
|
239
|
+
## 节点字段显隐与只读的运行时验收
|
|
240
|
+
|
|
241
|
+
- `wf_node.FieldsConfig` 使用当前业务表真实字段 `Name`,每项的 `Display=true` 表示可见,`Edit=false` 表示只读;可编辑不能扩大原有表单或用户权限。发起使用开始节点,办理使用当前待办节点。未配置的 `null/空字符串` 沿用原表单行为,显式合法 `[]` 表示全隐藏,不能把两种状态都转换为“无限制”的空列表。
|
|
242
|
+
- 普通模块/“我的工作”的 `diy-form-full` 与工作流专用表单都须消费节点初始化结果。修改抽屉链路时,检查 `InitStartWork/InitSendWork` 回调、传给 `DiyForm` 的 `ShowFields/ReadonlyFields` 及隐藏限制;不能把回调写为空函数。使用直接回调或事件转发时择一形成完整链路,避免只转发事件却无人消费。
|
|
243
|
+
- 从原入口覆盖可见可编辑、可见只读、隐藏、全隐藏、未配置、切换节点和随后打开普通表单;搜索及管理员“显示隐藏字段”不得恢复节点隐藏项。覆盖 PC 抽屉、页面表单及移动面板共用状态,保留原表单更严格的限制。
|
|
244
|
+
- 回读节点配置正确但控件仍可编辑时,先核对浏览器实际加载的 PC 前端和入口,不用逐表 `InFormV8/FieldSet` 临时逻辑掩盖平台漏接。纯前端修复须部署对应前端并刷新资源;无声明式资源变化时无需空升工作流商城包。
|
|
245
|
+
- 以上是表单交互约束,不能据此宣称服务端已阻止伪造写入。业务状态、待办办理人、重要字段写权限仍须由可信后端独立核验。
|
|
246
|
+
|
|
239
247
|
## “我的工作”与审核界面交付规则
|
|
240
248
|
|
|
241
249
|
- 模块使用“流程引擎”打开方式时,关联流程只能选择已启用的 `wf_flowdesign`;交付前同时验证流程已启用、模块 `OpenType=WorkFlow`、`FlowDesignId` 正确,且开始节点不存在测试阻断 V8。
|