index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. label-width="68px"
  10. >
  11. <el-form-item label="租户名称" prop="tenantName">
  12. <el-input
  13. v-model="queryParams.tenantName"
  14. placeholder="请输入租户名称"
  15. clearable
  16. @keyup.enter.native="handleQuery"
  17. />
  18. </el-form-item>
  19. <el-form-item label="租户编号" prop="tenantCode">
  20. <el-input
  21. v-model="queryParams.tenantCode"
  22. placeholder="请输入租户编号"
  23. clearable
  24. @keyup.enter.native="handleQuery"
  25. />
  26. </el-form-item>
  27. <el-form-item label="负责人" prop="owner">
  28. <el-input
  29. v-model="queryParams.owner"
  30. placeholder="请输入负责人"
  31. clearable
  32. @keyup.enter.native="handleQuery"
  33. />
  34. </el-form-item>
  35. <el-form-item label="联系方式" prop="contactInfo">
  36. <el-input
  37. v-model="queryParams.contactInfo"
  38. placeholder="请输入联系方式"
  39. clearable
  40. @keyup.enter.native="handleQuery"
  41. />
  42. </el-form-item>
  43. <el-form-item label="地址" prop="address">
  44. <el-input
  45. v-model="queryParams.address"
  46. placeholder="请输入地址"
  47. clearable
  48. @keyup.enter.native="handleQuery"
  49. />
  50. </el-form-item>
  51. <el-form-item>
  52. <el-button
  53. type="primary"
  54. icon="el-icon-search"
  55. size="mini"
  56. @click="handleQuery"
  57. >搜索</el-button
  58. >
  59. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  60. >重置</el-button
  61. >
  62. </el-form-item>
  63. </el-form>
  64. <el-row :gutter="10" class="mb8">
  65. <el-col :span="1.5">
  66. <el-button
  67. type="primary"
  68. plain
  69. icon="el-icon-plus"
  70. size="mini"
  71. @click="handleAdd"
  72. v-hasPermi="['system:tenant:add']"
  73. >新增
  74. </el-button>
  75. </el-col>
  76. <!-- <el-col :span="1.5">
  77. <el-button
  78. type="success"
  79. plain
  80. icon="el-icon-edit"
  81. size="mini"
  82. :disabled="single"
  83. @click="handleUpdate"
  84. v-hasPermi="['system:tenant:edit']"
  85. >修改</el-button>
  86. </el-col> -->
  87. <el-col :span="1.5">
  88. <el-button
  89. type="danger"
  90. plain
  91. icon="el-icon-delete"
  92. size="mini"
  93. :disabled="multiple"
  94. @click="handleDelete"
  95. v-hasPermi="['system:tenant:remove']"
  96. >删除
  97. </el-button>
  98. </el-col>
  99. <el-col :span="1.5">
  100. <el-button
  101. type="warning"
  102. plain
  103. icon="el-icon-download"
  104. size="mini"
  105. @click="handleExport"
  106. v-hasPermi="['system:tenant:export']"
  107. >导出
  108. </el-button>
  109. <el-button
  110. type="warning"
  111. plain
  112. icon="el-icon-download"
  113. size="mini"
  114. @click="handleTest"
  115. >test
  116. </el-button>
  117. </el-col>
  118. <right-toolbar
  119. :showSearch.sync="showSearch"
  120. @queryTable="getList"
  121. ></right-toolbar>
  122. </el-row>
  123. <el-table
  124. v-loading="loading"
  125. :data="tenantList"
  126. @selection-change="handleSelectionChange"
  127. >
  128. <el-table-column type="selection" width="55" align="center" />
  129. <el-table-column label="租户ID" align="center" prop="tenantId" />
  130. <el-table-column label="租户名称" align="center" prop="tenantName" />
  131. <el-table-column label="租户编号" align="center" prop="tenantCode" />
  132. <el-table-column label="负责人" align="center" prop="owner" />
  133. <el-table-column label="联系方式" align="center" prop="contactInfo" />
  134. <el-table-column label="地址" align="center" prop="address" />
  135. <el-table-column
  136. label="操作"
  137. align="center"
  138. class-name="small-padding fixed-width"
  139. >
  140. <template slot-scope="scope">
  141. <el-dropdown>
  142. <el-button type="warning" plain size="small">
  143. 处理<i class="el-icon-arrow-down el-icon--right"></i>
  144. </el-button>
  145. <el-dropdown-menu slot="dropdown">
  146. <el-dropdown-item>
  147. <el-button
  148. size="mini"
  149. type="text"
  150. icon="el-icon-edit"
  151. @click="handleUpdate(scope.row)"
  152. v-hasPermi="['system:tenant:edit']"
  153. >修改
  154. </el-button>
  155. </el-dropdown-item>
  156. <el-dropdown-item>
  157. <el-button
  158. size="mini"
  159. type="text"
  160. icon="el-icon-delete"
  161. @click="handleDelete(scope.row)"
  162. v-hasPermi="['system:tenant:remove']"
  163. >删除
  164. </el-button>
  165. </el-dropdown-item>
  166. <el-dropdown-item>
  167. <el-button
  168. size="mini"
  169. type="text"
  170. icon="el-icon-edit"
  171. @click="bindDatasource(scope.row)"
  172. v-show="scope.row.datasourceId == null"
  173. >绑定数据源
  174. </el-button>
  175. </el-dropdown-item>
  176. </el-dropdown-menu>
  177. </el-dropdown>
  178. </template>
  179. </el-table-column>
  180. </el-table>
  181. <pagination
  182. v-show="total > 0"
  183. :total="total"
  184. :page.sync="queryParams.pageNum"
  185. :limit.sync="queryParams.pageSize"
  186. @pagination="getList"
  187. />
  188. <!-- 添加或修改租户信息对话框 -->
  189. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  190. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  191. <el-form-item label="租户名称" prop="tenantName">
  192. <el-input v-model="form.tenantName" placeholder="请输入租户名称" />
  193. </el-form-item>
  194. <el-form-item label="租户编号" prop="tenantCode">
  195. <el-input v-model="form.tenantCode" placeholder="请输入租户编号" />
  196. </el-form-item>
  197. <el-form-item label="负责人" prop="owner">
  198. <el-input v-model="form.owner" placeholder="请输入负责人" />
  199. </el-form-item>
  200. <el-form-item label="联系方式" prop="contactInfo">
  201. <el-input v-model="form.contactInfo" placeholder="请输入联系方式" />
  202. </el-form-item>
  203. <el-form-item label="地址" prop="address">
  204. <el-input v-model="form.address" placeholder="请输入地址" />
  205. </el-form-item>
  206. </el-form>
  207. <div slot="footer" class="dialog-footer">
  208. <el-button type="primary" @click="submitForm">确 定</el-button>
  209. <el-button @click="cancel">取 消</el-button>
  210. </div>
  211. </el-dialog>
  212. <!-- 添加或修改数据源信息对话框 -->
  213. <el-dialog
  214. :title="dataSourceTitle"
  215. :visible.sync="dataSourceOpen"
  216. width="500px"
  217. append-to-body
  218. >
  219. <el-radio-group
  220. v-model="dataSourceType"
  221. class="mb5"
  222. @input="dataSourceTypeChange"
  223. >
  224. <el-radio-button :label="true">公网</el-radio-button>
  225. <el-radio-button :label="false">内网</el-radio-button>
  226. </el-radio-group>
  227. <el-form
  228. ref="dataSourceForm"
  229. :model="dataSourceForm"
  230. :rules="dataSourceFormRules"
  231. label-width="120px"
  232. >
  233. <el-form-item label="数据源类型" prop="databaseType">
  234. <el-select
  235. v-model="dataSourceForm.databaseType"
  236. :placeholder="palcemsg"
  237. @change="selecthandle"
  238. :disabled="dataSourceType"
  239. >
  240. <el-option
  241. v-for="item in dict.type.datasource_type"
  242. :key="item.value"
  243. :label="item.label"
  244. :value="item.value"
  245. ></el-option>
  246. </el-select>
  247. </el-form-item>
  248. <el-form-item label="数据库名称" prop="databaseName">
  249. <el-input
  250. v-model="dataSourceForm.databaseName"
  251. placeholder="请输入数据库名称"
  252. />
  253. </el-form-item>
  254. <el-form-item label="租户管理员账号" prop="tenantAccount">
  255. <el-input
  256. v-model="dataSourceForm.tenantAccount"
  257. placeholder="请输入租户管理员账号"
  258. />
  259. </el-form-item>
  260. <!-- !dataSourceType -->
  261. <el-form-item
  262. label="数据库IP"
  263. v-show="!dataSourceType"
  264. prop="databaseIp"
  265. >
  266. <el-input
  267. v-model="dataSourceForm.databaseIp"
  268. placeholder="请输数据库IP"
  269. />
  270. </el-form-item>
  271. <el-form-item label="用户名" v-show="!dataSourceType" prop="username">
  272. <el-input
  273. v-model="dataSourceForm.username"
  274. placeholder="请输入用户名"
  275. />
  276. </el-form-item>
  277. <el-form-item label="密码" v-show="!dataSourceType" prop="password">
  278. <el-input
  279. v-model="dataSourceForm.password"
  280. placeholder="请输入密码"
  281. />
  282. </el-form-item>
  283. <el-form-item label="端口号" v-show="!dataSourceType" prop="portNumber">
  284. <el-input
  285. v-model="dataSourceForm.portNumber"
  286. placeholder="请输入端口号"
  287. />
  288. </el-form-item>
  289. </el-form>
  290. <div slot="footer" class="dialog-footer">
  291. <el-button type="primary" @click="submitForm1">确 定</el-button>
  292. <el-button @click="cancel1">取 消</el-button>
  293. </div>
  294. </el-dialog>
  295. </div>
  296. </template>
  297. <script>
  298. import {
  299. listTenant,
  300. getTenant,
  301. delTenant,
  302. addTenant,
  303. updateTenant,
  304. bindDatasource,
  305. selectAllUser,
  306. createTenant,
  307. initTenantMenuData,
  308. } from "@/api/system/tenant";
  309. import { getDataSourceInfo, insertDataSource } from "@/api/system/data";
  310. import { async } from "@/components/updateModule/k-form-design/lib/k-form-design.common";
  311. export default {
  312. name: "Tenant",
  313. dicts: [
  314. "datasource_type",
  315. "sqlserver_connection_information",
  316. "mysql_connection_information",
  317. "dm_connection_information",
  318. "orcale_connection_information",
  319. ],
  320. data() {
  321. return {
  322. // 遮罩层
  323. loading: true,
  324. // 选中数组
  325. ids: [],
  326. // 非单个禁用
  327. single: true,
  328. // 非多个禁用
  329. multiple: true,
  330. // 显示搜索条件
  331. showSearch: true,
  332. // 总条数
  333. total: 0,
  334. // 租户信息表格数据
  335. tenantList: [],
  336. // 弹出层标题
  337. title: "",
  338. // 是否显示弹出层
  339. open: false,
  340. // 所有用户信息
  341. allUser: [],
  342. // 查询参数
  343. queryParams: {
  344. pageNum: 1,
  345. pageSize: 10,
  346. tenantName: null,
  347. tenantCode: null,
  348. owner: null,
  349. contactInfo: null,
  350. address: null,
  351. },
  352. // 当前编辑租户的信息
  353. currentTenantInfo: {},
  354. // 表单参数
  355. form: {},
  356. // 表单校验
  357. rules: {
  358. tenantName: [
  359. { required: true, message: "租户名称不能为空", trigger: "blur" },
  360. ],
  361. tenantCode: [
  362. { required: true, message: "租户编号不能为空", trigger: "blur" },
  363. ],
  364. },
  365. //数据源表单参数
  366. dataSourceType: true, //true:公网 false:内网
  367. dataSourceForm: {
  368. databaseType: "",
  369. databaseName: "",
  370. tenantAccount: "",
  371. databaseIp: "",
  372. username: "",
  373. password: "",
  374. portNumber: "",
  375. },
  376. dataSourceTitle: "",
  377. dataSourceOpen: false,
  378. fromTenantId: null,
  379. dataSourceFormRules: {
  380. databaseType: [
  381. { required: true, message: "数据源类型不能为空", trigger: "change" },
  382. ],
  383. databaseName: [
  384. { required: true, message: "数据库名不能为空", trigger: "blur" },
  385. ],
  386. tenantAccount: [
  387. { required: true, message: "租户账号不能为空", trigger: "change" },
  388. { validator: this.tenantAccountValidator, trigger: "blur" },
  389. ],
  390. databaseIp: [
  391. { required: true, message: "数据库IP不能为空", trigger: "blur" },
  392. ],
  393. username: [
  394. { required: true, message: "用户名不能为空", trigger: "blur" },
  395. ],
  396. password: [
  397. { required: true, message: "密码不能为空", trigger: "blur" },
  398. ],
  399. portNumber: [
  400. { required: true, message: "端口号不能为空", trigger: "blur" },
  401. ],
  402. },
  403. };
  404. },
  405. computed: {
  406. palcemsg() {
  407. return this.dataSourceType ? "mysql" : "请选择数据源类型";
  408. },
  409. },
  410. created() {
  411. this.getList();
  412. this.selectAllUser();
  413. },
  414. methods: {
  415. // 获取所用用户名,作校验用
  416. async selectAllUser() {
  417. let res = await selectAllUser();
  418. if (res.code == 200) {
  419. this.allUser = res.data;
  420. } else {
  421. console.log(res.msg);
  422. }
  423. },
  424. // 租户名自定义校验规则
  425. tenantAccountValidator(rule, value, callback) {
  426. let isRepeat = this.allUser.filter((item) => item.userName == value);
  427. if (isRepeat.length !== 0) {
  428. callback(new Error("租户账号重复"));
  429. } else {
  430. callback();
  431. }
  432. },
  433. // 数据源类型改变回调
  434. dataSourceTypeChange(type) {
  435. this.$nextTick(() => {
  436. this.$refs.dataSourceForm.resetFields();
  437. this.dataSourceForm.databaseType = "mysql";
  438. this.selecthandle("mysql");
  439. });
  440. },
  441. handleOpe() {},
  442. /** 查询租户信息列表 */
  443. getList() {
  444. this.loading = true;
  445. listTenant(this.queryParams).then((response) => {
  446. this.tenantList = response.rows;
  447. this.total = response.total;
  448. this.loading = false;
  449. });
  450. },
  451. // 取消按钮
  452. cancel() {
  453. this.open = false;
  454. this.reset();
  455. },
  456. // 绑定数据源取消按钮
  457. cancel1() {
  458. this.dataSourceOpen = false;
  459. this.reset1();
  460. },
  461. // 表单重置
  462. reset() {
  463. this.form = {
  464. tenantId: null,
  465. tenantName: null,
  466. tenantCode: null,
  467. owner: null,
  468. contactInfo: null,
  469. address: null,
  470. createBy: null,
  471. createTime: null,
  472. };
  473. this.resetForm("form");
  474. },
  475. // 表单重置
  476. reset1() {
  477. this.dataSourceType = true;
  478. this.dataSourceForm = {
  479. id: null,
  480. databaseName: null,
  481. databaseIp: null,
  482. tenantAccount: "",
  483. username: null,
  484. password: null,
  485. portNumber: null,
  486. databaseType: "mysql",
  487. };
  488. // this.resetForm("dataSourceForm");
  489. },
  490. /** 搜索按钮操作 */
  491. handleQuery() {
  492. this.queryParams.pageNum = 1;
  493. this.getList();
  494. },
  495. /** 重置按钮操作 */
  496. resetQuery() {
  497. this.resetForm("queryForm");
  498. this.handleQuery();
  499. },
  500. // 多选框选中数据
  501. handleSelectionChange(selection) {
  502. this.ids = selection.map((item) => item.tenantId);
  503. this.single = selection.length !== 1;
  504. this.multiple = !selection.length;
  505. },
  506. /** 新增按钮操作 */
  507. handleAdd() {
  508. this.reset();
  509. this.open = true;
  510. this.title = "添加租户信息";
  511. },
  512. /** 修改按钮操作 */
  513. handleUpdate(row) {
  514. this.reset();
  515. const tenantId = row.tenantId || this.ids;
  516. getTenant(tenantId).then((response) => {
  517. this.form = response.data;
  518. this.open = true;
  519. this.title = "修改租户信息";
  520. });
  521. },
  522. /** 绑定数据源按钮操作 */
  523. bindDatasource(row) {
  524. this.currentTenantInfo = row;
  525. console.log(row);
  526. this.reset1();
  527. this.dataSourceOpen = true;
  528. this.dataSourceTitle = row.tenantName + "配置数据库";
  529. this.fromTenantId = row.tenantId;
  530. this.dataSourceTypeChange();
  531. // const tenantId = row.tenantId || this.ids;
  532. // getTenant(tenantId).then((response) => {
  533. // this.form = response.data;
  534. // this.open = true;
  535. // this.title = "修改租户信息";
  536. // });
  537. },
  538. /** 提交按钮 */
  539. submitForm() {
  540. this.$refs["form"].validate((valid) => {
  541. if (valid) {
  542. if (this.form.tenantId != null) {
  543. updateTenant(this.form).then((response) => {
  544. this.$modal.msgSuccess("修改成功");
  545. this.open = false;
  546. this.getList();
  547. });
  548. } else {
  549. addTenant(this.form).then((response) => {
  550. this.$modal.msgSuccess("新增成功");
  551. this.open = false;
  552. this.getList();
  553. });
  554. }
  555. }
  556. });
  557. },
  558. /** 提交按钮 */
  559. submitForm1() {
  560. this.$refs["dataSourceForm"].validate((valid) => {
  561. if (valid) {
  562. if (this.dataSourceForm.id != null) {
  563. // bindDatasource(this.dataSourceForm).then((response) => {
  564. // this.$modal.msgSuccess("修改成功");
  565. // this.dataSourceOpen = false;
  566. // this.getList();
  567. // });
  568. } else {
  569. let query = {
  570. tenantId: this.fromTenantId,
  571. dataSource: this.dataSourceForm,
  572. };
  573. bindDatasource(query).then((response) => {
  574. if (response.code == 200) {
  575. let data = {
  576. userName: this.dataSourceForm.tenantAccount,
  577. nickName: this.currentTenantInfo.tenantName,
  578. userType: "01",
  579. tenantId: this.currentTenantInfo.tenantId,
  580. password: "123456",
  581. };
  582. createTenant(data).then(async (res) => {
  583. if (res.code == 200) {
  584. let resp = await initTenantMenuData(
  585. this.currentTenantInfo.tenantId
  586. );
  587. if ((resp.code = 200)) {
  588. this.$modal.msgSuccess("新增成功");
  589. this.dataSourceOpen = false;
  590. this.getList();
  591. }
  592. }
  593. });
  594. }
  595. });
  596. }
  597. }
  598. });
  599. },
  600. /** 删除按钮操作 */
  601. handleDelete(row) {
  602. const tenantIds = row.tenantId || this.ids;
  603. this.$modal
  604. .confirm('是否确认删除租户信息编号为"' + tenantIds + '"的数据项?')
  605. .then(function () {
  606. return delTenant(tenantIds);
  607. })
  608. .then(() => {
  609. this.getList();
  610. this.$modal.msgSuccess("删除成功");
  611. })
  612. .catch(() => {});
  613. },
  614. /** 导出按钮操作 */
  615. handleExport() {
  616. this.download(
  617. "system/tenant/export",
  618. {
  619. ...this.queryParams,
  620. },
  621. `tenant_${new Date().getTime()}.xlsx`
  622. );
  623. },
  624. /**
  625. * 选择数据源校验名称
  626. */
  627. selecthandle(row) {
  628. let sql = {
  629. sqlserver: "sqlserver_connection_information",
  630. mysql: "mysql_connection_information",
  631. dm: "dm_connection_information",
  632. oracle: "oracle_connection_information",
  633. };
  634. let qar = {};
  635. this.dict.type[sql[row]].forEach((item) => {
  636. qar[item.label] = item.value;
  637. });
  638. if (this.dataSourceType) {
  639. let { databaseIp, password, portNumber, username } = qar;
  640. Object.assign(this.dataSourceForm, {
  641. databaseIp,
  642. password,
  643. portNumber,
  644. username,
  645. });
  646. }
  647. getDataSourceInfo(qar).then((res) => {
  648. console.log(res);
  649. });
  650. },
  651. handleTest() {
  652. let formdata = {
  653. databaseType: "mysql",
  654. databaseName: "test1111",
  655. databaseIp: "127.0.0.1",
  656. username: "testname",
  657. password: "123123",
  658. portNumber: "3306",
  659. };
  660. insertDataSource(formdata).then((res) => {
  661. console.log(res);
  662. });
  663. },
  664. },
  665. };
  666. </script>