6912301c4738ca3d92e9d31c3a6ebe2cc0ba6ca0
\345\272\224\347\224\250\345\270\202\345\234\272.md
| ... | ... | @@ -1 +1,224 @@ |
| 1 | -- [[单机版.md]] |
|
| 1 | +## IIDP 平台应用市场功能技术文档 |
|
| 2 | + |
|
| 3 | +### 概述 |
|
| 4 | + |
|
| 5 | +本文档详细描述了 IIDP 平台应用市场的相关功能,包括应用的上传、上架、安装、更新、卸载和删除的具体流程和技术实现。以下内容基于单机版平台的功能实现。 |
|
| 6 | + |
|
| 7 | +### 1. 应用上传 |
|
| 8 | + |
|
| 9 | +#### 功能描述 |
|
| 10 | +上传应用的 JAR 包到 `meta_attachment` 中,对于重复的文件也会当作新的文件处理。优化建议:可以实现一键秒传功能,即如果文件的 MD5 值相同则无需重复上传。 |
|
| 11 | + |
|
| 12 | +#### 实现细节 |
|
| 13 | +1. **方法签名**: |
|
| 14 | + ```java |
|
| 15 | + public String putObject(InputStream inputStream, String fileType, String originalFilename, String bucketName) |
|
| 16 | + ``` |
|
| 17 | +2. **上传流程**: |
|
| 18 | + - 最终调用 `base_file` 中的 `upload` 方法。 |
|
| 19 | + - 在 `meta_attachment` 中新增一条记录。 |
|
| 20 | + - 点击保存后,调用 `create` 方法,在应用市场创建一条记录,并设置 `app_market` 为 `noUp`。 |
|
| 21 | + |
|
| 22 | +[[http://iidp.chinasie.com:9999/iidpminio/design/store/upload.png]] |
|
| 23 | + |
|
| 24 | +<details> |
|
| 25 | + <summary>点击展开puml</summary> |
|
| 26 | +```puml |
|
| 27 | +@startuml |
|
| 28 | +start |
|
| 29 | +:浏览器端上传jar包和前端zip包; |
|
| 30 | +:调用 /file/upload 接口; |
|
| 31 | + |
|
| 32 | +:调用 meta_attachment 模型的 upload 方法(这个方法继承自base_file模型); |
|
| 33 | +:根据 minio 配置信息构建 minioTemplate; |
|
| 34 | +:调用 putObject 上传到 minio apps桶下; |
|
| 35 | + |
|
| 36 | +:计算 md5 值; |
|
| 37 | +:在 meta_attachment create 新增一条附件记录; |
|
| 38 | + |
|
| 39 | +:返回到浏览器; |
|
| 40 | + |
|
| 41 | +:用户点击保存; |
|
| 42 | +:调用 meta_app_store 元模型upload 方法; |
|
| 43 | + |
|
| 44 | +:将前端上传的 jar 包下载到 apps/uploads 目录下; |
|
| 45 | +:获取 app 的信息 (name, version, summary 等); |
|
| 46 | + |
|
| 47 | +:在 meta_app_store 新增一条记录,并设置 state 为 noup; |
|
| 48 | + |
|
| 49 | +if (app 有依赖?) then (是) |
|
| 50 | + :在 meta_app_store_dependency 表中新增一条或多条依赖的 app id 信息; |
|
| 51 | +endif |
|
| 52 | + |
|
| 53 | +stop |
|
| 54 | +@enduml |
|
| 55 | + |
|
| 56 | +``` |
|
| 57 | +</details> |
|
| 58 | + |
|
| 59 | +### 2. 应用上架 |
|
| 60 | + |
|
| 61 | +#### 功能描述 |
|
| 62 | +计算依赖图,检查依赖的应用是否在应用市场中,修改应用状态为 `up`。此过程相当于一次干运行(dry run)。 |
|
| 63 | + |
|
| 64 | +#### 实现细节 |
|
| 65 | +1. **依赖检查**:确保所有依赖的应用均在应用市场中。 |
|
| 66 | +2. **状态修改**:将应用状态设置为 `up`。 |
|
| 67 | + |
|
| 68 | +[[http://iidp.chinasie.com:9999/iidpminio/design/store/putaway.png]] |
|
| 69 | + |
|
| 70 | +<details> |
|
| 71 | + <summary>点击展开puml</summary> |
|
| 72 | + ```uml |
|
| 73 | + @startuml |
|
| 74 | +start |
|
| 75 | +:如果是单个上架; |
|
| 76 | +: 获取整个应用市场的app,并计算当前待上架app的依赖图; |
|
| 77 | +: 依次检查待上架app的依赖是否已经存在; |
|
| 78 | + |
|
| 79 | + |
|
| 80 | +if (存在?) then (是) |
|
| 81 | + : 修改app_market状态为up; |
|
| 82 | +else (否) |
|
| 83 | + : 返回上架失败; |
|
| 84 | +endif |
|
| 85 | + |
|
| 86 | +stop |
|
| 87 | +@enduml |
|
| 88 | + |
|
| 89 | + ``` |
|
| 90 | +</details> |
|
| 91 | + |
|
| 92 | +### 3. 应用安装 |
|
| 93 | + |
|
| 94 | +#### 功能描述 |
|
| 95 | +应用必须先上架后才能安装。安装过程中会获取依赖的应用,初始化策略注册菜单的权限策略,加载应用的配置信息和系统变量,并将状态修改为 `installed`。 |
|
| 96 | + |
|
| 97 | +#### 实现细节 |
|
| 98 | +1. **安装方法**: |
|
| 99 | + - `installApps` |
|
| 100 | + - 获取依赖的应用,调用 `buildAppDataInfo` 方法。 |
|
| 101 | + - 调用 `doInstallApps` 方法。 |
|
| 102 | + - 调用 `postInstall` 方法。 |
|
| 103 | + - 加载种子数据 `loadSeedData`。 |
|
| 104 | +2. **状态修改**:将应用状态设置为 `installed`。 |
|
| 105 | + |
|
| 106 | +[[http://iidp.chinasie.com:9999/iidpminio/design/store/install.png]] |
|
| 107 | + |
|
| 108 | +<details> |
|
| 109 | + <summary>展开puml </summary> |
|
| 110 | +```puml |
|
| 111 | +@startuml |
|
| 112 | +start |
|
| 113 | +: 如果是单机模式; |
|
| 114 | + |
|
| 115 | +: 从应用市场获取待安装的app信息; |
|
| 116 | + |
|
| 117 | +: 根据模式获取loader,这是是单机版的loader; |
|
| 118 | + |
|
| 119 | +: 从应用市场获取待安装的app的依赖图,并获取依赖app; |
|
| 120 | + |
|
| 121 | +if (依赖的app存在?) then (是) |
|
| 122 | + : 所有的依赖,计算需要安装的引用,更新的应用,初始化: 插入应用,更改应用,初始化菜单等; |
|
| 123 | + : 下载新jar包; |
|
| 124 | + : 恢复之前软删除的其他资源,比如menu、view等; |
|
| 125 | + : doInstallApps、postInstall 统一的方法; |
|
| 126 | + : 调用安装事件 startUpEvent; |
|
| 127 | +else (否) |
|
| 128 | + : 返回上架失败; |
|
| 129 | +endif |
|
| 130 | + |
|
| 131 | +stop |
|
| 132 | +@enduml |
|
| 133 | + |
|
| 134 | +``` |
|
| 135 | +</details> |
|
| 136 | + |
|
| 137 | +### 4. 应用卸载 |
|
| 138 | + |
|
| 139 | +#### 功能描述 |
|
| 140 | +除了卸载选中的当前应用,还需要卸载其所依赖的应用。修改数据状态为 `uninstalled`,软删除应用的其他资源状态(如菜单、视图等),清理内存中的相关信息。 |
|
| 141 | + |
|
| 142 | +#### 实现细节 |
|
| 143 | +1. **状态修改**:将应用状态设置为 `uninstalled`。 |
|
| 144 | +2. **资源清理**: |
|
| 145 | + - 移除内存信息。 |
|
| 146 | + - 清理 `appContainer` 中的 `metas`、`models`。 |
|
| 147 | + - 清理 `appDataInfoMap`、`appContainerMap`。 |
|
| 148 | + - 移除类加载器。 |
|
| 149 | + - 清理 `appContainerMap` 中的 `finalModelMap`。 |
|
| 150 | + - 移除自定义系统变量。 |
|
| 151 | +3. **重新安装**:安装需要重装的应用(按安装流程)。 |
|
| 152 | + |
|
| 153 | +[[http://iidp.chinasie.com:9999/iidpminio/design/store/uninstall.png]] |
|
| 154 | + |
|
| 155 | +<details> |
|
| 156 | + <summary>展开puml </summary> |
|
| 157 | +```puml |
|
| 158 | +@startuml |
|
| 159 | +start |
|
| 160 | +: 如果是单机模式; |
|
| 161 | + |
|
| 162 | +: 初始化当前模式的appLoader; |
|
| 163 | + |
|
| 164 | +: 调用loader的uninstallApps方法; |
|
| 165 | + |
|
| 166 | +: 获取待卸载的 appGroupContainer,以及 graphs 信息; |
|
| 167 | + |
|
| 168 | +: 设置安装状态为 uninstalled; |
|
| 169 | + |
|
| 170 | +: 软删除应用的其他资源状态,比如menue、view等; |
|
| 171 | + |
|
| 172 | +: 清理出台metas,清理models,以及清理appDataInfoMap和 appContainerMap该app的key; |
|
| 173 | + |
|
| 174 | +: 清理该app的类加载器,并设置为null; |
|
| 175 | + |
|
| 176 | +: 清理 finalModelMap 终态信息; |
|
| 177 | + |
|
| 178 | +: 移除自定义变量; |
|
| 179 | + |
|
| 180 | +: 计算需要重装的app,并执行统一的 doInstallApps; |
|
| 181 | + |
|
| 182 | + |
|
| 183 | +stop |
|
| 184 | +@enduml |
|
| 185 | +``` |
|
| 186 | +</details> |
|
| 187 | +### 5. 应用更新 |
|
| 188 | + |
|
| 189 | +#### 功能描述 |
|
| 190 | +对比应用市场的 MD5 值和已安装的 MD5 值(前提是应用已上架),如果不相等则激活更新。可优化点:仅在有新版本时提示更新,而不是仅基于 MD5 不相等。 |
|
| 191 | + |
|
| 192 | +#### 实现细节 |
|
| 193 | +1. **MD5 比对**:如果上架的应用版本低于已安装版本,也会提示更新,这是需要优化的点。 |
|
| 194 | +2. **更新流程**: |
|
| 195 | + - 点击更新后,比对 MD5 不一致,则下载新的 JAR 包到 `apps/modules` 目录下。 |
|
| 196 | + - 按照install的逻辑执行,同时更新app信息到数据库中。 |
|
| 197 | + |
|
| 198 | +### 6. 应用删除 |
|
| 199 | + |
|
| 200 | +#### 功能描述 |
|
| 201 | +已经安装过的应用不能删除。否则将直接删除 `MetaAppStore` 中的记录。 |
|
| 202 | + |
|
| 203 | +#### 实现细节 |
|
| 204 | +1. **删除限制**:已安装的应用不可删除。 |
|
| 205 | +2. **记录删除**:直接删除 `MetaAppStore` 中的记录。 |
|
| 206 | + |
|
| 207 | +### 7. 安装逻辑详细描述 (`doInstallApps`) |
|
| 208 | + |
|
| 209 | +#### 步骤描述 |
|
| 210 | +1. **清空应用信息**:清空 `app` 信息,元模型信息,移除类加载器等操作。 |
|
| 211 | +2. **重置类加载器**:通过最新的 JAR 文件设置类加载器,检测循环依赖和配置错误,计算应用安装顺序(基础应用在最前面)。 |
|
| 212 | +3. **加载初始态元模型**: |
|
| 213 | + - `OriginalMeta`:直接通过 `convert` 转换而来的元模型信息,没有继承扩展。 |
|
| 214 | + - `appDataInfoMap`:保存的是 `app.json` 信息。 |
|
| 215 | + - `appContainerMap`:保存的是元模型相关信息。 |
|
| 216 | + - `appGroupContainer`:多个应用组成一个组的 `map`。 |
|
| 217 | +4. **二次构建**: |
|
| 218 | + - 仅处理 `ModelMeta`,即 `model` 元模型,并处理继承扩展(仅解析)。 |
|
| 219 | +5. **最终构建**: |
|
| 220 | + - 处理继承扩展的场景,并构建父信息。 |
|
| 221 | + |
|
| 222 | +### 总结 |
|
| 223 | + |
|
| 224 | +以上是 IIDP 平台应用市场功能的详细技术文档。本文档涵盖了应用上传、上架、安装、更新、卸载和删除的具体实现细节和流程。通过对各功能模块的详细描述,能够帮助开发者更好地理解和使用 IIDP 平台的应用市场功能。 |
|
| ... | ... | \ No newline at end of file |