Browse Source

Merge pull request #139 in DEC/decision-webui-dcm from ~ABBY/decision-webui-dcm:persist/10.0 to persist/10.0

* commit 'f3802c5c8c095674372a1b9114d85ebb47885bb7':
  fix: 更新注释
  fix: 移除不必要的修改
  fix: BI-56355 如果数据库类型和驱动都为空,则认为是其他jdbc
  fix: DEC-11219 调整布局
  fix: DEC-11216 jdbc默认最小空闲值为0
  fix: 更新单元测试名称
  fix: DEC-11030 修复切换驱动时解析url的问题并补充单元测试
  fix: DEC-10992 修复数据库名包含特殊符号的问题
  fix: DEC-10944 修复修改工程servlet后,图片无法显示的问题
  fix: 修改插件接口,使用providew
  fix: DEC-10883 修改其他JDBC的类型为otherJDBC以区别旧版
qufenxi
Kara 5 years ago
parent
commit
53a34a6a09
  1. 53
      src/modules/__test__/app.test.ts
  2. 2
      src/modules/app.constant.ts
  3. 9
      src/modules/app.provider.ts
  4. 30
      src/modules/app.service.ts
  5. 1
      src/modules/app.ts
  6. 24
      src/modules/constants/constant.ts
  7. 3
      src/modules/constants/plugin.ts
  8. 2
      src/modules/pages/connection/connection_plugin/connection_plugin.ts
  9. 8
      src/modules/pages/database/database.ts
  10. 21
      src/modules/pages/maintain/forms/components/form.jdbc.ts
  11. 4
      src/modules/pages/maintain/forms/components/form.plugin.ts
  12. 6
      webpack/webpack.prod.js

53
src/modules/__test__/app.test.ts

