Skip to content

Commit fc18d34

Browse files
committed
feat(ui): 优化未安装 JsonConvert 插件提示
1 parent 6dfda03 commit fc18d34

7 files changed

Lines changed: 60 additions & 38 deletions

File tree

configure/etc/conf/i18n/messages_en.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,4 +729,5 @@ notify.text.dingtalk=DingTalk Notification
729729
notify.text.created=Created
730730
notify.text.updated=Updated
731731
notify.text.deleted=Deleted
732-
notify.text.syncData=Sync Data
732+
notify.text.syncData=Sync Data
733+
plugin.text.requiredJsonConvert=The JsonConvert plugin has not been installed and cannot be converted, please try again after installation

configure/etc/conf/i18n/messages_zh-cn.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,4 +729,5 @@ notify.text.dingtalk=\u9489\u9489\u901A\u77E5
729729
notify.text.created=\u521B\u5EFA
730730
notify.text.updated=\u66F4\u65B0
731731
notify.text.deleted=\u5220\u9664
732-
notify.text.syncData=\u540C\u6B65\u6570\u636E
732+
notify.text.syncData=\u540C\u6B65\u6570\u636E
733+
plugin.text.requiredJsonConvert=\u5C1A\u672A\u5B89\u88C5 JsonConvert \u63D2\u4EF6\uFF0C\u65E0\u6CD5\u8FDB\u884C Json \u8F6C\u6362\uFF0C\u8BF7\u5B89\u88C5\u540E\u91CD\u8BD5

core/datacap-plugin/src/main/java/io/edurt/datacap/plugin/PluginMetadata.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class PluginMetadata
2020
private PluginType type;
2121
private String loaderName;
2222
private String key;
23+
private Object configure;
2324

2425
@JsonIgnore
2526
private ClassLoader classLoader;

core/datacap-server/src/main/java/io/edurt/datacap/server/controller/PluginController.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,49 @@
44
import io.edurt.datacap.common.response.CommonResponse;
55
import io.edurt.datacap.plugin.PluginManager;
66
import io.edurt.datacap.plugin.PluginMetadata;
7+
import io.edurt.datacap.plugin.PluginType;
8+
import io.edurt.datacap.service.common.PluginUtils;
79
import lombok.Data;
10+
import org.springframework.core.env.Environment;
811
import org.springframework.web.bind.annotation.DeleteMapping;
912
import org.springframework.web.bind.annotation.GetMapping;
1013
import org.springframework.web.bind.annotation.PathVariable;
1114
import org.springframework.web.bind.annotation.PostMapping;
1215
import org.springframework.web.bind.annotation.RequestBody;
1316
import org.springframework.web.bind.annotation.RequestMapping;
17+
import org.springframework.web.bind.annotation.RequestParam;
1418
import org.springframework.web.bind.annotation.RestController;
1519

1620
import java.nio.file.Path;
1721
import java.util.List;
22+
import java.util.stream.Collectors;
1823

