@microi.net/cli 5.1.8 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +85 -85
- package/scripts/microi-cli.js +2 -2
- package/scripts/microi-skills.meta.json +216 -201
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +17 -17
- package/skills/README.md +2 -1
- package/skills/ai-engine/SKILL.md +7 -2
- package/skills/app-store/SKILL.md +81 -81
- package/skills/job-engine/SKILL.md +1 -1
- 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 +1 -1
- package/skills/microi-docs-coverage/references/capability-map.md +1 -0
- package/skills/microi-form-layout/SKILL.md +191 -191
- package/skills/microi-frontend-sdk/SKILL.md +189 -182
- package/skills/microi-left-right-layout/SKILL.md +2 -0
- package/skills/microi-sso/SKILL.md +82 -0
- package/skills/microi-sso/references/acceptance.md +49 -0
- package/skills/microi-sso/references/configuration-and-security.md +53 -0
- package/skills/microi-sso/references/inbound.md +53 -0
- package/skills/microi-sso/references/outbound.md +39 -0
- package/skills/microi-ui/SKILL.md +11 -7
- package/skills/microi.v8.js +5 -2
- package/skills/module-engine/SKILL.md +184 -180
- package/skills/module-engine/references/module-config.md +4 -2
- package/skills/ui-design/SKILL.md +34 -30
- package/skills/v8-crud-api/SKILL.md +2 -2
- package/skills/v8-debugging/SKILL.md +3 -1
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +3 -2
- package/skills/v8-security/SKILL.md +69 -69
- package/skills/v8-table-event/SKILL.md +1 -1
- package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +1 -1
- package/skills/v8-utilities/references/server-api-index.md +135 -135
|
@@ -9,17 +9,21 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
|
|
|
9
9
|
|
|
10
10
|
你正在为 Microi 吾码平台创建界面。所有页面、组件、弹窗必须遵循本规范,打造高级、克制、具有科技感和品牌识别度的视觉体验。
|
|
11
11
|
|
|
12
|
-
> **适用平台**:PC 端(Vue 3 + Element Plus + SCSS)、移动端 H5/uni-app/原生 WebView(纯 CSS / 无第三方组件库)
|
|
13
|
-
> **核心理念**:高级但不浮夸,动效丰富但可维护,多端统一同时尊重平台差异
|
|
14
|
-
> **变量前缀**:所有 CSS 变量统一使用 `--mci-` 前缀(Microi Interface)
|
|
15
|
-
|
|
16
|
-
---
|
|
12
|
+
> **适用平台**:PC 端(Vue 3 + Element Plus + SCSS)、移动端 H5/uni-app/原生 WebView(纯 CSS / 无第三方组件库)
|
|
13
|
+
> **核心理念**:高级但不浮夸,动效丰富但可维护,多端统一同时尊重平台差异
|
|
14
|
+
> **变量前缀**:所有 CSS 变量统一使用 `--mci-` 前缀(Microi Interface)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
17
|
|
|
18
18
|
<!-- microi-progressive:begin -->
|
|
19
|
-
<!-- microi-progressive:chunk id=ui-design-000 sha256=
|
|
20
|
-
## 整体风格定义
|
|
21
|
-
|
|
22
|
-
-
|
|
19
|
+
<!-- microi-progressive:chunk id=ui-design-000 sha256=205676798890adacffba77fa7ffb48f044b5d4443f11620831f361d2edf97a81 -->
|
|
20
|
+
## 整体风格定义
|
|
21
|
+
|
|
22
|
+
- **默认基线**:优先呈现清爽、清新、易读的界面,减少重复层级、冗长说明、同义统计卡和无业务意义的装饰,把视觉重量留给真实内容与关键操作。
|
|
23
|
+
- **信息密度**:清爽不是空白越多越好;应用应以任务完成效率决定首屏密度,并通过字号、间距、对齐和语义表面建立层次。
|
|
24
|
+
- **主题适配**:所有颜色、表面、边界、阴影和交互状态必须使用语义 token,适配任意租户主题色,并同时覆盖亮色、暗色模式;不得只在默认主题下成立。
|
|
25
|
+
- **视觉验收**:至少选择浅色、暗色及一个非默认租户主题色,检查文本对比度、焦点态、状态色、悬停与禁用状态。
|
|
26
|
+
- **风格关键词**:高级、通透、科技感、品牌化、轻量精致、视觉张力。
|
|
23
27
|
- **质感**:柔和多层阴影、清晰边界、结构化光影、细腻纹理、精致微动效。
|
|
24
28
|
- **氛围**:默认亮色多彩主题(colorful + gradient + soft shadow),暗黑主题作为可选切换;避免廉价装饰,优先用布局、层级、动效和真实内容建立高级感。
|
|
25
29
|
- **参考吸收**:可参考成熟移动端 UI 灵感库的组件完整度、色彩节奏、入场动效和模板化能力,但 Microi 视觉必须通过 `--mci-*` token 与 MCI-UI 组件形成自己的品牌系统,不照搬第三方外观,也不在吾码源码、文档或样式命名中保留外部 UI 品牌痕迹。
|
|
@@ -28,8 +32,8 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
|
|
|
28
32
|
|
|
29
33
|
- 当需求只描述“高级、主流、好看”而没有明确视觉方向时,先从 Microi 内置模式中确定一种主结构:品牌叙事、真实产品流程、趋势构图、沉浸互动、动态首屏或数据工作台;再选择至多两种辅助能力。禁止把多套视觉语言堆成拼盘。
|
|
30
34
|
- 设计结果必须被拆成可执行规则:首屏目标、信息层级、栅格与最大宽度、字体层级、语义颜色、间距、圆角/阴影、组件状态、动效时间线、响应式重排、低性能降级和 `prefers-reduced-motion`。
|
|
31
|
-
- 先完成默认、加载、空、错误、成功、权限、禁用等真实业务状态,再增加装饰和动效;任何看起来可点击的元素都必须有真实结果。
|
|
32
|
-
- 所有异步内容加载统一使用贴合最终几何的主题骨架;菜单切换、首页、表格、表单/详情、弹窗和远程媒体都不得退回半透明黑色遮罩。具体实现、主题令牌与状态边界读取 [references/progressive-02-字体.md](references/progressive-02-字体.md)。
|
|
35
|
+
- 先完成默认、加载、空、错误、成功、权限、禁用等真实业务状态,再增加装饰和动效;任何看起来可点击的元素都必须有真实结果。
|
|
36
|
+
- 所有异步内容加载统一使用贴合最终几何的主题骨架;菜单切换、首页、表格、表单/详情、弹窗和远程媒体都不得退回半透明黑色遮罩。具体实现、主题令牌与状态边界读取 [references/progressive-02-字体.md](references/progressive-02-字体.md)。
|
|
33
37
|
- 所有成品只使用 Microi 自有内容、`--mci-*` token、`mci-*` 组件/类名和项目合法资产。禁止复制第三方页面、源码、图片、字体、3D 模型、商标或原始设计 token。
|
|
34
38
|
- 设计前必须读取 [references/design-pattern-library.md](references/design-pattern-library.md);涉及登录、订阅、支付、权限、搜索、设置等流程时再读 [references/product-flow-recipes.md](references/product-flow-recipes.md);涉及滚动、3D、Canvas/WebGL 或动态 Hero 时再读 [references/motion-and-media.md](references/motion-and-media.md);生成整站或交给 AI 延续设计时使用 [references/mci-design-contract.md](references/mci-design-contract.md)。
|
|
35
39
|
- 可运行原创案例位于 [assets/pattern-showcase/index.html](assets/pattern-showcase/index.html),用于理解结构和状态,不作为需要逐像素复制的模板。
|
|
@@ -184,22 +188,22 @@ Microi 项目必须支持用户或项目级形态偏好:`data-mci-shape="round
|
|
|
184
188
|
- [references/progressive-06-主题切换实现.md](references/progressive-06-主题切换实现.md):主题切换实现;命名规范
|
|
185
189
|
- [references/progressive-07-速查-从头搭建一个移动端页面.md](references/progressive-07-速查-从头搭建一个移动端页面.md):速查:从头搭建一个移动端页面;🚨 移动端低代码项目落地踩坑(必读,2026.5);🔗 关联字段:保存真实 Id,界面展示可读标签;表单布局规范(Column)
|
|
186
190
|
- [references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md](references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md):表单分组规范:Tabs vs CollapseGroup(强制);缓存刷新(解决"我改了字段但页面不变"问题);接口引擎匿名访问;MCI-UI 与第三方组件库策略;MCI-UI 源码落地位置;VitePress 中文文档布局规范
|
|
187
|
-
<!-- microi-progressive:end -->
|
|
188
|
-
|
|
189
|
-
## Microi 低代码工作台默认清爽体验(强制)
|
|
190
|
-
|
|
191
|
-
`diy-form`、`diy-table`、模块卡片、设计器弹窗和框架导航默认采用清爽、紧凑、层次明确的现代视觉;经典样式只能作为显式兼容模式保留,不能继续作为新页面或未配置页面的默认外观。
|
|
192
|
-
|
|
193
|
-
- **只升级呈现,不改变业务链路**:不得删除、合并或绕开页面 V8 按钮、行 V8 按钮、批量按钮、字段事件、表单事件、权限判断、校验、工作流与保存逻辑。按钮仍应出现在其业务语义对应的位置;只有原本属于“更多”的操作才进入更多菜单。
|
|
194
|
-
- **普通表单使用连续画布**:弹窗/页面的表单区使用柔和底色,普通字段外壳透明、无独立边框和阴影,只有输入、选择、日期、文本域等真实控件使用白色/主题高亮表面;禁止把每个字段切成一张小卡片。系统设置、控制中心等明确配置为工作台的模式可以保留分区卡片。字段间距以一屏可读更多信息为目标,布局字段、富文本、上传、地图、代码编辑器、子表等重型控件不强制固定高度。
|
|
195
|
-
- **尊重三种标签布局**:`left`、`right`、`top` 三种 `FormLabelPosition` 必须完整保留,标签宽度继续服从表单配置;移动窄屏允许回落到顶部标签,但不能破坏桌面配置语义。字段存在说明文字时,`left/right` 把灰色小字放在 Label 与控件整行下方,默认最多两行并压缩上下间距;`top` 把说明放在 Label 右侧,单行省略并通过原生 `title` 或等价可访问方式查看全文。不得再以孤立 `i` 图标和仅鼠标悬停 Tooltip 作为默认说明入口。
|
|
196
|
-
- **Label 与紧凑控件共用中心线**:左右标签布局下,普通字段 Label、输入控件、日期文字与日期前缀图标必须共用同一控件高度和垂直中心线;不得保留会把 Label 单独上抬/下压的底部外边距。多行文本、上传、子表等高控件才切换为顶部对齐。
|
|
197
|
-
- **弹窗与抽屉边界有区别**:表单对话框采用中性细边界、柔和遮罩与模糊背景,标题顶部不加装饰色线;抽屉必须贴边且无圆角,可在顶部保留克制的 2–3px 主题色识别线。两者都使用连续的柔和表单画布和紧凑操作区;设计器双击字段弹窗必须可拖动,并继续提供控件专项配置入口。
|
|
198
|
-
- **平台 Dialog 统一壳**:除 Drawer 外,框架弹层、微应用弹层、系统设置、商城、通知与业务表单默认使用 20–24px 大圆角、上下左右居中、标题栏可拖动的 Dialog;禁止页面自行恢复方角壳或顶部主题色粗线。标题栏左侧依次提供语义图标、英文眉题、大字标题和可选小字副标题;右上关闭按钮与标题区垂直居中并必须有可辨识的按钮底色。内容区使用连续、固定的柔和背景和整齐栅格;底部操作区右对齐大号关闭/保存按钮,两者都带语义图标。拖动与窗口缩放必须按弹层真实宽高重新约束,四边至少保留 8–18px 可视余量,不得把内容拖出视口。Teleport 到 `body` 的微应用弹层必须在弹层根同步 `data-mci-ui-root`、主题与必要 token,不能只依赖原祖先 CSS 变量。遮罩毛玻璃由 `sys_config.FormMaskBlur=1/true` 全局显式开启,缺失或 `0/false` 默认关闭;`prefers-reduced-motion` 只能停止动画与过渡,不得擅自反转静态毛玻璃配置。
|
|
199
|
-
- **Dialog 关闭按钮可见性**:右上关闭按钮固定使用 40×40px(移动端不低于 40px)中性灰底、细边框和 10–12px 圆角,不能只显示悬空的细线 X;亮色和暗色主题都必须保持可辨识背景。hover/focus-visible 时使用更深一级灰底、主题色图标和清晰焦点环。底部关闭/取消/保存按钮高度不低于 42px、最小宽度 96px,并保持右对齐与 12px 间距。
|
|
200
|
-
- **Tabs 统一视觉**:顶部工作区、数据列表 PageTabs、表单 Tabs 与右侧关联数据 Tabs 使用同一套清爽、独立标签视觉。横向 Tabs 禁止铺设贯穿整行的有色轨道、边框底板、下划线或其它装饰线;未选项保持透明,悬停与选中只使用克制的文字色、浅色独立表面和轻阴影。纵向 Tabs 可使用截图式中性浅色分组容器,选中项是独立浅色卡片。数字角标放在标签文本之后且不得挤压标题;过渡只用于交互,并尊重 `prefers-reduced-motion`。
|
|
201
|
-
- **表格与卡片行为完整**:桌面数据卡片采用连续白色表面、弱边界和轻阴影,操作区不得再叠加有色底板或硬分割线;表格模块门头的标题/副标题卡片与每个动态统计卡片必须彼此独立,父布局保持透明,禁止用一个大卡片或外框把标题和全部统计项包在一起。表格默认取消无意义的纵向网格,只保留浅表头与轻量横向行节奏,工具栏和分页不得层层套框。`PageBtns`、`BatchSelect`、行内/行外 V8 按钮均不可因改版丢失;需多选而当前未选中时,应先把当前记录纳入选中集再执行。
|
|
202
|
-
- **启动状态可理解、可恢复**:Vue 挂载和业务就绪是两个状态。进度到 100% 后若仍在初始化,应显示“正在连接/后端响应较慢/仍在等待”等阶段文字;明确失败时提供原因摘要与刷新重试,禁止撤掉启动层后留下空白页。
|
|
203
|
-
- **侧栏清爽但层级清晰**:压缩无效间距,保留足够点击区域、选中态、父子层级和键盘焦点;颜色、圆角、阴影必须来自主题 token。
|
|
204
|
-
- **纵向导航使用短圆角侧标**:侧栏、纵向 Tab、分组导航等选中态的左/右侧强调线统一参照平台左侧菜单:宽 3–4px、高度约为选中项的 45%–60%,垂直居中,端点使用小圆角;禁止铺满 100% 高度,也禁止做折线或包边。右侧 Tab 镜像到右边;横向 Tabs 不使用这条侧标,也不额外增加上下指示线。
|
|
205
|
-
- **主题与可访问性验收**:至少验证亮色/暗色、租户主题色、1366/1440/1920 桌面与 390px 移动宽度、三种标签对齐、慢接口和接口失败;动效必须服从 `prefers-reduced-motion`。
|
|
191
|
+
<!-- microi-progressive:end -->
|
|
192
|
+
|
|
193
|
+
## Microi 低代码工作台默认清爽体验(强制)
|
|
194
|
+
|
|
195
|
+
`diy-form`、`diy-table`、模块卡片、设计器弹窗和框架导航默认采用清爽、紧凑、层次明确的现代视觉;经典样式只能作为显式兼容模式保留,不能继续作为新页面或未配置页面的默认外观。
|
|
196
|
+
|
|
197
|
+
- **只升级呈现,不改变业务链路**:不得删除、合并或绕开页面 V8 按钮、行 V8 按钮、批量按钮、字段事件、表单事件、权限判断、校验、工作流与保存逻辑。按钮仍应出现在其业务语义对应的位置;只有原本属于“更多”的操作才进入更多菜单。
|
|
198
|
+
- **普通表单使用连续画布**:弹窗/页面的表单区使用柔和底色,普通字段外壳透明、无独立边框和阴影,只有输入、选择、日期、文本域等真实控件使用白色/主题高亮表面;禁止把每个字段切成一张小卡片。系统设置、控制中心等明确配置为工作台的模式可以保留分区卡片。字段间距以一屏可读更多信息为目标,布局字段、富文本、上传、地图、代码编辑器、子表等重型控件不强制固定高度。
|
|
199
|
+
- **尊重三种标签布局**:`left`、`right`、`top` 三种 `FormLabelPosition` 必须完整保留,标签宽度继续服从表单配置;移动窄屏允许回落到顶部标签,但不能破坏桌面配置语义。字段存在说明文字时,`left/right` 把灰色小字放在 Label 与控件整行下方,默认最多两行并压缩上下间距;`top` 把说明放在 Label 右侧,单行省略并通过原生 `title` 或等价可访问方式查看全文。不得再以孤立 `i` 图标和仅鼠标悬停 Tooltip 作为默认说明入口。
|
|
200
|
+
- **Label 与紧凑控件共用中心线**:左右标签布局下,普通字段 Label、输入控件、日期文字与日期前缀图标必须共用同一控件高度和垂直中心线;不得保留会把 Label 单独上抬/下压的底部外边距。多行文本、上传、子表等高控件才切换为顶部对齐。
|
|
201
|
+
- **弹窗与抽屉边界有区别**:表单对话框采用中性细边界、柔和遮罩与模糊背景,标题顶部不加装饰色线;抽屉必须贴边且无圆角,可在顶部保留克制的 2–3px 主题色识别线。两者都使用连续的柔和表单画布和紧凑操作区;设计器双击字段弹窗必须可拖动,并继续提供控件专项配置入口。
|
|
202
|
+
- **平台 Dialog 统一壳**:除 Drawer 外,框架弹层、微应用弹层、系统设置、商城、通知与业务表单默认使用 20–24px 大圆角、上下左右居中、标题栏可拖动的 Dialog;禁止页面自行恢复方角壳或顶部主题色粗线。标题栏左侧依次提供语义图标、英文眉题、大字标题和可选小字副标题;右上关闭按钮与标题区垂直居中并必须有可辨识的按钮底色。内容区使用连续、固定的柔和背景和整齐栅格;底部操作区右对齐大号关闭/保存按钮,两者都带语义图标。拖动与窗口缩放必须按弹层真实宽高重新约束,四边至少保留 8–18px 可视余量,不得把内容拖出视口。Teleport 到 `body` 的微应用弹层必须在弹层根同步 `data-mci-ui-root`、主题与必要 token,不能只依赖原祖先 CSS 变量。遮罩毛玻璃由 `sys_config.FormMaskBlur=1/true` 全局显式开启,缺失或 `0/false` 默认关闭;`prefers-reduced-motion` 只能停止动画与过渡,不得擅自反转静态毛玻璃配置。
|
|
203
|
+
- **Dialog 关闭按钮可见性**:右上关闭按钮固定使用 40×40px(移动端不低于 40px)中性灰底、细边框和 10–12px 圆角,不能只显示悬空的细线 X;亮色和暗色主题都必须保持可辨识背景。hover/focus-visible 时使用更深一级灰底、主题色图标和清晰焦点环。底部关闭/取消/保存按钮高度不低于 42px、最小宽度 96px,并保持右对齐与 12px 间距。
|
|
204
|
+
- **Tabs 统一视觉**:顶部工作区、数据列表 PageTabs、表单 Tabs 与右侧关联数据 Tabs 使用同一套清爽、独立标签视觉。横向 Tabs 禁止铺设贯穿整行的有色轨道、边框底板、下划线或其它装饰线;未选项保持透明,悬停与选中只使用克制的文字色、浅色独立表面和轻阴影。纵向 Tabs 可使用截图式中性浅色分组容器,选中项是独立浅色卡片。数字角标放在标签文本之后且不得挤压标题;过渡只用于交互,并尊重 `prefers-reduced-motion`。
|
|
205
|
+
- **表格与卡片行为完整**:桌面数据卡片采用连续白色表面、弱边界和轻阴影,操作区不得再叠加有色底板或硬分割线;表格模块门头的标题/副标题卡片与每个动态统计卡片必须彼此独立,父布局保持透明,禁止用一个大卡片或外框把标题和全部统计项包在一起。表格默认取消无意义的纵向网格,只保留浅表头与轻量横向行节奏,工具栏和分页不得层层套框。`PageBtns`、`BatchSelect`、行内/行外 V8 按钮均不可因改版丢失;需多选而当前未选中时,应先把当前记录纳入选中集再执行。
|
|
206
|
+
- **启动状态可理解、可恢复**:Vue 挂载和业务就绪是两个状态。进度到 100% 后若仍在初始化,应显示“正在连接/后端响应较慢/仍在等待”等阶段文字;明确失败时提供原因摘要与刷新重试,禁止撤掉启动层后留下空白页。
|
|
207
|
+
- **侧栏清爽但层级清晰**:压缩无效间距,保留足够点击区域、选中态、父子层级和键盘焦点;颜色、圆角、阴影必须来自主题 token。
|
|
208
|
+
- **纵向导航使用短圆角侧标**:侧栏、纵向 Tab、分组导航等选中态的左/右侧强调线统一参照平台左侧菜单:宽 3–4px、高度约为选中项的 45%–60%,垂直居中,端点使用小圆角;禁止铺满 100% 高度,也禁止做折线或包边。右侧 Tab 镜像到右边;横向 Tabs 不使用这条侧标,也不额外增加上下指示线。
|
|
209
|
+
- **主题与可访问性验收**:至少验证亮色/暗色、租户主题色、1366/1440/1920 桌面与 390px 移动宽度、三种标签对齐、慢接口和接口失败;动效必须服从 `prefers-reduced-motion`。
|
|
@@ -10,7 +10,7 @@ description: Microi V8 CRUD 接口引擎开发。用于编写服务端 JavaScrip
|
|
|
10
10
|
你正在开发 Microi 吾码平台的 V8 接口引擎。接口引擎是运行在服务端的 JavaScript 函数,通过 `V8.FormEngine` 操作数据库,通过 `V8.Result` 或 `return` 返回结果。
|
|
11
11
|
|
|
12
12
|
<!-- microi-progressive:begin -->
|
|
13
|
-
<!-- microi-progressive:chunk id=v8-crud-api-000 sha256=
|
|
13
|
+
<!-- microi-progressive:chunk id=v8-crud-api-000 sha256=6b43119f4eae78fb6b185d48c5c289878ba86093ae62ce44ad0bdaa48093f605 -->
|
|
14
14
|
## 本地优先与版本头(必做)
|
|
15
15
|
|
|
16
16
|
AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目>/接口引擎/.../*.js` 本地文件,再通过 MCP 或 VS Code 插件同步到数据库。插件提示“本地和远端不一致”时,必须先读取本地与远端代码并合并有效差异,不能盲目用任一侧覆盖另一侧。
|
|
@@ -33,7 +33,7 @@ AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目
|
|
|
33
33
|
|
|
34
34
|
Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`,让 `Program.cs` 读取 `Microi.Server/Microi.net.Api/.microi-local` 并加载对应的 `appsettings.{Env}.json`。
|
|
35
35
|
|
|
36
|
-
版本与历史同步规则:通过 MCP 或 VS Code 插件保存接口引擎时,必须同步写入 `sys_apiengine.Version
|
|
36
|
+
版本与历史同步规则:通过 MCP 或 VS Code 插件保存接口引擎时,必须同步写入 `sys_apiengine.Version`;新版平台把每次修改说明作为独立记录写入 `mci_apiengine_change_history`,表单中的“修改历史”使用 `TableChild` 展示,不再让客户端拼接或覆盖 `sys_apiengine.ChangeHistory` 多行文本。写入必须携带版本号与简明说明,并使用幂等 `EntryKey` 防止网络重试产生重复记录。安装/升级表单引擎官方应用时,旧 `ChangeHistory` 按非空行迁入子表并保留旧物理列作滚动兼容;尚未安装该子表、旧库缺字段或迁移期间,后端应自动回退旧字段或仅更新 `ApiV8Code` 与 `UpdateTime`,不得因此阻断代码同步。
|
|
37
37
|
|
|
38
38
|
生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
39
|
|
|
@@ -89,7 +89,9 @@ return {
|
|
|
89
89
|
`HasMore + Checkpoint` 续跑,不要只提高单次超时或内存。
|
|
90
90
|
- 接口引擎的正向开关是 `sys_apiengine.V8Limit`:默认关闭时
|
|
91
91
|
`V8.Limits.UnlimitedRuntime=true`,打开后才应用超时、语句、函数递归、
|
|
92
|
-
累计分配和 Promise
|
|
92
|
+
累计分配和 Promise 等待限制。表后端事件同样使用正向 `diy_table.V8Limit`:
|
|
93
|
+
缺失、`null`、`0/false` 不设置单次预算,只有 `1/true` 才启用限制;旧
|
|
94
|
+
`V8Unlimited` 仅在新字段不存在时反向兼容。
|
|
93
95
|
常驻内存保护、外部取消、并发、接口嵌套深度、权限沙箱与数据库限制始终
|
|
94
96
|
生效;两类开关都只能来自持久化可信元数据,不能从请求参数启用。
|
|
95
97
|
- 服务端另有一个内置受信任特例:主租户中由持久队列恢复的
|
|
@@ -74,9 +74,10 @@ return {
|
|
|
74
74
|
|
|
75
75
|
- 列表页固定顺序为“模块 Hero(标题/副标题/动态指标)→ PageTabs → 查询与表格”;PageTabs 不能渲染到 Hero 上方,也不能重复承担模块标题。
|
|
76
76
|
- `TargetSysMenuId` 为空时,页签仍在当前模块执行 `V8Code` 和重新查询。
|
|
77
|
-
- `TargetSysMenuId`
|
|
77
|
+
- `TargetSysMenuId` 指向其它模块时,点击会在当前 `diy-table` 实例内加载目标模块自己的表单引擎、字段、查询接口替换、按钮和分页配置;入口路由、面包屑、顶部访问标签和宿主 Hero 不变,URL 只更新 `Tab` 查询参数。
|
|
78
78
|
- 目标模块可以设置 `Display=0、AppDisplay=0` 隐藏左侧菜单,但必须给使用角色分配菜单权限,否则动态路由中找不到目标模块。
|
|
79
|
-
-
|
|
79
|
+
- 一组 PageTabs 只保存在入口模块;隐藏目标模块设置 `ParentId=入口菜单Id、HasChild=0、PageTabs=[]`,不得复制同一套 PageTabs。入口菜单保持 `HasChild=0`,仍然直接打开业务页面。
|
|
80
|
+
- 模块设计器的 PageTabs 必须显示【关联模块】可搜索菜单树,展示模块名称并保存 `TargetSysMenuId`,不能让该协议只能手工改 JSON。
|
|
80
81
|
- 禁止在 `diy-table` 或 mixin 中按模块名、Url、表名写死页签数据源。
|
|
81
82
|
|
|
82
83
|
### V8CodeShow(显隐控制)—— 支持 `return` 和 `V8.Result`
|
|
@@ -1,66 +1,66 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: v8-security
|
|
3
|
-
description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆业务秘密、Passkey/TOTP/人脸步进验证、接口引擎安全、密钥管理、SQL 注入、匿名端点、文件上传和租户隔离。
|
|
3
|
+
description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆业务秘密、Passkey/TOTP/人脸步进验证、接口引擎安全、密钥管理、SQL 注入、匿名端点、文件上传和租户隔离。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
7
|
|
|
8
|
-
# Microi V8 安全最佳实践
|
|
9
|
-
|
|
10
|
-
你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
|
|
11
|
-
|
|
12
|
-
访问密钥由 `microi_list_my_access_keys`、`microi_create_my_access_key`、`microi_revoke_my_access_key` 管理,只允许当前用户、限期、最小 scope,明文仅创建时返回一次。外部身份回调固定为 `/api/ExternalLogin/Callback`,服务端校验租户、Provider、state、redirect 和回调域名,验证成功后仍签发 DiyToken。
|
|
8
|
+
# Microi V8 安全最佳实践
|
|
9
|
+
|
|
10
|
+
你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
|
|
11
|
+
|
|
12
|
+
访问密钥由 `microi_list_my_access_keys`、`microi_create_my_access_key`、`microi_revoke_my_access_key` 管理,只允许当前用户、限期、最小 scope,明文仅创建时返回一次。外部身份回调固定为 `/api/ExternalLogin/Callback`,服务端校验租户、Provider、state、redirect 和回调域名,验证成功后仍签发 DiyToken。
|
|
13
13
|
|
|
14
14
|
<!-- microi-progressive:begin -->
|
|
15
15
|
<!-- microi-progressive:chunk id=v8-security-000 sha256=0346bd9ca3fe98dd2b589d1777aa1e55cd24cf7dedc69ee65d4ca91461db7dee -->
|
|
16
|
-
## 0. 租户动态系统设置与密钥边界
|
|
17
|
-
|
|
18
|
-
第三方密钥(微信、支付宝、OpenAI、阿里云、ERP、SMTP)**禁止**硬编码在 V8 代码或前端。公开的租户配置必须建成当前租户 `sys_config` 的实体字段;敏感或仅供后端使用的租户业务配置保存到 `mci_system_setting`。数据库、Redis、MongoDB、MinIO、MQ 等部署控制面仍由主库 `sys_osclients` 托管,子租户不能修改。
|
|
16
|
+
## 0. 租户动态系统设置与密钥边界
|
|
17
|
+
|
|
18
|
+
第三方密钥(微信、支付宝、OpenAI、阿里云、ERP、SMTP)**禁止**硬编码在 V8 代码或前端。公开的租户配置必须建成当前租户 `sys_config` 的实体字段;敏感或仅供后端使用的租户业务配置保存到 `mci_system_setting`。数据库、Redis、MongoDB、MinIO、MQ 等部署控制面仍由主库 `sys_osclients` 托管,子租户不能修改。
|
|
19
19
|
|
|
20
20
|
```javascript
|
|
21
|
-
// ✅ 浏览器/前端 V8 只读取 sys_config 的浏览器安全投影
|
|
22
|
-
var sysTitle = V8.SysConfig.SysTitle;
|
|
23
|
-
var githubVisible = V8.SysConfig.DisableLoginGitHub !== 1;
|
|
24
|
-
|
|
25
|
-
// ✅ 后端接口引擎/后端 V8 事件从独立节点读取私密设置
|
|
26
|
-
var privateSettings = V8.SysConfig.ServerPrivateSettings || {};
|
|
27
|
-
var clientSecret = privateSettings['Login.Gitee.ClientSecret'];
|
|
28
|
-
// 只能在后端使用,禁止 return、日志、审计或写入前端可读数据。
|
|
21
|
+
// ✅ 浏览器/前端 V8 只读取 sys_config 的浏览器安全投影
|
|
22
|
+
var sysTitle = V8.SysConfig.SysTitle;
|
|
23
|
+
var githubVisible = V8.SysConfig.DisableLoginGitHub !== 1;
|
|
24
|
+
|
|
25
|
+
// ✅ 后端接口引擎/后端 V8 事件从独立节点读取私密设置
|
|
26
|
+
var privateSettings = V8.SysConfig.ServerPrivateSettings || {};
|
|
27
|
+
var clientSecret = privateSettings['Login.Gitee.ClientSecret'];
|
|
28
|
+
// 只能在后端使用,禁止 return、日志、审计或写入前端可读数据。
|
|
29
29
|
|
|
30
30
|
// ❌ 危险:密钥泄漏 / 跨租户串号
|
|
31
31
|
var openaiKey = 'sk-xxxxxxxxxx';
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
`V8.OsClientModel` 与兼容别名 `V8.ClientModel` 均为独立脱敏副本:数据库连接、AuthSecret、Redis、对象存储、MQ、MQTT、Search 的地址与凭据不会注入脚本。存量租户业务字段只作兼容,新增 Secret 不得继续依赖 `V8.OsClientModel`。
|
|
35
|
-
|
|
36
|
-
`V8.SysConfig` 按运行端采用不同权限投影,且任何运行端都不存在 `PublicSettings` 属性。浏览器/前端 V8 只得到匿名 `GetSysConfig` 的独立脱敏 `sys_config` 投影;`mci_system_setting` 的任何记录都不会进入浏览器。后端接口引擎和后端 V8 事件得到当前租户完整、独立的 `sys_config`,全部启用的 `mci_system_setting` 则放在 `V8.SysConfig.ServerPrivateSettings`,Secret 由可信后端按租户解密。独立节点避免动态 Key 覆盖 `sys_config` 实体字段,也让前后端边界可审计。子租户调用 `V8.FormEngine.GetSysConfig(...)` 时仍强制使用当前 `OsClient`,不能借缓存命中读取其它租户配置。
|
|
37
|
-
|
|
38
|
-
Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30 秒清除,审计不含原文。前端 V8、普通 FormEngine HTTP、匿名请求和访问密钥会话不得读取 `SecretCipher`、`ServerPrivateSettings` 或 Secret 原文;后端 V8 只能通过当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用已解密值,不获得通用解密器,也不得返回或记录原文。
|
|
39
|
-
|
|
40
|
-
共享基础设施只能通过受控能力访问:`V8.Cache` 自动绑定 `Microi:{OsClient}:*`,文件路径绑定 `/{OsClient}/...`,RabbitMQ 队列绑定 `microi.{OsClient}.*`,MQTT Topic 绑定 `tenant/{OsClient}/...`,Search 索引绑定 `{OsClient}_*`。V8 不得获得 Redis `IDatabase`、HDFS `ClientModel` 或原始基础设施配置。
|
|
41
|
-
|
|
42
|
-
子租户缺少 RabbitMQ/MQTT/Search 独立凭据时必须失败关闭,禁止回退主租户账号。新租户开通只有在外部 broker/search 中真实创建 user、vhost、ACL 或 API Key 后,才能标记对应服务可用。
|
|
43
|
-
|
|
44
|
-
登录和管理端必须强制 HTTPS。登录 RSA 只用于避免密码在请求体、代理调试界面中直接显示,不能替代 HTTPS,也不能作为身份认证或密码存储密钥。平台为兼容已发布客户、旧前端和浏览器缓存,保留历史登录 RSA 密钥对作为缺省回退;安全修复不得直接删除该回退并造成全量客户无法登录。需要部署专属密钥时,在主租户 SaaS 引擎【后端运行配置】中成对维护 `BackendLoginRsaPrivateKey` 与 `BackendLoginRsaPublicKey`;私钥只允许可信服务端读取,匿名 `GetSysConfig` 只返回匹配公钥。源码、环境变量、普通 V8、前端业务代码和日志中仍禁止新增或输出真正的业务私钥、JWT 密钥、支付密钥及对象存储凭据。
|
|
45
|
-
|
|
46
|
-
微信内容安全回调固定使用 `/api/wechatcontentsecurity/callback` 或第三方不支持 QueryString 时以 `/api/wechatcontentsecurity/callback--osclient--` 为路径前缀并追加 `{OsClient}--`;回调只能由服务端按签名和租户规则建立信任。
|
|
47
|
-
|
|
48
|
-
吾码现有多端兼容约定是:主 SaaS 引擎 `sys_osclients.CorsAllowOrigins` 为空时默认允许全部跨域,便于本地开发、独立前端、H5 和不同租户域名访问;配置了来源后才按精确来源或通配符限制。安全修复不得把“未配置”改成默认拒绝,否则会造成所有存量部署和本地调试突然失效。CORS 不是鉴权边界,权限仍必须依赖 Token、租户隔离、菜单/表权限和服务端数据范围。
|
|
49
|
-
|
|
50
|
-
吾码既有客户大量通过 `V8.Http` 访问内网设备、InfluxDB、内部 ApiEngine 和本机 sidecar。严格 SSRF 防护必须默认关闭:未配置时不得限制协议、URL 内嵌凭据、回环、私网、链路本地、云元数据或重定向。只有客户在 SaaS 引擎主租户启用 `SsrfProtectionEnabled` 后才进入严格模式,并用精确 `SsrfAllowedHosts` 放行;不要为这类普通运行参数增加 API 容器环境变量。
|
|
51
|
-
|
|
52
|
-
外部数据库与附件迁移属于更高风险的控制面操作:
|
|
53
|
-
|
|
54
|
-
- `microi_database` 只允许 `Level >= 9999` 的可信管理链路维护;连接字符串、密码和鉴权 Header 不得出现在日志、接口返回、前端或审计详情。
|
|
55
|
-
- MCP 临时连接和保存连接只接受平台认证数据库类型;保存前测试写连接和独立读连接,写入必须显式确认,返回只包含 DbKey、类型和回读状态。
|
|
56
|
-
- `microi_query_external_database` 是默认只读入口;`microi_execute_external_database` 是独立超级管理员入口,后端必须从当前 Token 硬校验 `Level >= 9999`。显式确认后不限制 SQL 类型,可执行数据库账号有权执行的 DML、DDL、存储过程、文件能力和多语句;审计仅保留 SQL 哈希、长度、模式和结果。
|
|
57
|
-
- `V8.Dbs.Open` 只能在可信后端代码中使用,连接串来自服务端密钥或管理员配置;禁止把 `V8.Param`、Header 或匿名请求里的连接串直接传入。
|
|
58
|
-
- `microi_import_external_attachment` 仅对后端确认的 `Level >= 9999` 当前用户开放,可访问 HTTP/HTTPS、私网、本机绝对路径和 UNC;不设固定 MCP 大小上限并采用流式迁移。源 URL、鉴权 Header、本机/UNC 路径只以哈希进入审计,能力仍受 API 服务账号和目标基础设施授权约束。
|
|
59
|
-
- 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
|
|
60
|
-
|
|
34
|
+
`V8.OsClientModel` 与兼容别名 `V8.ClientModel` 均为独立脱敏副本:数据库连接、AuthSecret、Redis、对象存储、MQ、MQTT、Search 的地址与凭据不会注入脚本。存量租户业务字段只作兼容,新增 Secret 不得继续依赖 `V8.OsClientModel`。
|
|
35
|
+
|
|
36
|
+
`V8.SysConfig` 按运行端采用不同权限投影,且任何运行端都不存在 `PublicSettings` 属性。浏览器/前端 V8 只得到匿名 `GetSysConfig` 的独立脱敏 `sys_config` 投影;`mci_system_setting` 的任何记录都不会进入浏览器。后端接口引擎和后端 V8 事件得到当前租户完整、独立的 `sys_config`,全部启用的 `mci_system_setting` 则放在 `V8.SysConfig.ServerPrivateSettings`,Secret 由可信后端按租户解密。独立节点避免动态 Key 覆盖 `sys_config` 实体字段,也让前后端边界可审计。子租户调用 `V8.FormEngine.GetSysConfig(...)` 时仍强制使用当前 `OsClient`,不能借缓存命中读取其它租户配置。
|
|
37
|
+
|
|
38
|
+
Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30 秒清除,审计不含原文。前端 V8、普通 FormEngine HTTP、匿名请求和访问密钥会话不得读取 `SecretCipher`、`ServerPrivateSettings` 或 Secret 原文;后端 V8 只能通过当前租户 `V8.SysConfig.ServerPrivateSettings[ConfigKey]` 使用已解密值,不获得通用解密器,也不得返回或记录原文。
|
|
39
|
+
|
|
40
|
+
共享基础设施只能通过受控能力访问:`V8.Cache` 自动绑定 `Microi:{OsClient}:*`,文件路径绑定 `/{OsClient}/...`,RabbitMQ 队列绑定 `microi.{OsClient}.*`,MQTT Topic 绑定 `tenant/{OsClient}/...`,Search 索引绑定 `{OsClient}_*`。V8 不得获得 Redis `IDatabase`、HDFS `ClientModel` 或原始基础设施配置。
|
|
41
|
+
|
|
42
|
+
子租户缺少 RabbitMQ/MQTT/Search 独立凭据时必须失败关闭,禁止回退主租户账号。新租户开通只有在外部 broker/search 中真实创建 user、vhost、ACL 或 API Key 后,才能标记对应服务可用。
|
|
43
|
+
|
|
44
|
+
登录和管理端必须强制 HTTPS。登录 RSA 只用于避免密码在请求体、代理调试界面中直接显示,不能替代 HTTPS,也不能作为身份认证或密码存储密钥。平台为兼容已发布客户、旧前端和浏览器缓存,保留历史登录 RSA 密钥对作为缺省回退;安全修复不得直接删除该回退并造成全量客户无法登录。需要部署专属密钥时,在主租户 SaaS 引擎【后端运行配置】中成对维护 `BackendLoginRsaPrivateKey` 与 `BackendLoginRsaPublicKey`;私钥只允许可信服务端读取,匿名 `GetSysConfig` 只返回匹配公钥。源码、环境变量、普通 V8、前端业务代码和日志中仍禁止新增或输出真正的业务私钥、JWT 密钥、支付密钥及对象存储凭据。
|
|
45
|
+
|
|
46
|
+
微信内容安全回调固定使用 `/api/wechatcontentsecurity/callback` 或第三方不支持 QueryString 时以 `/api/wechatcontentsecurity/callback--osclient--` 为路径前缀并追加 `{OsClient}--`;回调只能由服务端按签名和租户规则建立信任。
|
|
47
|
+
|
|
48
|
+
吾码现有多端兼容约定是:主 SaaS 引擎 `sys_osclients.CorsAllowOrigins` 为空时默认允许全部跨域,便于本地开发、独立前端、H5 和不同租户域名访问;配置了来源后才按精确来源或通配符限制。安全修复不得把“未配置”改成默认拒绝,否则会造成所有存量部署和本地调试突然失效。CORS 不是鉴权边界,权限仍必须依赖 Token、租户隔离、菜单/表权限和服务端数据范围。
|
|
49
|
+
|
|
50
|
+
吾码既有客户大量通过 `V8.Http` 访问内网设备、InfluxDB、内部 ApiEngine 和本机 sidecar。严格 SSRF 防护必须默认关闭:未配置时不得限制协议、URL 内嵌凭据、回环、私网、链路本地、云元数据或重定向。只有客户在 SaaS 引擎主租户启用 `SsrfProtectionEnabled` 后才进入严格模式,并用精确 `SsrfAllowedHosts` 放行;不要为这类普通运行参数增加 API 容器环境变量。
|
|
51
|
+
|
|
52
|
+
外部数据库与附件迁移属于更高风险的控制面操作:
|
|
53
|
+
|
|
54
|
+
- `microi_database` 只允许 `Level >= 9999` 的可信管理链路维护;连接字符串、密码和鉴权 Header 不得出现在日志、接口返回、前端或审计详情。
|
|
55
|
+
- MCP 临时连接和保存连接只接受平台认证数据库类型;保存前测试写连接和独立读连接,写入必须显式确认,返回只包含 DbKey、类型和回读状态。
|
|
56
|
+
- `microi_query_external_database` 是默认只读入口;`microi_execute_external_database` 是独立超级管理员入口,后端必须从当前 Token 硬校验 `Level >= 9999`。显式确认后不限制 SQL 类型,可执行数据库账号有权执行的 DML、DDL、存储过程、文件能力和多语句;审计仅保留 SQL 哈希、长度、模式和结果。
|
|
57
|
+
- `V8.Dbs.Open` 只能在可信后端代码中使用,连接串来自服务端密钥或管理员配置;禁止把 `V8.Param`、Header 或匿名请求里的连接串直接传入。
|
|
58
|
+
- `microi_import_external_attachment` 仅对后端确认的 `Level >= 9999` 当前用户开放,可访问 HTTP/HTTPS、私网、本机绝对路径和 UNC;不设固定 MCP 大小上限并采用流式迁移。源 URL、鉴权 Header、本机/UNC 路径只以哈希进入审计,能力仍受 API 服务账号和目标基础设施授权约束。
|
|
59
|
+
- 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
|
|
60
|
+
|
|
61
61
|
<!-- /microi-progressive:chunk -->
|
|
62
62
|
<!-- microi-progressive:chunk id=v8-security-001 sha256=c5868fd8a159b72f1038658873dfee83a9eca68661eebd837ecadab13dea5c22 -->
|
|
63
|
-
## 0.5 接口引擎配置安全
|
|
63
|
+
## 0.5 接口引擎配置安全
|
|
64
64
|
|
|
65
65
|
代码以外,接口本身的配置项也是安全防线(详见 `v8-api-config/SKILL.md`):
|
|
66
66
|
|
|
@@ -85,10 +85,10 @@ V8.FormEngine.GetTableData('SysUser', {
|
|
|
85
85
|
_PageSize: 20
|
|
86
86
|
});
|
|
87
87
|
|
|
88
|
-
// ✅ 必须原生 SQL 时:FromSql 只传 SQL,参数用 AddInParameter
|
|
89
|
-
V8.Db.FromSql('SELECT * FROM SysUser WHERE Account = @p0')
|
|
90
|
-
.AddInParameter("@p0", V8.Param.account)
|
|
91
|
-
.ToArray();
|
|
88
|
+
// ✅ 必须原生 SQL 时:FromSql 只传 SQL,参数用 AddInParameter
|
|
89
|
+
V8.Db.FromSql('SELECT * FROM SysUser WHERE Account = @p0')
|
|
90
|
+
.AddInParameter("@p0", V8.Param.account)
|
|
91
|
+
.ToArray();
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
### 禁止:字符串拼接
|
|
@@ -146,26 +146,26 @@ if (isNaN(amount) || amount <= 0 || amount > 999999.99) {
|
|
|
146
146
|
|
|
147
147
|
<!-- /microi-progressive:chunk -->
|
|
148
148
|
<!-- microi-progressive:chunk id=v8-security-004 sha256=e811dff8614c24c751291dda271b1574debccf741c0e166790f5324a3d3594ad -->
|
|
149
|
-
## 4. 防 XSS
|
|
150
|
-
|
|
151
|
-
四个字符替换不是通用 XSS 防护。必须按输出上下文处理:
|
|
152
|
-
|
|
153
|
-
- 纯文本保存原始业务值,渲染时使用 Vue 文本绑定/`textContent`,不要用 `v-html`;
|
|
154
|
-
- URL 只允许明确协议和域名,并通过 URL 解析器校验;
|
|
155
|
-
- 富文本使用平台统一 allowlist 清洗器,移除 `script`、事件属性、危险协议、`iframe/object` 等;
|
|
156
|
-
- V8 模板经 `v-safe-html` / DOMPurify 清洗,内联 `onclick` 等事件会被移除;交互使用平台按钮/V8 事件,不拼接可执行 HTML;
|
|
157
|
-
- CSV、Excel、邮件和日志还要分别处理公式注入、HTML 邮件和日志换行注入。
|
|
158
|
-
|
|
159
|
-
```javascript
|
|
160
|
-
var content = String(V8.Param.content || '');
|
|
161
|
-
if (content.length > 5000) {
|
|
162
|
-
return { Code: 0, Msg: '内容过长' };
|
|
163
|
-
}
|
|
164
|
-
V8.FormEngine.AddFormData('Comment', {
|
|
165
|
-
Content: content,
|
|
166
|
-
UserId: V8.CurrentUser.Id
|
|
167
|
-
});
|
|
168
|
-
```
|
|
149
|
+
## 4. 防 XSS
|
|
150
|
+
|
|
151
|
+
四个字符替换不是通用 XSS 防护。必须按输出上下文处理:
|
|
152
|
+
|
|
153
|
+
- 纯文本保存原始业务值,渲染时使用 Vue 文本绑定/`textContent`,不要用 `v-html`;
|
|
154
|
+
- URL 只允许明确协议和域名,并通过 URL 解析器校验;
|
|
155
|
+
- 富文本使用平台统一 allowlist 清洗器,移除 `script`、事件属性、危险协议、`iframe/object` 等;
|
|
156
|
+
- V8 模板经 `v-safe-html` / DOMPurify 清洗,内联 `onclick` 等事件会被移除;交互使用平台按钮/V8 事件,不拼接可执行 HTML;
|
|
157
|
+
- CSV、Excel、邮件和日志还要分别处理公式注入、HTML 邮件和日志换行注入。
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
var content = String(V8.Param.content || '');
|
|
161
|
+
if (content.length > 5000) {
|
|
162
|
+
return { Code: 0, Msg: '内容过长' };
|
|
163
|
+
}
|
|
164
|
+
V8.FormEngine.AddFormData('Comment', {
|
|
165
|
+
Content: content,
|
|
166
|
+
UserId: V8.CurrentUser.Id
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
169
|
|
|
170
170
|
<!-- /microi-progressive:chunk -->
|
|
171
171
|
## 详细参考路由(渐进披露)
|
|
@@ -58,7 +58,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
58
58
|
- 传入 `_InvokeType: 'Client'` → **触发**表单 V8 事件
|
|
59
59
|
- Postman 等直接调用接口 → 前端事件**不执行**,后端事件**仍执行**
|
|
60
60
|
- 服务器端提交前/后 V8 事件在**同一事务**中执行
|
|
61
|
-
- `diy_table.
|
|
61
|
+
- `diy_table.V8Limit` 是表后端提交前、提交后和数据处理 V8 的正向开关:缺失、`null`、`0/false` 均不设置 Jint 单次超时、语句、函数递归和累计分配预算,只有 `1/true` 才启用这些限制。旧 `V8Unlimited` 仅在新字段不存在时反向推断,新的 MCP、Manifest 和应用资源只写 `V8Limit`。进程常驻内存、取消、并发、接口嵌套深度、权限和数据库保护始终生效。
|
|
62
62
|
|
|
63
63
|
<!-- /microi-progressive:chunk -->
|
|
64
64
|
<!-- microi-progressive:chunk id=v8-table-event-003 sha256=65a1e728982d4e534d06dc2440eac111fe53a08f0a3012c6a9f8b1de45b4b81f -->
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
- `_InvokeType:'Server'` 只表达事件调用语义,不是客户端授权开关;浏览器伪造它不会获得受信任权限
|
|
36
36
|
- `V8.FormSubmitAction` 的值是 `'Insert'`/`'Update'`/`'Delete'`(非 Add/Upt/Del)
|
|
37
37
|
- 在 DataFilterV8 中使用 `V8.CacheData` 缓存查询结果,避免每行执行 N+1 查询
|
|
38
|
-
-
|
|
38
|
+
- 表事件调用下游接口时,表级正向 `diy_table.V8Limit` 不会改变下游接口;下游接口独立读取正向 `sys_apiengine.V8Limit`(两者均默认 0 表示不限 Jint 单次预算,1 表示启用限制)
|
|
39
39
|
|
|
40
40
|
### 复盘:提交后事件误把增量表单当作完整记录
|
|
41
41
|
|