You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

477 lines
15 KiB
Vue

<template>
<el-dialog
width="700px"
:title="title"
:visible.sync="setDatasourceVisible"
:append-to-body="true"
:close-on-click-modal="false"
:before-close="handleClose"
class="bs-dialog-wrap bs-el-dialog"
>
<div
v-loading="linkLoading"
element-loading-text="正在测试连接..."
style="padding-right: 80px;"
>
<el-form
ref="dataForm"
:model="dataForm"
:rules="dataForm.id ? updateRules : rules"
size="small"
label-position="right"
:label-width="dataForm.advanceSettingFlag ? '200px' : '150px'"
>
<el-form-item
label="类型"
prop="sourceType"
>
<el-select
v-model="dataForm.sourceType"
placeholder="请选择类型"
class="bs-el-select"
popper-class="bs-el-select"
clearable
filterable
@change="sourceEdit"
>
<el-option
v-for="sourceType in sourceTypeList"
:key="sourceType.id"
:label="sourceType.name"
:value="sourceType.name"
/>
</el-select>
</el-form-item>
<el-form-item
label="数据源名称"
prop="sourceName"
>
<el-input
v-model="dataForm.sourceName"
placeholder="请输入数据源名称"
class="bs-el-input"
maxlength="200"
/>
</el-form-item>
<el-form-item
label="JDBC URL"
prop="url"
>
<el-input
v-model="dataForm.url"
placeholder="请输入JDBC URL"
class="bs-el-input"
type="textarea"
rows="4"
@keydown.enter.native="textareaKeydown"
/>
</el-form-item>
<el-form-item
label="用户名"
prop="username"
>
<el-input
v-model="dataForm.username"
placeholder="请输入用户名"
class="bs-el-input"
/>
</el-form-item>
<el-form-item
label="密码"
prop="password"
>
<el-input
v-model="dataForm.password"
:placeholder="dataForm.id ? '请输入密码,不输入代表不更新' : '请输入密码'"
class="bs-el-input"
type="password"
show-password
/>
</el-form-item>
<el-form-item
label="备注"
prop="remark"
>
<el-input
v-model="dataForm.remark"
placeholder="请输入备注"
class="bs-el-input"
type="textarea"
rows="4"
@keydown.enter.native="textareaKeydown"
/>
</el-form-item>
<template v-if="dataForm.advanceSettingFlag">
<el-form-item label="初始化连接数">
<el-input v-model="dataForm.initConnNum" />
</el-form-item>
<el-form-item label="最大活动连接数">
<el-input v-model="dataForm.maxActiveConnNum" />
</el-form-item>
<el-form-item label="最大空闲连接数">
<el-input v-model="dataForm.maxIdleConnNum" />
</el-form-item>
<el-form-item label="最小空闲连接数">
<el-input v-model="dataForm.minIdleConnNum" />
</el-form-item>
<el-form-item label="最大等待时间 (ms)">
<el-input v-model="dataForm.maxWaitConnNum" />
</el-form-item>
<el-form-item label="SQL验证查询">
<el-input
v-model="dataForm.sqlCheck"
type="text"
/>
</el-form-item>
<el-form-item label="获取连接前校验">
<el-select
v-model="dataForm.getconnCheckFlag"
clearable
>
<el-option
label="是"
:value="1"
/>
<el-option
label="否"
:value="0"
/>
</el-select>
</el-form-item>
<el-form-item label="归还连接前校验">
<el-select
v-model="dataForm.returnCheckFlag"
clearable
>
<el-option
label="是"
:value="1"
/>
<el-option
label="否"
:value="0"
/>
</el-select>
</el-form-item>
<el-form-item label="开启空闲回收器校验">
<el-select
v-model="dataForm.startIdleCheckFlag"
clearable
>
<el-option
label="是"
:value="1"
/>
<el-option
label="否"
:value="0"
/>
</el-select>
</el-form-item>
<el-form-item label="空闲连接回收器休眠时间 (ms)">
<el-input v-model="dataForm.idleConnDormantTime" />
</el-form-item>
<el-form-item label="空闲连接回收检查数">
<el-input v-model="dataForm.idleConnCheckNum" />
</el-form-item>
<el-form-item label="保持空闲最小时间值 (s)">
<el-input v-model="dataForm.keepIdleMinTime" />
</el-form-item>
</template>
</el-form>
</div>
<span
slot="footer"
class="dialog-footer"
>
<el-button
type="primary"
@click="sourceLinkCheck"
>
测试
</el-button>
<el-button
class="bs-el-button-default"
@click="handleClose"
>
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</span>
</el-dialog>
</template>
<script>
import { checkRepeat, sourceLinkTest, add, update } from 'packages/js/utils/dataSourceService'
export default {
props: {
appCode: {
type: String,
default: ''
}
},
data () {
return {
setDatasourceVisible: false,
title: '',
linkLoading: false,
sourceTypeList: [
{ name: 'Mysql', code: 'mysql' },
{ name: 'ClickHouse', code: 'clickhouse' },
{ name: 'PostgreSQL', code: 'postgresql' },
{ name: 'Oracle', code: 'oracle' }
],
driverCLassList: [
{ code: 'mysqlDriver', name: 'com.mysql.jdbc.Driver' },
{ code: 'clickhouseDriver', name: 'ru.yandex.clickhouse.ClickHouseDriver' },
{ code: 'oracleDriver', name: 'oracle.jdbc.driver.OracleDriver' },
{ code: 'hsqlDriver', name: 'org.hsqldb.jdbc.JDBCDriver' },
{ code: 'ibmdb2Driver', name: 'com.ibm.db2.jcc.DB2Driver' },
{ code: 'sqlserverDriver', name: 'com.microsoft.sqlserver.jdbc.SQLServerDriver' },
{ code: 'postgresqlDriver', name: 'org.postgresql.Driver' },
{ code: 'hiveDriver', name: 'org.apache.hive.jdbc.HiveDriver' }
],
dataForm: {
id: '',
sourceName: '',
sourceType: 'Mysql',
driverClassName: 'com.mysql.jdbc.Driver',
username: '',
password: '',
url: 'jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&useOldAliasMetadataBehavior=true',
remark: ''
},
rules: {
sourceType: [
{ required: true, message: '请选择数据源类型', trigger: 'blur' }
],
sourceName: [
{ required: true, message: '请输入数据源名称', trigger: 'blur' },
{ validator: this.validateSourceName, trigger: 'blur' }
],
driverClassName: [
{ required: true, message: '请选择连接驱动', trigger: 'blur' }
],
database: [
{ required: true, message: '请输入数据库名称', trigger: 'blur' },
{ pattern: /^[^\u4e00-\u9fa5]+$/, message: '数据库名称不能包含汉字' }
],
host: [
{ required: true, message: '请输入主机号', trigger: 'blur' },
{
pattern: /((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))/,
message: '主机号格式有误'
}
],
port: [
{ required: true, message: '请输入端口', trigger: 'blur' },
{ pattern: /^[0-9]*$/, message: '端口号只能为数字' }
],
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ pattern: /^[^\u4e00-\u9fa5]+$/, message: '用户名不能包含汉字' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
],
url: [
{ required: true, message: '请输入连接url', trigger: 'blur' }
],
coding: [
{ required: true, message: '请选择编码', trigger: 'blur' }
]
},
updateRules: {
sourceType: [
{ required: true, message: '请选择数据源类型', trigger: 'blur' }
],
sourceName: [
{ required: true, message: '请输入数据源名称', trigger: 'blur' },
{ validator: this.validateSourceName, trigger: 'blur' }
],
driverClassName: [
{ required: true, message: '请选择连接驱动', trigger: 'blur' }
],
database: [
{ required: true, message: '请输入数据库名称', trigger: 'blur' },
{ pattern: /^[^\u4e00-\u9fa5]+$/, message: '数据库名称不能包含汉字' }
],
url: [
{ required: true, message: '请输入连接url', trigger: 'blur' }
],
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ pattern: /^[^\u4e00-\u9fa5]+$/, message: '用户名不能包含汉字' }
]
}
}
},
methods: {
// 初始化
init (row) {
// 清除表单验证
if (this.$refs.dataForm) {
this.$refs.dataForm.clearValidate()
}
if (row && row.id) {
this.dataForm = row
}
},
getUrl (driverClassName) {
switch (driverClassName) {
case 'com.mysql.jdbc.Driver':
return 'jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&useOldAliasMetadataBehavior=true'
case 'ru.yandex.clickhouse.ClickHouseDriver':
return 'jdbc:clickhouse://localhost:8123/db_name'
case 'oracle.jdbc.driver.OracleDriver':
return 'jdbc:oracle:thin:@localhost:1521:orcl'
case 'org.hsqldb.jdbc.JDBCDriver':
return 'jdbc:hsqldb:http://localhost:1527/db_name'
case 'com.ibm.db2.jcc.DB2Driver':
return 'jdbc:db2://localhost:5000/db_name'
case 'com.microsoft.sqlserver.jdbc.SQLServerDriver':
return 'jdbc:microsoft:sqlserver://localhost:1433DatabaseName=db_name'
case 'org.postgresql.Driver':
return 'jdbc:postgresql://localhost:13308/db_name'
case 'org.apache.hive.jdbc.HiveDriver':
return 'jdbc:hive2://localhost:10000/db_name'
}
},
// 名称校验
validateSourceName (rule, value, callback) {
checkRepeat({
id: this.dataForm.id,
sourceName: this.dataForm.sourceName,
moduleCode: this.appCode
}).then(r => {
if (r) {
callback(new Error('数据源名称已存在'))
} else {
callback()
}
})
},
// 数据源类型选择
sourceEdit (name) {
this.dataForm.coding = '自动'
if (!this.dataForm.id && name) {
let type = ''
type = name
this.sourceTypeList.forEach(r => {
if (type === r.name) {
const code = r.code + 'Driver'
this.driverCLassList.forEach(r => {
if (code === r.code) {
this.dataForm.driverClassName = r.name
this.queryDriverTemp(r.name)
}
})
}
})
}
},
queryDriverTemp (val) {
this.$set(this.dataForm, 'url', this.getUrl(val))
},
// 阻止文本域回车换行
textareaKeydown () {
const e = window.event || arguments[0]
if (e.key === 'Enter' || e.code === 'Enter' || e.keyCode === 13) {
e.returnValue = false
return false
}
},
// 连接测试
sourceLinkCheck () {
let flag = 0
this.$refs.dataForm.validate((valid) => {
if (!valid) {
flag = 1
return false
} else {
if (flag === 0) {
this.sourceLinkTest(this.dataForm)
}
}
})
},
sourceLinkTest (row) {
this.linkLoading = true
sourceLinkTest(row).then((r) => {
this.$message.success(r)
this.linkLoading = false
}).catch(() => {
this.linkLoading = false
})
},
// 取消重制
handleClose () {
this.$refs.dataForm.resetFields()
this.dataForm = {
id: '',
sourceName: '',
sourceType: 'Mysql',
driverClassName: 'com.mysql.jdbc.Driver',
username: '',
password: '',
url: 'jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&useOldAliasMetadataBehavior=true',
remark: ''
}
this.setDatasourceVisible = false
},
// 保存
submitForm () {
// mysql 需要包含useOldAliasMetadataBehavior
// if (this.dataForm.sourceType == 'Mysql') {
// if (this.dataForm.url.indexOf('useOldAliasMetadataBehavior') == -1) {
// if (this.dataForm.url.indexOf('?') == -1) {
// this.dataForm.url = this.dataForm.url + '?useOldAliasMetadataBehavior=true'
// } else {
// this.dataForm.url = this.dataForm.url + '&useOldAliasMetadataBehavior=true'
// }
// }
// }
this.$refs.dataForm.validate((valid) => {
if (valid) {
if (this.dataForm.id) {
update({
...this.dataForm,
moduleCode: this.appCode,
editable: this.appCode ? 1 : 0
}).then(() => {
this.$message.success('保存成功')
// 刷新表格
this.$emit('refreshTable')
this.handleClose()
})
} else {
add({
...this.dataForm,
moduleCode: this.appCode,
editable: this.appCode ? 1 : 0
}).then(() => {
this.$message.success('保存成功')
// 刷新表格
this.$emit('refreshTable')
this.handleClose()
})
}
} else {
return false
}
})
}
}
}
</script>
<style lang="scss" scoped>
@import '~packages/assets/style/bsTheme.scss';
</style>