@ -1,4 +1,4 @@
import { connectionCanEdit } from '../app.service'; import { connectionCanEdit, resolveUrlInfo, splitUrl, getJdbcDatabaseType } from '../app.service';
const connection = { const connection = {
connectionId: '', connectionId: '',
connectionType: '', connectionType: '',
@ -6,6 +6,57 @@ const connection = {
connectionData: '', connectionData: '',
}; };
/**
* test_author_alan
*/
test('DEC-11030 拼接url', () => {
expect(splitUrl('localhost', '22', 'dbname', 'jdbc:pivotal:greenplum://hostname:port;dbname')).toEqual('jdbc:pivotal:greenplum://localhost:22;dbname');
});
/**
* test_author_alan
*/
test('BI-56355 如果数据库类型和驱动都为空,则为其他jdbc', () => {
expect(getJdbcDatabaseType('', '').databaseType).toEqual('otherJDBC');
expect(getJdbcDatabaseType('mysql', '').databaseType).toEqual('mysql');
expect(getJdbcDatabaseType('', 'com.mysql.jdbc.Driver').databaseType).toEqual('mysql');
});
/**
* test_author_alan
*/
test('DEC-10992 数据连接名称带-', () => {
expect(resolveUrlInfo('jdbc:sqlserver://192.168.17.111:1433;databaseName=L-Pick-DAS-MengYan')).toEqual({
host: '192.168.17.111',
port: '1433',
databaseName: 'L-Pick-DAS-MengYan',
urlInfo: '',
});
});
test('解析url', () => {
expect(resolveUrlInfo('jdbc:postgresql://endpoint:port/database')).toEqual({
host: 'endpoint',
port: '',
databaseName: 'database',
urlInfo: '',
});
expect(resolveUrlInfo('jdbc:pivotal:greenplum://hostname:port;dbname')).toEqual({
host: 'hostname',
port: '',
databaseName: 'dbname',
urlInfo: '',
});
expect(resolveUrlInfo('jdbc:mysql://hostname:22/database')).toEqual({
host: 'hostname',
port: '22',
databaseName: 'database',
urlInfo: '',
});
});
/**
* test_author_alan
*/
test('BI-51537 判断数据连接是否有权限', () => { test('BI-51537 判断数据连接是否有权限', () => {
expect(connectionCanEdit({ expect(connectionCanEdit({
...connection, ...connection,

2
src/modules/app.constant.ts

@ -0,0 +1,2 @@
export const CONSTANT_PLUGIN_TYPES = 'dec.constant.database.conf.connect.types';
BI.constant(CONSTANT_PLUGIN_TYPES, []);

9
src/modules/app.provider.ts

@ -0,0 +1,9 @@
import { CONSTANT_PLUGIN_TYPES } from './app.constant';
BI.provider('dec.connection.provider.datebase', function() {
this.registerDatabaseType = (config: any) => {
BI.config(CONSTANT_PLUGIN_TYPES, connections => BI.concat(connections, config));
};
this.$get = () => BI.inherit(BI.OB, {
});
});

30
src/modules/app.service.ts

@ -1,5 +1,5 @@
import { DATA_BASE_TYPES, DATA_BASE_TYPES_OTHER, DESIGN_DRIVER_TYPE } from '@constants/constant'; import { DATA_BASE_TYPES, DATA_BASE_TYPES_OTHER, DESIGN_DRIVER_TYPE } from '@constants/constant';
import { CONSTANT_PLUGIN_TYPES, CONSTANT_PLUGIN_SHOW, CONSTANT_PLUGIN_EDIT } from '@constants/plugin'; import { CONSTANT_PLUGIN_TYPES } from './app.constant';
import { DatabaseType } from './app.typings'; import { DatabaseType } from './app.typings';
import { Connection } from './crud/crud.typings'; import { Connection } from './crud/crud.typings';
export function getAllDatabaseTypes():DatabaseType[] { export function getAllDatabaseTypes():DatabaseType[] {
@ -14,21 +14,25 @@ export function getAllDatabaseTypes():DatabaseType[] {
}), }),
]; ];
} }
function getPlugin(type: string) {
return BI.Constants.getConstant(CONSTANT_PLUGIN_TYPES).find(item => item.databaseType === type);
}
export function getPluginWidgetShow(plugin: string) { export function getPluginWidgetShow(plugin: string) {
return BI.Constants.getConstant(CONSTANT_PLUGIN_SHOW.replace('${databaseType}', plugin)); return BI.get(getPlugin(plugin), 'show');
} }
export function getPluginWidgetEdit(plugin: string) { export function getPluginWidgetEdit(plugin: string) {
return BI.Constants.getConstant(CONSTANT_PLUGIN_EDIT.replace('${databaseType}', plugin)); return BI.get(getPlugin(plugin), 'edit');
} }
// 由于database可能为空,所以为了兼容平台和设计器,需要根据driver来判断数据库类型 // 由于database可能为空,所以为了兼容平台和设计器,需要根据driver来判断数据库类型
export function getJdbcDatabaseType(database: string, driver: string): DatabaseType { export function getJdbcDatabaseType(database: string, driver: string): DatabaseType {
if (!database && !driver) {
return DATA_BASE_TYPES_OTHER;
}
let databaseType = null; let databaseType = null;
// KERNEL-1655 兼容旧版 由于旧版设计器创建的数据连接database都为other,所以要根据driber来判断数据类型 // KERNEL-1655 兼容旧版 由于旧版设计器创建的数据连接database都为other,所以要根据driber来判断数据类型
// DEC-10872 不能过滤other,因为新版数据连接创建的其他jdbc也是other类型,会混淆,需要和后端讨论一个最佳的解决方案。 if (database && database !== 'other' && DATA_BASE_TYPES.some(item => item.databaseType === database)) {
if (database && DATA_BASE_TYPES.some(item => item.databaseType === database)) {
databaseType = DATA_BASE_TYPES.find(item => item.databaseType === database); databaseType = DATA_BASE_TYPES.find(item => item.databaseType === database);
} else { } else {
const designDatabase = DESIGN_DRIVER_TYPE.find(item => item.driver === driver); const designDatabase = DESIGN_DRIVER_TYPE.find(item => item.driver === driver);
@ -45,7 +49,16 @@ export function getJdbcDatabaseType(database: string, driver: string): DatabaseT
export function resolveUrlInfo (url: string) { export function resolveUrlInfo (url: string) {
if (BI.isNull(url)) return {}; if (BI.isNull(url)) return {};
const result = url.match(/^jdbc:(oracle|mysql|sqlserver|db2|impala|kylin|phoenix|derby|gbase|gbasedbt-sqli|informix-sqli|h2|postgresql|hive2|vertica|kingbase|presto):(thin:([0-9a-zA-Z/]*)?@|thin:([0-9a-zA-Z/]*)?@\/\/|\/\/|)([0-9a-zA-Z_\\.-]+)(:([0-9|port]+))?(:|\/|;DatabaseName=)([0-9a-zA-Z_\\.]+)(.*)/i); const greenplumUrl = url.match(/^jdbc:(pivotal:greenplum):(thin:([0-9a-zA-Z/]*)?@\/\/|\/\/|)([0-9a-zA-Z_\\.-]+)(:([0-9|port]+))?(:|\/|;)([^]+)(.*)/i);
if (greenplumUrl) {
return {
host: greenplumUrl[4],
port: greenplumUrl[6] === 'port' ? '' : greenplumUrl[6],
databaseName: greenplumUrl[8],
urlInfo: greenplumUrl[9],
};
}
const result = url.match(/^jdbc:(oracle|mysql|sqlserver|db2|impala|kylin|phoenix|derby|gbase|gbasedbt-sqli|informix-sqli|h2|postgresql|hive2|vertica|kingbase|presto|redshift|postgresql):(thin:([0-9a-zA-Z/]*)?@|thin:([0-9a-zA-Z/]*)?@\/\/|\/\/|)([0-9a-zA-Z_\\.-]+)(:([0-9|port]+))?(:|\/|;DatabaseName=)([^]+)(.*)/i);
if (result) { if (result) {
return { return {
host: result[5], host: result[5],
@ -85,7 +98,8 @@ export function splitUrl(host: string, port: string, database: string, baseUrl:
} }
return baseUrl.replace('hostname', host).replace(':port', port ? `:${port}` : '') return baseUrl.replace('hostname', host).replace(':port', port ? `:${port}` : '')
.replace('database', database); .replace('database', database)
.replace('dbname', database);
} }
export function connectionCanEdit(connection: Connection) { export function connectionCanEdit(connection: Connection) {

1
src/modules/app.ts

@ -4,6 +4,7 @@ import { TitleXtype } from './title/title';
import { PAGE_INDEX } from './constants/constant'; import { PAGE_INDEX } from './constants/constant';
import { ConnectionXtype, DatebaseXtype, MaintainXtype, ConnectionPoolXtype } from './pages'; import { ConnectionXtype, DatebaseXtype, MaintainXtype, ConnectionPoolXtype } from './pages';
import { AppModel, AppModelXtype } from './app.model'; import { AppModel, AppModelXtype } from './app.model';
import './app.provider';
import '../less/index.less'; import '../less/index.less';
export const AppXtype = 'dec.dcm.main'; export const AppXtype = 'dec.dcm.main';

24
src/modules/constants/constant.ts

@ -1,4 +1,4 @@
import { CONSTANT_PLUGIN_TYPES } from './plugin'; import { CONSTANT_PLUGIN_TYPES } from '../app.constant';
export const PAGE_INDEX = { export const PAGE_INDEX = {
CONNECTION: 'connection', CONNECTION: 'connection',
@ -7,19 +7,18 @@ export const PAGE_INDEX = {
POOL: 'pool', POOL: 'pool',
}; };
export const OTHER_JDBC = 'otherJDBC';
export const DATEBASE_FILTER_TYPE = { export const DATEBASE_FILTER_TYPE = {
COMMONLY: 'commonly', COMMONLY: 'commonly',
ALL: 'all', ALL: 'all',
OTHER: 'other', OTHER: OTHER_JDBC,
}; };
BI.constant(CONSTANT_PLUGIN_TYPES, [
]);
export const DATA_BASE_TYPES_OTHER = export const DATA_BASE_TYPES_OTHER =
{ {
text: 'other', text: OTHER_JDBC,
databaseType: 'other', databaseType: OTHER_JDBC,
driver: '', driver: '',
url: '', url: '',
commonly: false, commonly: false,
@ -162,7 +161,7 @@ export const DATA_BASE_DRIVER_LINK = DecCst && DecCst.Hyperlink ? [
link: DecCst.Hyperlink.Database.INCEPTOR, link: DecCst.Hyperlink.Database.INCEPTOR,
}, },
{ {
databaseType: 'other', databaseType: OTHER_JDBC,
link: DecCst.Hyperlink.Database.OTHER, link: DecCst.Hyperlink.Database.OTHER,
}, },
] : []; ] : [];
@ -447,8 +446,8 @@ export const DATA_BASE_TYPES = [
hasSchema: false, hasSchema: false,
kerberos: false, kerberos: false,
urls: { urls: {
'com.mysql.jdbc.Driver': 'jdbc:mysql://localhost/dbname', 'com.mysql.jdbc.Driver': 'jdbc:mysql://hostname:port/database',
'org.gjt.mm.mysql.Driver': 'jdbc:mysql://localhost/dbname', 'org.gjt.mm.mysql.Driver': 'jdbc:mysql://hostname:port/database',
}, },
}, },
{ {
@ -570,13 +569,13 @@ export const DATA_BASE_TYPES = [
}, },
{ {
text: BI.i18nText('Dec-Dcm_Connection_JDBC_Other'), text: BI.i18nText('Dec-Dcm_Connection_JDBC_Other'),
databaseType: 'other', databaseType: OTHER_JDBC,
driver: 'org.h2.Driver', driver: 'org.h2.Driver',
drivers: ['org.h2.Driver', 'com.fr.third.org.hsqldb.jdbcDriver', 'org.sqlite.JDBC'], drivers: ['org.h2.Driver', 'com.fr.third.org.hsqldb.jdbcDriver', 'org.sqlite.JDBC'],
url: 'jdbc:h2://${ENV_HOME}/../database', url: 'jdbc:h2://${ENV_HOME}/../database',
commonly: false, commonly: false,
internal: true, internal: true,
type: 'other', type: OTHER_JDBC,
hasSchema: true, hasSchema: true,
kerberos: false, kerberos: false,
urls: { urls: {
@ -668,6 +667,7 @@ export const DEFAULT_JDBC_POOL = {
initialSize: 0, initialSize: 0,
maxActive: 50, maxActive: 50,
maxIdle: 10, maxIdle: 10,
minIdle: 0,
maxWait: 10000, maxWait: 10000,
testOnBorrow: true, testOnBorrow: true,
testOnReturn: false, testOnReturn: false,

3
src/modules/constants/plugin.ts

@ -1,3 +0,0 @@
export const CONSTANT_PLUGIN_TYPES = 'dec.constant.database.conf.connect.types';
export const CONSTANT_PLUGIN_SHOW = 'dec.constant.database.conf.connect.form.${databaseType}.show';
export const CONSTANT_PLUGIN_EDIT = 'dec.constant.database.conf.connect.form.${databaseType}.edit';

2
src/modules/pages/connection/connection_plugin/connection_plugin.ts

@ -12,7 +12,7 @@ export class ConnectionPlugin extends BI.Widget {
return { return {
type: getPluginWidgetShow(databaseType), type: getPluginWidgetShow(databaseType),
formData: this.model.connectionSelectedOne.connectionData, value: this.model.connectionSelectedOne.connectionData,
}; };
} }
} }

8
src/modules/pages/database/database.ts

@ -2,7 +2,7 @@ import { SearchEditor, Vtape, Right, Htape, Vertical, ButtonGroup, Left, Vertica
import { shortcut, store } from '@core/core'; import { shortcut, store } from '@core/core';
import { FilterXtype } from './filter/filter'; import { FilterXtype } from './filter/filter';
import { DatebaseModel, DatebaseModelXtype } from './database.model'; import { DatebaseModel, DatebaseModelXtype } from './database.model';
import { DATEBASE_FILTER_TYPE } from '@constants/constant'; import { DATEBASE_FILTER_TYPE, OTHER_JDBC } from '@constants/constant';
import { connectionType } from '@constants/env'; import { connectionType } from '@constants/env';
import { DatebaseTypeXtype } from './database_type/database_type'; import { DatebaseTypeXtype } from './database_type/database_type';
import { getAllDatabaseTypes } from '../../app.service'; import { getAllDatabaseTypes } from '../../app.service';
@ -56,7 +56,7 @@ export class Datebase extends BI.Widget {
if (this.model.isPlugin) { if (this.model.isPlugin) {
datebaseTypes = [...datebaseTypes, ...this.allDatabaseTypes.filter(item => !item.internal)]; datebaseTypes = [...datebaseTypes, ...this.allDatabaseTypes.filter(item => !item.internal)];
} }
this.store.setDatebaseTypes(datebaseTypes.filter(item => item.type !== connectionType.JNDI && item.type !== 'other')); this.store.setDatebaseTypes(datebaseTypes.filter(item => item.type !== connectionType.JNDI && item.type !== OTHER_JDBC));
} }
}, },
} }
@ -241,10 +241,10 @@ export class Datebase extends BI.Widget {
this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.commonly)); this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.commonly));
break; break;
case DATEBASE_FILTER_TYPE.OTHER: case DATEBASE_FILTER_TYPE.OTHER:
this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.type === connectionType.JNDI || item.type === 'other')); this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.type === connectionType.JNDI || item.type === OTHER_JDBC));
break; break;
default: default:
this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.type !== connectionType.JNDI && item.type !== 'other')); this.store.setDatebaseTypes(this.allDatabaseTypes.filter(item => item.type !== connectionType.JNDI && item.type !== OTHER_JDBC));
break; break;
} }
} }