1924
@RestController
2025
@RequestMapping(value = "/api/v1/plugin")
2126
@SuppressFBWarnings(value = {"EI_EXPOSE_REP2"})
2227
public class PluginController
2328
{
2429
private final PluginManager pluginManager;
30+
private final Environment environment;
2531

26-
public PluginController(PluginManager pluginManager)
32+
public PluginController(PluginManager pluginManager, Environment environment)
2733
{
2834
this.pluginManager = pluginManager;
35+
this.environment = environment;
2936
}
3037

3138
@GetMapping
32-
public CommonResponse<List<PluginMetadata>> getPlugins()
39+
public CommonResponse<List<PluginMetadata>> getPlugins(@RequestParam(value = "hasConfigure", required = false) boolean hasConfigure)
3340
{
41+
List<PluginMetadata> plugins = pluginManager.getPluginInfos()
42+
.stream()
43+
.filter(v -> v.getType().equals(PluginType.CONNECTOR))
44+
.collect(Collectors.toList());
45+
46+
if (hasConfigure) {
47+
plugins.forEach(plugin -> plugin.setConfigure(PluginUtils.loadYamlConfigure("JDBC", plugin.getName(), plugin.getName(), environment)));
48+
}
49+
3450
return CommonResponse.success(pluginManager.getPluginInfos());
3551
}
3652

core/datacap-service/src/main/java/io/edurt/datacap/service/common/PluginUtils.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,18 @@ private PluginUtils() {}
2828

2929
public static Optional<PluginService> getPluginByName(Injector injector, String pluginName)
3030
{
31-
Optional<PluginService> pluginOptional = injector.getInstance(Key.get(new TypeLiteral<Set<PluginService>>() {})).stream().filter(plugin -> plugin.name().equalsIgnoreCase(pluginName)).findFirst();
32-
return pluginOptional;
31+
return injector.getInstance(Key.get(new TypeLiteral<Set<PluginService>>() {}))
32+
.stream()
33+
.filter(plugin -> plugin.name().equalsIgnoreCase(pluginName))
34+
.findFirst();
3335
}
3436

3537
public static Optional<PluginService> getPluginByNameAndType(Injector injector, String pluginName, String pluginType)
3638
{
37-
Optional<PluginService> pluginOptional = injector.getInstance(Key.get(new TypeLiteral<Set<PluginService>>() {})).stream().filter(plugin -> plugin.name().equalsIgnoreCase(pluginName) && plugin.type().name().equalsIgnoreCase(pluginType)).findFirst();
38-
return pluginOptional;
39+
return injector.getInstance(Key.get(new TypeLiteral<Set<PluginService>>() {}))
40+
.stream()
41+
.filter(plugin -> plugin.name().equalsIgnoreCase(pluginName) && plugin.type().name().equalsIgnoreCase(pluginType))
42+
.findFirst();
3943
}
4044

4145
@Deprecated

core/datacap-ui/src/services/plugin.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ const DEFAULT_PATH = '/api/v1/plugin'
55

66
class PluginService
77
{
8-
getPlugins(): Promise<ResponseModel>
8+
getPlugins(hasConfigure?: boolean): Promise<ResponseModel>
99
{
10-
return new HttpUtils().get(`${ DEFAULT_PATH }`)
10+
return new HttpUtils().get(`${ DEFAULT_PATH }`, { hasConfigure })
1111
}
1212

1313
install(configure: { name: string, url: string }): Promise<ResponseModel>

core/datacap-ui/src/views/pages/admin/source/SourceInfo.vue

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010
<ShadcnTab v-model="activeTab" :key="`tab-${configureTabs.length}`" @on-change="onChangeTab">
1111
<ShadcnTabItem value="source" :label="$t('source.common.source')" :key="'source-tab'">
1212
<ShadcnFormItem name="type" :label="$t('source.common.type')" :rules="[{ required: true, message: $t('function.tip.selectPluginHolder') }]">
13-
<ShadcnToggleGroup v-model="formState.type" class="flex flex-wrap gap-3" name="plugin">
14-
<ShadcnToggle v-for="plugin in plugins" class="p-1"
15-
:key="plugin.name"
16-
:value="plugin.name">
13+
<ShadcnToggleGroup v-model="formState.type" class="flex flex-wrap gap-3" name="plugin" :disabled="!hasJsonConvert">
14+
<ShadcnToggle v-for="plugin in plugins" class="p-1" :key="plugin.name" :value="plugin.name">
1715
<ShadcnTooltip :content="plugin.name" class="p-1">
1816
<img class="h-16 w-16 object-contain" :src="'/static/images/plugin/' + plugin.name.toLowerCase() + '.svg'" :alt="plugin.name">
1917
</ShadcnTooltip>
@@ -26,6 +24,7 @@
2624
class="space-y-4"
2725
:key="tab"
2826
:value="tab"
27+
:disabled="!hasJsonConvert"
2928
:label="$t(`source.common.${ tab }`)">
3029
<ShadcnFormItem v-for="configure in pluginTabConfigure"
3130
:name="configure.field"
@@ -119,6 +118,7 @@ import { defineComponent } from 'vue'
119118
import { SourceModel, SourceRequest } from '@/model/source'
120119
import { cloneDeep, pick } from 'lodash'
121120
import SourceService from '@/services/source'
121+
import PluginService from '@/services/plugin'
122122
import { TokenUtils } from '@/utils/token'
123123
import { ResponseModel } from '@/model/response'
124124
@@ -172,7 +172,8 @@ export default defineComponent({
172172
pluginConfigure: null as unknown as any,
173173
pluginTabConfigure: null as unknown as any,
174174
applyConfigure: null as unknown as any,
175-
originalSchema: null as unknown as any
175+
originalSchema: null as unknown as any,
176+
hasJsonConvert: false
176177
}
177178
},
178179
created()
@@ -246,23 +247,30 @@ export default defineComponent({
246247
247248
// 获取插件列表的 Promise
248249
// Get plugins promise
249-
const getPluginsPromise = SourceService.getPlugins()
250+
const getPluginsPromise = PluginService.getPlugins(true)
251+
252+
const pluginsResponse = await getPluginsPromise
253+
this.hasJsonConvert = pluginsResponse.data.some(value =>
254+
value.type?.toLowerCase() === 'convert' &&
255+
value.name === 'JsonConvert'
256+
)
257+
258+
if (!this.hasJsonConvert) {
259+
this.testInfo.message = this.$t('plugin.text.requiredJsonConvert')
260+
}
261+
262+
if (pluginsResponse.status) {
263+
this.plugins = pluginsResponse.data.filter((plugin: { type: string }) =>
264+
plugin.type?.toLowerCase() === 'connector'
265+
)
266+
}
250267
251268
if (this.info) {
252-
this.title = `${ this.$t('source.common.modify').replace('$NAME', String(this.info.name)) }`
269+
this.title = `${ this.$t('source.common.modify').replace('$NAME', String(this.info.name || '...')) }`
253270
254271
// 同时执行获取插件列表和源代码信息的请求
255272
// Simultaneously execute requests to get plugin list and source code
256-
const [pluginsResponse, sourceResponse] = await Promise.all([
257-
getPluginsPromise,
258-
SourceService.getByCode(this.info.code)
259-
])
260-
261-
// 处理插件列表响应
262-
// Handle plugin list response
263-
if (pluginsResponse.status) {
264-
this.plugins = pluginsResponse.data
265-
}
273+
const sourceResponse = await SourceService.getByCode(this.info.code)
266274
267275
// 处理源代码信息响应
268276
// Handle source code response
@@ -280,19 +288,10 @@ export default defineComponent({
280288
this.updatePluginTabConfigure('source')
281289
}
282290
}
291+
292+
console.log(this.plugins)
283293
}
284294
else {
285-
// 如果没有 info,只需要获取插件列表
286-
// If there is no info, only get plugin list
287-
const pluginsResponse = await getPluginsPromise
288-
if (pluginsResponse.status) {
289-
this.plugins = pluginsResponse.data
290-
291-
const hasJsonConvert = this.plugins.filter(value => value.type === 'Convert' && value.name === 'JsonConvert').length > 0
292-
if (!hasJsonConvert) {
293-
this.testInfo.message = 'JsonConvert plugin is required'
294-
}
295-
}
296295
this.formState = SourceRequest.of()
297296
}
298297
}

0 commit comments

Comments
 (0)