From 8bcdadec6db465a73f03cbfbcb69e1a48a127672 Mon Sep 17 00:00:00 2001 From: "Aries.lsy" <”Aries.lsy@fanruan.com“> Date: Thu, 9 Mar 2023 10:37:48 +0800 Subject: [PATCH 01/10] =?UTF-8?q?REPORT-91394=20fix:jdbcResolve=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=80=82=E9=85=8Dsyabse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/app.provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/app.provider.ts b/src/modules/app.provider.ts index 791d2be..6ce5bce 100644 --- a/src/modules/app.provider.ts +++ b/src/modules/app.provider.ts @@ -26,7 +26,7 @@ BI.provider('dec.connection.provider.datebase', function () { urlInfo: greenplumUrl[9], }; } - const result = url.match(/^jdbc:(mysql|sqlserver|db2|dm|impala|kylin|phoenix|derby|gbase|gbasedbt-sqli|informix-sqli|h2|postgresql|hive2|vertica|kingbase|presto|redshift|postgresql|clickhouse|trino):(thin:([0-9a-zA-Z/]*)?@|thin:([0-9a-zA-Z/]*)?@\/\/|\/\/|)([0-9a-zA-Z_\\.-]+)(:([0-9|port]+))?(\/|;DatabaseName=)?([^]+)?(.*)/i); + const result = url.match(/^jdbc:(mysql|sqlserver|db2|dm|impala|kylin|phoenix|derby|gbase|gbasedbt-sqli|informix-sqli|h2|postgresql|hive2|vertica|kingbase|presto|redshift|postgresql|clickhouse|trino|sybase:Tds):(thin:([0-9a-zA-Z/]*)?@|thin:([0-9a-zA-Z/]*)?@\/\/|\/\/|)([0-9a-zA-Z_\\.-]+)(:([0-9|port]+))?(\/|;DatabaseName=)?([^]+)?(.*)/i); if (result) { return { host: result[5], From 4f09f02a5d928e66696b0cf3f0565d0c29903766 Mon Sep 17 00:00:00 2001 From: "Austin.Duan" Date: Fri, 17 Mar 2023 15:13:51 +0800 Subject: [PATCH 02/10] =?UTF-8?q?REPORT-90357=20fix:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BB=E6=9C=BA=E3=80=81=E7=AB=AF=E5=8F=A3=E5=90=8E=E6=B8=85?= =?UTF-8?q?=E7=A9=BA=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/maintain/forms/components/form.jdbc.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/modules/pages/maintain/forms/components/form.jdbc.ts b/src/modules/pages/maintain/forms/components/form.jdbc.ts index 869f63d..7db6718 100644 --- a/src/modules/pages/maintain/forms/components/form.jdbc.ts +++ b/src/modules/pages/maintain/forms/components/form.jdbc.ts @@ -1015,6 +1015,14 @@ export class FormJdbc extends BI.Widget { watermark: BI.i18nText('Dec-Dcm_Connection_Form_Host'), allowBlank: false, value: sshIp || 'hostname', + listeners: [ + { + eventName: BI.Editor.EVENT_CHANGE, + action: () => { + this.form.sshSecret.setValue(""); + } + } + ] }, ], }, @@ -1038,6 +1046,14 @@ export class FormJdbc extends BI.Widget { valueRangeConfig, ], value: String(sshPort || 22), + listeners: [ + { + eventName: BI.Editor.EVENT_CHANGE, + action: () => { + this.form.sshSecret.setValue(""); + } + } + ] }, ], }, From af72fa4a51436027f6cbedf46f492979cd8fc641 Mon Sep 17 00:00:00 2001 From: "Austin.Duan" Date: Mon, 20 Mar 2023 16:36:31 +0800 Subject: [PATCH 03/10] =?UTF-8?q?REPORT-90545:=20=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=B9=B3=E5=8F=B0=E5=89=8D=E7=AB=AF=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/test_status/test_status.ts | 36 +++++++++--- src/modules/crud/api.ts | 12 ++++ src/modules/crud/crud.typings.d.ts | 9 ++- src/modules/crud/decision.api.ts | 23 +++++++- src/modules/crud/design.api.ts | 23 +++++++- .../pages/maintain/forms/form.server.ts | 58 ++++++++++++++++++- types/globals.d.ts | 1 + 7 files changed, 148 insertions(+), 14 deletions(-) diff --git a/src/modules/components/test_status/test_status.ts b/src/modules/components/test_status/test_status.ts index 8929f7d..c9c6bf0 100644 --- a/src/modules/components/test_status/test_status.ts +++ b/src/modules/components/test_status/test_status.ts @@ -29,7 +29,9 @@ export class TestStatus extends BI.Widget { failDriverMessage: Label; driverLink: FloatLeftLayout; detail: VerticalLayout; - failMaskers:any; + failMaskers: any; + + extraContainer: VerticalLayout; watch = { status: (status: string) => { @@ -38,8 +40,9 @@ export class TestStatus extends BI.Widget { } render() { + const LAYOUT_WIDTH = 400; const { loadingCls, loadingText, successCls, successText, failCls, failText, retryText } = this.options; - var self=this; + var self = this; return { type: BI.CenterAdaptLayout.xtype, cls: 'bi-z-index-mask', @@ -71,10 +74,10 @@ export class TestStatus extends BI.Widget { tipCls: failCls, tipText: failText, retryText, - ref:(_ref:any)=>{ - self.failMaskers=_ref; - if(this.failMessage.getText()===''){ - this.failMaskers.populateFail(BI.i18nText("Dec-Conn-ect-Failed"),false); + ref: (_ref: TipFail) => { + this.failMaskers = _ref; + if (BI.isEmptyString(this.failMessage.getText())) { + this.failMaskers.populateFail(BI.i18nText('Dec-Conn-ect-Failed'), false); } }, listeners: [ @@ -123,10 +126,17 @@ export class TestStatus extends BI.Widget { scrolly: true, height: 75, items: [ + { + type: BI.VerticalLayout.xtype, + width: LAYOUT_WIDTH, + ref: (_ref: VerticalLayout) => { + this.extraContainer = _ref; + } + }, { type: BI.Label.xtype, whiteSpace: 'normal', - width: 400, + width: LAYOUT_WIDTH, textAlign: 'left', text: '', ref: (_ref: Label) => { @@ -175,7 +185,7 @@ export class TestStatus extends BI.Widget { this.store.setStatus(TEST_STATUS.SUCCESS); } - setFail(message: string='', driver = '', link = '') { + setFail(message: string = '', driver = '', link = '') { this.store.setStatus(TEST_STATUS.FAIL); this.failMessage.setText(message); this.failDriverMessage.setVisible(!!driver); @@ -189,4 +199,14 @@ export class TestStatus extends BI.Widget { setLoading() { this.store.setStatus(TEST_STATUS.LOADING); } + + /** + * 设置报错弹窗自定义展示内容 + */ + setExtraContainer(container: Obj) { + BI.createWidget({ + ...container, + element: this.extraContainer, + }); + } } diff --git a/src/modules/crud/api.ts b/src/modules/crud/api.ts index daa9e4d..01ed8dd 100644 --- a/src/modules/crud/api.ts +++ b/src/modules/crud/api.ts @@ -5,6 +5,7 @@ import { ConnectionPoolType, SocketResult, ResultType, + checkDriverStatusParams, } from './crud.typings'; export interface Api { @@ -46,6 +47,17 @@ export interface Api { */ testConnection(data: Connection): Promise; + /** + * 获取驱动加载路径 + */ + getDriverLoadPath(data: Connection): Promise>; + + /** + * 检测驱动冲突状态 + * @param data 驱动路径 + */ + checkDriverStatus(data: checkDriverStatusParams): Promise>; + /** * 获取连接池数据 * @param name diff --git a/src/modules/crud/crud.typings.d.ts b/src/modules/crud/crud.typings.d.ts index 0193583..f9baae9 100644 --- a/src/modules/crud/crud.typings.d.ts +++ b/src/modules/crud/crud.typings.d.ts @@ -306,8 +306,13 @@ export interface SocketResult { errorMsg?: string; } -export interface ResultType { - data?: any; +export interface ResultType { + data?: T; errorCode?: string; errorMsg?: string; } + +export type checkDriverStatusParams = { + path: string; + driver: ConnectionJDBC['driver'] +} \ No newline at end of file diff --git a/src/modules/crud/decision.api.ts b/src/modules/crud/decision.api.ts index a77f406..54bbc9e 100644 --- a/src/modules/crud/decision.api.ts +++ b/src/modules/crud/decision.api.ts @@ -1,5 +1,5 @@ import { Api } from './api'; -import { Connection, TestRequest, ConnectionPoolType, SocketResult, ConnectionLicInfo } from './crud.typings'; +import { Connection, TestRequest, ConnectionPoolType, SocketResult, ConnectionLicInfo, ResultType, checkDriverStatusParams } from './crud.typings'; import { requestGet, requestDelete, requestPost, requestPut } from './crud.service'; import { editStatusEvent, errorCode } from '@constants/env'; @@ -48,6 +48,27 @@ export class DecisionApi implements Api { return requestPost('test', form); } + /** + * 获取驱动加载路径 + * @returns + */ + getDriverLoadPath(data: Connection): Promise> { + const form = { + ...data, + connectionData: JSON.stringify(data.connectionData), + } + + return requestPost('driver/path', form); + } + + /** + * 检测驱动冲突状态 + * @param data 驱动路径 + */ + checkDriverStatus(data: checkDriverStatusParams): Promise> { + return requestGet(Dec.Utils.getEncodeURL('test/driver/conflict', '', data)); + } + getConnectionPool(name: string): Promise<{ data?: ConnectionPoolType }> { return requestGet(`pool/info?connectionName=${encodeURIComponent(name)}`, {}); } diff --git a/src/modules/crud/design.api.ts b/src/modules/crud/design.api.ts index 643ad8e..b1e3d2d 100644 --- a/src/modules/crud/design.api.ts +++ b/src/modules/crud/design.api.ts @@ -1,5 +1,5 @@ import { Api } from './api'; -import { Connection, TestRequest, ConnectionPoolType, SocketResult, ConnectionLicInfo } from './crud.typings'; +import { Connection, TestRequest, ConnectionPoolType, SocketResult, ConnectionLicInfo, ResultType, ConnectionJDBC, checkDriverStatusParams } from './crud.typings'; import { requestGet } from './crud.service'; // TODO: 此页面的接口等待设计器提供相应的方法 @@ -39,6 +39,27 @@ export class DesignApi implements Api { }); } + /** + * 获取驱动加载路径 + * @param name + * @returns + */ + getDriverLoadPath(data: Connection): Promise> { + return new Promise(resolve => { + resolve({ data: '' }); + }); + } + + /** + * 检测驱动冲突状态 + * @param data 驱动路径 + */ + checkDriverStatus(data: checkDriverStatusParams): Promise> { + return new Promise(resolve => { + resolve({ data: false }); + }) + } + getConnectionPool(name: string): Promise<{ data: ConnectionPoolType }> { return new Promise(resolve => { resolve({ diff --git a/src/modules/pages/maintain/forms/form.server.ts b/src/modules/pages/maintain/forms/form.server.ts index 67647fc..2098ac1 100644 --- a/src/modules/pages/maintain/forms/form.server.ts +++ b/src/modules/pages/maintain/forms/form.server.ts @@ -5,6 +5,7 @@ import { TestStatus } from '../../../components/test_status/test_status'; import { getJdbcDatabaseType } from '../../../app.service'; import { ApiFactory } from '../../../crud/apiFactory'; const api = new ApiFactory().create(); + export function testConnection(value: Connection): Promise { return new Promise(resolve => { let testStatus = null; @@ -15,16 +16,18 @@ export function testConnection(value: Connection): Promise { return false; } + const id = BI.UUID(); const testConnection = () => { const formValue = value; + api.testConnection(formValue).then(re => { if (re && re.errorCode) { - if(re.errorCode === DecCst.ErrorCode.NO_IP_AUTHORIZED){ + if (re.errorCode === DecCst.ErrorCode.NO_IP_AUTHORIZED) { testStatus.setFail(); return; } - // 判断是否是缺少驱动,如果缺少驱动则显示下载驱动的连接 + // 判断是否是缺少驱动,如果缺少驱动则显示下载驱动的连接 if (api.isDriverError(re.errorCode)) { if (formValue.connectionType === connectionType.JDBC) { const driver = (formValue.connectionData as ConnectionJDBC).driver; @@ -44,7 +47,11 @@ export function testConnection(value: Connection): Promise { } else if (re.errorCode === errorCode.DUPLICATE_NAMES) { testStatus.setFail(BI.i18nText(re.errorMsg)); } else { + // 不缺少驱动,但连接失败,打印出当前驱动加载路径,并显示检测驱动按钮 testStatus.setFail(re.errorMsg); + api.getDriverLoadPath(formValue).then(res => { + testStatus.setExtraContainer(createDriverTestContainer(res.data)); + }) } } else if (re.data) { testStatus.setSuccess(); @@ -59,7 +66,54 @@ export function testConnection(value: Connection): Promise { BI.Maskers.remove(id); } }); + + /** + * 驱动及冲突检测内容,补充到报错弹窗里 + */ + function createDriverTestContainer(path: string) { + return { + type: BI.VerticalLayout.xtype, + vgap: 5, + items: [ + { + type: BI.Label.xtype, + text: BI.i18nText('Dec-Connection_Driver_Current_Load_Path', path), + textAlign: 'left', + whiteSpace: 'normal', + }, + { + type: BI.TextButton.xtype, + cls: 'bi-high-light', + text: BI.i18nText('Dec-Connection_Driver_Check'), + textAlign: 'left', + handler: () => { + api.checkDriverStatus({ + driver: (formValue.connectionData as ConnectionJDBC).driver, + path, + }).then(res => { + const isDriverConflict = res.data; + + testStatus.setExtraContainer({ + type: BI.VerticalLayout.xtype, + items: [ + { + type: BI.Label.xtype, + textAlign: 'left', + text: isDriverConflict + ? BI.i18nText('Dec-Connection_Driver_Has_Confilt_Tip') + : BI.i18nText('Dec-Connection_Driver_No_Confilt_Tip'), + cls: isDriverConflict ? 'bi-error' : '', + } + ] + }) + }); + } + } + ] + } + } }; + BI.Maskers.create(id, null, { render: { type: TestStatus.xtype, diff --git a/types/globals.d.ts b/types/globals.d.ts index f868d4b..0eb147e 100644 --- a/types/globals.d.ts +++ b/types/globals.d.ts @@ -16,6 +16,7 @@ declare const Dec: { personal: { username: string; }; + Utils: Obj; reqByEncrypt: (method: AxiosType.X_Method, url: string, data?: any, config?: AxiosType.X_AxiosRequestConfig) => {}, socketEmit: (type: string, name: string, callback: (re: any) => void) => void; // req From 68aef91840844073d5ed770b71dd5f79e31840ab Mon Sep 17 00:00:00 2001 From: "Austin.Duan" Date: Mon, 20 Mar 2023 16:43:29 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/components/test_status/test_status.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/components/test_status/test_status.ts b/src/modules/components/test_status/test_status.ts index c9c6bf0..a055e6e 100644 --- a/src/modules/components/test_status/test_status.ts +++ b/src/modules/components/test_status/test_status.ts @@ -42,7 +42,7 @@ export class TestStatus extends BI.Widget { render() { const LAYOUT_WIDTH = 400; const { loadingCls, loadingText, successCls, successText, failCls, failText, retryText } = this.options; - var self = this; + return { type: BI.CenterAdaptLayout.xtype, cls: 'bi-z-index-mask', From a39db945c754cd0c3e8700bdc3238afed9375a18 Mon Sep 17 00:00:00 2001 From: "Austin.Duan" Date: Mon, 20 Mar 2023 16:54:24 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E6=97=A0JIRA=EF=BC=8C=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=B8=8B=E6=A0=BC=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/crud/crud.typings.d.ts | 2 +- src/modules/crud/decision.api.ts | 2 +- src/modules/crud/design.api.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/crud/crud.typings.d.ts b/src/modules/crud/crud.typings.d.ts index f9baae9..8a5c8b9 100644 --- a/src/modules/crud/crud.typings.d.ts +++ b/src/modules/crud/crud.typings.d.ts @@ -314,5 +314,5 @@ export interface ResultType { export type checkDriverStatusParams = { path: string; - driver: ConnectionJDBC['driver'] + driver: ConnectionJDBC['driver']; } \ No newline at end of file diff --git a/src/modules/crud/decision.api.ts b/src/modules/crud/decision.api.ts index 54bbc9e..dbcf141 100644 --- a/src/modules/crud/decision.api.ts +++ b/src/modules/crud/decision.api.ts @@ -56,7 +56,7 @@ export class DecisionApi implements Api { const form = { ...data, connectionData: JSON.stringify(data.connectionData), - } + }; return requestPost('driver/path', form); } diff --git a/src/modules/crud/design.api.ts b/src/modules/crud/design.api.ts index b1e3d2d..d629b16 100644 --- a/src/modules/crud/design.api.ts +++ b/src/modules/crud/design.api.ts @@ -57,7 +57,7 @@ export class DesignApi implements Api { checkDriverStatus(data: checkDriverStatusParams): Promise> { return new Promise(resolve => { resolve({ data: false }); - }) + }); } getConnectionPool(name: string): Promise<{ data: ConnectionPoolType }> { From 2a69cb9907a7c53520b47563c689f2a7aa6d5702 Mon Sep 17 00:00:00 2001 From: "Aries.lsy" <”Aries.lsy@fanruan.com“> Date: Mon, 20 Mar 2023 16:54:28 +0800 Subject: [PATCH 06/10] =?UTF-8?q?KERNEL-10281=20docs:=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BF=9E=E6=8E=A5readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cca899a..50cd82d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## 开始 安装依赖 ``` -yarn +yarn install ``` 开始开发 @@ -15,6 +15,104 @@ yarn yarn dev ``` +## 决策平台开发: + +### A.项目运行 + +#### 1. 工程`decision-webui-dev`添加代理(可跳过) +```js + webpack/webpack.config + "/plugin/dcm": { + pathRewrite: { "^/plugin/dcm": "" }, + target: "http://localhost:10002", + }, +``` +#### 2. 工程`decision-webui-dev`引入 + fr环境:`templates/bundle.report.html` bi环境:`templates/bundle.bi.html` + +```html + // css 文件: + + + + + + // js 文件 + +``` + 若未设1,将`/plugin/dcm`替换成`http://localhost:10002`亦可 +#### 3. 启动工程[decision-webui-dev]以及数据连接[desicion-webui-dcm]工程 + +#### 4. 此时工程`decision-webui-dev`的`http://localhost:9002/#management/connnection`数据连接模块已替换成该工程 + +### B.插件形式添加数据连接-数据库 + +#### 1. 以多版本的tdsql为例 单一版本数据库不需drivers,versions,hasSchemas + +```js +BI.config("dec.connection.provider.datebase", function (provider) { + BI.isFunction(provider.registerJdbcDatabase) && provider.registerJdbcDatabase({ + text: 'TDSQL', // 数据库名称 + databaseType: 'tdsql', // 数据库key + driver: 'org.postgresql.Driver', // 默认驱动 + drivers: { + "pgsql": ["org.postgresql.Driver"], + "mysql": ["com.mysql.jdbc.Driver"] + }, // 驱动可选项,version: array[driver],[0]为该版本的默认驱动 + versions: ["pgsql", "mysql"], // array[version] + urls: { + "org.postgresql.Driver": "jdbc:postgresql://hostname:port/database?finedbType=tdsql-pgsql", + "com.mysql.jdbc.Driver": "jdbc:mysql://hostname:port/database?finedbType=tdsql-mysql" + }, // urlkey : url 一个驱动对应一个url + url: 'jdbc:postgresql://hostname:port/database?finedbType=tdsql-pgsql', + commonly: false, + internal: true, + type: 'jdbc', 数据库类型 + hasSchema: true, // 默认是否支持模式 + hasSchemas: { + "pgsql": true, + "mysql": false, + },是否支持模式 version: boolean + kerberos: false, // 是否添加kerberos认证方式 + }, function (url) { + var result = url.match(/^jdbc:(mysql|postgresql):\/\/([0-9a-zA-Z_\\.-]+)(:([0-9|port]+))?\/([0-9a-zA-Z_\\.]+)(.*)finedbType=([^&]+)(|(&.*))/i); // 匹配正则 + if (result) { + return { + host: result[2], //主机 + port: result[4] === "port" ? "" : result[4], // 端口 + databaseName: result[5], // 数据库名称 + version: result[7].split('-')[1] ?? "pgsql", // 版本 单版本不要返回这个 + }; + } +//适配原先tbase的url + result = url.match(/^jdbc:postgresql:\/\/([0-9a-zA-Z_\\.-]+)(:([0-9|port]+))?\/([0-9a-zA-Z_\\.]+)(.*)/i); + if (result) { + return { + host: result[1], + port: result[3] === "port" ? "" : result[3], + databaseName: result[4], + version: "pgsql", + }; + } + + }); + }); +``` + +### C 工程开发 + +#### 1. 图片资源添加 + 工程`decision-webui-dev` + decision-webui/dist/images/1x/icon/database + decision-webui/dist/images/2x/icon/database + +#### 2. 国际化添加 + 工程`decision-webui-dev` + decision-i18n/decision-main-i18n/src/main/resources/com/fr/decision/web/i18n + +#### 3. 版本控制 + 版本和平台保持一致 + ## 接口文档: ### 增加数据连接类型 使用`BI.config`,ConstantName名称为`dec.constant.database.conf.connect.types`,值为连接的名称 From 6efad99c382b76b62ca0251dca88de54df16b890 Mon Sep 17 00:00:00 2001 From: "Aries.lsy" <”Aries.lsy@fanruan.com“> Date: Wed, 22 Mar 2023 11:34:31 +0800 Subject: [PATCH 07/10] =?UTF-8?q?REPORT-92280=20fix:timeBetweenEvictionRun?= =?UTF-8?q?sMillis=E9=BB=98=E8=AE=A4=E5=80=BC=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/constants/constant.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/constants/constant.ts b/src/modules/constants/constant.ts index dbf1b28..fa34f1f 100644 --- a/src/modules/constants/constant.ts +++ b/src/modules/constants/constant.ts @@ -831,7 +831,7 @@ export const DEFAULT_JDBC_POOL = { testOnBorrow: true, testOnReturn: false, testWhileIdle: false, - timeBetweenEvictionRunsMillis: -1, + timeBetweenEvictionRunsMillis: 60000, numTestsPerEvictionRun: 3, minEvictableIdleTimeMillis: 1800, }; From 04a10740ec7ebc06c3006160af3d668eeb4176ea Mon Sep 17 00:00:00 2001 From: "Austin.Duan" Date: Wed, 22 Mar 2023 15:25:29 +0800 Subject: [PATCH 08/10] =?UTF-8?q?REPORT-91742=20fix:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=BF=9E=E6=8E=A5=E5=A4=B1=E8=B4=A5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/connection/list/list_item/list_item.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/modules/pages/connection/list/list_item/list_item.ts b/src/modules/pages/connection/list/list_item/list_item.ts index 58537d7..a3c9f2c 100644 --- a/src/modules/pages/connection/list/list_item/list_item.ts +++ b/src/modules/pages/connection/list/list_item/list_item.ts @@ -6,6 +6,9 @@ import { hasRegistered } from '../list.service'; import { connectionCanEdit, getTextByDatabaseType, getChartLength } from '../../../../app.service'; import { testConnection } from '../../../maintain/forms/form.server'; import { DownListCombo, Label, SignEditor } from '@fui/core'; +import { ApiFactory } from '../../../../crud/apiFactory'; + +const api = new ApiFactory().create(); @shortcut() @store(ListItemModel) @@ -206,8 +209,17 @@ export class ListItem extends BI.BasicButton { } private testConnectionAction() { - const { name } = this.options; - testConnection(this.model.connections.find(item => item.connectionName === name)); + // 接口返回的内容是对称加密的,前端要先解密再用新加密传回去 + const connection = this.model.connections + .find(item => item.connectionName === this.options.name) || {}; + + if (BI.isNull(connection)) return; + + const validationQuery = connection?.connectionData?.connectionPoolAttr?.validationQuery; + + BI.set(connection, 'connectionData.connectionPoolAttr.validationQuery', api.getCipher(api.getPlain(validationQuery))); + + testConnection(connection); } private itemActionCalculate() { From ad38c145260f0e8909616eef5abe586ac84c5e10 Mon Sep 17 00:00:00 2001 From: "Austin.Duan" Date: Wed, 22 Mar 2023 15:29:13 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8B=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/pages/connection/list/list_item/list_item.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/pages/connection/list/list_item/list_item.ts b/src/modules/pages/connection/list/list_item/list_item.ts index a3c9f2c..63e186c 100644 --- a/src/modules/pages/connection/list/list_item/list_item.ts +++ b/src/modules/pages/connection/list/list_item/list_item.ts @@ -211,7 +211,7 @@ export class ListItem extends BI.BasicButton { private testConnectionAction() { // 接口返回的内容是对称加密的,前端要先解密再用新加密传回去 const connection = this.model.connections - .find(item => item.connectionName === this.options.name) || {}; + .find(item => item.connectionName === this.options.name); if (BI.isNull(connection)) return; From 9fa393d58399b94d24ad38decf9820dc12e1132c Mon Sep 17 00:00:00 2001 From: "Austin.Duan" Date: Wed, 22 Mar 2023 15:57:20 +0800 Subject: [PATCH 10/10] =?UTF-8?q?REPORT-91742=20fix:=20=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E4=B8=8B=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/pages/connection/list/list_item/list_item.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/pages/connection/list/list_item/list_item.ts b/src/modules/pages/connection/list/list_item/list_item.ts index 63e186c..60736d3 100644 --- a/src/modules/pages/connection/list/list_item/list_item.ts +++ b/src/modules/pages/connection/list/list_item/list_item.ts @@ -215,7 +215,7 @@ export class ListItem extends BI.BasicButton { if (BI.isNull(connection)) return; - const validationQuery = connection?.connectionData?.connectionPoolAttr?.validationQuery; + const validationQuery = connection?.connectionData?.connectionPoolAttr?.validationQuery || ''; BI.set(connection, 'connectionData.connectionPoolAttr.validationQuery', api.getCipher(api.getPlain(validationQuery)));