123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- <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"
- class="bs-el-form"
- :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="sourceTypeChange"
- >
- <el-option
- v-for="sourceType in sourceTypeList"
- :key="sourceType.code"
- :label="sourceType.label"
- :value="sourceType.code"
- />
- </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"
- maxlength="200"
- @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 'data-room-ui/js/utils/dataSourceService'
- export default {
- props: {
- appCode: {
- type: String,
- default: ''
- }
- },
- data () {
- return {
- setDatasourceVisible: false,
- title: '',
- linkLoading: false,
- 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: '用户名不能包含汉字' }
- ]
- }
- }
- },
- computed: {
- sourceTypeList () {
- return window.BS_CONFIG?.sourceTypeList || [
- { label: 'Mysql', code: 'mysql', name: 'com.mysql.jdbc.Driver', url: 'jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&useOldAliasMetadataBehavior=true' },
- { label: 'ClickHouse', code: 'clickhouse', name: 'ru.yandex.clickhouse.ClickHouseDriver', url: 'jdbc:clickhouse://localhost:8123/db_name' },
- { label: 'PostgreSQL', code: 'postgresql', name: 'org.postgresql.Driver', url: 'jdbc:postgresql://localhost:13308/db_name' },
- { label: 'Oracle', code: 'oracle', name: 'oracle.jdbc.driver.OracleDriver', url: 'jdbc:oracle:thin:@localhost:1521:orcl' },
- { label: 'Sqlserver', code: 'sqlserver', name: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', url: 'jdbc:sqlserver://localhost:1433;databaseName=db_name' }
- ]
- }
- },
- methods: {
- // 初始化
- init (row) {
- // 清除表单验证
- if (this.$refs.dataForm) {
- this.$refs.dataForm.clearValidate()
- }
- if (row && row.id) {
- this.dataForm = row
- }
- },
- // 名称校验
- 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()
- }
- })
- },
- // 数据源类型选择
- sourceTypeChange (code) {
- if (!this.dataForm.id && code) {
- this.dataForm.driverClassName = this.sourceTypeList.find(item => item.code === code)?.name
- this.$set(this.dataForm, 'url', this.sourceTypeList.find(item => item.code === code)?.url)
- }
- },
- // 阻止文本域回车换行
- 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 '../../assets//style/bsTheme.scss';
- </style>
|