Browse Source

update

main
wangshaoping 12 months ago
parent
commit
ed419c60e8
  1. 2
      gradle.properties
  2. 2
      io.sc.engine.mv.frontend/package.json
  3. 3
      io.sc.platform.core.frontend/package.json
  4. 8
      io.sc.platform.core.frontend/src/platform/components/form/elements/WCodeMirror.vue
  5. 2
      io.sc.platform.core.frontend/src/platform/components/form/elements/WPosition.vue
  6. 15
      io.sc.platform.core.frontend/src/views/FormElements.vue
  7. 5
      io.sc.platform.core.frontend/template-project/package.json
  8. 24
      io.sc.platform.core.frontend/template-project/src/views/FormElements.vue
  9. 1
      io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs
  10. 2
      io.sc.platform.core.frontend/template-project/webpack.env.build.cjs
  11. 1
      io.sc.platform.core.frontend/webpack.config.mf.cjs
  12. 2
      io.sc.platform.core.frontend/webpack.env.build.cjs
  13. 2
      io.sc.platform.developer.frontend/package.json
  14. 102
      io.sc.platform.developer.frontend/src/views/backend/ExportLiquibase.vue
  15. 4
      io.sc.platform.jdbc.liquibase/src/main/resources/templates/io/sc/platform/jdbc/liquibase/installer/installer.html
  16. 2
      io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java
  17. 15
      io.sc.platform.jdbc.schemacrawler/src/main/resources/META-INF/platform/plugins/components.json
  18. 6
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/DatasourceType.java
  19. 22
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcConnectionTemplateWebController.java
  20. 29
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcMetaDataLoaderWebController.java
  21. 7
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcConnectionTemplateService.java
  22. 12
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcMetaDataLoaderService.java
  23. 4
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/DatasourceServiceImpl.java
  24. 17
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcConnectionTemplateServiceImpl.java
  25. 52
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcMetaDataLoaderServiceImpl.java
  26. 34
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/support/DatasourceConfigRowMapper.java
  27. 1
      io.sc.platform.jdbc/src/main/resources/META-INF/platform/plugins/components.json
  28. 5
      io.sc.platform.jdbc/src/main/resources/META-INF/platform/plugins/messages.json
  29. 2
      io.sc.platform.jdbc/src/main/resources/io/sc/platform/jdbc/i18n/messages.properties
  30. 2
      io.sc.platform.jdbc/src/main/resources/io/sc/platform/jdbc/i18n/messages_tw_CN.properties
  31. 2
      io.sc.platform.jdbc/src/main/resources/io/sc/platform/jdbc/i18n/messages_zh_CN.properties
  32. 2
      io.sc.platform.lcdp.frontend/package.json
  33. 2
      io.sc.platform.mvc.frontend/package.json
  34. 2
      io.sc.platform.security.frontend/package.json
  35. 2
      io.sc.platform.system.frontend/package.json
  36. 6
      io.sc.platform.system.frontend/src/components/index.ts
  37. 32
      io.sc.platform.system.frontend/src/i18n/messages.json
  38. 10
      io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json
  39. 32
      io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json
  40. 44
      io.sc.platform.system.frontend/src/menus/menus.json
  41. 45
      io.sc.platform.system.frontend/src/routes/routes.json
  42. 172
      io.sc.platform.system.frontend/src/views/datasource/ConnectionPropertiesDialog.vue
  43. 168
      io.sc.platform.system.frontend/src/views/datasource/Datasource.vue
  44. 16
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/controller/DsWebController.java
  45. 23
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/entity/DsEntity.java
  46. 2
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/entity/JdbcDsEntity.java
  47. 2
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/entity/JndiDsEntity.java
  48. 2
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/repository/DsRepository.java
  49. 4
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/DsService.java
  50. 32
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/impl/DsServiceImpl.java
  51. 92
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/impl/messages.properties
  52. 90
      io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/impl/messages_zh.properties
  53. 1
      io.sc.platform.system/src/main/resources/liquibase/io.sc.platform.system_8.0.0_20220606__System Database Schema DDL.xml

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.1.24 platform_version=8.1.24
platform_plugin_version=8.1.13 platform_plugin_version=8.1.13
platform_core_frontend_version=8.1.119 platform_core_frontend_version=8.1.133
########################################################### ###########################################################
# dependencies version # dependencies version

2
io.sc.engine.mv.frontend/package.json

@ -80,7 +80,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.119", "platform-core": "8.1.133",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

3
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.132", "version": "8.1.133",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件", "//main": "库的主文件",
"main": "dist/platform-core.js", "main": "dist/platform-core.js",
@ -123,7 +123,6 @@
"quasar": "2.14.5", "quasar": "2.14.5",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",
"vue-codemirror6": "1.2.0",
"vue-dompurify-html": "5.0.1", "vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0", "vue-i18n": "9.8.0",
"vue-router": "4.2.5" "vue-router": "4.2.5"

8
io.sc.platform.core.frontend/src/platform/components/form/elements/WCodeMirror.vue

