From fd8e98f44c729e4fcc7ce2fcc7fa47fa8d6b10d2 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 31 Mar 2022 17:52:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=E8=A7=86=E5=9B=BE=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E8=87=AA=E5=AE=9A=E4=B9=89icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/service/impl/ShiroServiceImpl.java | 3 ++ .../plugins/server/PluginCommonServer.java | 41 +++++++++++++++++++ frontend/src/utils/validate.js | 2 +- frontend/src/views/chart/group/Group.vue | 34 ++++++++++++--- frontend/src/views/chart/view/ChartEdit.vue | 35 ++++++++++++---- frontend/src/views/panel/ViewSelect/index.vue | 26 ++++++++++-- 6 files changed, 124 insertions(+), 17 deletions(-) diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index d6eb70a6f9..3e4f3a1155 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -68,6 +68,8 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/**/*.js", ANON); filterChainDefinitionMap.put("/**/*.css", ANON); filterChainDefinitionMap.put("/**/*.map", ANON); + filterChainDefinitionMap.put("/**/*.svg", ANON); + filterChainDefinitionMap.put("/api/auth/login", ANON); filterChainDefinitionMap.put("/api/auth/isPluginLoaded", ANON); @@ -77,6 +79,7 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/api/auth/isOpenOidc", ANON); filterChainDefinitionMap.put("/api/auth/getPublicKey", ANON); filterChainDefinitionMap.put("/api/pluginCommon/component/*", ANON); + filterChainDefinitionMap.put("/api/pluginCommon/staticInfo/**", ANON); filterChainDefinitionMap.put("/plugin/oidc/authInfo", ANON); filterChainDefinitionMap.put("/sso/callBack*", ANON); diff --git a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java index b33e60244c..03d1e3bca7 100644 --- a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java @@ -2,9 +2,11 @@ package io.dataease.plugins.server; import io.dataease.commons.utils.ServletUtils; import io.dataease.plugins.common.dto.PluginSysMenu; +import io.dataease.plugins.common.dto.StaticResource; import io.dataease.plugins.common.service.PluginComponentService; import io.dataease.plugins.common.service.PluginMenuService; import io.dataease.plugins.config.SpringContextUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -102,4 +104,43 @@ public class PluginCommonServer { } }); } + + @GetMapping("/staticInfo/{name}/{suffix}") + public void staticInfo(@PathVariable("name") String name, @PathVariable("suffix") String suffix) { + Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(PluginComponentService.class); + beansOfType.values().stream().forEach(service -> { + List staticResources = service.staticResources(); + + if (staticResources.stream().anyMatch(resource -> resource.match(name, suffix))) { + HttpServletResponse response = ServletUtils.response(); + BufferedInputStream bis = null; + InputStream inputStream = null; + OutputStream os = null; //输出流 + try{ + inputStream = service.vueResource(name, suffix); + byte[] buffer = new byte[1024]; + os = response.getOutputStream(); + bis = new BufferedInputStream(inputStream); + int i = bis.read(buffer); + while(i != -1){ + os.write(buffer, 0, i); + i = bis.read(buffer); + } + response.setContentType("image/svg+xml"); + os.flush(); + }catch (Exception e) { + e.printStackTrace(); + }finally { + try { + bis.close(); + inputStream.close(); + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return; + } + }); + } } diff --git a/frontend/src/utils/validate.js b/frontend/src/utils/validate.js index de31eda81e..576f91d20c 100644 --- a/frontend/src/utils/validate.js +++ b/frontend/src/utils/validate.js @@ -7,7 +7,7 @@ * @returns {Boolean} */ export function isExternal(path) { - return /^(https?:|mailto:|tel:)/.test(path) + return /^(https?:|mailto:|tel:)/.test(path) || /^(http?:|mailto:|tel:)/.test(path) || path.startsWith('/api/pluginCommon/staticInfo') } /** diff --git a/frontend/src/views/chart/group/Group.vue b/frontend/src/views/chart/group/Group.vue index 0b1a562bd4..90db051db7 100644 --- a/frontend/src/views/chart/group/Group.vue +++ b/frontend/src/views/chart/group/Group.vue @@ -224,7 +224,7 @@ - + @@ -297,6 +297,7 @@ import TableSelector from '../view/TableSelector' import GroupMoveSelector from '../components/TreeSelector/GroupMoveSelector' import ChartMoveSelector from '../components/TreeSelector/ChartMoveSelector' import ChartType from '@/views/chart/view/ChartType' +import { pluginTypes } from '@/api/chart/chart' import { DEFAULT_COLOR_CASE, DEFAULT_LABEL, @@ -420,7 +421,8 @@ export default { folder: this.$t('commons.folder') }, currentViewNodeData: {}, - currentKey: null + currentKey: null, + pluginRenderOptions: [] } }, computed: { @@ -429,14 +431,14 @@ export default { }, panelInfo() { return this.$store.state.panel.panelInfo - }, - pluginRenderOptions() { + } + /* pluginRenderOptions() { const plugins = localStorage.getItem('plugin-views') && JSON.parse(localStorage.getItem('plugin-views')) || [] const pluginOptions = plugins.filter(plugin => !this.renderOptions.some(option => option.value === plugin.render)).map(plugin => { return { name: plugin.render, value: plugin.render } }) return [...this.renderOptions, ...pluginOptions] - } + } */ }, watch: { saveStatus() { @@ -460,6 +462,21 @@ export default { } }, + created() { + const plugins = localStorage.getItem('plugin-views') && JSON.parse(localStorage.getItem('plugin-views')) + if (plugins) { + this.loadPluginType() + } else { + pluginTypes().then(res => { + const plugins = res.data + localStorage.setItem('plugin-views', JSON.stringify(plugins)) + this.loadPluginType() + }).catch(e => { + localStorage.setItem('plugin-views', null) + this.loadPluginType() + }) + } + }, mounted() { if (this.mountedInit) { this.treeNode(true) @@ -468,6 +485,13 @@ export default { this.getChartGroupTree() }, methods: { + loadPluginType() { + const plugins = localStorage.getItem('plugin-views') && JSON.parse(localStorage.getItem('plugin-views')) || [] + const pluginOptions = plugins.filter(plugin => !this.renderOptions.some(option => option.value === plugin.render)).map(plugin => { + return { name: plugin.render, value: plugin.render } + }) + this.pluginRenderOptions = [...this.renderOptions, ...pluginOptions] + }, clickAdd(param) { this.currGroup = param.data if (param.type === 'group') { diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 9bdecaae0f..c77965e2b1 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -154,7 +154,7 @@ {{ $t('chart.chart_type') }} - + !this.renderOptions.some(option => option.value === plugin.render)).map(plugin => { return { name: plugin.render, value: plugin.render } }) return [...this.renderOptions, ...pluginOptions] - } + } */ }, watch: { 'param': function(val) { @@ -1411,8 +1412,19 @@ export default { } }, created() { - // this.get(this.$store.state.chart.viewId); - // this.initAreas() + const plugins = localStorage.getItem('plugin-views') && JSON.parse(localStorage.getItem('plugin-views')) + if (plugins) { + this.loadPluginType() + } else { + pluginTypes().then(res => { + const plugins = res.data + localStorage.setItem('plugin-views', JSON.stringify(plugins)) + this.loadPluginType() + }).catch(e => { + localStorage.setItem('plugin-views', null) + this.loadPluginType() + }) + } }, mounted() { this.bindPluginEvent() @@ -1424,6 +1436,13 @@ export default { }, methods: { + loadPluginType() { + const plugins = localStorage.getItem('plugin-views') && JSON.parse(localStorage.getItem('plugin-views')) || [] + const pluginOptions = plugins.filter(plugin => !this.renderOptions.some(option => option.value === plugin.render)).map(plugin => { + return { name: plugin.render, value: plugin.render } + }) + this.pluginRenderOptions = [...this.renderOptions, ...pluginOptions] + }, emptyTableData() { this.table = {} this.dimension = [] diff --git a/frontend/src/views/panel/ViewSelect/index.vue b/frontend/src/views/panel/ViewSelect/index.vue index c28f3e2bc3..c6ac23043d 100644 --- a/frontend/src/views/panel/ViewSelect/index.vue +++ b/frontend/src/views/panel/ViewSelect/index.vue @@ -47,6 +47,7 @@ + {{ data.name }} @@ -74,7 +75,7 @@ import eventBus from '@/components/canvas/utils/eventBus' import { mapState } from 'vuex' import { queryPanelViewTree } from '@/api/panel/panel' import { deleteCircle } from '@/api/chart/chart' -import { delUser } from '@/api/system/user' +import { pluginTypes } from '@/api/chart/chart' export default { name: 'ViewSelect', @@ -96,7 +97,8 @@ export default { data: [], showdetail: false, detailItem: null, - loading: false + loading: false, + plugins: null } }, computed: { @@ -110,7 +112,20 @@ export default { } }, created() { - this.loadData() + this.plugins = localStorage.getItem('plugin-views') && JSON.parse(localStorage.getItem('plugin-views')) + if (this.plugins) { + this.loadData() + } else { + pluginTypes().then(res => { + this.plugins = res.data + localStorage.setItem('plugin-views', JSON.stringify(res.data)) + this.loadData() + }).catch(e => { + localStorage.setItem('plugin-views', null) + this.plugins = null + this.loadData() + }) + } }, methods: { filterNode(value, data) { @@ -172,6 +187,11 @@ export default { if (node.modelType === 'panel' || node.nodeType === 'spine') { node.disabled = true } + + if (node.modelType === 'view' && node.modelInnerType && this.plugins && this.plugins.length) { + node.isPlugin = this.plugins.some(plugin => plugin.value === node.modelInnerType) + } + if (node.children && node.children.length > 0) { this.setParentDisable(node.children) } From 178a411131643f27504f76f5117a23323365c12e Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 31 Mar 2022 22:51:54 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E8=A1=8C=E6=9D=83=E9=99=90=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provider/datasource/JdbcProvider.java | 3 +- .../service/datasource/DatasourceService.java | 1 + frontend/src/views/system/datasource/form.vue | 33 ++++++++++--------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java index 3a92cebe16..d193600cb1 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java @@ -367,11 +367,10 @@ public class JdbcProvider extends DatasourceProvider { public String checkStatus(DatasourceRequest datasourceRequest) throws Exception { String queryStr = getTablesSql(datasourceRequest); try (Connection con = getConnection(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryStr)) { - return "Success"; } catch (Exception e) { DataEaseException.throwException(e.getMessage()); } - return "Error"; + return "Success"; } @Override diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java index fa18dab52e..ee31edf8c3 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -191,6 +191,7 @@ public class DatasourceService { datasource.setDesc(updataDsRequest.getDesc()); datasource.setConfiguration(updataDsRequest.getConfiguration()); datasource.setCreateTime(null); + datasource.setType(updataDsRequest.getType()); datasource.setUpdateTime(System.currentTimeMillis()); checkAndUpdateDatasourceStatus(datasource); DatasourceExample example = new DatasourceExample(); diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index 1b93ca6c75..93007a3de4 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -337,10 +337,10 @@ export default { apiConfiguration: [] }, rule: { - name: [{required: true, message: i18n.t('datasource.input_name'), trigger: 'change'}, - {min: 2, max: 25, message: i18n.t('datasource.input_limit_2_25', [2, 25]), trigger: 'change'}], + name: [{required: true, message: i18n.t('datasource.input_name'), trigger: 'blur'}, + {min: 2, max: 25, message: i18n.t('datasource.input_limit_2_25', [2, 25]), trigger: 'blur'}], desc: [{min: 2, max: 50, message: i18n.t('datasource.input_limit_2_50'), trigger: 'blur'}], - type: [{required: true, message: i18n.t('datasource.please_choose_type'), trigger: 'change'}], + type: [{required: true, message: i18n.t('datasource.please_choose_type'), trigger: 'blur'}], 'configuration.dataBase': [{ required: true, message: i18n.t('datasource.please_input_data_base'), @@ -359,43 +359,43 @@ export default { 'configuration.password': [{ required: true, message: i18n.t('datasource.please_input_password'), - trigger: 'change' + trigger: 'blur' }], - 'configuration.host': [{required: true, message: i18n.t('datasource.please_input_host'), trigger: 'change'}], - 'configuration.url': [{required: true, message: i18n.t('datasource.please_input_url'), trigger: 'change'}], - 'configuration.port': [{required: true, message: i18n.t('datasource.please_input_port'), trigger: 'change'}], + 'configuration.host': [{required: true, message: i18n.t('datasource.please_input_host'), trigger: 'blur'}], + 'configuration.url': [{required: true, message: i18n.t('datasource.please_input_url'), trigger: 'blur'}], + 'configuration.port': [{required: true, message: i18n.t('datasource.please_input_port'), trigger: 'blur'}], 'configuration.initialPoolSize': [{ required: true, message: i18n.t('datasource.please_input_initial_pool_size'), - trigger: 'change' + trigger: 'blur' }], 'configuration.minPoolSize': [{ required: true, message: i18n.t('datasource.please_input_min_pool_size'), - trigger: 'change' + trigger: 'blur' }], 'configuration.maxPoolSize': [{ required: true, message: i18n.t('datasource.please_input_max_pool_size'), - trigger: 'change' + trigger: 'blur' }], 'configuration.maxIdleTime': [{ required: true, message: i18n.t('datasource.please_input_max_idle_time'), - trigger: 'change' + trigger: 'blur' }], 'configuration.acquireIncrement': [{ required: true, message: i18n.t('datasource.please_input_acquire_increment'), - trigger: 'change' + trigger: 'blur' }], 'configuration.connectTimeout': [{ required: true, message: i18n.t('datasource.please_input_connect_timeout'), - trigger: 'change' + trigger: 'blur' }], - 'url': [{required: true, message: i18n.t('datasource.please_input_url'), trigger: 'change'}], - 'dataPath': [{required: true, message: i18n.t('datasource.please_input_dataPath'), trigger: 'change'}] + 'url': [{required: true, message: i18n.t('datasource.please_input_url'), trigger: 'blur'}], + 'dataPath': [{required: true, message: i18n.t('datasource.please_input_dataPath'), trigger: 'blur'}] }, allTypes: [ {name: 'mysql', label: 'MySQL', type: 'jdbc', extraParams: 'characterEncoding=UTF-8&connectTimeout=5000&useSSL=false&allowPublicKeyRetrieval=true'}, @@ -764,6 +764,9 @@ export default { } }, addApiItem(item) { + this.$nextTick(() => { + this.$refs.apiItem.clearValidate() + }) if (item) { this.add_api_item = false this.api_table_title = this.$t('datasource.edit_api_table') From b93847a5b48e2a78604697ed792a48c6c0e1550c Mon Sep 17 00:00:00 2001 From: taojinlong Date: Thu, 31 Mar 2022 22:56:54 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20sql=20=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E5=85=88=E9=80=89=E5=AE=9A=E6=97=B6=E5=90=8C=E6=AD=A5=E5=90=8E?= =?UTF-8?q?=E9=80=89=E6=95=B0=E6=8D=AE=E6=BA=90=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/dataset/add/AddSQL.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index a34f0e6da2..e005b5b912 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -205,6 +205,7 @@ export default { for (let i = 0; i < this.options.length; i++) { if (this.options[i].id === this.dataSource) { this.selectedDatasource = this.options[i] + this.mode = '0' if (this.engineMode === 'simple' || (!this.kettleRunning || this.disabledSyncDs.indexOf(this.selectedDatasource.type) !== -1 )) { this.disabledSync = true } else {