SysDataSourceModal.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <template>
  2. <a-modal
  3. :title="title"
  4. :width="800"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. @ok="handleOk"
  8. @cancel="handleCancel"
  9. cancelText="关闭">
  10. <a-spin :spinning="confirmLoading">
  11. <a-form :form="form">
  12. <a-form-item
  13. :labelCol="labelCol"
  14. :wrapperCol="wrapperCol"
  15. label="数据源编码">
  16. <a-input placeholder="请输入数据源编码" :disabled="!!model.id" v-decorator="['code', validatorRules.code]"/>
  17. </a-form-item>
  18. <a-form-item
  19. :labelCol="labelCol"
  20. :wrapperCol="wrapperCol"
  21. label="数据源名称">
  22. <a-input placeholder="请输入数据源名称" v-decorator="['name', validatorRules.name]"/>
  23. </a-form-item>
  24. <a-form-item
  25. :labelCol="labelCol"
  26. :wrapperCol="wrapperCol"
  27. label="数据库类型">
  28. <j-dict-select-tag placeholder="请选择数据库类型" dict-code="database_type" triggerChange v-decorator="['dbType', validatorRules.dbType]" @change="handleDbTypeChange"/>
  29. </a-form-item>
  30. <a-form-item
  31. :labelCol="labelCol"
  32. :wrapperCol="wrapperCol"
  33. label="驱动类">
  34. <a-input placeholder="请输入驱动类" v-decorator="['dbDriver', validatorRules.dbDriver]"/>
  35. </a-form-item>
  36. <a-form-item
  37. :labelCol="labelCol"
  38. :wrapperCol="wrapperCol"
  39. label="数据源地址">
  40. <a-input placeholder="请输入数据源地址" v-decorator="['dbUrl', validatorRules.dbUrl]"/>
  41. </a-form-item>
  42. <!-- <a-form-item
  43. :labelCol="labelCol"
  44. :wrapperCol="wrapperCol"
  45. label="数据库名称">
  46. <a-input placeholder="请输入数据库名称" v-decorator="['dbName', validatorRules.dbName]"/>
  47. </a-form-item>-->
  48. <a-form-item
  49. :labelCol="labelCol"
  50. :wrapperCol="wrapperCol"
  51. label="用户名">
  52. <a-input placeholder="请输入用户名" v-decorator="['dbUsername', validatorRules.dbUsername]"/>
  53. </a-form-item>
  54. <a-form-item
  55. :labelCol="labelCol"
  56. :wrapperCol="wrapperCol"
  57. label="密码">
  58. <a-row :gutter="8">
  59. <a-col :span="21">
  60. <a-input-password placeholder="请输入密码" v-decorator="['dbPassword', validatorRules.dbPassword]"/>
  61. </a-col>
  62. <a-col :span="3">
  63. <a-button type="primary" size="small" style="width: 100%" @click="handleTest">测试</a-button>
  64. </a-col>
  65. </a-row>
  66. </a-form-item>
  67. <a-form-item
  68. :labelCol="labelCol"
  69. :wrapperCol="wrapperCol"
  70. label="备注">
  71. <a-textarea placeholder="请输入备注" v-decorator="['remark', {}]"/>
  72. </a-form-item>
  73. </a-form>
  74. </a-spin>
  75. </a-modal>
  76. </template>
  77. <script>
  78. import pick from 'lodash.pick'
  79. import { httpAction, postAction,getAction } from '@/api/manage'
  80. import { validateDuplicateValue } from '@/utils/util'
  81. export default {
  82. name: 'SysDataSourceModal',
  83. components: {},
  84. data() {
  85. return {
  86. title: '操作',
  87. visible: false,
  88. model: {},
  89. labelCol: {
  90. xs: { span: 24 },
  91. sm: { span: 5 },
  92. },
  93. wrapperCol: {
  94. xs: { span: 24 },
  95. sm: { span: 16 },
  96. },
  97. confirmLoading: false,
  98. form: this.$form.createForm(this),
  99. validatorRules: {
  100. code: {
  101. validateFirst: true,
  102. rules: [
  103. { required: true, message: '请输入数据源编码!' },
  104. {
  105. validator: (rule, value, callback) => {
  106. let pattern = /^[a-z|A-Z][a-z|A-Z\d_-]{0,}$/
  107. if (!pattern.test(value)) {
  108. callback('编码必须以字母开头,可包含数字、下划线、横杠')
  109. } else {
  110. validateDuplicateValue('sys_data_source', 'code', value, this.model.id, callback)
  111. }
  112. }
  113. }
  114. ]
  115. },
  116. name: { rules: [{ required: true, message: '请输入数据源名称!' }] },
  117. dbType: { rules: [{ required: true, message: '请选择数据库类型!' }] },
  118. dbDriver: { rules: [{ required: true, message: '请输入驱动类!' }] },
  119. dbUrl: { rules: [{ required: true, message: '请输入数据源地址!' }] },
  120. dbName: { rules: [{ required: true, message: '请输入数据库名称!' }] },
  121. dbUsername: { rules: [{ required: true, message: '请输入用户名!' }] },
  122. dbPassword: { rules: [{ required: false, message: '请输入密码!' }] }
  123. },
  124. url: {
  125. add: '/sys/dataSource/add',
  126. edit: '/sys/dataSource/edit',
  127. queryById: '/sys/dataSource/queryById',
  128. },
  129. dbDriverMap: {
  130. // MySQL 数据库
  131. '1': { dbDriver: 'com.mysql.jdbc.Driver' },
  132. //MySQL5.7+ 数据库
  133. '4': { dbDriver: 'com.mysql.cj.jdbc.Driver' },
  134. // Oracle
  135. '2': { dbDriver: 'oracle.jdbc.OracleDriver' },
  136. // SQLServer 数据库
  137. '3': { dbDriver: 'com.microsoft.sqlserver.jdbc.SQLServerDriver' },
  138. // marialDB 数据库
  139. '5': { dbDriver: 'org.mariadb.jdbc.Driver' },
  140. // postgresql 数据库
  141. '6': { dbDriver: 'org.postgresql.Driver' },
  142. // 达梦 数据库
  143. '7': { dbDriver: 'dm.jdbc.driver.DmDriver' },
  144. // 人大金仓 数据库
  145. '8': { dbDriver: 'com.kingbase8.Driver' },
  146. // 神通 数据库
  147. '9': { dbDriver: 'com.oscar.Driver' },
  148. // SQLite 数据库
  149. '10': { dbDriver: 'org.sqlite.JDBC' },
  150. // DB2 数据库
  151. '11': { dbDriver: 'com.ibm.db2.jcc.DB2Driver' },
  152. // Hsqldb 数据库
  153. '12': { dbDriver: 'org.hsqldb.jdbc.JDBCDriver' },
  154. // Derby 数据库
  155. '13': { dbDriver: 'org.apache.derby.jdbc.ClientDriver' },
  156. // H2 数据库
  157. '14': { dbDriver: 'org.h2.Driver' },
  158. // 其他数据库
  159. '15': { dbDriver: '' }
  160. },
  161. dbUrlMap: {
  162. // MySQL 数据库
  163. '1': { dbUrl: 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false' },
  164. //MySQL5.7+ 数据库
  165. '4': { dbUrl: 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai' },
  166. // Oracle
  167. '2': { dbUrl: 'jdbc:oracle:thin:@127.0.0.1:1521:ORCL' },
  168. // SQLServer 数据库
  169. '3': { dbUrl: 'jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=jeecgboot' },
  170. // Mariadb 数据库
  171. '5': { dbUrl: 'jdbc:mariadb://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useSSL=false' },
  172. // Postgresql 数据库
  173. '6': { dbUrl: 'jdbc:postgresql://127.0.0.1:5432/jeecg-boot' },
  174. // 达梦 数据库
  175. '7': { dbUrl: 'jdbc:dm://127.0.0.1:5236/?jeecg-boot&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8' },
  176. // 人大金仓 数据库
  177. '8': { dbUrl: 'jdbc:kingbase8://127.0.0.1:54321/jeecg-boot' },
  178. // 神通 数据库
  179. '9': { dbUrl: 'jdbc:oscar://192.168.1.125:2003/jeecg-boot' },
  180. // SQLite 数据库
  181. '10': { dbUrl: 'jdbc:sqlite://opt/test.db' },
  182. // DB2 数据库
  183. '11': { dbUrl: 'jdbc:db2://127.0.0.1:50000/jeecg-boot' },
  184. // Hsqldb 数据库
  185. '12': { dbUrl: 'jdbc:hsqldb:hsql://127.0.0.1/jeecg-boot' },
  186. // Derby 数据库
  187. '13': { dbUrl: 'jdbc:derby://127.0.0.1:1527/jeecg-boot' },
  188. // H2 数据库
  189. '14': { dbUrl: 'jdbc:h2:tcp://127.0.0.1:8082/jeecg-boot' },
  190. // 其他数据库
  191. '15': { dbUrl: '' }
  192. }
  193. }
  194. },
  195. created() {
  196. },
  197. methods: {
  198. add() {
  199. this.edit({})
  200. },
  201. async edit(record) {
  202. this.form.resetFields()
  203. this.model = Object.assign({}, record)
  204. //update-begin-author:liusq---date:20220705--for: 编辑时,查询获取解密后的密码 ---
  205. if(record.id){
  206. let res = await getAction(this.url.queryById, {id:record.id});
  207. if (res.success) {
  208. this.model = Object.assign({}, {...res.result})
  209. }
  210. }
  211. //update-end-author:liusq---date:20220705--for: 编辑时,查询获取解密后的密码 ---
  212. this.visible = true
  213. this.$nextTick(() => {
  214. this.form.setFieldsValue(pick(this.model, 'code', 'name', 'remark', 'dbType', 'dbDriver', 'dbUrl', 'dbName', 'dbUsername', 'dbPassword'))
  215. })
  216. },
  217. close() {
  218. this.$emit('close')
  219. this.visible = false
  220. },
  221. handleOk() {
  222. // 触发表单验证
  223. this.form.validateFields((err, values) => {
  224. if (!err) {
  225. this.confirmLoading = true
  226. let formData = Object.assign(this.model, values)
  227. let httpUrl = this.url.add, method = 'post'
  228. if (this.model.id) {
  229. httpUrl = this.url.edit
  230. method = 'put'
  231. // 由于编码的特殊性,所以不能更改
  232. formData['code'] = undefined
  233. }
  234. httpAction(httpUrl, formData, method).then((res) => {
  235. if (res.success) {
  236. this.$message.success(res.message)
  237. this.$emit('ok')
  238. this.close()
  239. } else {
  240. this.$message.warning(res.message)
  241. }
  242. }).finally(() => {
  243. this.confirmLoading = false
  244. })
  245. }
  246. })
  247. },
  248. handleCancel() {
  249. this.close()
  250. },
  251. // 测试数据源配置是否可以正常连接
  252. handleTest() {
  253. let keys = ['dbType', 'dbDriver', 'dbUrl', 'dbName', 'dbUsername', 'dbPassword']
  254. // 获取以上字段的值,并清除校验状态
  255. let fieldsValues = this.form.getFieldsValue(keys)
  256. let setFields = {}
  257. keys.forEach(key => setFields[key] = { value: fieldsValues[key], errors: null })
  258. // 清除校验状态,目的是可以让错误文字闪烁
  259. this.form.setFields(setFields)
  260. // 重新校验
  261. this.$nextTick(() => {
  262. this.form.validateFields(keys, (errors, values) => {
  263. if (!errors) {
  264. let loading = this.$message.loading('连接中……', 0)
  265. postAction('/online/cgreport/api/testConnection', fieldsValues).then(res => {
  266. if (res.success) {
  267. this.$message.success('连接成功')
  268. } else throw new Error(res.message)
  269. }).catch(error => {
  270. this.$warning({ title: '连接失败', content: error.message || error })
  271. }).finally(() => loading())
  272. }
  273. })
  274. })
  275. },
  276. // 数据库类型更改时,联动更改数据库驱动
  277. handleDbTypeChange(val) {
  278. let dbDriver = this.dbDriverMap[val]
  279. let dbUrl = this.dbUrlMap[val]
  280. if (dbDriver) {
  281. this.form.setFieldsValue(dbDriver)
  282. }
  283. if (dbUrl) {
  284. this.form.setFieldsValue(dbUrl)
  285. }
  286. },
  287. }
  288. }
  289. </script>
  290. <style lang="less" scoped></style>