21
src/modules/pages/maintain/forms/components/form.jdbc.ts

@ -98,13 +98,12 @@ export class FormJdbc extends BI.Widget {
const value = this.form.driver.getValue(); const value = this.form.driver.getValue();
const connectionData = this.options.formData.connectionData as ConnectionJDBC; const connectionData = this.options.formData.connectionData as ConnectionJDBC;
const connectionType = getJdbcDatabaseType(connectionData.database, connectionData.driver); const connectionType = getJdbcDatabaseType(connectionData.database, connectionData.driver);
if (connectionType.urls) { const url = connectionType.urls ? connectionType.urls[value] : connectionType.url;
this.form.url.setValue(connectionType.urls[value]); this.form.url.setValue(url);
const urlInfo = resolveUrlInfo(connectionType.urls[value]); const urlInfo = resolveUrlInfo(url);
this.form.host.setValue(urlInfo.host); this.form.host.setValue(urlInfo.host);
this.form.database.setValue(urlInfo.databaseName); this.form.database.setValue(urlInfo.databaseName);
this.form.port.setValue(urlInfo.port); this.form.port.setValue(urlInfo.port);
}
}, },
}], }],
}], }],
@ -375,6 +374,7 @@ export class FormJdbc extends BI.Widget {
}, },
{ {
type: CollapseXtype, type: CollapseXtype,
bgap: -15,
width: 70, width: 70,
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Advanced_Setting'), name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Advanced_Setting'),
listeners: [ listeners: [
@ -397,6 +397,7 @@ export class FormJdbc extends BI.Widget {
items: [ items: [
{ {
type: FormItemXtype, type: FormItemXtype,
tgap: 15,
name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Initial_Size'), name: BI.i18nText('Dec-Dcm_Connection_Form_Database_Initial_Size'),
forms: [{ forms: [{
type: TextCheckerXtype, type: TextCheckerXtype,
@ -692,11 +693,13 @@ export class FormJdbc extends BI.Widget {
} }
private onHostPortChange(databaseType) { private onHostPortChange(databaseType) {
const { url = '' } = databaseType; const { urls, url } = databaseType;
const driver = this.form.driver.getValue();
const selectUrl = BI.get(urls, driver) || url;
const host = this.form.host.getValue(); const host = this.form.host.getValue();
const port = this.form.port.getValue(); const port = this.form.port.getValue();
const database = this.form.database.getValue(); const database = this.form.database.getValue();
this.form.url.setValue(splitUrl(host, port, database, url)); this.form.url.setValue(splitUrl(host, port, database, selectUrl));
} }
public setSchemas(schemas: string[]) { public setSchemas(schemas: string[]) {

4
src/modules/pages/maintain/forms/components/form.plugin.ts

@ -18,7 +18,7 @@ export class FormPlugin extends BI.Widget {
ref: (_ref: any) => { ref: (_ref: any) => {
this.plugin = _ref; this.plugin = _ref;
}, },
formData: this.options.formData.connectionData, value: this.options.formData.connectionData,
}; };
} }
@ -29,7 +29,7 @@ export class FormPlugin extends BI.Widget {
connectionId, connectionId,
connectionType, connectionType,
connectionName, connectionName,
connectionData: this.plugin.getSubmitValue(), connectionData: this.plugin.getValue(),
}; };
} }
} }

6
webpack/webpack.prod.js

@ -51,9 +51,9 @@ module.exports = merge.smart(common, {
options: { options: {
plugins: [vars({ plugins: [vars({
variables: { variables: {
fontUrl: '/webroot/decision/resources?path=/com/fr/web/ui/font', fontUrl: '${fineServletURL}/resources?path=/com/fr/web/ui/font',
imageUrl: '/webroot/decision/resources?path=/com/fr/web/resources/dist/images/1x', imageUrl: '${fineServletURL}/resources?path=/com/fr/web/resources/dist/images/1x',
image2xUrl: '/webroot/decision/resources?path=/com/fr/web/resources/dist/images/2x', image2xUrl: '${fineServletURL}/resources?path=/com/fr/web/resources/dist/images/2x',
} }
})] })]
}, },

Loading…
Cancel
Save