@ -44,7 +44,7 @@ import { ref, useAttrs, onMounted, onUnmounted, watch, computed, toRaw } from 'v
import { Tools } from '@/platform'; import { Tools } from '@/platform';
import { FormValidators } from '@/platform/components'; import { FormValidators } from '@/platform/components';
import { EditorView } from '@codemirror/view'; import { EditorView } from '@codemirror/view';
import { EditorState, Compartment } from '@codemirror/state'; import { EditorState, StateEffect, Compartment } from '@codemirror/state';
import * as view from '@codemirror/view'; import * as view from '@codemirror/view';
import * as language from '@codemirror/language'; import * as language from '@codemirror/language';
import * as commands from '@codemirror/commands'; import * as commands from '@codemirror/commands';
@ -213,6 +213,7 @@ onMounted(() => {
basicSetup, basicSetup,
language.of(getLanguage(props.lang)), language.of(getLanguage(props.lang)),
tabSize.of(EditorState.tabSize.of(props.tabSize)), tabSize.of(EditorState.tabSize.of(props.tabSize)),
EditorState.readOnly.of(props.readonlyIf(props.form)),
EditorView.theme({ EditorView.theme({
'&': { '&': {
outline: 'none !important', outline: 'none !important',
@ -268,6 +269,10 @@ const setValue = (value: string) => {
editorView.dispatch({ changes: { from: 0, to: editorView.state.doc.length, insert: value } }); editorView.dispatch({ changes: { from: 0, to: editorView.state.doc.length, insert: value } });
}; };
const configure = (values) => {
editorView.dispatch({ effects: StateEffect.reconfigure.of(values) });
};
const updateModelValue = (value) => { const updateModelValue = (value) => {
emits('update:modelValue', value); emits('update:modelValue', value);
}; };
@ -280,5 +285,6 @@ const buttonClick = (button) => {
defineExpose({ defineExpose({
getValue, getValue,
setValue, setValue,
configure,
}); });
</script> </script>

2
io.sc.platform.core.frontend/src/platform/components/form/elements/WPosition.vue

@ -88,7 +88,7 @@ const props = defineProps({
readonlyIf: { readonlyIf: {
type: Function, type: Function,
default: () => { default: () => {
return true; return false;
}, },
}, },
disableIf: { disableIf: {

15
io.sc.platform.core.frontend/src/views/FormElements.vue

@ -15,9 +15,20 @@
:fields="[ :fields="[
{ name: 'color', label: 'please select color', type: 'color-input', outlined: true, dense: true }, { name: 'color', label: 'please select color', type: 'color-input', outlined: true, dense: true },
{ name: 'colorPalette', label: 'please select color palette', type: 'color-input-palette', outlined: true, dense: true }, { name: 'colorPalette', label: 'please select color palette', type: 'color-input-palette', outlined: true, dense: true },
{ name: 'codemirror', label: 'please input SQL', type: 'code-mirror', outlined: true, lang: 'sql', dense: true, rows: 5 }, {
name: 'codemirror',
label: 'please input SQL',
type: 'code-mirror',
outlined: true,
lang: 'sql',
dense: true,
rows: 5,
readonlyIf: () => {
return true;
},
},
{ name: 'cron', label: 'please input cron expression', type: 'cron', outlined: true, dense: true }, { name: 'cron', label: 'please input cron expression', type: 'cron', outlined: true, dense: true },
{ name: 'position', label: 'please select position', type: 'position', outlined: true, dense: true }, { name: 'position', label: 'please select position', type: 'position', outlined: true, dense: true, readOnly: true },
{ name: 'icon', label: 'please select icon', type: 'icon', outlined: true, dense: true }, { name: 'icon', label: 'please select icon', type: 'icon', outlined: true, dense: true },
]" ]"
> >

5
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.126", "version": "8.1.133",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,11 +92,10 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.126", "platform-core": "8.1.133",
"quasar": "2.14.5", "quasar": "2.14.5",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",
"vue-codemirror6": "1.2.0",
"vue-dompurify-html": "5.0.1", "vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0", "vue-i18n": "9.8.0",
"vue-router": "4.2.5" "vue-router": "4.2.5"

24
io.sc.platform.core.frontend/template-project/src/views/FormElements.vue

@ -2,8 +2,8 @@
<q-splitter v-model="splitWidthRef"> <q-splitter v-model="splitWidthRef">
<template #before> <template #before>
<q-tabs v-model="selectedTab" vertical no-caps> <q-tabs v-model="selectedTab" vertical no-caps>
<q-tab name="formElements" label="Form Elements" /> <q-tab name="formElements" label="All Form Elements" />
<q-tab name="codemirror" label="w-code-mirror" /> <q-tab name="codemirror" label="code-mirror" />
</q-tabs> </q-tabs>
</template> </template>
@ -15,9 +15,21 @@
:fields="[ :fields="[
{ name: 'color', label: 'please select color', type: 'color-input', outlined: true, dense: true }, { name: 'color', label: 'please select color', type: 'color-input', outlined: true, dense: true },
{ name: 'colorPalette', label: 'please select color palette', type: 'color-input-palette', outlined: true, dense: true }, { name: 'colorPalette', label: 'please select color palette', type: 'color-input-palette', outlined: true, dense: true },
{ name: 'codemirror', label: 'please input SQL', type: 'code-mirror', outlined: true, lang: 'sql', dense: true, rows: 5 }, {
name: 'codemirror',
label: 'please input SQL',
type: 'code-mirror',
outlined: true,
lang: 'sql',
dense: true,
rows: 5,
readonlyIf: () => {
return true;
},
},
{ name: 'cron', label: 'please input cron expression', type: 'cron', outlined: true, dense: true }, { name: 'cron', label: 'please input cron expression', type: 'cron', outlined: true, dense: true },
{ name: 'position', label: 'please select position', type: 'position', outlined: true, dense: true }, { name: 'position', label: 'please select position', type: 'position', outlined: true, dense: true, readOnly: true },
{ name: 'icon', label: 'please select icon', type: 'icon', outlined: true, dense: true },
]" ]"
> >
</w-form> </w-form>
@ -26,6 +38,7 @@
<q-input v-model="valueRef" label="please input number 1:" outlined dense clearable></q-input> <q-input v-model="valueRef" label="please input number 1:" outlined dense clearable></q-input>
<w-code-mirror v-model="valueRef" label="please input SQL:" lang="sql" outlined dense></w-code-mirror> <w-code-mirror v-model="valueRef" label="please input SQL:" lang="sql" outlined dense></w-code-mirror>
<q-input v-model="valueRef" label="please input number 2:" outlined dense clearable></q-input> <q-input v-model="valueRef" label="please input number 2:" outlined dense clearable></q-input>
<w-icon v-model="iconValueRef" label="please select icon:" lang="sql" outlined dense></w-icon>
</q-tab-panel> </q-tab-panel>
</q-tab-panels> </q-tab-panels>
</template> </template>
@ -34,9 +47,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
const selectedTab = ref('formElements'); const selectedTab = ref('codemirror');
const splitWidthRef = ref(20); const splitWidthRef = ref(20);
const valueRef = ref('xxxx'); const valueRef = ref('xxxx');
const iconValueRef = ref('8k_plus');
const focus = () => { const focus = () => {
console.log('sfsdf'); console.log('sfsdf');

1
io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs

@ -56,7 +56,6 @@ module.exports = {
'platform-core': { requiredVersion: deps['platform-core'], singleton: true }, 'platform-core': { requiredVersion: deps['platform-core'], singleton: true },
'quasar': { requiredVersion: deps['quasar'], singleton: true }, 'quasar': { requiredVersion: deps['quasar'], singleton: true },
'vue': { requiredVersion: deps['vue'], singleton: true }, 'vue': { requiredVersion: deps['vue'], singleton: true },
'vue-codemirror6': { requiredVersion: deps['vue-codemirror6'], singleton: true },
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true }, 'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true }, 'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true }, 'vue-router': { requiredVersion: deps['vue-router'], singleton: true },

2
io.sc.platform.core.frontend/template-project/webpack.env.build.cjs

@ -38,7 +38,7 @@ module.exports = merge(common, mf, {
}, },
'codemirror':{ 'codemirror':{
name: 'codemirror', name: 'codemirror',
test: /[\\/]node_modules[\\/](codemirror|vue-codemirror6|@codemirror[\\/]autocomplete|@codemirror[\\/]commands|@codemirror[\\/]lang-html|@codemirror[\\/]lang-java|@codemirror[\\/]lang-javascript|@codemirror[\\/]lang-json|@codemirror[\\/]lang-sql|@codemirror[\\/]lang-xml|@codemirror[\\/]language|@codemirror[\\/]search|@codemirror[\\/]state|@codemirror[\\/]view)[\\/]/, test: /[\\/]node_modules[\\/](codemirror|@codemirror[\\/]autocomplete|@codemirror[\\/]commands|@codemirror[\\/]lang-html|@codemirror[\\/]lang-java|@codemirror[\\/]lang-javascript|@codemirror[\\/]lang-json|@codemirror[\\/]lang-sql|@codemirror[\\/]lang-xml|@codemirror[\\/]language|@codemirror[\\/]search|@codemirror[\\/]state|@codemirror[\\/]view)[\\/]/,
priority: 20, priority: 20,
chunks: 'all', chunks: 'all',
enforce: true enforce: true

1
io.sc.platform.core.frontend/webpack.config.mf.cjs

@ -56,7 +56,6 @@ module.exports = {
'platform-core': { requiredVersion: deps['platform-core'], singleton: true }, 'platform-core': { requiredVersion: deps['platform-core'], singleton: true },
'quasar': { requiredVersion: deps['quasar'], singleton: true }, 'quasar': { requiredVersion: deps['quasar'], singleton: true },
'vue': { requiredVersion: deps['vue'], singleton: true }, 'vue': { requiredVersion: deps['vue'], singleton: true },
'vue-codemirror6': { requiredVersion: deps['vue-codemirror6'], singleton: true },
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true }, 'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true }, 'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true }, 'vue-router': { requiredVersion: deps['vue-router'], singleton: true },

2
io.sc.platform.core.frontend/webpack.env.build.cjs

@ -38,7 +38,7 @@ module.exports = merge(common, mf, {
}, },
'codemirror':{ 'codemirror':{
name: 'codemirror', name: 'codemirror',
test: /[\\/]node_modules[\\/](codemirror|vue-codemirror6|@codemirror[\\/]autocomplete|@codemirror[\\/]commands|@codemirror[\\/]lang-html|@codemirror[\\/]lang-java|@codemirror[\\/]lang-javascript|@codemirror[\\/]lang-json|@codemirror[\\/]lang-sql|@codemirror[\\/]lang-xml|@codemirror[\\/]language|@codemirror[\\/]search|@codemirror[\\/]state|@codemirror[\\/]view)[\\/]/, test: /[\\/]node_modules[\\/](codemirror|@codemirror[\\/]autocomplete|@codemirror[\\/]commands|@codemirror[\\/]lang-html|@codemirror[\\/]lang-java|@codemirror[\\/]lang-javascript|@codemirror[\\/]lang-json|@codemirror[\\/]lang-sql|@codemirror[\\/]lang-xml|@codemirror[\\/]language|@codemirror[\\/]search|@codemirror[\\/]state|@codemirror[\\/]view)[\\/]/,
priority: 20, priority: 20,
chunks: 'all', chunks: 'all',
enforce: true enforce: true

2
io.sc.platform.developer.frontend/package.json

@ -80,7 +80,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.126", "platform-core": "8.1.133",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

102
io.sc.platform.developer.frontend/src/views/backend/ExportLiquibase.vue

@ -0,0 +1,102 @@
<template>
<div>
<w-form
ref="formRef"
:fields="[
{
name: 'datasourceName',
label: 'datasourceName',
type: 'select',
options: datasourceOptionsRef,
'onUpdate:modelValue': (value) => {
datasourceNameChanged(value);
},
},
{
name: 'schemaName',
label: 'schemaName',
type: 'select',
options: schemaNameOptionsRef,
'onUpdate:modelValue': (value) => {
schemaNameChanged(formRef.getFieldValue('datasourceName'), value);
},
},
{ name: 'tableName', label: 'tableName', type: 'select', multiple: true, options: tableNameOptionsRef },
{ name: 'fetchSize', label: 'fetchSize', type: 'number', defaultValue: 1000 },
{ name: 'sql', label: 'sql', type: 'code-mirror', colSpan: 4, rows: 5, lang: 'sql' },
]"
>
</w-form>
<w-grid
ref="gridRef"
:title="$t('queryResult')"
:config-button="false"
selection="multiple"
:checkbox-selection="false"
:data-url="Environment.apiContextPath('/api/system/datasource')"
:query-form-fields="[]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'query',
'refresh',
{
name: 'export',
label: $t('export'),
icon: '',
click: () => {},
},
]"
:columns="[]"
>
</w-grid>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUpdated } from 'vue';
import { axios, Environment, EnumTools, Formater, Options, DialogManager, NotifyManager } from 'platform-core';
const formRef = ref();
const datasourceOptionsRef = ref([]);
const schemaNameOptionsRef = ref([]);
const tableNameOptionsRef = ref([]);
const loadDatasource = () => {
axios.get(Environment.apiContextPath('/api/system/datasource?pageable=false&sortBy=name')).then((response) => {
const data = response?.data.content;
if (data && data.length > 0) {
datasourceOptionsRef.value.splice(0, datasourceOptionsRef.value.length);
for (let item of data) {
datasourceOptionsRef.value.push({ label: item.name, value: item.name });
}
}
});
};
const datasourceNameChanged = (datasourceName: string) => {
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getSchemaNames/' + datasourceName)).then((response) => {
const data = response?.data;
if (data && data.length > 0) {
schemaNameOptionsRef.value.splice(0, schemaNameOptionsRef.value.length);
for (let item of data) {
schemaNameOptionsRef.value.push({ label: item.name, value: item.name });
}
}
});
};
const schemaNameChanged = (datasourceName: string, schemaName: string) => {
axios.get(Environment.apiContextPath('/api/jdbc/metadata/getTables/' + datasourceName + '/' + schemaName)).then((response) => {
const data = response?.data;
if (data && data.length > 0) {
tableNameOptionsRef.value.splice(0, tableNameOptionsRef.value.length);
for (let item of data) {
tableNameOptionsRef.value.push(item.name);
}
}
});
};
onMounted(() => {
loadDatasource();
});
</script>

4
io.sc.platform.jdbc.liquibase/src/main/resources/templates/io/sc/platform/jdbc/liquibase/installer/installer.html

@ -1,8 +1,8 @@
<!-- 数据源类型 --> <!-- 数据源类型 -->
<label for="datasourceType" class="form-label pt-2" th:text="#{DatasourceInstallerItem.datasourceType}">数据源类型</label> <label for="datasourceType" class="form-label pt-2" th:text="#{DatasourceInstallerItem.datasourceType}">数据源类型</label>
<select id="datasourceType" class="form-select form-select-sm" onchange="datasourceTypeChanged()"> <select id="datasourceType" class="form-select form-select-sm" onchange="datasourceTypeChanged()">
<option th:value="${T(io.sc.platform.jdbc.DatasourceType).JDBC}" th:text="${T(io.sc.platform.jdbc.DatasourceType).JDBC}" selected>JDBC</option> <option th:value="${T(io.sc.platform.jdbc.datasource.DatasourceType).JDBC}" th:text="${T(io.sc.platform.jdbc.datasource.DatasourceType).JDBC}" selected>JDBC</option>
<option th:value="${T(io.sc.platform.jdbc.DatasourceType).JNDI}" th:text="${T(io.sc.platform.jdbc.DatasourceType).JNDI}">JNDI</option> <option th:value="${T(io.sc.platform.jdbc.datasource.DatasourceType).JNDI}" th:text="${T(io.sc.platform.jdbc.datasource.DatasourceType).JNDI}">JNDI</option>
</select> </select>
<div id="jdniDatasourceContainer" style="display:none;"> <div id="jdniDatasourceContainer" style="display:none;">
<!-- JNDI 名称 --> <!-- JNDI 名称 -->

2
io.sc.platform.jdbc.schemacrawler/src/main/java/io/sc/platform/jdbc/schemacrawler/MetaDataLoaderImpl.java

@ -4,6 +4,7 @@ import io.sc.platform.core.util.CollectionUtil;
import io.sc.platform.jdbc.DatabaseType; import io.sc.platform.jdbc.DatabaseType;
import io.sc.platform.jdbc.meta.*; import io.sc.platform.jdbc.meta.*;
import io.sc.platform.jdbc.meta.support.*; import io.sc.platform.jdbc.meta.support.*;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import schemacrawler.inclusionrule.RegularExpressionExclusionRule; import schemacrawler.inclusionrule.RegularExpressionExclusionRule;
import schemacrawler.schema.ColumnReference; import schemacrawler.schema.ColumnReference;
@ -23,6 +24,7 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@Service
public class MetaDataLoaderImpl implements MetaDataLoader { public class MetaDataLoaderImpl implements MetaDataLoader {
@Override @Override
public List<Schema> getSchemas(DataSource dataSource) throws MetaDataAccessException { public List<Schema> getSchemas(DataSource dataSource) throws MetaDataAccessException {

15
io.sc.platform.jdbc.schemacrawler/src/main/resources/META-INF/platform/plugins/components.json

@ -0,0 +1,15 @@
/*
*
* : , spring
* 使:
* includes:
* excludes:
* : includes excludes , excludes ,
*/
{
"includes":[
"io.sc.platform.jdbc.schemacrawler"
],
"excludes":[]
}

6
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/DatasourceType.java

@ -1,6 +0,0 @@
package io.sc.platform.jdbc;
public enum DatasourceType {
JNDI,
JDBC;
}

22
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcConnectionTemplateWebController.java

@ -0,0 +1,22 @@
package io.sc.platform.jdbc.controller;
import io.sc.platform.jdbc.plugins.item.JdbcConnectionTemplate;
import io.sc.platform.jdbc.service.JdbcConnectionTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/jdbc")
public class JdbcConnectionTemplateWebController {
@Autowired JdbcConnectionTemplateService jdbcConnectionTemplateService;
@GetMapping("jdbcConnectionTemplate")
public List<JdbcConnectionTemplate> jdbcConnectionTemplate(){
return jdbcConnectionTemplateService.getTemplates();
}
}

29
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/controller/JdbcMetaDataLoaderWebController.java

@ -0,0 +1,29 @@
package io.sc.platform.jdbc.controller;
import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.meta.support.TableSummary;
import io.sc.platform.jdbc.service.JdbcMetaDataLoaderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api/jdbc/metadata")
public class JdbcMetaDataLoaderWebController {
@Autowired private JdbcMetaDataLoaderService jdbcMetaDataLoaderService;
@GetMapping("getSchemaNames/{datasourceName}")
public List<Schema> getSchemaNames(@PathVariable(name="datasourceName")String datasourceName) throws Exception {
return jdbcMetaDataLoaderService.getSchemaNames(datasourceName);
}
@GetMapping("getTables/{datasourceName}/{schemaName}")
public List<Table> getTables(@PathVariable(name="datasourceName")String datasourceName, @PathVariable(name="schemaName")String schemaName) throws Exception {
return jdbcMetaDataLoaderService.getTables(datasourceName,schemaName);
}
}

7
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcConnectionTemplateService.java

@ -1,6 +1,7 @@
package io.sc.platform.jdbc.service; package io.sc.platform.jdbc.service;
import java.util.List; import java.util.List;
import java.util.Map;
import io.sc.platform.jdbc.plugins.item.JdbcConnectionTemplate; import io.sc.platform.jdbc.plugins.item.JdbcConnectionTemplate;
import io.sc.platform.jdbc.DatabaseType; import io.sc.platform.jdbc.DatabaseType;
@ -22,6 +23,12 @@ public interface JdbcConnectionTemplateService {
*/ */
public List<JdbcConnectionTemplate> getTemplates(); public List<JdbcConnectionTemplate> getTemplates();
/**
* 获取所有数据库连接模板
* @return 所有数据库连接模板
*/
public Map<String,JdbcConnectionTemplate> getTemplatesMap();
/** /**
* 通过数据库类型获取数据库连接模板 * 通过数据库类型获取数据库连接模板
* @param type 类型 * @param type 类型

12
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/JdbcMetaDataLoaderService.java

@ -0,0 +1,12 @@
package io.sc.platform.jdbc.service;
import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.meta.support.TableSummary;
import java.util.List;
public interface JdbcMetaDataLoaderService {
public List<Schema> getSchemaNames(String datasourceName) throws Exception;
public List<Table> getTables(String datasourceName, String schemaName) throws Exception;
}

4
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/DatasourceServiceImpl.java

@ -62,12 +62,12 @@ public class DatasourceServiceImpl implements DatasourceService{
@Override @Override
public List<DatasourceConfig> getDatasourceConfigs(){ public List<DatasourceConfig> getDatasourceConfigs(){
return jdbcTemplate.query("select * from SYS_DATASOURCE order by FD_NAME", datasourceConfigRowMapper); return jdbcTemplate.query("select * from SYS_DATASOURCE order by NAME_", datasourceConfigRowMapper);
} }
@Override @Override
public DatasourceConfig getDatasourceConfig(String name){ public DatasourceConfig getDatasourceConfig(String name){
return jdbcTemplate.queryForObject("select * from SYS_DATASOURCE where FD_NAME=?", datasourceConfigRowMapper, name); return jdbcTemplate.queryForObject("select * from SYS_DATASOURCE where NAME_=?", datasourceConfigRowMapper, name);
} }
@Override @Override

17
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcConnectionTemplateServiceImpl.java

@ -12,9 +12,7 @@ import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.List;
@Service("jdbcConnectionTemplateService") @Service("jdbcConnectionTemplateService")
public class JdbcConnectionTemplateServiceImpl implements JdbcConnectionTemplateService { public class JdbcConnectionTemplateServiceImpl implements JdbcConnectionTemplateService {
@ -51,6 +49,19 @@ public class JdbcConnectionTemplateServiceImpl implements JdbcConnectionTemplate
return PluginManager.getInstance().getJdbcConnectionTemplates(); return PluginManager.getInstance().getJdbcConnectionTemplates();
} }
@Override
public Map<String, JdbcConnectionTemplate> getTemplatesMap() {
List<JdbcConnectionTemplate> templates =PluginManager.getInstance().getJdbcConnectionTemplates();
if(templates!=null && !templates.isEmpty()){
Map<String,JdbcConnectionTemplate> map =new HashMap<>();
for(JdbcConnectionTemplate template : templates){
map.put(template.getType(),template);
}
return map;
}
return Collections.emptyMap();
}
@Override @Override
public JdbcConnectionTemplate getTemplateByType(DatabaseType type) { public JdbcConnectionTemplate getTemplateByType(DatabaseType type) {
List<JdbcConnectionTemplate> templates =PluginManager.getInstance().getJdbcConnectionTemplates(); List<JdbcConnectionTemplate> templates =PluginManager.getInstance().getJdbcConnectionTemplates();

52
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/impl/JdbcMetaDataLoaderServiceImpl.java

@ -0,0 +1,52 @@
package io.sc.platform.jdbc.service.impl;
import io.sc.platform.jdbc.meta.MetaDataLoader;
import io.sc.platform.jdbc.meta.support.Schema;
import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.meta.support.TableSummary;
import io.sc.platform.jdbc.service.DatasourceService;
import io.sc.platform.jdbc.service.JdbcMetaDataLoaderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.sql.DataSource;
import java.util.Collections;
import java.util.List;
@Service
public class JdbcMetaDataLoaderServiceImpl implements JdbcMetaDataLoaderService {
@Autowired DatasourceService datasourceService;
@Autowired MetaDataLoader metaDataLoader;
@Override
public List<Schema> getSchemaNames(String datasourceName) throws Exception {
DataSource dataSource =null;
if(StringUtils.hasText(datasourceName)) {
dataSource =datasourceService.getDatasource(datasourceName);
}else{
dataSource =datasourceService.getDefaultDatasource();
}
if(dataSource!=null){
return metaDataLoader.getSchemas(dataSource);
}
return Collections.emptyList();
}
@Override
public List<Table> getTables(String datasourceName, String schemaName) throws Exception {
if(!StringUtils.hasText(schemaName)) {
return Collections.emptyList();
}
DataSource dataSource =null;
if(StringUtils.hasText(datasourceName)) {
dataSource =datasourceService.getDatasource(datasourceName);
}else{
dataSource =datasourceService.getDefaultDatasource();
}
if(dataSource!=null){
return metaDataLoader.getTables(dataSource,schemaName);
}
return Collections.emptyList();
}
}

34
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/service/support/DatasourceConfigRowMapper.java

@ -17,22 +17,22 @@ public class DatasourceConfigRowMapper implements RowMapper<DatasourceConfig> {
@Override @Override
public DatasourceConfig mapRow(ResultSet rs, int rowNum) throws SQLException { public DatasourceConfig mapRow(ResultSet rs, int rowNum) throws SQLException {
DatasourceConfig result =null; DatasourceConfig result =null;
String type =rs.getString("FD_DATASOURCE_TYPE"); String type =rs.getString("TYPE_");
if(StringUtils.hasText(type)) { if(StringUtils.hasText(type)) {
if("JDBC".equalsIgnoreCase(type.trim())) { if("JDBC".equalsIgnoreCase(type.trim())) {
JdbcDatasourceConfig jdbc =new JdbcDatasourceConfig(); JdbcDatasourceConfig jdbc =new JdbcDatasourceConfig();
jdbc.setId(rs.getString("FD_ID")); jdbc.setId(rs.getString("ID_"));
jdbc.setName(rs.getString("FD_NAME")); jdbc.setName(rs.getString("NAME_"));
jdbc.setDescription(rs.getString("FD_DESCRIPTION")); jdbc.setDescription(rs.getString("DESCRIPTION_"));
jdbc.setDatabaseType(rs.getString("FD_DATABASE_TYPE")); jdbc.setDatabaseType(rs.getString("JDBC_DATABASE_TYPE_"));
jdbc.setJdbcDriver(rs.getString("FD_JDBC_DRIVER")); jdbc.setJdbcDriver(rs.getString("JDBC_DRIVER_"));
jdbc.setJdbcUrl(rs.getString("FD_JDBC_URL")); jdbc.setJdbcUrl(rs.getString("JDBC_URL_"));
jdbc.setHibernateDialect(rs.getString("FD_HIBERNATE_DIALECT")); //jdbc.setHibernateDialect(rs.getString("HIBERNATE_DIALECT_"));
jdbc.setUsername(rs.getString("FD_USERNAME")); jdbc.setUsername(rs.getString("JDBC_USERNAME_"));
jdbc.setPassword(rs.getString("FD_PASSWORD")); jdbc.setPassword(rs.getString("JDBC_PASSWORD_"));
String properties =rs.getString("FD_PROPERTIES"); String properties =rs.getString("JDBC_PROPERTIES_");
if(StringUtils.hasText(properties)) { if(StringUtils.hasText(properties)) {
try { try {
Map<String,String> map = ObjectMapper4Json.getMapper().readValue(properties, new TypeReference<Map<String,String>>(){}); Map<String,String> map = ObjectMapper4Json.getMapper().readValue(properties, new TypeReference<Map<String,String>>(){});
@ -46,10 +46,10 @@ public class DatasourceConfigRowMapper implements RowMapper<DatasourceConfig> {
}else if("JNDI".equalsIgnoreCase(type.trim())) { }else if("JNDI".equalsIgnoreCase(type.trim())) {
JndiDatasourceConfig jndi =new JndiDatasourceConfig(); JndiDatasourceConfig jndi =new JndiDatasourceConfig();
jndi.setId(rs.getString("FD_ID")); jndi.setId(rs.getString("ID_"));
jndi.setName(rs.getString("FD_NAME")); jndi.setName(rs.getString("NAME_"));
jndi.setDescription(rs.getString("FD_DESCRIPTION")); jndi.setDescription(rs.getString("DESCRIPTION_"));
jndi.setJndiName(rs.getString("FD_JNDI_NAME")); jndi.setJndiName(rs.getString("JNDI_NAME_"));
result =jndi; result =jndi;
} }

1
io.sc.platform.jdbc/src/main/resources/META-INF/platform/plugins/components.json

@ -1,5 +1,6 @@
{ {
"includes":[ "includes":[
"io.sc.platform.jdbc.controller",
"io.sc.platform.jdbc.datasource.aspect", "io.sc.platform.jdbc.datasource.aspect",
"io.sc.platform.jdbc.service.impl" "io.sc.platform.jdbc.service.impl"
] ]

5
io.sc.platform.jdbc/src/main/resources/META-INF/platform/plugins/messages.json

@ -0,0 +1,5 @@
{
"includes":[
"io/sc/platform/jdbc/i18n/messages"
]
}

2
io.sc.platform.jdbc/src/main/resources/io/sc/platform/jdbc/i18n/messages.properties

@ -0,0 +1,2 @@
io.sc.platform.jdbc.datasource.DatasourceType.JDBC=JDBC
io.sc.platform.jdbc.datasource.DatasourceType.JNDI=JNDI

2
io.sc.platform.jdbc/src/main/resources/io/sc/platform/jdbc/i18n/messages_tw_CN.properties

@ -0,0 +1,2 @@
io.sc.platform.jdbc.datasource.DatasourceType.JDBC=JDBC
io.sc.platform.jdbc.datasource.DatasourceType.JNDI=JNDI

2
io.sc.platform.jdbc/src/main/resources/io/sc/platform/jdbc/i18n/messages_zh_CN.properties

@ -0,0 +1,2 @@
io.sc.platform.jdbc.datasource.DatasourceType.JDBC=JDBC
io.sc.platform.jdbc.datasource.DatasourceType.JNDI=JNDI

2
io.sc.platform.lcdp.frontend/package.json

@ -93,7 +93,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.119", "platform-core": "8.1.133",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

2
io.sc.platform.mvc.frontend/package.json

@ -80,7 +80,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.119", "platform-core": "8.1.133",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

2
io.sc.platform.security.frontend/package.json

@ -99,6 +99,6 @@
"vue-dompurify-html": "5.0.1", "vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0", "vue-i18n": "9.8.0",
"vue-router": "4.2.5", "vue-router": "4.2.5",
"platform-core": "8.1.119" "platform-core": "8.1.133"
} }
} }

2
io.sc.platform.system.frontend/package.json

@ -80,7 +80,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.119", "platform-core": "8.1.133",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

6
io.sc.platform.system.frontend/src/components/index.ts

@ -2,6 +2,7 @@
* , * ,
*/ */
import License from '@/views/license/License.vue';
import Corporation from '@/views/corporation/Corporation.vue'; import Corporation from '@/views/corporation/Corporation.vue';
import User from '@/views/user/User.vue'; import User from '@/views/user/User.vue';
import Role from '@/views/role/Role.vue'; import Role from '@/views/role/Role.vue';
@ -13,12 +14,13 @@ import NotificationManager from '@/views/notification/NotificationManager.vue';
import Parameter from '@/views/parameter/Parameter.vue'; import Parameter from '@/views/parameter/Parameter.vue';
import Dictionary from '@/views/dictionary/Dictionary.vue'; import Dictionary from '@/views/dictionary/Dictionary.vue';
import I18n from '@/views/i18n/I18n.vue'; import I18n from '@/views/i18n/I18n.vue';
import datasource from '@/views/datasource/Datasource.vue';
import AuditLog from '@/views/monitor/AuditLog.vue'; import AuditLog from '@/views/monitor/AuditLog.vue';
import Log from '@/views/monitor/Log.vue'; import Log from '@/views/monitor/Log.vue';
import Resources from '@/views/monitor/Resources.vue'; import Resources from '@/views/monitor/Resources.vue';
import License from '@/views/license/License.vue';
const localComponents = { const localComponents = {
'component.system.License': License,
'component.system.Corporation': Corporation, 'component.system.Corporation': Corporation,
'component.system.User': User, 'component.system.User': User,
'component.system.Role': Role, 'component.system.Role': Role,
@ -30,10 +32,10 @@ const localComponents = {
'component.system.Parameter': Parameter, 'component.system.Parameter': Parameter,
'component.system.Dictionary': Dictionary, 'component.system.Dictionary': Dictionary,
'component.system.I18n': I18n, 'component.system.I18n': I18n,
'component.system.datasource': datasource,
'component.system.monitor.AuditLog': AuditLog, 'component.system.monitor.AuditLog': AuditLog,
'component.system.monitor.Log': Log, 'component.system.monitor.Log': Log,
'component.system.monitor.Resources': Resources, 'component.system.monitor.Resources': Resources,
'component.system.License': License,
}; };
export default localComponents; export default localComponents;

32
io.sc.platform.system.frontend/src/i18n/messages.json

@ -4,6 +4,7 @@
"parameter.login.encodePassword":"Login Password Encode", "parameter.login.encodePassword":"Login Password Encode",
"menu.system" : "System Manager", "menu.system" : "System Manager",
"menu.system.license" : "License",
"menu.system.corporation" : "Corporation", "menu.system.corporation" : "Corporation",
"menu.system.user" : "User", "menu.system.user" : "User",
"menu.system.role" : "Role", "menu.system.role" : "Role",
@ -15,11 +16,11 @@
"menu.system.parameter" : "Parameter", "menu.system.parameter" : "Parameter",
"menu.system.dictionary" : "Dictionary", "menu.system.dictionary" : "Dictionary",
"menu.system.i18n" : "I18n Messages", "menu.system.i18n" : "I18n Messages",
"menu.system.datasource": "DataSource",
"menu.system.monitor" : "Monitor", "menu.system.monitor" : "Monitor",
"menu.system.monitor.auditlog" : "Audit Log", "menu.system.monitor.auditlog" : "Audit Log",
"menu.system.monitor.log" : "Log", "menu.system.monitor.log" : "Log",
"menu.system.monitor.resources" : "Resources", "menu.system.monitor.resources" : "Resources",
"menu.system.license" : "License",
"system.shared.selectUser.grid.title": "Included User List", "system.shared.selectUser.grid.title": "Included User List",
"system.shared.selectUser.grid.toolbar.selectIn":"Select In", "system.shared.selectUser.grid.toolbar.selectIn":"Select In",
@ -95,6 +96,35 @@
"system.i18n.grid.toolbar.removeAll.tip":"Are you sure to remove ALL i18n messages?", "system.i18n.grid.toolbar.removeAll.tip":"Are you sure to remove ALL i18n messages?",
"system.i18n.grid.toolbar.importAll.tip":"Are you sure to import ALL i18n messages?", "system.i18n.grid.toolbar.importAll.tip":"Are you sure to import ALL i18n messages?",
"system.datasource.grid.title":"Datasource List",
"system.datasource.grid.toolbar.connectionProperties":"Connection Properties",
"system.datasource.grid.entity.jndiName":"JNDI Name",
"system.datasource.grid.entity.databaseType":"Database Type",
"system.datasource.grid.entity.jdbcDriver":"JDBC Driver",
"system.datasource.grid.entity.jdbcUrl":"JDBC URL",
"system.datasource.hikari.autoCommit":"Auto Commit(default:true)",
"system.datasource.hikari.connectionTimeout":"Connection Timeout (millisecond,default:30000,minimal:250)",
"system.datasource.hikari.idleTimeout":"Idle Timeout (millisecond,default:600000,minimal:10000)",
"system.datasource.hikari.maxLifetime":"Max Life Time(millisecond,default:1800000)",
"system.datasource.hikari.connectionTestQuery":"Connection Test Query Sql(JDBC4 Not needed)",
"system.datasource.hikari.minimumIdle":"Minimum Idle(default:equals maximumPoolSize)",
"system.datasource.hikari.maximumPoolSize":"Maximum Pool Size(default:10)",
"system.datasource.hikari.metricRegistry":"Metric Registry",
"system.datasource.hikari.healthCheckRegistry":"Health Check Registry",
"system.datasource.hikari.poolName":"Pool Name",
"system.datasource.hikari.initializationFailTimeout":"Initialization Fail Timeout",
"system.datasource.hikari.isolateInternalQueries":"Internal Query Isolate(default:false)",
"system.datasource.hikari.allowPoolSuspension":"Allow Pool Suspension(default:false)",
"system.datasource.hikari.readOnly":"Read Only(default:false)",
"system.datasource.hikari.registerMbeans":"Register Mbeans(default:false)",
"system.datasource.hikari.catalog":"Catalog",
"system.datasource.hikari.connectionInitSql":"Connection init Sql",
"system.datasource.hikari.driverClassName":"JDBC Driver Class Name",
"system.datasource.hikari.transactionIsolation":"Transaction Isolation",
"system.datasource.hikari.validationTimeout":"Validation Timeout(millisecond,default:5000,minimal:250)",
"system.datasource.hikari.leakDetectionThreshold":"Leak Detection Threshold(default:0-not check,minimal:2000)",
"system.datasource.hikari.schema":"Schema",
"system.monitor.auditlog.grid.title":"Audit Logs List", "system.monitor.auditlog.grid.title":"Audit Logs List",
"system.monitor.log.tab.view":"Log View", "system.monitor.log.tab.view":"Log View",

10
io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json

@ -4,6 +4,7 @@
"parameter.login.encodePassword":"登錄頁面密碼加密", "parameter.login.encodePassword":"登錄頁面密碼加密",
"menu.system" : "系統管理", "menu.system" : "系統管理",
"menu.system.license" : "許可證管理",
"menu.system.corporation" : "法人管理", "menu.system.corporation" : "法人管理",
"menu.system.user" : "用戶管理", "menu.system.user" : "用戶管理",
"menu.system.role" : "角色管理", "menu.system.role" : "角色管理",
@ -15,11 +16,11 @@
"menu.system.parameter" : "參數管理", "menu.system.parameter" : "參數管理",
"menu.system.dictionary" : "數據字典", "menu.system.dictionary" : "數據字典",
"menu.system.i18n" : "國際化多語言", "menu.system.i18n" : "國際化多語言",
"menu.system.datasource": "數據源管理",
"menu.system.monitor" : "系統監控", "menu.system.monitor" : "系統監控",
"menu.system.monitor.auditlog" : "審計日誌", "menu.system.monitor.auditlog" : "審計日誌",
"menu.system.monitor.log" : "系統日誌", "menu.system.monitor.log" : "系統日誌",
"menu.system.monitor.resources" : "系統資源", "menu.system.monitor.resources" : "系統資源",
"menu.system.license" : "許可證管理",
"system.shared.selectUser.grid.title": "已包含用戶列表", "system.shared.selectUser.grid.title": "已包含用戶列表",
"system.shared.selectUser.grid.toolbar.selectIn":"選入", "system.shared.selectUser.grid.toolbar.selectIn":"選入",
@ -95,6 +96,13 @@
"system.i18n.grid.toolbar.removeAll.tip":"您確定要刪除所有多語言消息嗎?", "system.i18n.grid.toolbar.removeAll.tip":"您確定要刪除所有多語言消息嗎?",
"system.i18n.grid.toolbar.importAll.tip":"您確定要所導入所有多語言消息嗎?", "system.i18n.grid.toolbar.importAll.tip":"您確定要所導入所有多語言消息嗎?",
"system.datasource.grid.title":"數據源列表",
"system.datasource.grid.toolbar.connectionProperties":"連接屬性",
"system.datasource.grid.entity.jndiName":"JNDI 名稱",
"system.datasource.grid.entity.databaseType":"數據庫類型",
"system.datasource.grid.entity.jdbcDriver":"JDBC 驅動程序",
"system.datasource.grid.entity.jdbcUrl":"JDBC URL",
"system.monitor.auditlog.grid.title":"審計日誌列表", "system.monitor.auditlog.grid.title":"審計日誌列表",
"system.monitor.log.tab.view":"日誌查看", "system.monitor.log.tab.view":"日誌查看",

32
io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json

@ -4,6 +4,7 @@
"parameter.login.encodePassword":"登录页面密码加密", "parameter.login.encodePassword":"登录页面密码加密",
"menu.system" : "系统管理", "menu.system" : "系统管理",
"menu.system.license" : "许可证管理",
"menu.system.corporation" : "法人管理", "menu.system.corporation" : "法人管理",
"menu.system.user" : "用户管理", "menu.system.user" : "用户管理",
"menu.system.role" : "角色管理", "menu.system.role" : "角色管理",
@ -15,11 +16,11 @@
"menu.system.parameter" : "参数管理", "menu.system.parameter" : "参数管理",
"menu.system.dictionary" : "数据字典", "menu.system.dictionary" : "数据字典",
"menu.system.i18n" : "国际化多语言", "menu.system.i18n" : "国际化多语言",
"menu.system.datasource": "数据源管理",
"menu.system.monitor" : "系统监控", "menu.system.monitor" : "系统监控",
"menu.system.monitor.auditlog" : "审计日志", "menu.system.monitor.auditlog" : "审计日志",
"menu.system.monitor.log" : "系统日志", "menu.system.monitor.log" : "系统日志",
"menu.system.monitor.resources" : "系统资源", "menu.system.monitor.resources" : "系统资源",
"menu.system.license" : "许可证管理",
"system.shared.selectUser.grid.title": "已包含用户列表", "system.shared.selectUser.grid.title": "已包含用户列表",
"system.shared.selectUser.grid.toolbar.selectIn":"选入", "system.shared.selectUser.grid.toolbar.selectIn":"选入",
@ -95,6 +96,35 @@
"system.i18n.grid.toolbar.removeAll.tip":"您确定要删除所有多语言消息吗?", "system.i18n.grid.toolbar.removeAll.tip":"您确定要删除所有多语言消息吗?",
"system.i18n.grid.toolbar.importAll.tip":"您确定要导入所有多语言消息吗?", "system.i18n.grid.toolbar.importAll.tip":"您确定要导入所有多语言消息吗?",
"system.datasource.grid.title":"数据源列表",
"system.datasource.grid.toolbar.connectionProperties":"连接属性",
"system.datasource.grid.entity.jndiName":"JNDI 名称",
"system.datasource.grid.entity.databaseType":"数据库类型",
"system.datasource.grid.entity.jdbcDriver":"JDBC 驱动程序",
"system.datasource.grid.entity.jdbcUrl":"JDBC URL",
"system.datasource.hikari.autoCommit":"是否自动提交(默认值:true)",
"system.datasource.hikari.connectionTimeout":"连接超时(单位:毫秒,默认值:30000,最小值:250)",
"system.datasource.hikari.idleTimeout":"空闲超时(单位:毫秒,默认值:600000,最小值:10000)",
"system.datasource.hikari.maxLifetime":"最大活动时间(单位:毫秒,默认值:1800000)",
"system.datasource.hikari.connectionTestQuery":"连接测试查询(JDBC4 无需填写)",
"system.datasource.hikari.minimumIdle":"最小空闲,默认值:池最大尺寸",
"system.datasource.hikari.maximumPoolSize":"池最大尺寸,默认值:10",
"system.datasource.hikari.metricRegistry":"监控指标注册器",
"system.datasource.hikari.healthCheckRegistry":"健康检查注册器",
"system.datasource.hikari.poolName":"连接池名称",
"system.datasource.hikari.initializationFailTimeout":"初始化失败超时",
"system.datasource.hikari.isolateInternalQueries":"内部查询是否要被隔离,默认值:false",
"system.datasource.hikari.allowPoolSuspension":"是否允许池暂停,默认值:false",
"system.datasource.hikari.readOnly":"是否只读,默认值:false",
"system.datasource.hikari.registerMbeans":"是否注册为 MBean,默认值:false",
"system.datasource.hikari.catalog":"目录",
"system.datasource.hikari.connectionInitSql":"连接初始化 sql",
"system.datasource.hikari.driverClassName":"JDBC 驱动类名称",
"system.datasource.hikari.transactionIsolation":"事务隔离度",
"system.datasource.hikari.validationTimeout":"验证超时(单位:毫秒,默认值:5000)",
"system.datasource.hikari.leakDetectionThreshold":"泄漏检测阈值(单位:毫秒,默认值:0-不进行泄漏检查,最小值:2000)",
"system.datasource.hikari.schema":"方案",
"system.monitor.auditlog.grid.title":"审计日志列表", "system.monitor.auditlog.grid.title":"审计日志列表",
"system.monitor.log.tab.view":"日志查看", "system.monitor.log.tab.view":"日志查看",

44
io.sc.platform.system.frontend/src/menus/menus.json

@ -18,45 +18,51 @@
[ [
{"type":"GROUP", "order":10000, "id":"menu.system", "titleI18nKey":"menu.system", "icon":"bi-gear"}, {"type":"GROUP", "order":10000, "id":"menu.system", "titleI18nKey":"menu.system", "icon":"bi-gear"},
/*/*/
{"type":"ROUTE", "order":100,"parentId":"menu.system", "id":"menu.system.license", "titleI18nKey":"menu.system.license", "icon":"bi-c-circle", "routeName":"route.system.license"},
/*/*/
{"type":"SEPARATOR", "order":200, "parentId":"menu.system"},
/*/*/ /*/*/
{"type":"ROUTE", "order":200, "parentId":"menu.system", "id":"menu.system.corporation", "titleI18nKey":"menu.system.corporation", "icon":"bi-share", "routeName":"route.system.corporation", "routeQuery": {"query":"query"}, "authorizeExpression":"T(org.wsp.framework.core.Environment).isEnableMultiCorporation()"}, {"type":"ROUTE", "order":300, "parentId":"menu.system", "id":"menu.system.corporation", "titleI18nKey":"menu.system.corporation", "icon":"bi-share", "routeName":"route.system.corporation", "routeQuery": {"query":"query"}, "authorizeExpression":"T(org.wsp.framework.core.Environment).isEnableMultiCorporation()"},
/*/*/ /*/*/
{"type":"SEPARATOR", "order":300, "parentId":"menu.system"}, {"type":"SEPARATOR", "order":400, "parentId":"menu.system"},
/*/*/ /*/*/
{"type":"ROUTE", "order":400, "parentId":"menu.system", "id":"menu.system.user", "titleI18nKey":"menu.system.user", "icon":"bi-person", "routeName":"route.system.user"}, {"type":"ROUTE", "order":500, "parentId":"menu.system", "id":"menu.system.user", "titleI18nKey":"menu.system.user", "icon":"bi-person", "routeName":"route.system.user"},
/*/*/ /*/*/
{"type":"ROUTE", "order":500, "parentId":"menu.system", "id":"menu.system.role", "titleI18nKey":"menu.system.role", "icon":"bi-people", "routeName":"route.system.role"}, {"type":"ROUTE", "order":600, "parentId":"menu.system", "id":"menu.system.role", "titleI18nKey":"menu.system.role", "icon":"bi-people", "routeName":"route.system.role"},
/*/*/ /*/*/
{"type":"ROUTE", "order":600, "parentId":"menu.system", "id":"menu.system.org", "titleI18nKey":"menu.system.org", "icon":"bi-diagram-3", "routeName":"route.system.org"}, {"type":"ROUTE", "order":700, "parentId":"menu.system", "id":"menu.system.org", "titleI18nKey":"menu.system.org", "icon":"bi-diagram-3", "routeName":"route.system.org"},
/*/*/ /*/*/
{"type":"ROUTE", "order":700, "parentId":"menu.system", "id":"menu.system.department", "titleI18nKey":"menu.system.department", "icon":"bi-diagram-2", "routeName":"route.system.department"}, {"type":"ROUTE", "order":800, "parentId":"menu.system", "id":"menu.system.department", "titleI18nKey":"menu.system.department", "icon":"bi-diagram-2", "routeName":"route.system.department"},
/*/*/ /*/*/
{"type":"ROUTE", "order":800, "parentId":"menu.system", "id":"menu.system.menu", "titleI18nKey":"menu.system.menu", "icon":"bi-menu-app", "routeName":"route.system.menu"}, {"type":"ROUTE", "order":900, "parentId":"menu.system", "id":"menu.system.menu", "titleI18nKey":"menu.system.menu", "icon":"bi-menu-app", "routeName":"route.system.menu"},
/*/*/ /*/*/
{"type":"SEPARATOR", "order":900, "parentId":"menu.system"}, {"type":"SEPARATOR", "order":1000, "parentId":"menu.system"},
/*/*/ /*/*/
{"type":"ROUTE", "order":1000, "parentId":"menu.system", "id":"menu.system.announcementManager", "titleI18nKey":"menu.system.announcementManager", "icon":"bi-megaphone", "routeName":"route.system.announcementManager"}, {"type":"ROUTE", "order":1100, "parentId":"menu.system", "id":"menu.system.announcementManager", "titleI18nKey":"menu.system.announcementManager", "icon":"bi-megaphone", "routeName":"route.system.announcementManager"},
/*/*/ /*/*/
{"type":"ROUTE", "order":1100, "parentId":"menu.system", "id":"menu.system.notificationManager", "titleI18nKey":"menu.system.notificationManager", "icon":"bi-chat-dots", "routeName":"route.system.notificationManager"}, {"type":"ROUTE", "order":1200, "parentId":"menu.system", "id":"menu.system.notificationManager", "titleI18nKey":"menu.system.notificationManager", "icon":"bi-chat-dots", "routeName":"route.system.notificationManager"},
/*/*/ /*/*/
{"type":"SEPARATOR", "order":1200, "parentId":"menu.system"}, {"type":"SEPARATOR", "order":1300, "parentId":"menu.system"},
/*/*/ /*/*/
{"type":"ROUTE", "order":1300, "parentId":"menu.system", "id":"menu.system.parameter", "titleI18nKey":"menu.system.parameter", "icon":"bi-postcard", "routeName":"route.system.parameter"}, {"type":"ROUTE", "order":1400, "parentId":"menu.system", "id":"menu.system.parameter", "titleI18nKey":"menu.system.parameter", "icon":"bi-postcard", "routeName":"route.system.parameter"},
/*/*/ /*/*/
{"type":"ROUTE", "order":1400, "parentId":"menu.system", "id":"menu.system.dictionary", "titleI18nKey":"menu.system.dictionary", "icon":"bi-list-ul", "routeName":"route.system.dictionary"}, {"type":"ROUTE", "order":1500, "parentId":"menu.system", "id":"menu.system.dictionary", "titleI18nKey":"menu.system.dictionary", "icon":"bi-list-ul", "routeName":"route.system.dictionary"},
/*/*/ /*/*/
{"type":"ROUTE", "order":1500, "parentId":"menu.system", "id":"menu.system.i18n", "titleI18nKey":"menu.system.i18n", "icon":"bi-globe", "routeName":"route.system.i18n"}, {"type":"ROUTE", "order":1600, "parentId":"menu.system", "id":"menu.system.i18n", "titleI18nKey":"menu.system.i18n", "icon":"bi-globe", "routeName":"route.system.i18n"},
/*/*/ /*/*/
{"type":"SEPARATOR", "order":1600, "parentId":"menu.system"}, {"type":"SEPARATOR", "order":1700, "parentId":"menu.system"},
/*/*/
{"type":"ROUTE", "order":1800, "parentId":"menu.system", "id":"menu.system.datasource", "titleI18nKey":"menu.system.datasource", "icon":"bi-database", "routeName":"route.system.datasource"},
/*/*/
{"type":"SEPARATOR", "order":1900, "parentId":"menu.system"},
/*/*/ /*/*/
{"type":"GROUP", "order":1700, "parentId":"menu.system", "id":"menu.system.monitor", "titleI18nKey":"menu.system.monitor", "icon":"bi-speedometer2"}, {"type":"GROUP", "order":2000, "parentId":"menu.system", "id":"menu.system.monitor", "titleI18nKey":"menu.system.monitor", "icon":"bi-speedometer2"},
/*//*/ /*//*/
{"type":"ROUTE", "order":100, "parentId":"menu.system.monitor", "id":"menu.system.monitor.auditlog", "titleI18nKey":"menu.system.monitor.auditlog", "icon":"bi-card-list", "routeName":"route.system.monitor.auditlog","authorizeExpression":"'database'.equals(T(org.wsp.framework.core.Environment).getAuditLogType())"}, {"type":"ROUTE", "order":100, "parentId":"menu.system.monitor", "id":"menu.system.monitor.auditlog", "titleI18nKey":"menu.system.monitor.auditlog", "icon":"bi-card-list", "routeName":"route.system.monitor.auditlog","authorizeExpression":"'database'.equals(T(org.wsp.framework.core.Environment).getAuditLogType())"},
/*//*/ /*//*/
{"type":"ROUTE", "order":200, "parentId":"menu.system.monitor", "id":"menu.system.monitor.log", "titleI18nKey":"menu.system.monitor.log", "icon":"bi-terminal", "routeName":"route.system.monitor.log"}, {"type":"ROUTE", "order":200, "parentId":"menu.system.monitor", "id":"menu.system.monitor.log", "titleI18nKey":"menu.system.monitor.log", "icon":"bi-terminal", "routeName":"route.system.monitor.log"},
/*//*/ /*//*/
{"type":"ROUTE", "order":300, "parentId":"menu.system.monitor", "id":"menu.system.monitor.resources", "titleI18nKey":"menu.system.monitor.resources", "icon":"ssid_chart", "routeName":"route.system.monitor.resources"}, {"type":"ROUTE", "order":300, "parentId":"menu.system.monitor", "id":"menu.system.monitor.resources", "titleI18nKey":"menu.system.monitor.resources", "icon":"ssid_chart", "routeName":"route.system.monitor.resources"}
/*/*/
{"type":"ROUTE", "order":10000,"parentId":"menu.system", "id":"menu.system.license", "titleI18nKey":"menu.system.license", "icon":"bi-c-circle", "routeName":"route.system.license"}
] ]

45
io.sc.platform.system.frontend/src/routes/routes.json

@ -1,4 +1,19 @@
[ [
{
"name": "route.system.license",
"path": "system/license",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.License",
"componentPath":"@/views/license/License.vue",
"redirect": null,
"meta": {
"permissions": [
"/system/license/**/*"
]
}
},
{ {
"name": "route.system.corporation", "name": "route.system.corporation",
"path": "system/corporation", "path": "system/corporation",
@ -170,6 +185,21 @@
] ]
} }
}, },
{
"name": "route.system.datasource",
"path": "system/datasource",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.datasource",
"componentPath":"@/views/datasource/Datasource.vue",
"redirect": null,
"meta": {
"permissions": [
"/system/datasource/**/*"
]
}
},
{ {
"name": "route.system.monitor.auditlog", "name": "route.system.monitor.auditlog",
"path": "system/monitor/auditlog", "path": "system/monitor/auditlog",
@ -214,20 +244,5 @@
"/system/monitor/resources/**/*" "/system/monitor/resources/**/*"
] ]
} }
},
{
"name": "route.system.license",
"path": "system/license",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.License",
"componentPath":"@/views/license/License.vue",
"redirect": null,
"meta": {
"permissions": [
"/system/license/**/*"
]
}
} }
] ]

172
io.sc.platform.system.frontend/src/views/datasource/ConnectionPropertiesDialog.vue

@ -0,0 +1,172 @@
<template>
<w-dialog
ref="dialogRef"
:title="$t('system.datasource.grid.toolbar.connectionProperties')"
width="900px"
height="600px"
:can-maximize="false"
:buttons="[
{
label: $t('submit'),
noCaps: true,
click: () => {
axios.post(Environment.apiContextPath('/api/system/datasource/connectionProperties/' + id), formRef.getData()).then((response) => {
close();
NotifyManager.success();
});
},
},
]"
>
<w-form
ref="formRef"
:cols-num="2"
:fields="[
{
name: 'name',
label: 'name',
hidden: true,
},
{
name: 'autoCommit',
label: $t('system.datasource.hikari.autoCommit'),
type: 'select',
options: ['', 'true', 'false'],
},
{
name: 'connectionTimeout',
label: $t('system.datasource.hikari.connectionTimeout'),
type: 'text',
},
{
name: 'idleTimeout',
label: $t('system.datasource.hikari.idleTimeout'),
type: 'text',
},
{
name: 'maxLifetime',
label: $t('system.datasource.hikari.maxLifetime'),
type: 'text',
},
{
name: 'connectionTestQuery',
label: $t('system.datasource.hikari.connectionTestQuery'),
type: 'text',
},
{
name: 'minimumIdle',
label: $t('system.datasource.hikari.minimumIdle'),
type: 'text',
},
{
name: 'maximumPoolSize',
label: $t('system.datasource.hikari.maximumPoolSize'),
type: 'text',
},
{
name: 'metricRegistry',
label: $t('system.datasource.hikari.metricRegistry'),
type: 'text',
},
{
name: 'healthCheckRegistry',
label: $t('system.datasource.hikari.healthCheckRegistry'),
type: 'text',
},
{
name: 'poolName',
label: $t('system.datasource.hikari.poolName'),
type: 'text',
},
{
name: 'initializationFailTimeout',
label: $t('system.datasource.hikari.initializationFailTimeout'),
type: 'text',
},
{
name: 'isolateInternalQueries',
label: $t('system.datasource.hikari.isolateInternalQueries'),
type: 'select',
options: ['', 'true', 'false'],
},
{
name: 'allowPoolSuspension',
label: $t('system.datasource.hikari.allowPoolSuspension'),
type: 'select',
options: ['', 'true', 'false'],
},
{
name: 'readOnly',
label: $t('system.datasource.hikari.readOnly'),
type: 'select',
options: ['', 'true', 'false'],
},
{
name: 'registerMbeans',
label: $t('system.datasource.hikari.registerMbeans'),
type: 'select',
options: ['', 'true', 'false'],
},
{
name: 'catalog',
label: $t('system.datasource.hikari.catalog'),
type: 'text',
},
{
name: 'connectionInitSql',
label: $t('system.datasource.hikari.connectionInitSql'),
type: 'text',
},
{
name: 'transactionIsolation',
label: $t('system.datasource.hikari.connectionInitSql'),
type: 'select',
options: ['', 'TRANSACTION_READ_COMMITTED', 'TRANSACTION_REPEATABLE_READ', ''],
},
{
name: 'validationTimeout',
label: $t('system.datasource.hikari.validationTimeout'),
type: 'text',
},
{
name: 'leakDetectionThreshold',
label: $t('system.datasource.hikari.leakDetectionThreshold'),
type: 'text',
},
{
name: 'schema',
label: $t('system.datasource.hikari.schema'),
type: 'text',
},
]"
class="p-2"
></w-form>
</w-dialog>
</template>
<script setup lang="ts">
import { nextTick, ref } from 'vue';
import { axios, Environment, NotifyManager } from 'platform-core';
const dialogRef = ref();
const formRef = ref();
let id = '';
const open = (datasourceId: string) => {
id = datasourceId;
dialogRef.value.show();
nextTick(() => {
axios.get(Environment.apiContextPath('/api/system/datasource/connectionProperties/' + datasourceId)).then((response) => {
formRef.value.setData(response.data);
});
});
};
const close = () => {
dialogRef.value.hide();
};
defineExpose({
open,
close,
});
</script>

168
io.sc.platform.system.frontend/src/views/datasource/Datasource.vue

@ -0,0 +1,168 @@
<template>
<div>
<w-grid
ref="gridRef"
:title="$t('system.i18n.grid.title')"
:config-button="true"
selection="multiple"
:checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/datasource')"
:query-form-fields="[
{ name: 'name', label: $t('name'), type: 'text', clearable: true },
{ name: 'type', label: $t('type'), type: 'select', options: Options.enum(DatasourceTypeEnum), queryOperator: 'equals', clearable: true },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'query',
'refresh',
'separator',
'add',
'clone',
'edit',
'remove',
'separator',
{
name: 'connectionProperties',
label: $t('system.datasource.grid.toolbar.connectionProperties'),
icon: 'bi-card-list',
enableIf: (selecteds) => {
return selecteds && selecteds.length > 0 && selecteds[0].type === 'JDBC';
},
click: (selecteds) => {
if (selecteds && selecteds.length > 0) {
dialogRef.open(selecteds[0].id);
}
},
},
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: 150, name: 'name', label: $t('name') },
{ width: 80, name: 'type', label: $t('type') },
{ width: 100, name: 'jndiName', label: $t('system.datasource.grid.entity.jndiName'), sortable: false },
{ width: 100, name: 'databaseType', label: $t('system.datasource.grid.entity.databaseType'), sortable: false },
{ width: 200, name: 'jdbcDriver', label: $t('system.datasource.grid.entity.jdbcDriver'), sortable: false },
{ width: 200, name: 'jdbcUrl', label: $t('system.datasource.grid.entity.jdbcUrl'), sortable: false },
{ width: 100, name: 'username', label: $t('userName'), sortable: false },
{ width: 100, name: 'lastModifier', label: $t('lastModifier') },
{ width: 110, name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() },
]"
:editor="{
dialog: {
width: '800px',
height: '500px',
},
form: {
colsNum: 1,
fields: [
{ name: 'name', label: $t('name'), type: 'text', required: true },
{ name: 'type', label: $t('type'), type: 'select', required: true, options: Options.enum(DatasourceTypeEnum), defaultValue: 'JDBC' },
{
name: 'jndiName',
label: $t('system.datasource.grid.entity.jndiName'),
type: 'text',
required: true,
showIf: (form) => {
return form.getFieldValue('type') === 'JNDI';
},
},
{
name: 'databaseType',
label: $t('system.datasource.grid.entity.databaseType'),
type: 'select',
options: databaseTypeRef,
dense: true,
required: true,
showIf: (form) => {
return form.getFieldValue('type') === 'JDBC';
},
'onUpdate:modelValue': (value) => {
gridRef.getEditorForm().setFieldValue('jdbcDriver', databaseTypeMapRef[value].driver);
gridRef.getEditorForm().setFieldValue('jdbcUrl', databaseTypeMapRef[value].urlSample);
},
},
{
name: 'jdbcDriver',
label: $t('system.datasource.grid.entity.jdbcDriver'),
type: 'text',
required: true,
showIf: (form) => {
return form.getFieldValue('type') === 'JDBC';
},
},
{
name: 'jdbcUrl',
label: $t('system.datasource.grid.entity.jdbcUrl'),
type: 'text',
required: true,
showIf: (form) => {
return form.getFieldValue('type') === 'JDBC';
},
},
{
name: 'username',
label: $t('userName'),
type: 'text',
showIf: (form) => {
return form.getFieldValue('type') === 'JDBC';
},
},
{
name: 'password',
label: $t('password'),
type: 'text',
showIf: (form) => {
return form.getFieldValue('type') === 'JDBC';
},
},
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'name', label: $t('name') },
{ name: 'type', label: $t('type') },
{ name: 'jndiName', label: $t('system.datasource.grid.entity.jndiName') },
{ name: 'databaseType', label: $t('system.datasource.grid.entity.databaseType') },
{ name: 'jdbcDriver', label: $t('system.datasource.grid.entity.jdbcDriver') },
{ name: 'jdbcUrl', label: $t('system.datasource.grid.entity.jdbcUrl') },
{ name: 'username', label: $t('userName') },
{ name: 'dataComeFrom', label: $t('dataComeFrom') },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.none() },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
@row-click="(evt, row, index) => {}"
></w-grid>
<ConnectionPropertiesDialog ref="dialogRef"></ConnectionPropertiesDialog>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { axios, Environment, EnumTools, Formater, Options } from 'platform-core';
import ConnectionPropertiesDialog from './ConnectionPropertiesDialog.vue';
const gridRef = ref();
const dialogRef = ref();
const DatasourceTypeEnum = await EnumTools.fetch('io.sc.platform.jdbc.datasource.DatasourceType');
const databaseTypeRef = ref([]);
const databaseTypeMapRef = ref({});
axios.get(Environment.apiContextPath('/api/jdbc/jdbcConnectionTemplate')).then((response) => {
const templates = response.data;
databaseTypeRef.value.splice(0, databaseTypeRef.value.length);
databaseTypeMapRef.value = {};
for (let template of templates) {
databaseTypeRef.value.push(template.type);
databaseTypeMapRef.value[template.type] = template;
}
});
</script>

16
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/controller/DsWebController.java

@ -5,11 +5,25 @@ import io.sc.platform.system.api.ds.DsVo;
import io.sc.platform.system.ds.jpa.entity.DsEntity; import io.sc.platform.system.ds.jpa.entity.DsEntity;
import io.sc.platform.system.ds.jpa.repository.DsRepository; import io.sc.platform.system.ds.jpa.repository.DsRepository;
import io.sc.platform.system.ds.service.DsService; import io.sc.platform.system.ds.service.DsService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController @RestController
@RequestMapping("/datasource") @RequestMapping("/api/system/datasource")
public class DsWebController extends RestCrudController<DsVo,DsEntity,String,DsRepository, DsService> { public class DsWebController extends RestCrudController<DsVo,DsEntity,String,DsRepository, DsService> {
@GetMapping("connectionProperties/{datasourceId}")
public Map<String,String> getConnectionProperties(@PathVariable(name = "datasourceId")String datasourceId){
return service.getConnectionPropertiesById(datasourceId);
}
@PostMapping("connectionProperties/{datasourceId}")
public void saveConnectionProperties(@PathVariable(name = "datasourceId")String datasourceId,@RequestBody Map<String,String> properties) throws Exception {
service.saveConnectionPropertiesById(datasourceId,properties);
}
} }

23
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/entity/DsEntity.java

@ -2,13 +2,8 @@ package io.sc.platform.system.ds.jpa.entity;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.sc.platform.orm.api.vo.CorporationAuditorVo;
import io.sc.platform.orm.entity.AuditorEntity;
import io.sc.platform.orm.entity.CorporationAuditorEntity; import io.sc.platform.orm.entity.CorporationAuditorEntity;
import io.sc.platform.orm.service.support.criteria.impl.*;
import io.sc.platform.system.api.ds.DsVo; import io.sc.platform.system.api.ds.DsVo;
import io.sc.platform.system.ds.jpa.support.DsEntityJsonSerializer;
import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*; import javax.persistence.*;
@ -41,25 +36,23 @@ public abstract class DsEntity extends CorporationAuditorEntity<DsVo> {
//数据源类型 //数据源类型
@Column(name="TYPE_", insertable=false,updatable=false) @Column(name="TYPE_", insertable=false,updatable=false)
@Size(max=20) @Size(max=20)
private String type; protected String type;
//描述 //描述
@Column(name="DESCRIPTION_") @Column(name="DESCRIPTION_")
@Size(max=255) @Size(max=255)
private String description; private String description;
public static void toVo(DsVo vo, DsEntity entity){ public void toVo(DsVo vo){
if(vo!=null && entity!=null) { if(vo!=null){
CorporationAuditorEntity.toVo(vo,entity); super.toVo(vo);
vo.setId(entity.getId()); vo.setId(this.getId());
vo.setName(entity.getName()); vo.setName(this.getName());
vo.setType(entity.getType()); vo.setType(this.getType());
vo.setDescription(entity.getDescription()); vo.setDescription(this.getDescription());
} }
} }
public String getId() { public String getId() {
return id; return id;
} }

2
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/entity/JdbcDsEntity.java

@ -47,7 +47,7 @@ public class JdbcDsEntity extends DsEntity {
@Override @Override
public DsVo toVo() { public DsVo toVo() {
JdbcDsVo vo =new JdbcDsVo(); JdbcDsVo vo =new JdbcDsVo();
DsEntity.toVo(vo,this); super.toVo(vo);
vo.setDatabaseType(this.getDatabaseType()); vo.setDatabaseType(this.getDatabaseType());
vo.setJdbcDriver(this.getJdbcDriver()); vo.setJdbcDriver(this.getJdbcDriver());
vo.setJdbcUrl(this.getJdbcUrl()); vo.setJdbcUrl(this.getJdbcUrl());

2
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/entity/JndiDsEntity.java

@ -23,7 +23,7 @@ public class JndiDsEntity extends DsEntity {
@Override @Override
public DsVo toVo() { public DsVo toVo() {
JndiDsVo vo =new JndiDsVo(); JndiDsVo vo =new JndiDsVo();
DsEntity.toVo(vo,this); super.toVo(vo);
vo.setJndiName(this.getJndiName()); vo.setJndiName(this.getJndiName());
return vo; return vo;
} }

2
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/jpa/repository/DsRepository.java

@ -4,5 +4,5 @@ import io.sc.platform.orm.repository.DaoRepository;
import io.sc.platform.system.ds.jpa.entity.DsEntity; import io.sc.platform.system.ds.jpa.entity.DsEntity;
public interface DsRepository extends DaoRepository<DsEntity,String> { public interface DsRepository extends DaoRepository<DsEntity,String> {
public DsEntity findByName(String name);
} }

4
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/DsService.java

@ -4,5 +4,9 @@ import io.sc.platform.orm.service.DaoService;
import io.sc.platform.system.ds.jpa.entity.DsEntity; import io.sc.platform.system.ds.jpa.entity.DsEntity;
import io.sc.platform.system.ds.jpa.repository.DsRepository; import io.sc.platform.system.ds.jpa.repository.DsRepository;
import java.util.Map;
public interface DsService extends DaoService<DsEntity, String, DsRepository> { public interface DsService extends DaoService<DsEntity, String, DsRepository> {
public Map<String,String> getConnectionPropertiesById(String datasourceId);
public void saveConnectionPropertiesById(String datasourceId,Map<String,String> properties) throws Exception;
} }

32
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/impl/DsServiceImpl.java

@ -2,11 +2,43 @@ package io.sc.platform.system.ds.service.impl;
import io.sc.platform.orm.service.impl.DaoServiceImpl; import io.sc.platform.orm.service.impl.DaoServiceImpl;
import io.sc.platform.system.ds.jpa.entity.DsEntity; import io.sc.platform.system.ds.jpa.entity.DsEntity;
import io.sc.platform.system.ds.jpa.entity.JdbcDsEntity;
import io.sc.platform.system.ds.jpa.repository.DsRepository; import io.sc.platform.system.ds.jpa.repository.DsRepository;
import io.sc.platform.system.ds.service.DsService; import io.sc.platform.system.ds.service.DsService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Collections;
import java.util.Map;
@Service @Service
public class DsServiceImpl extends DaoServiceImpl<DsEntity, String, DsRepository> implements DsService { public class DsServiceImpl extends DaoServiceImpl<DsEntity, String, DsRepository> implements DsService {
@Override
public DsEntity findByUniqueKey(DsEntity entity) {
return repository.findByName(entity.getName());
}
@Override
public Map<String, String> getConnectionPropertiesById(String datasourceId) {
if(StringUtils.hasText(datasourceId)){
DsEntity entity =findById(datasourceId);
if(entity!=null && entity instanceof JdbcDsEntity){
JdbcDsEntity jdbcDsEntity =(JdbcDsEntity)entity;
return jdbcDsEntity.getProperties();
}
}
return Collections.emptyMap();
}
@Override
public void saveConnectionPropertiesById(String datasourceId, Map<String, String> properties) throws Exception {
if(StringUtils.hasText(datasourceId)){
DsEntity entity =findById(datasourceId);
if(entity!=null && entity instanceof JdbcDsEntity){
JdbcDsEntity jdbcDsEntity =(JdbcDsEntity)entity;
jdbcDsEntity.setProperties(properties);
this.update(datasourceId,jdbcDsEntity);
}
}
}
} }

92
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/impl/messages.properties

@ -0,0 +1,92 @@
DatabaseSchemaInstallerItem.name=Configure Database Connection
org.wsp.framework.datasource.installer.label.select_ds_type=Datasource Type
org.wsp.framework.datasource.installer.label.jndi_name=JNDI Name
org.wsp.framework.datasource.installer.label.database_type=Database Type
org.wsp.framework.datasource.installer.label.jdbc_url=JDBC URL
org.wsp.framework.datasource.installer.label.database_username=Database Connection User Name
org.wsp.framework.datasource.installer.label.database_password=Database Connection Password
org.wsp.framework.datasource.installer.label.database_options=Database Intall Options
org.wsp.framework.datasource.installer.label.database_options.create=Auto Create Database Objects
org.wsp.framework.datasource.installer.label.database_options.skip=Skip Create Database Objects
org.wsp.framework.datasource.installer.label.database_options.dropAllFirst=Drop All Database Objects First And Auto Create New Database Objects
org.wsp.framework.datasource.installer.action.configurationProperties=Connection Properties
org.wsp.framework.datasource.installer.button.connection_test=Test Connection
org.wsp.framework.datasource.installer.tip.required=This item required
org.wsp.framework.datasource.installer.tip.jdbc_url_sample=Format
org.wsp.framework.datasource.installer.tip.connection_test_success=Connection Test Success
org.wsp.framework.datasource.installer.tip.connection_test_failed=Connection Test Failed, and error message:
org.wsp.framework.datasource.installer.tip.request_failed=Request Failed, and error message:
org.wsp.framework.datasource.installer.tip.databaseObjectAlreadyExists=Database Object Already Exists, Can NOT Create the Objects in install, You Can Select Other Option in "Database Intall Options", and try again
org.wsp.framework.datasource.window.title.add=Add Datasource Configuration
org.wsp.framework.datasource.window.title.modify=Modify Datasource Configuration
org.wsp.framework.datasource.list =Datasource List
org.wsp.framework.datasource.name=Name
org.wsp.framework.datasource.datasourceType=Datasource Type
org.wsp.framework.datasource.databaseType=Database Type
org.wsp.framework.datasource.description=description
org.wsp.framework.datasource.jdbcDriver=JDBC Driver
org.wsp.framework.datasource.jdbcUrl=Connection URL
org.wsp.framework.datasource.hibernateDialect=Hibernate Dialect
org.wsp.framework.datasource.username=User Name
org.wsp.framework.datasource.password=Password
org.wsp.framework.datasource.jndiName=JNDI Name
# druid ds properties
org.wsp.framework.datasource.defaultAutoCommit=\u662F\u5426\u81EA\u52A8\u63D0\u4EA4
org.wsp.framework.datasource.defaultReadOnly=\u662F\u5426\u53EA\u8BFB
org.wsp.framework.datasource.defaultTransactionIsolation=\u4E8B\u52A1\u9694\u79BB\u7B49\u7EA7
org.wsp.framework.datasource.defaultCatalog=\u9ED8\u8BA4 Catalog
org.wsp.framework.datasource.init=\u662F\u5426\u5728\u521B\u5EFA\u6570\u636E\u6E90\u65F6\u8FDB\u884C\u521D\u59CB\u5316
org.wsp.framework.datasource.initialSize=\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570,\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528 init() \u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21 getConnection() \u65F6<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:0
org.wsp.framework.datasource.maxActive=\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:8
org.wsp.framework.datasource.minIdle=\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:0
org.wsp.framework.datasource.maxWait=\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6E useUnfairLock \u5C5E\u6027\u4E3A true \u4F7F\u7528\u975E\u516C\u5E73\u9501
org.wsp.framework.datasource.poolPreparedStatements=\u662F\u5426\u7F13\u5B58 preparedStatement\uFF0C\u4E5F\u5C31\u662F PSCache\u3002PSCache \u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4 oracle\u3002\u5728 mysql \u4E0B\u5EFA\u8BAE\u5173\u95ED<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.maxPoolPreparedStatementPerConnectionSize=\u8981\u542F\u7528 PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements \u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728 Druid \u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728 Oracle \u4E0B PSCache \u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:-1
org.wsp.framework.datasource.validationQuery=\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684 sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 1\u3002\u5982\u679C validationQuery \u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle \u90FD\u4E0D\u4F1A\u5176\u4F5C\u7528
org.wsp.framework.datasource.validationQueryTimeout=\u5355\u4F4D\uFF1A\u79D2\uFF0C\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684\u8D85\u65F6\u65F6\u95F4\u3002\u5E95\u5C42\u8C03\u7528 jdbc Statement \u5BF9\u8C61\u7684 void setQueryTimeout(int seconds) \u65B9\u6CD5
org.wsp.framework.datasource.testOnBorrow=\u662F\u5426\u5728\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:true
org.wsp.framework.datasource.testOnReturn=\u662F\u5426\u5728\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.testWhileIdle=\u662F\u5426\u5728\u7A7A\u95F2\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u5EFA\u8BAE\u914D\u7F6E\u4E3A true\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8E timeBetweenEvictionRunsMillis\uFF0C\u6267\u884C validationQuery \u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.timeBetweenEvictionRunsMillis=\u6709\u4E24\u4E2A\u542B\u4E49:<br/>1) Destroy \u7EBF\u7A0B\u4F1A\u68C0\u6D4B\u8FDE\u63A5\u7684\u95F4\u9694\u65F6\u95F4\uFF0C\u5982\u679C\u8FDE\u63A5\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8E\u7B49\u4E8E minEvictableIdleTimeMillis \u5219\u5173\u95ED\u7269\u7406\u8FDE\u63A5<br/>2) testWhileIdle \u7684\u5224\u65AD\u4F9D\u636E\uFF0C\u8BE6\u7EC6\u770B testWhileIdle \u5C5E\u6027\u7684\u8BF4\u660E<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:1\u5206\u949F
org.wsp.framework.datasource.minEvictableIdleTimeMillis=\u8FDE\u63A5\u4FDD\u6301\u7A7A\u95F2\u800C\u4E0D\u88AB\u9A71\u9010\u7684\u6700\u957F\u65F6\u95F4
org.wsp.framework.datasource.connectionInitSqls=\u7269\u7406\u8FDE\u63A5\u521D\u59CB\u5316\u7684\u65F6\u5019\u6267\u884C\u7684sql
org.wsp.framework.datasource.exceptionSorter=\u5F53\u6570\u636E\u5E93\u629B\u51FA\u4E00\u4E9B\u4E0D\u53EF\u6062\u590D\u7684\u5F02\u5E38\u65F6\uFF0C\u629B\u5F03\u8FDE\u63A5<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:\u6839\u636E dbType \u81EA\u52A8\u8BC6\u522B
org.wsp.framework.datasource.useGlobalDataSourceStat=\u662F\u5426\u4F7F\u7528\u5168\u5C40\u6570\u636E\u6E90\u7EDF\u8BA1
org.wsp.framework.datasource.connectionProperties=\u8FDE\u63A5\u5176\u4ED6\u914D\u7F6E\u5C5E\u6027
org.wsp.framework.datasource.filters=\u5B57\u7B26\u4E32\uFF0C\u901A\u8FC7\u522B\u540D\u7684\u65B9\u5F0F\u914D\u7F6E\u6269\u5C55\u63D2\u4EF6\uFF0C\u5E38\u7528\u7684\u63D2\u4EF6\u6709<br/>\u76D1\u63A7\u7EDF\u8BA1\u7528\u7684filter:stat<br/>\u65E5\u5FD7\u7528\u7684filter:log4j<br/>\u9632\u5FA1sql\u6CE8\u5165\u7684filter:wall
# hikari ds properties
org.wsp.framework.datasource.hikari.autoCommit=Auto Commit<br/><br/>default value:true
org.wsp.framework.datasource.hikari.connectionTimeout=Connection Timeout (millisecond)<br/><br/>minimal value:250<br/>default value:30000(30 seconds)
org.wsp.framework.datasource.hikari.idleTimeout=Idle Timeout (millisecond)<br/><br/>minimal value:10000(10 seconds)<br/>default value:600000(10 minutes)
org.wsp.framework.datasource.hikari.maxLifetime=Max Life Time(millisecond)<br/><br/>default value:1800000(30 minutes)
org.wsp.framework.datasource.hikari.connectionTestQuery=Connection Test Query Sql(JDBC4 Not needed)
org.wsp.framework.datasource.hikari.minimumIdle=Minimum Idle<br/><br/>default value: equals maximumPoolSize
org.wsp.framework.datasource.hikari.maximumPoolSize=Maximum Pool Size<br/><br/>default value:10
org.wsp.framework.datasource.hikari.metricRegistry=Metric Registry
org.wsp.framework.datasource.hikari.healthCheckRegistry=Health Check Registry
org.wsp.framework.datasource.hikari.poolName=Pool Name
org.wsp.framework.datasource.hikari.initializationFailTimeout=Initialization Fail Timeout
org.wsp.framework.datasource.hikari.isolateInternalQueries=Internal Query Isolate<br/><br/>default value:false
org.wsp.framework.datasource.hikari.allowPoolSuspension=Allow Pool Suspension<br/><br/>default value:false
org.wsp.framework.datasource.hikari.readOnly=Read Only<br/><br/>default value:false
org.wsp.framework.datasource.hikari.registerMbeans=Register Mbeans<br/><br/>default value:false
org.wsp.framework.datasource.hikari.catalog=Catalog
org.wsp.framework.datasource.hikari.connectionInitSql=Connection init Sql
org.wsp.framework.datasource.hikari.driverClassName=JDBC Driver Class Name
org.wsp.framework.datasource.hikari.transactionIsolation=Transaction Isolation
org.wsp.framework.datasource.hikari.validationTimeout=Validation Timeout(millisecond)<br/><br/>minimal value:250<br/>default value:5000(5 seconds)
org.wsp.framework.datasource.hikari.leakDetectionThreshold=Leak Detection Threshold<br/><br/>minimal value:2000<br/>default value:0(not check)
org.wsp.framework.datasource.hikari.dataSource=DataSource
org.wsp.framework.datasource.hikari.schema=Schema
org.wsp.framework.datasource.hikari.threadFactory=Thread Factory
org.wsp.framework.datasource.hikari.scheduledExecutor=Scheduled Executor
org.wsp.framework.datasource.preference=DataSource Configuration

90
io.sc.platform.system/src/main/java/io/sc/platform/system/ds/service/impl/messages_zh.properties

@ -0,0 +1,90 @@
DatabaseSchemaInstallerItem.name=\u914D\u7F6E\u6570\u636E\u5E93\u8FDE\u63A5
org.wsp.framework.datasource.installer.label.select_ds_type=\u6570\u636E\u5E93\u8FDE\u63A5\u7C7B\u578B
org.wsp.framework.datasource.installer.label.jndi_name=JNDI \u540D\u79F0
org.wsp.framework.datasource.installer.label.database_type=\u6570\u636E\u5E93\u7C7B\u578B
org.wsp.framework.datasource.installer.label.jdbc_url=JDBC URL
org.wsp.framework.datasource.installer.label.database_username=\u6570\u636E\u5E93\u7528\u6237\u540D
org.wsp.framework.datasource.installer.label.database_password=\u6570\u636E\u5E93\u7528\u6237\u5BC6\u7801
org.wsp.framework.datasource.installer.label.database_options=\u6570\u636E\u5E93\u5B89\u88C5\u9009\u9879
org.wsp.framework.datasource.installer.label.database_options.create=\u81EA\u52A8\u521B\u5EFA\u6570\u636E\u5E93\u5BF9\u8C61\u5E76\u4E14\u521D\u59CB\u5316\u5FC5\u8981\u6570\u636E
org.wsp.framework.datasource.installer.label.database_options.skip=\u4FDD\u7559\u73B0\u6709\u6570\u636E\u5E93\u4E2D\u7684\u6240\u6709\u5BF9\u8C61\uFF0C\u5373\u8DF3\u8FC7\u6570\u636E\u5E93\u5BF9\u8C61\u521B\u5EFA
org.wsp.framework.datasource.installer.label.database_options.dropAllFirst=\u5B89\u88C5\u524D\u9996\u5148\u5220\u9664\u73B0\u6709\u6570\u636E\u5E93\u4E2D\u6240\u6709\u5BF9\u8C61,\u6CE8\u610F:\u8BE5\u64CD\u4F5C\u4E0D\u53EF\u9006\uFF0C\u5728\u786E\u8BA4\u6267\u884C\u5B89\u88C5\u524D\u8BF7\u505A\u597D\u6570\u636E\u5907\u4EFD!
org.wsp.framework.datasource.installer.action.configurationProperties=\u8FDE\u63A5\u5C5E\u6027
org.wsp.framework.datasource.installer.button.connection_test=\u6D4B\u8BD5\u6570\u636E\u5E93\u8FDE\u63A5
org.wsp.framework.datasource.installer.tip.required=\u6B64\u9879\u4E3A\u5FC5\u8F93\u9879
org.wsp.framework.datasource.installer.tip.jdbc_url_sample=\u683C\u5F0F
org.wsp.framework.datasource.installer.tip.connection_test_success=\u6570\u636E\u5E93\u8FDE\u63A5\u6D4B\u8BD5\u6210\u529F
org.wsp.framework.datasource.installer.tip.connection_test_failed=\u6570\u636E\u5E93\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25,\u4FE1\u606F\u5982\u4E0B:
org.wsp.framework.datasource.installer.tip.request_failed=\u8BF7\u6C42\u5931\u8D25,\u4FE1\u606F\u5982\u4E0B:
org.wsp.framework.datasource.installer.tip.databaseObjectAlreadyExists=\u6570\u636E\u5E93\u5BF9\u8C61\u5DF2\u7ECF\u5B58\u5728,\u5728\u5B89\u88C5\u65F6\u4E0D\u80FD\u521B\u5EFA\u65B0\u7684\u5BF9\u8C61,\u8BF7\u6839\u636E\u4F60\u7684\u9700\u8981\u5728 "\u6570\u636E\u5E93\u5B89\u88C5\u9009\u9879" \u4E2D\u9009\u62E9\u5176\u4ED6\u9009\u9879,\u7136\u540E\u91CD\u8BD5
org.wsp.framework.datasource.window.title.add=\u6DFB\u52A0\u6570\u636E\u6E90\u914D\u7F6E
org.wsp.framework.datasource.window.title.modify=\u4FEE\u6539\u6570\u636E\u6E90\u914D\u7F6E
org.wsp.framework.datasource.list=\u6570\u636E\u6E90\u5217\u8868
org.wsp.framework.datasource.name=\u540D\u79F0
org.wsp.framework.datasource.datasourceType=\u6570\u636E\u6E90\u7C7B\u578B
org.wsp.framework.datasource.databaseType=\u6570\u636E\u5E93\u7C7B\u578B
org.wsp.framework.datasource.description=\u63CF\u8FF0
org.wsp.framework.datasource.jdbcDriver=JDBC \u9A71\u52A8\u7C7B\u540D\u79F0
org.wsp.framework.datasource.jdbcUrl=\u6570\u636E\u5E93\u8FDE\u63A5 URL
org.wsp.framework.datasource.hibernateDialect=Hibernate \u65B9\u8A00\u540D\u79F0
org.wsp.framework.datasource.username=\u8FDE\u63A5\u7528\u6237\u540D
org.wsp.framework.datasource.password=\u8FDE\u63A5\u5BC6\u7801
org.wsp.framework.datasource.jndiName=JNDI \u540D\u79F0
# druid ds properties
org.wsp.framework.datasource.defaultAutoCommit=\u662F\u5426\u81EA\u52A8\u63D0\u4EA4
org.wsp.framework.datasource.defaultReadOnly=\u662F\u5426\u53EA\u8BFB
org.wsp.framework.datasource.defaultTransactionIsolation=\u4E8B\u52A1\u9694\u79BB\u7B49\u7EA7
org.wsp.framework.datasource.defaultCatalog=\u9ED8\u8BA4 Catalog
org.wsp.framework.datasource.init=\u662F\u5426\u5728\u521B\u5EFA\u6570\u636E\u6E90\u65F6\u8FDB\u884C\u521D\u59CB\u5316
org.wsp.framework.datasource.initialSize=\u521D\u59CB\u5316\u65F6\u5EFA\u7ACB\u7269\u7406\u8FDE\u63A5\u7684\u4E2A\u6570,\u521D\u59CB\u5316\u53D1\u751F\u5728\u663E\u793A\u8C03\u7528 init() \u65B9\u6CD5\uFF0C\u6216\u8005\u7B2C\u4E00\u6B21 getConnection() \u65F6<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:0
org.wsp.framework.datasource.maxActive=\u6700\u5927\u8FDE\u63A5\u6C60\u6570\u91CF<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:8
org.wsp.framework.datasource.minIdle=\u6700\u5C0F\u8FDE\u63A5\u6C60\u6570\u91CF<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:0
org.wsp.framework.datasource.maxWait=\u83B7\u53D6\u8FDE\u63A5\u65F6\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\u3002\u914D\u7F6E\u4E86maxWait\u4E4B\u540E\uFF0C\u7F3A\u7701\u542F\u7528\u516C\u5E73\u9501\uFF0C\u5E76\u53D1\u6548\u7387\u4F1A\u6709\u6240\u4E0B\u964D\uFF0C\u5982\u679C\u9700\u8981\u53EF\u4EE5\u901A\u8FC7\u914D\u7F6E useUnfairLock \u5C5E\u6027\u4E3A true \u4F7F\u7528\u975E\u516C\u5E73\u9501
org.wsp.framework.datasource.poolPreparedStatements=\u662F\u5426\u7F13\u5B58 preparedStatement\uFF0C\u4E5F\u5C31\u662F PSCache\u3002PSCache \u5BF9\u652F\u6301\u6E38\u6807\u7684\u6570\u636E\u5E93\u6027\u80FD\u63D0\u5347\u5DE8\u5927\uFF0C\u6BD4\u5982\u8BF4 oracle\u3002\u5728 mysql \u4E0B\u5EFA\u8BAE\u5173\u95ED<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.maxPoolPreparedStatementPerConnectionSize=\u8981\u542F\u7528 PSCache\uFF0C\u5FC5\u987B\u914D\u7F6E\u5927\u4E8E0\uFF0C\u5F53\u5927\u4E8E0\u65F6\uFF0CpoolPreparedStatements \u81EA\u52A8\u89E6\u53D1\u4FEE\u6539\u4E3Atrue\u3002\u5728 Druid \u4E2D\uFF0C\u4E0D\u4F1A\u5B58\u5728 Oracle \u4E0B PSCache \u5360\u7528\u5185\u5B58\u8FC7\u591A\u7684\u95EE\u9898\uFF0C\u53EF\u4EE5\u628A\u8FD9\u4E2A\u6570\u503C\u914D\u7F6E\u5927\u4E00\u4E9B\uFF0C\u6BD4\u5982\u8BF4100<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:-1
org.wsp.framework.datasource.validationQuery=\u7528\u6765\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684 sql\uFF0C\u8981\u6C42\u662F\u4E00\u4E2A\u67E5\u8BE2\u8BED\u53E5\uFF0C\u5E38\u7528select 1\u3002\u5982\u679C validationQuery \u4E3Anull\uFF0CtestOnBorrow\u3001testOnReturn\u3001testWhileIdle \u90FD\u4E0D\u4F1A\u5176\u4F5C\u7528
org.wsp.framework.datasource.validationQueryTimeout=\u5355\u4F4D\uFF1A\u79D2\uFF0C\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\u7684\u8D85\u65F6\u65F6\u95F4\u3002\u5E95\u5C42\u8C03\u7528 jdbc Statement \u5BF9\u8C61\u7684 void setQueryTimeout(int seconds) \u65B9\u6CD5
org.wsp.framework.datasource.testOnBorrow=\u662F\u5426\u5728\u7533\u8BF7\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:true
org.wsp.framework.datasource.testOnReturn=\u662F\u5426\u5728\u5F52\u8FD8\u8FDE\u63A5\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u505A\u4E86\u8FD9\u4E2A\u914D\u7F6E\u4F1A\u964D\u4F4E\u6027\u80FD<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.testWhileIdle=\u662F\u5426\u5728\u7A7A\u95F2\u65F6\u6267\u884CvalidationQuery\u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548\uFF0C\u5EFA\u8BAE\u914D\u7F6E\u4E3A true\uFF0C\u4E0D\u5F71\u54CD\u6027\u80FD\uFF0C\u5E76\u4E14\u4FDD\u8BC1\u5B89\u5168\u6027\u3002\u7533\u8BF7\u8FDE\u63A5\u7684\u65F6\u5019\u68C0\u6D4B\uFF0C\u5982\u679C\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8E timeBetweenEvictionRunsMillis\uFF0C\u6267\u884C validationQuery \u68C0\u6D4B\u8FDE\u63A5\u662F\u5426\u6709\u6548<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.timeBetweenEvictionRunsMillis=\u6709\u4E24\u4E2A\u542B\u4E49:<br/>1) Destroy \u7EBF\u7A0B\u4F1A\u68C0\u6D4B\u8FDE\u63A5\u7684\u95F4\u9694\u65F6\u95F4\uFF0C\u5982\u679C\u8FDE\u63A5\u7A7A\u95F2\u65F6\u95F4\u5927\u4E8E\u7B49\u4E8E minEvictableIdleTimeMillis \u5219\u5173\u95ED\u7269\u7406\u8FDE\u63A5<br/>2) testWhileIdle \u7684\u5224\u65AD\u4F9D\u636E\uFF0C\u8BE6\u7EC6\u770B testWhileIdle \u5C5E\u6027\u7684\u8BF4\u660E<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:1\u5206\u949F
org.wsp.framework.datasource.minEvictableIdleTimeMillis=\u8FDE\u63A5\u4FDD\u6301\u7A7A\u95F2\u800C\u4E0D\u88AB\u9A71\u9010\u7684\u6700\u957F\u65F6\u95F4
org.wsp.framework.datasource.connectionInitSqls=\u7269\u7406\u8FDE\u63A5\u521D\u59CB\u5316\u7684\u65F6\u5019\u6267\u884C\u7684sql
org.wsp.framework.datasource.exceptionSorter=\u5F53\u6570\u636E\u5E93\u629B\u51FA\u4E00\u4E9B\u4E0D\u53EF\u6062\u590D\u7684\u5F02\u5E38\u65F6\uFF0C\u629B\u5F03\u8FDE\u63A5<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:\u6839\u636E dbType \u81EA\u52A8\u8BC6\u522B
org.wsp.framework.datasource.useGlobalDataSourceStat=\u662F\u5426\u4F7F\u7528\u5168\u5C40\u6570\u636E\u6E90\u7EDF\u8BA1
org.wsp.framework.datasource.connectionProperties=\u8FDE\u63A5\u5176\u4ED6\u914D\u7F6E\u5C5E\u6027
org.wsp.framework.datasource.filters=\u5B57\u7B26\u4E32\uFF0C\u901A\u8FC7\u522B\u540D\u7684\u65B9\u5F0F\u914D\u7F6E\u6269\u5C55\u63D2\u4EF6\uFF0C\u5E38\u7528\u7684\u63D2\u4EF6\u6709<br/>\u76D1\u63A7\u7EDF\u8BA1\u7528\u7684filter:stat<br/>\u65E5\u5FD7\u7528\u7684filter:log4j<br/>\u9632\u5FA1sql\u6CE8\u5165\u7684filter:wall
# hikari ds properties
org.wsp.framework.datasource.hikari.autoCommit=\u662F\u5426\u81EA\u52A8\u63D0\u4EA4<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:true
org.wsp.framework.datasource.hikari.connectionTimeout=\u8FDE\u63A5\u8D85\u65F6(\u5355\u4F4D:\u6BEB\u79D2)<br/><br/>\u6700\u5C0F\u503C:250<br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:30000(30\u79D2)
org.wsp.framework.datasource.hikari.idleTimeout=\u7A7A\u95F2\u8D85\u65F6(\u6BEB\u79D2)<br/><br/>\u6700\u5C0F\u503C:10000(10\u79D2)<br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:600000(10\u5206\u949F)
org.wsp.framework.datasource.hikari.maxLifetime=\u6700\u5927\u6D3B\u52A8\u65F6\u95F4(\u6BEB\u79D2)<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:1800000(30\u5206\u949F)
org.wsp.framework.datasource.hikari.connectionTestQuery=\u8FDE\u63A5\u6D4B\u8BD5\u67E5\u8BE2(JDBC4 \u65E0\u9700\u586B\u5199)
org.wsp.framework.datasource.hikari.minimumIdle=\u6700\u5C0F\u7A7A\u95F2<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:\u540C maximumPoolSize
org.wsp.framework.datasource.hikari.maximumPoolSize=\u6C60\u6700\u5927\u5C3A\u5BF8<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:10
org.wsp.framework.datasource.hikari.metricRegistry=\u76D1\u63A7\u6307\u6807\u6CE8\u518C\u5668
org.wsp.framework.datasource.hikari.healthCheckRegistry=\u5065\u5EB7\u68C0\u67E5\u6CE8\u518C\u5668
org.wsp.framework.datasource.hikari.poolName=\u8FDE\u63A5\u6C60\u540D\u79F0
org.wsp.framework.datasource.hikari.initializationFailTimeout=\u521D\u59CB\u5316\u5931\u8D25\u8D85\u65F6
org.wsp.framework.datasource.hikari.isolateInternalQueries=\u5185\u90E8\u67E5\u8BE2\u662F\u5426\u8981\u88AB\u9694\u79BB<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.hikari.allowPoolSuspension=\u662F\u5426\u5141\u8BB8\u6C60\u6682\u505C<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.hikari.readOnly=\u662F\u5426\u53EA\u8BFB<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.hikari.registerMbeans=\u662F\u5426\u6CE8\u518C\u4E3A MBean<br/><br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:false
org.wsp.framework.datasource.hikari.catalog=\u76EE\u5F55
org.wsp.framework.datasource.hikari.connectionInitSql=\u8FDE\u63A5\u521D\u59CB\u5316 sql
org.wsp.framework.datasource.hikari.driverClassName=JDBC \u9A71\u52A8\u7C7B\u540D\u79F0
org.wsp.framework.datasource.hikari.transactionIsolation=\u4E8B\u52A1\u9694\u79BB\u5EA6
org.wsp.framework.datasource.hikari.validationTimeout=\u9A8C\u8BC1\u8D85\u65F6<br/><br/>\u6700\u5C0F\u503C:250<br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:5000(5\u79D2)
org.wsp.framework.datasource.hikari.leakDetectionThreshold=\u6CC4\u6F0F\u68C0\u6D4B\u9608\u503C<br/><br/>\u6700\u5C0F\u503C:2000<br/>\u4E0D\u586B\u5199\u91C7\u7528\u9ED8\u8BA4\u503C:0(\u4E0D\u8FDB\u884C\u6CC4\u6F0F\u68C0\u67E5)
org.wsp.framework.datasource.hikari.dataSource=\u6570\u636E\u6E90
org.wsp.framework.datasource.hikari.schema=\u65B9\u6848
org.wsp.framework.datasource.hikari.threadFactory=\u7EBF\u7A0B\u5DE5\u5382
org.wsp.framework.datasource.hikari.scheduledExecutor=\u8BA1\u5212\u4EFB\u52A1\u6267\u884C\u5668

1
io.sc.platform.system/src/main/resources/liquibase/io.sc.platform.system_8.0.0_20220606__System Database Schema DDL.xml

@ -164,6 +164,7 @@
<column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"/> <column name="LAST_MODIFYDATE_" type="DATETIME" remarks="最后修改日期"/>
<column name="CORP_CODE_" type="NVARCHAR(255)" remarks="所属法人代码"/> <column name="CORP_CODE_" type="NVARCHAR(255)" remarks="所属法人代码"/>
</createTable> </createTable>
<addUniqueConstraint tableName="SYS_DATASOURCE" columnNames="NAME_"></addUniqueConstraint>
<addNotNullConstraint columnName="NAME_" columnDataType="NVARCHAR(255)" tableName="SYS_DATASOURCE" constraintName="CONST_SYS_DATASOURCE_NAME"/> <addNotNullConstraint columnName="NAME_" columnDataType="NVARCHAR(255)" tableName="SYS_DATASOURCE" constraintName="CONST_SYS_DATASOURCE_NAME"/>
<addNotNullConstraint columnName="TYPE_" columnDataType="NVARCHAR(20)" tableName="SYS_DATASOURCE" constraintName="CONST_SYS_DATASOURCE_TYPE"/> <addNotNullConstraint columnName="TYPE_" columnDataType="NVARCHAR(20)" tableName="SYS_DATASOURCE" constraintName="CONST_SYS_DATASOURCE_TYPE"/>
<addNotNullConstraint columnName="DATA_COME_FROM_" columnDataType="NVARCHAR(10)" tableName="SYS_DATASOURCE" constraintName="CONST_SYS_DATASOURCE_DCF"/> <addNotNullConstraint columnName="DATA_COME_FROM_" columnDataType="NVARCHAR(10)" tableName="SYS_DATASOURCE" constraintName="CONST_SYS_DATASOURCE_DCF"/>

Loading…
Cancel
Save