\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