🏪 应用商城
平台从 v4.7.2 开始自动安装应用商城模块,用户可通过应用商城安装和管理各种应用
数据来源
AI 应用与应用商城已经统一为一个系统,sys_microistore 是唯一应用主表。商城入口保留三个业务页签:
| 页签 | 数据来源 |
|---|---|
| AI 应用 | 使用模块引擎配置的 SelectApi 读取统一商城源,包含平台应用、Web、UniApp、微服务以及官方/社区来源。 |
| 我发布的应用 | 切换到隐藏模块【我发布的应用】,由该模块绑定当前租户 sys_microistore,不配置 SelectApi。 |
| 我安装的应用 | 切换到隐藏模块【我安装的应用】,由该模块绑定当前租户 sys_microistoreversion,不配置 SelectApi。 |
三个页签不是前端写死的数据源分支,而是三个真实模块引擎通过【页面多Tab → 关联模块】组成:主模块负责统一商城数据,两个隐藏模块分别负责当前租户的发布记录和安装记录。主模块不再拆分“官方应用、社区应用”,而是在同一 AI 应用列表中通过 ApplicationType、Category、PublisherType 和关键词进行复选筛选。
统一字段约定:
| 字段 | 说明 |
|---|---|
ApplicationType | 运行形态:Regular / Platform / Web / UniApp / MicroService。Regular 是普通平台离线包的新建默认值;商城中的既有平台应用、平台应用通知和旧包仍使用 Platform,两者都必须兼容,不能在未迁移数据和调用方前强制改单值。 |
AppType | 历史兼容字段,旧数据/接口曾同时把它用于“官方/社区来源”和运行形态。新代码不得以它作为唯一判断依据;读取旧包时可回退,写入新数据使用 ApplicationType + PublisherType。 |
Category | 游戏、企业应用、办公、教育、行业应用、平台能力等。 |
PublisherType | 发布者身份/展示来源:官方应用、社区应用。新代码的官方/社区筛选以此字段为准。 |
ViewCount | 官网或商城打开应用时累计浏览次数。 |
InstallCount | 每次安装、更新或重新安装成功后累计一次;后台任务重试仍使用同一个 OperationId,不会重复累计。 |
因此本地数据始终走当前 ApiBase + OsClient + Token,不会发送到官网;以后其它业务遇到“不同 Tab 使用不同表单引擎和模块引擎”时,也直接配置 TargetSysMenuId,不需要修改 diy-table 的数据加载代码。
安装、升级与安全
- 应用商城定义、私有源码、安装、升级和卸载属于控制面,只允许
Level >= 9999。 - 官方平台身份不能只看租户名。只有
OsClient=iTdos且当前服务节点持有与平台内嵌官方公钥匹配的 License 私钥时,V8.SysConfig.IsOfficialPlatform才为true。官方环境会隐藏【安装】【更新】【重新安装】【安装离线包】【全部安装/更新】,服务端也会拒绝对应安装接口;普通部署即使把租户命名为iTdos也不会被误判。 - 离线包必须校验 Manifest、平台最低版本、依赖、文件哈希和资源清单;包内不能携带源租户
OsClient、数据库、Redis、对象存储、MQ/MQTT、AI 或第三方密钥。 - 安装使用后台任务和稳定
OperationId,阶段进度/checkpoint 写共享存储。安装成功后先写商城安装事件,再与InstallCount + 1同事务提交;同一操作的重试只回读已有事件。两个节点重复领取时,由幂等键与数据库唯一/条件更新保证副作用一次。 - 非官方环境的页面按钮【全部安装/更新】固定只规划
ApplicationType=Platform的官方平台应用,并只处理Uninstalled和Outdated两类状态;UniApp、Web、MicroService 及其它社区/AI 应用仍由用户逐个选择,已是最新版的Installed不会重新安装。计划、当前应用和子安装 checkpoint 保存在共享数据库的后台任务CheckpointJson,不要求租户额外创建批量计划表;右上角后台任务中心显示总量、当前项和整体进度,节点重启或租约转移后继续执行。 - MySQL 历史宽表接近 65,535 字节行内上限时,导入器只对明确触发行宽错误且不参与索引的
varchar配置列改用mediumtext行外存储,并把类型覆盖写入后台任务 checkpoint,节点切换后继续沿用;索引字段或其它 DDL 错误不会被自动吞掉。应用包中的长连接串、密钥、回调地址、域名清单等配置字段应直接声明为mediumtext,避免依赖运行时回退。 - 批量任务以单个应用作为外层事务和恢复边界。规模可控的小型官方包一次完成,避免每 8 个字段反复下载同一包并重新排队;超过字段、表、DDL、流程、随包数据或资产安全阈值的大包仍使用内部安全分片,因此不会为了提速牺牲大包的内存保护和断点恢复。
- 批量引擎只接受平台持久化任务 Worker 注入的可信调用标记,并同时核对任务 Id、任务信封与正数 fencing token。HTTP 控制器会主动剥离该标记,因此即使为兼容旧服务节点将引擎配置为
StopHttp=0,浏览器或外部请求也只能得到“必须通过持久化后台任务执行”,不能绕过后台任务直接安装。 - 商城页面按钮及其调用的接口引擎、权限和数据结构必须由同一版本应用包交付。导入器会在接口引擎新增/更新后清除缓存并回读 Key、启用状态、HTTP 状态和完整源码;任一项失败时整次安装回滚,不会留下“按钮可见但接口不存在”的半安装状态。
- 已有资源使用存在性检查与差异合并;客户自定义 V8、全局配置和非包拥有字段不得被整表覆盖。
- 更新遵守“先扩展、后迁移、再收缩”,新旧节点滚动期间 API、数据库和缓存合约兼容。
- 安装成功后回读表、字段、接口引擎、菜单、权限、页面、工作流和版本,并执行真实 HTTP/UI 冒烟。
复杂安装交互使用 V8.OpenAppDialog;后台安装调用 V8.ApiEngine.RunBackground。不要在 ConfirmTips 中拼接上传控件和大段内联 HTML/事件。
完整规范见源码 microi.skills/app-store/SKILL.md 与平台安全与兼容基线。