🏪 应用商城
平台从 v4.7.2 开始自动安装应用商城模块,用户可通过应用商城安装和管理各种应用
数据来源
AI 应用与应用商城已经统一为一个系统,sys_microistore 是唯一应用主表。商城入口在同一个页面保留四个业务页签:
| 页签 | 数据来源 |
|---|---|
| 应用市场 | 读取当前选中的联邦商城源,包含平台应用、Web、UniApp、微服务以及租户发布的公开/私有应用。 |
| 已经安装应用 | 以当前租户 sys_microistoreversion 为安装事实源,显示安装版本、最新版本和更新状态。 |
| 发布 / 制作离线包 | 只读取当前登录用户在当前租户拥有的应用,草稿和构建失败项也可继续编辑。 |
| 安装离线包 | 在当前页面校验并提交后台安装任务,不跳转到另一个菜单。 |
旧的 /microi-store-installed、/microi-store-published 菜单不再作为独立入口。主页面保留来源、筛选和分页上下文,并通过应用包中的受管接口引擎读取列表、详情与历史版本。列表可按 ApplicationType、Category、PublisherType、公开范围和关键词筛选。
统一字段约定:
| 字段 | 说明 |
|---|---|
ApplicationType | 运行形态:Regular / Platform / Web / UniApp / MicroService。Regular 是普通平台离线包的新建默认值;商城中的既有平台应用、平台应用通知和旧包仍使用 Platform,两者都必须兼容,不能在未迁移数据和调用方前强制改单值。 |
AppType | 历史兼容字段,旧数据/接口曾同时把它用于“官方/社区来源”和运行形态。新代码不得以它作为唯一判断依据;读取旧包时可回退,写入新数据使用 ApplicationType + PublisherType。 |
Category | 游戏、企业应用、办公、教育、行业应用、平台能力等。 |
PublisherType | 发布者身份/展示来源:官方应用、社区应用。新代码的官方/社区筛选以此字段为准。 |
IsPublic | 1 为公开应用,未登录商城源也可读取;0 为私有应用,只在来源登录成功后可见。历史空值按公开兼容。 |
ViewCount | 官网或商城打开应用时累计浏览次数。 |
InstallCount | 每次安装、更新或重新安装成功后累计一次;后台任务重试仍使用同一个 OperationId,不会重复累计。 |
当前租户数据只走当前 ApiBase + OsClient + Token;只有用户主动选择其它商城源时,才由可信后端代理向该来源发起只读查询或取包请求,来源 Token 不经过浏览器。
商城来源与私有应用
商城来源使用 ApiBase + OsClient 唯一定位。添加来源时先识别系统标题、验证码策略以及公开应用数;未登录时只能安装公开应用,登录后才可统计和安装该账号有权访问的私有应用。每个主租户、子租户都可以发布公开或私有应用,也可以添加其它吾码平台作为来源。
来源帐号密码只参与当次登录,不会保存。平台用非 PC 的 MCP/Mobile 客户端类型签发长会话 Token,并在当前租户后端加密保存到 mci_system_setting;浏览器、来源配置 JSON、日志和应用包都拿不到 Token。来源代理固定校验保存时的 ApiBase、OsClient 和有效期,退出来源登录会删除密文。
应用详情显示完整业务信息和可安装版本。当前版本与 mic_data_version 中仍保留完整应用包的历史快照都可选择安装;后台任务保存实际选择的版本,允许在新版出现问题时明确重新安装旧版。版本区使用服务端搜索与分页,当前版本固定置顶,默认每页不超过 20 条,不能一次加载全部历史版本再由浏览器过滤。详情弹层使用宿主级固定毛玻璃遮罩,默认居中;标题栏拖动和窗口缩放后都会按弹层真实宽高限制四边,内容不能移出视口。平台官方发布节点仅显示“平台官方应用源”标记,不允许对自身执行安装、更新或重新安装。
安装、升级与安全
- 应用商城定义、私有源码、安装、升级和卸载属于控制面,只允许
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 状态和完整源码;任一项失败时整次安装回滚,不会留下“按钮可见但接口不存在”的半安装状态。
- 发布器必须把请求发布的版本精确传给资产准备器,并回读
RequestedVersion == PackageVersion == PackageInfo.Version;禁止资产准备器静默改用“最新版本”。菜单、表和接口引擎的发布选择必须从本次包正文持久化,不能沿用上一版选择状态。 - 接口引擎资源必须在包内声明
ResourcePolicies.ApiEngines。Managed表示应用拥有的官方核心:目标端安装记录保存上一版 SHA-256 共同基线,只有Local == Base才更新到Incoming;若客户修改过核心,安装整包回滚并明确报告冲突,不静默覆盖。CreateIfMissing表示租户拥有的扩展 Hook:首次安装创建,后续更新永远跳过;同一 Key 一旦交给租户,后续版本也禁止改回Managed,确需新官方核心时必须发布新 Key。发布器会把上一版官方代码摘要写入新包,导入器把成功安装摘要写入sys_microistoreversion.InstallResult.ResourceState,因此首次启用策略和后续升级都可判定冲突。 - 官方应用应采用“受管核心接口 + 租户扩展 Hook”,不要让客户直接修改核心;扩展 Hook 必须按稳定
EventId幂等。安全核心发生冲突时不自动三方合并可执行代码,由管理员把租户差异迁移到 Hook 或人工确认基线后再更新。 - 其它已有资源使用存在性检查与差异合并;客户自定义 V8、全局配置和非包拥有字段不得被整表覆盖。
- 更新遵守“先扩展、后迁移、再收缩”,新旧节点滚动期间 API、数据库和缓存合约兼容。
- 定时任务是应用包的一等资源。导入器完成表、字段、数据与其它
PostSchema资源后,必须在独立ScheduleJobscheckpoint 中幂等创建/更新 Quartz 任务并回读运行元数据;任务阶段失败时不能提前写入已安装版本。 - 安装成功后回读表、字段、接口引擎、菜单、权限、页面、工作流、定时任务和版本,并执行真实 HTTP/UI 冒烟。官方发布源只负责制作和发布应用,禁止在自身执行安装、更新、重新安装、批量安装及
ValidateOnly;安装链路必须在非官方目标租户或本地非发布源环境验证,不能削弱发布源隔离规则。
商城入口自愈与通知中心兜底
更新后端源码并重启 API 时,基础应用完整性检查不仅核对应用商城菜单和导入接口,还会核对 microi-platform-service 是否启用、/marketplace 页面是否启用、菜单是否绑定到对应服务/页面,以及数据库内联 index.html 是否存在。任一项缺失、停用或绑定错误都会触发应用商城包的幂等重导入;在线官方资源必须通过相同运行时契约校验,否则整组回退程序集内置资源,不能把不完整资源写入客户库。
右上角【通知中心 → 平台应用】为超级管理员提供【安装/更新全部平台应用】。该入口直接提交 bulk-import-microi-store-packages 持久化后台任务,不依赖应用商城微服务页面能否打开;任务固定只处理 ApplicationType=Platform 且状态为 Uninstalled / Outdated 的应用,已是最新版和其它应用类型均跳过。官方应用源节点不会显示该按钮。
遇到 MICRO_APP_NOT_AVAILABLE 或“微服务不存在或已停用”时:
- 同时更新后端和 PC 前端源码,重启 API,确认日志中的“基础应用升级”已完成且没有导入失败。
- 刷新 PC 页面;如仍需补齐平台应用,由超级管理员在通知中心发起全部安装/更新,并在【后台任务】页签查看任务 Id、当前项、进度和失败原因。
- 任务成功后重新进入应用商城,分别核对页面可加载、平台应用版本和安装记录。源码构建成功、升级日志成功、后台任务成功和真实页面可访问是四个独立验收事实,不能互相替代。
AI 平台治理中心
官方应用 ai-platform-studio 通过同一个安装包交付门户、身份与权限、配置、功能开关、发布审批与执行、服务治理、Trace/日志生命周期、可观测告警、组件资产、页面源码桥接、协作和可恢复导入。包内固定包含 40 张治理表和 5 张运行基础表(合计 45 张表、873 个字段)、42 条稳定菜单兼容记录、64 个接口引擎、1 个治理任务、10 条微服务路由和已校验的构建资产;导航仅显示一个 AI平台治理 MicroService 入口,历史工作台和 40 个数据菜单隐藏,能力均在工作台页面中进入。
其中 57 个官方核心接口使用 Managed,7 个租户扩展 Hook 使用 CreateIfMissing。首次安装和后续升级都必须核对两类策略数量;安装后打开 /micro-app/ai-platform-studio/overview 做真实页面冒烟,并逐项验证配置、发布、服务、可观测、资产与协作入口。完整能力与验收见 AI 平台治理中心。
复杂安装交互使用 V8.OpenAppDialog;后台安装调用 V8.ApiEngine.RunBackground。不要在 ConfirmTips 中拼接上传控件和大段内联 HTML/事件。
完整规范见源码 microi.skills/app-store/SKILL.md 与平台安全与兼容基线。