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 |