user.vue 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058
  1. <template>
  2. <el-row>
  3. <el-col :span="5">
  4. <div class="box">
  5. <el-scrollbar>
  6. <basic-container>
  7. <avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick"/>
  8. </basic-container>
  9. </el-scrollbar>
  10. </div>
  11. </el-col>
  12. <el-col :span="19">
  13. <basic-container>
  14. <avue-crud :option="option"
  15. :search.sync="search"
  16. :table-loading="loading"
  17. :data="data"
  18. ref="crud"
  19. v-model="form"
  20. :permission="permissionList"
  21. @row-del="rowDel"
  22. @row-update="rowUpdate"
  23. @row-save="rowSave"
  24. :before-open="beforeOpen"
  25. :page.sync="page"
  26. @search-change="searchChange"
  27. @search-reset="searchReset"
  28. @selection-change="selectionChange"
  29. @current-change="currentChange"
  30. @size-change="sizeChange"
  31. @refresh-change="refreshChange"
  32. @on-load="onLoad">
  33. <template slot="menuLeft">
  34. <el-button type="danger"
  35. size="small"
  36. plain
  37. icon="el-icon-delete"
  38. v-if="permission.user_delete"
  39. @click="handleDelete">删 除
  40. </el-button>
  41. <el-button type="info"
  42. size="small"
  43. plain
  44. v-if="permission.user_role"
  45. icon="el-icon-user"
  46. @click="handleGrant">角色配置
  47. </el-button>
  48. <!--<el-button type="info"
  49. size="small"
  50. plain
  51. v-if="permission.user_reset"
  52. icon="el-icon-refresh"
  53. @click="handleReset">密码重置
  54. </el-button>-->
  55. <!-- <el-button type="info"
  56. size="small"
  57. plain
  58. v-if="userInfo.role_name.includes('admin')"
  59. icon="el-icon-setting"
  60. @click="handlePlatform">平台配置
  61. </el-button>-->
  62. <!--<el-button type="success"
  63. size="small"
  64. plain
  65. v-if="userInfo.role_name.includes('admin')"
  66. icon="el-icon-upload2"
  67. @click="handleImport">导入
  68. </el-button>-->
  69. <el-button type="warning"
  70. size="small"
  71. plain
  72. v-if="userInfo.role_name.includes('admin')"
  73. icon="el-icon-download"
  74. @click="handleExport">导出
  75. </el-button>
  76. <el-button type="info"
  77. size="small"
  78. plain
  79. v-if="userInfo.role_name.includes('admin')"
  80. icon="el-icon-setting"
  81. @click="testVisible = true">驗證測試
  82. </el-button>
  83. </template>
  84. <template slot-scope="{row}"
  85. slot="tenantName">
  86. <el-tag>{{row.tenantName}}</el-tag>
  87. </template>
  88. <template slot-scope="{row}"
  89. slot="roleName">
  90. <el-tag>{{row.roleName}}</el-tag>
  91. </template>
  92. <template slot-scope="{row}"
  93. slot="deptName">
  94. <el-tag>{{row.deptName}}</el-tag>
  95. </template>
  96. <template slot-scope="{row}"
  97. slot="userTypeName">
  98. <el-tag>{{row.userTypeName}}</el-tag>
  99. </template>
  100. </avue-crud>
  101. <el-dialog title="用户角色配置"
  102. append-to-body
  103. :visible.sync="roleBox"
  104. width="345px">
  105. <el-tree :data="roleGrantList"
  106. show-checkbox
  107. check-strictly
  108. default-expand-all
  109. node-key="id"
  110. ref="treeRole"
  111. :default-checked-keys="roleTreeObj"
  112. :props="props">
  113. </el-tree>
  114. <span slot="footer" class="dialog-footer">
  115. <el-button @click="roleBox = false">取 消</el-button>
  116. <el-button type="primary"
  117. @click="submitRole">确 定</el-button>
  118. </span>
  119. </el-dialog>
  120. <el-dialog title="用户数据导入"
  121. append-to-body
  122. :visible.sync="excelBox"
  123. width="555px">
  124. <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
  125. <template slot="excelTemplate">
  126. <el-button type="primary" @click="handleTemplate">
  127. 点击下载<i class="el-icon-download el-icon--right"></i>
  128. </el-button>
  129. </template>
  130. </avue-form>
  131. </el-dialog>
  132. <el-dialog title="用户平台配置"
  133. append-to-body
  134. :visible.sync="platformBox">
  135. <avue-crud :option="platformOption"
  136. :table-loading="platformLoading"
  137. :data="platformData"
  138. ref="platformCrud"
  139. v-model="platformForm"
  140. :before-open="platformBeforeOpen"
  141. :page.sync="platformPage"
  142. :permission="platformPermissionList"
  143. @row-update="platformRowUpdate"
  144. @search-change="platformSearchChange"
  145. @search-reset="platformSearchReset"
  146. @selection-change="platformSelectionChange"
  147. @current-change="platformCurrentChange"
  148. @size-change="platformSizeChange"
  149. @refresh-change="platformRefreshChange"
  150. @on-load="platformOnLoad">
  151. <template slot-scope="{row}"
  152. slot="tenantName">
  153. <el-tag>{{row.tenantName}}</el-tag>
  154. </template>
  155. <template slot-scope="{row}"
  156. slot="userTypeName">
  157. <el-tag>{{row.userTypeName}}</el-tag>
  158. </template>
  159. </avue-crud>
  160. </el-dialog>
  161. </basic-container>
  162. </el-col>
  163. <el-dialog :append-to-body="true" :modal-append-to-body="false" :destroy-on-close="true" :visible.sync="testVisible" title="驗證測試">
  164. <login-test></login-test>
  165. </el-dialog>
  166. </el-row>
  167. </template>
  168. <script>
  169. import {
  170. getList,
  171. getUser,
  172. getUserPlatform,
  173. remove,
  174. update,
  175. updatePlatform,
  176. add,
  177. grant,
  178. resetPassword
  179. } from "@/api/system/user";
  180. import {getDeptTree, getDeptLazyTree, getTree} from "@/api/system/dept";
  181. import {getRoleTree} from "@/api/system/role";
  182. import {getPostList} from "@/api/system/post";
  183. import {mapGetters} from "vuex";
  184. import website from '@/config/website';
  185. import {getToken} from '@/util/auth';
  186. import LoginTest from "./login-test";
  187. export default {
  188. components: {LoginTest},
  189. data() {
  190. const validatePass = (rule, value, callback) => {
  191. if (value === '') {
  192. callback(new Error('请输入密码'));
  193. } else {
  194. callback();
  195. }
  196. };
  197. const validatePass2 = (rule, value, callback) => {
  198. if (value === '') {
  199. callback(new Error('请再次输入密码'));
  200. } else if (value !== this.form.password) {
  201. callback(new Error('两次输入密码不一致!'));
  202. } else {
  203. callback();
  204. }
  205. };
  206. return {
  207. testVisible: false,
  208. form: {},
  209. search:{},
  210. roleBox: false,
  211. excelBox: false,
  212. platformBox: false,
  213. initFlag: true,
  214. selectionList: [],
  215. query: {},
  216. loading: true,
  217. platformLoading: false,
  218. page: {
  219. pageSize: 10,
  220. currentPage: 1,
  221. total: 0
  222. },
  223. platformPage: {
  224. pageSize: 10,
  225. currentPage: 1,
  226. total: 0
  227. },
  228. init: {
  229. roleTree: [],
  230. deptTree: [],
  231. },
  232. props: {
  233. label: "title",
  234. value: "key"
  235. },
  236. roleGrantList: [],
  237. roleTreeObj: [],
  238. treeDeptId: '',
  239. treeData: [],
  240. treeOption: {
  241. nodeKey: 'id',
  242. lazy: false,
  243. treeLoad: function (node, resolve) {
  244. /*const parentId = (node.level === 0) ? 0 : node.data.id;
  245. getDeptLazyTree(parentId).then(res => {
  246. resolve(res.data.data.map(item => {
  247. return {
  248. ...item,
  249. leaf: !item.hasChildren
  250. }
  251. }))
  252. });*/
  253. },
  254. addBtn: false,
  255. menu: false,
  256. size: 'small',
  257. props: {
  258. labelText: '标题',
  259. label: 'title',
  260. value: 'value',
  261. children: 'children'
  262. }
  263. },
  264. option: {
  265. height: 'auto',
  266. calcHeight: 80,
  267. tip: false,
  268. searchShow: true,
  269. searchMenuSpan: 6,
  270. border: true,
  271. index: true,
  272. selection: true,
  273. viewBtn: true,
  274. //dialogType: 'drawer',
  275. dialogClickModal: false,
  276. column: [
  277. {
  278. label: "登录账号",
  279. prop: "account",
  280. search: true,
  281. display: false
  282. },
  283. /*{
  284. label: "所属租户",
  285. prop: "tenantName",
  286. slot: true,
  287. display: false
  288. },*/
  289. {
  290. label: "用户姓名",
  291. prop: "name",
  292. search: true,
  293. display: false
  294. },
  295. {
  296. label: "EHR號",
  297. prop: "ehr",
  298. search: true,
  299. display: false
  300. },
  301. {
  302. label: "Mo碼",
  303. prop: "code",
  304. search: true,
  305. display: false
  306. },
  307. {
  308. label: "所属角色",
  309. prop: "roleName",
  310. slot: true,
  311. display: false
  312. },
  313. {
  314. label: "所属部门",
  315. prop: "deptName",
  316. slot: true,
  317. display: false
  318. },
  319. {
  320. label: "用户平台",
  321. prop: "userTypeName",
  322. slot: true,
  323. hide: true,
  324. display: false
  325. },
  326. {
  327. label: "用户平台",
  328. type: "select",
  329. dicUrl: "/api/blade-system/dict/dictionary?code=user_type",
  330. props: {
  331. label: "dictValue",
  332. value: "dictKey"
  333. },
  334. dataType: "number",
  335. hide: true,
  336. display: false,
  337. prop: "userType",
  338. rules: [{
  339. required: true,
  340. message: "请选择用户平台",
  341. trigger: "blur"
  342. }]
  343. },
  344. ],
  345. group: [
  346. {
  347. label: '基础信息',
  348. prop: 'baseInfo',
  349. icon: 'el-icon-user-solid',
  350. column: [
  351. {
  352. label: "所属租户",
  353. prop: "tenantId",
  354. type: "tree",
  355. dicUrl: "/api/blade-system/tenant/select",
  356. props: {
  357. label: "tenantName",
  358. value: "tenantId"
  359. },
  360. hide: !website.tenantMode,
  361. addDisplay: website.tenantMode,
  362. editDisplay: website.tenantMode,
  363. viewDisplay: website.tenantMode,
  364. rules: [{
  365. required: true,
  366. message: "请输入所属租户",
  367. trigger: "click"
  368. }],
  369. span: 24,
  370. },
  371. {
  372. label: "登录账号",
  373. prop: "account",
  374. rules: [{
  375. required: true,
  376. message: "请输入登录账号",
  377. trigger: "blur"
  378. }],
  379. },
  380. {
  381. label: "用户平台",
  382. type: "select",
  383. dicUrl: "/api/blade-system/dict/dictionary?code=user_type",
  384. props: {
  385. label: "dictValue",
  386. value: "dictKey"
  387. },
  388. dataType: "number",
  389. slot: true,
  390. prop: "userType",
  391. disabled: true,
  392. display: false,
  393. hide: true,
  394. rules: [{
  395. required: true,
  396. message: "请选择用户平台",
  397. trigger: "blur"
  398. }]
  399. },
  400. /* {
  401. label: '密码',
  402. prop: 'password',
  403. type: 'password',
  404. hide: true,
  405. editDisplay: false,
  406. viewDisplay: false,
  407. rules: [{required: true, validator: validatePass, trigger: 'blur'}]
  408. },
  409. {
  410. label: '确认密码',
  411. prop: 'password2',
  412. type: 'password',
  413. hide: true,
  414. editDisplay: false,
  415. viewDisplay: false,
  416. rules: [{required: true, validator: validatePass2, trigger: 'blur'}]
  417. },*/
  418. ]
  419. },
  420. {
  421. label: '详细信息',
  422. prop: 'detailInfo',
  423. icon: 'el-icon-s-order',
  424. column: [
  425. /*{
  426. label: "用户昵称",
  427. prop: "name",
  428. hide: true,
  429. rules: [{
  430. required: true,
  431. message: "请输入用户昵称",
  432. trigger: "blur"
  433. }]
  434. },*/
  435. {
  436. label: "用户姓名",
  437. prop: "name",
  438. rules: [{
  439. required: true,
  440. message: "请輸入输入用户姓名",
  441. trigger: "blur"
  442. }, {
  443. min: 2,
  444. max: 5,
  445. message: '姓名长度在2到5个字符'
  446. }]
  447. },
  448. /*{
  449. label: "手机号码",
  450. prop: "phone",
  451. overHidden: true
  452. },
  453. {
  454. label: "电子邮箱",
  455. prop: "email",
  456. hide: true,
  457. overHidden: true
  458. },
  459. {
  460. label: "用户性别",
  461. prop: "sex",
  462. type: "select",
  463. dicData: [
  464. {
  465. label: "男",
  466. value: 1
  467. },
  468. {
  469. label: "女",
  470. value: 2
  471. },
  472. {
  473. label: "未知",
  474. value: 3
  475. }
  476. ],
  477. hide: true
  478. },
  479. {
  480. label: "用户生日",
  481. type: "date",
  482. prop: "birthday",
  483. format: "yyyy-MM-dd hh:mm:ss",
  484. valueFormat: "yyyy-MM-dd hh:mm:ss",
  485. hide: true
  486. },
  487. {
  488. label: "账号状态",
  489. prop: "statusName",
  490. hide: true,
  491. display: false
  492. }*/
  493. ]
  494. },
  495. {
  496. label: '职责信息',
  497. prop: 'dutyInfo',
  498. icon: 'el-icon-s-custom',
  499. column: [
  500. {
  501. label: "用户Mo碼",
  502. prop: "code",
  503. rules: [{
  504. required: true,
  505. message: "请輸入Mo碼",
  506. trigger: "click"
  507. }, {
  508. max: 8,
  509. message: '不能超過8個字符'
  510. }]
  511. },
  512. {
  513. label: "EHR号",
  514. prop: "ehr",
  515. rules: [{
  516. required: true,
  517. message: "请輸入EHR号",
  518. trigger: "click"
  519. }, {
  520. max: 7,
  521. message: '不能超過7個字符'
  522. }]
  523. },
  524. {
  525. label: "所属角色",
  526. prop: "roleId",
  527. multiple: true,
  528. type: "tree",
  529. dicData: [],
  530. props: {
  531. label: "title"
  532. },
  533. checkStrictly: true,
  534. slot: true,
  535. rules: [{
  536. required: true,
  537. message: "请选择所属角色",
  538. trigger: "click"
  539. }]
  540. },
  541. {
  542. label: "所属部门",
  543. prop: "deptId",
  544. type: "tree",
  545. // multiple: true,
  546. dicData: [],
  547. props: {
  548. label: "title"
  549. },
  550. checkStrictly: true,
  551. slot: true,
  552. rules: [{
  553. required: true,
  554. message: "请选择所属部门",
  555. trigger: "click"
  556. }]
  557. },
  558. /* {
  559. label: "所属岗位",
  560. prop: "postId",
  561. type: "tree",
  562. multiple: true,
  563. dicData: [],
  564. props: {
  565. label: "postName",
  566. value: "id"
  567. },
  568. rules: [{
  569. required: true,
  570. message: "请选择所属岗位",
  571. trigger: "click"
  572. }],
  573. },*/
  574. ]
  575. },
  576. ]
  577. },
  578. data: [],
  579. platformQuery: {},
  580. platformSelectionList: [],
  581. platformData: [],
  582. platformForm: {},
  583. platformOption: {
  584. tip: false,
  585. searchShow: true,
  586. searchMenuSpan: 6,
  587. border: true,
  588. index: true,
  589. selection: true,
  590. viewBtn: true,
  591. dialogClickModal: false,
  592. menuWidth: 120,
  593. editBtnText: '配置',
  594. column: [
  595. {
  596. label: "登录账号",
  597. prop: "account",
  598. search: true,
  599. display: false
  600. },
  601. {
  602. label: "所属租户",
  603. prop: "tenantName",
  604. slot: true,
  605. display: false
  606. },
  607. {
  608. label: "用户姓名",
  609. prop: "realName",
  610. search: true,
  611. display: false
  612. },
  613. {
  614. label: "用户平台",
  615. prop: "userTypeName",
  616. slot: true,
  617. display: false,
  618. hide: true
  619. },
  620. {
  621. label: "用户平台",
  622. type: "select",
  623. dicUrl: "/api/blade-system/dict/dictionary?code=user_type",
  624. props: {
  625. label: "dictValue",
  626. value: "dictKey"
  627. },
  628. dataType: "number",
  629. search: true,
  630. hide: true,
  631. display: false,
  632. disabled: true,
  633. prop: "userType",
  634. rules: [{
  635. required: true,
  636. message: "请选择用户平台",
  637. trigger: "blur"
  638. }]
  639. },
  640. {
  641. label: "用户拓展",
  642. prop: "userExt",
  643. type: "textarea",
  644. minRows: 8,
  645. span: 24,
  646. overHidden: true,
  647. row: true,
  648. hide: true,
  649. },
  650. ],
  651. },
  652. excelForm: {},
  653. excelOption: {
  654. submitBtn: false,
  655. emptyBtn: false,
  656. column: [
  657. {
  658. label: '模板上传',
  659. prop: 'excelFile',
  660. type: 'upload',
  661. drag: true,
  662. loadText: '模板上传中,请稍等',
  663. span: 24,
  664. propsHttp: {
  665. res: 'data'
  666. },
  667. tip: '请上传 .xls,.xlsx 标准格式文件',
  668. action: "/api/blade-user/import-user"
  669. },
  670. {
  671. label: "数据覆盖",
  672. prop: "isCovered",
  673. type: "switch",
  674. align: "center",
  675. width: 80,
  676. dicData: [
  677. {
  678. label: "否",
  679. value: 0
  680. },
  681. {
  682. label: "是",
  683. value: 1
  684. }
  685. ],
  686. value: 0,
  687. slot: true,
  688. rules: [
  689. {
  690. required: true,
  691. message: "请选择是否覆盖",
  692. trigger: "blur"
  693. }
  694. ]
  695. },
  696. {
  697. label: '模板下载',
  698. prop: 'excelTemplate',
  699. formslot: true,
  700. span: 24,
  701. }
  702. ]
  703. }
  704. };
  705. },
  706. watch: {
  707. 'form.tenantId'() {
  708. if (this.form.tenantId !== '' && this.initFlag) {
  709. this.initData(this.form.tenantId);
  710. }
  711. },
  712. 'excelForm.isCovered'() {
  713. if (this.excelForm.isCovered !== '') {
  714. const column = this.findObject(this.excelOption.column, "excelFile");
  715. column.action = `/api/blade-user/import-user?isCovered=${this.excelForm.isCovered}`;
  716. }
  717. }
  718. },
  719. computed: {
  720. ...mapGetters(["userInfo", "permission"]),
  721. permissionList() {
  722. return {
  723. addBtn: this.vaildData(this.permission.user_add, false),
  724. viewBtn: this.vaildData(this.permission.user_view, false),
  725. delBtn: this.vaildData(this.permission.user_delete, false),
  726. editBtn: this.vaildData(this.permission.user_edit, false)
  727. };
  728. },
  729. platformPermissionList() {
  730. return {
  731. addBtn: false,
  732. viewBtn: false,
  733. delBtn: false,
  734. editBtn: this.vaildData(this.permission.user_edit, false)
  735. };
  736. },
  737. ids() {
  738. let ids = [];
  739. this.selectionList.forEach(ele => {
  740. ids.push(ele.id);
  741. });
  742. return ids.join(",");
  743. },
  744. },
  745. mounted() {
  746. // 非租户模式默认加载管理组数据
  747. if (!website.tenantMode) {
  748. this.initData(website.tenantId);
  749. }
  750. },
  751. methods: {
  752. nodeClick(data) {
  753. this.treeDeptId = data.id;
  754. this.page.currentPage = 1;
  755. this.onLoad(this.page);
  756. },
  757. initData(tenantId) {
  758. getRoleTree(tenantId).then(res => {
  759. const column = this.findObject(this.option.group, "roleId");
  760. column.dicData = res.data.data;
  761. });
  762. getDeptTree(tenantId).then(res => {
  763. const column = this.findObject(this.option.group, "deptId");
  764. column.dicData = res.data.data;
  765. let treeData = getTree(res.data.data, this.userInfo.dept_id);
  766. this.treeData = treeData;
  767. });
  768. /*getPostList(tenantId).then(res => {
  769. const column = this.findObject(this.option.group, "postId");
  770. column.dicData = res.data.data;
  771. });*/
  772. },
  773. submitRole() {
  774. const roleList = this.$refs.treeRole.getCheckedKeys().join(",");
  775. grant(this.ids, roleList).then(() => {
  776. this.roleBox = false;
  777. this.$message({
  778. type: "success",
  779. message: "操作成功!"
  780. });
  781. this.onLoad(this.page);
  782. });
  783. },
  784. rowSave(row, done, loading) {
  785. // row.deptId = row.deptId.join(",");
  786. row.roleId = row.roleId.join(",");
  787. if (row.postId){
  788. row.postId = row.postId.join(",");
  789. }
  790. add(row).then(() => {
  791. this.initFlag = false;
  792. this.onLoad(this.page);
  793. this.$message({
  794. type: "success",
  795. message: "操作成功!"
  796. });
  797. done();
  798. }, error => {
  799. window.console.log(error);
  800. loading();
  801. });
  802. },
  803. rowUpdate(row, index, done, loading) {
  804. // row.deptId = row.deptId.join(",");
  805. row.roleId = row.roleId.join(",");
  806. if (row.postId){
  807. row.postId = row.postId.join(",");
  808. }
  809. update(row).then(() => {
  810. this.initFlag = false;
  811. this.onLoad(this.page);
  812. this.$message({
  813. type: "success",
  814. message: "操作成功!"
  815. });
  816. done();
  817. }, error => {
  818. window.console.log(error);
  819. loading();
  820. });
  821. },
  822. rowDel(row) {
  823. this.$confirm("确定将选择数据删除?", {
  824. confirmButtonText: "确定",
  825. cancelButtonText: "取消",
  826. type: "warning"
  827. })
  828. .then(() => {
  829. return remove(row.id);
  830. })
  831. .then(() => {
  832. this.onLoad(this.page);
  833. this.$message({
  834. type: "success",
  835. message: "操作成功!"
  836. });
  837. });
  838. },
  839. searchReset() {
  840. this.query = {};
  841. this.treeDeptId = '';
  842. this.onLoad(this.page);
  843. },
  844. searchChange(params, done) {
  845. this.query = params;
  846. this.page.currentPage = 1;
  847. this.onLoad(this.page, params);
  848. done();
  849. },
  850. selectionChange(list) {
  851. this.selectionList = list;
  852. },
  853. selectionClear() {
  854. this.selectionList = [];
  855. this.$refs.crud.toggleSelection();
  856. },
  857. handleDelete() {
  858. if (this.selectionList.length === 0) {
  859. this.$message.warning("请选择至少一条数据");
  860. return;
  861. }
  862. this.$confirm("确定将选择数据删除?", {
  863. confirmButtonText: "确定",
  864. cancelButtonText: "取消",
  865. type: "warning"
  866. })
  867. .then(() => {
  868. return remove(this.ids);
  869. })
  870. .then(() => {
  871. this.onLoad(this.page);
  872. this.$message({
  873. type: "success",
  874. message: "操作成功!"
  875. });
  876. this.$refs.crud.toggleSelection();
  877. });
  878. },
  879. handleReset() {
  880. if (this.selectionList.length === 0) {
  881. this.$message.warning("请选择至少一条数据");
  882. return;
  883. }
  884. this.$confirm("确定将选择账号密码重置为123456?", {
  885. confirmButtonText: "确定",
  886. cancelButtonText: "取消",
  887. type: "warning"
  888. })
  889. .then(() => {
  890. return resetPassword(this.ids);
  891. })
  892. .then(() => {
  893. this.$message({
  894. type: "success",
  895. message: "操作成功!"
  896. });
  897. this.$refs.crud.toggleSelection();
  898. });
  899. },
  900. handleGrant() {
  901. if (this.selectionList.length === 0) {
  902. this.$message.warning("请选择至少一条数据");
  903. return;
  904. }
  905. this.roleTreeObj = [];
  906. if (this.selectionList.length === 1) {
  907. this.roleTreeObj = this.selectionList[0].roleId.split(",");
  908. }
  909. getRoleTree().then(res => {
  910. this.roleGrantList = res.data.data;
  911. this.roleBox = true;
  912. });
  913. },
  914. handlePlatform() {
  915. this.platformBox = true;
  916. },
  917. handleImport() {
  918. this.excelBox = true;
  919. },
  920. uploadAfter(res, done, loading, column) {
  921. window.console.log(column);
  922. this.excelBox = false;
  923. this.refreshChange();
  924. done();
  925. },
  926. handleExport() {
  927. this.$confirm("是否导出用户数据?", "提示", {
  928. confirmButtonText: "确定",
  929. cancelButtonText: "取消",
  930. type: "warning"
  931. }).then(() => {
  932. window.open(`/api/blade-user/export-user?${this.website.tokenHeader}=${getToken()}&account=${this.search.account}&name=${this.search.name}`);
  933. });
  934. },
  935. handleTemplate() {
  936. window.open(`/api/blade-user/export-template?${this.website.tokenHeader}=${getToken()}`);
  937. },
  938. beforeOpen(done, type) {
  939. if (type == 'add'){
  940. this.form.userType = '1';
  941. }
  942. if (["edit", "view"].includes(type)) {
  943. getUser(this.form.id).then(res => {
  944. this.form = res.data.data;
  945. /* if(this.form.hasOwnProperty("deptId")){
  946. this.form.deptId = this.form.deptId.split(",");
  947. }*/
  948. if(this.form.hasOwnProperty("roleId")){
  949. this.form.roleId = this.form.roleId.split(",");
  950. }
  951. if(this.form.hasOwnProperty("postId")){
  952. this.form.postId = this.form.postId.split(",");
  953. }
  954. });
  955. }
  956. this.initFlag = true;
  957. done();
  958. },
  959. currentChange(currentPage) {
  960. this.page.currentPage = currentPage;
  961. },
  962. sizeChange(pageSize) {
  963. this.page.pageSize = pageSize;
  964. },
  965. refreshChange() {
  966. this.onLoad(this.page, this.query);
  967. },
  968. onLoad(page, params = {}) {
  969. this.loading = true;
  970. getList(page.currentPage, page.pageSize, Object.assign(params, this.query), this.treeDeptId).then(res => {
  971. const data = res.data.data;
  972. this.page.total = data.total;
  973. this.data = data.records;
  974. this.loading = false;
  975. this.selectionClear();
  976. });
  977. },
  978. platformRowUpdate(row, index, done, loading) {
  979. updatePlatform(row.id, row.userType, row.userExt).then(() => {
  980. this.platformOnLoad(this.platformPage);
  981. this.$message({
  982. type: "success",
  983. message: "操作成功!"
  984. });
  985. done();
  986. }, error => {
  987. window.console.log(error);
  988. loading();
  989. });
  990. },
  991. platformBeforeOpen(done, type) {
  992. if (["edit", "view"].includes(type)) {
  993. getUserPlatform(this.platformForm.id).then(res => {
  994. this.platformForm = res.data.data;
  995. });
  996. }
  997. done();
  998. },
  999. platformSearchReset() {
  1000. this.platformQuery = {};
  1001. this.platformOnLoad(this.platformPage);
  1002. },
  1003. platformSearchChange(params, done) {
  1004. this.platformQuery = params;
  1005. this.platformPage.currentPage = 1;
  1006. this.platformOnLoad(this.platformPage, params);
  1007. done();
  1008. },
  1009. platformSelectionChange(list) {
  1010. this.platformSelectionList = list;
  1011. },
  1012. platformSelectionClear() {
  1013. this.platformSelectionList = [];
  1014. this.$refs.platformCrud.toggleSelection();
  1015. },
  1016. platformCurrentChange(currentPage) {
  1017. this.platformPage.currentPage = currentPage;
  1018. },
  1019. platformSizeChange(pageSize) {
  1020. this.platformPage.pageSize = pageSize;
  1021. },
  1022. platformRefreshChange() {
  1023. this.platformOnLoad(this.platformPage, this.platformQuery);
  1024. },
  1025. platformOnLoad(page, params = {}) {
  1026. this.platformLoading = true;
  1027. getList(page.currentPage, page.pageSize, Object.assign(params, this.query), this.treeDeptId).then(res => {
  1028. const data = res.data.data;
  1029. this.platformPage.total = data.total;
  1030. this.platformData = data.records;
  1031. this.platformLoading = false;
  1032. this.selectionClear();
  1033. });
  1034. }
  1035. }
  1036. };
  1037. </script>
  1038. <style>
  1039. .box {
  1040. height: 800px;
  1041. }
  1042. .el-scrollbar {
  1043. height: 100%;
  1044. }
  1045. .box .el-scrollbar__wrap {
  1046. overflow: scroll;
  1047. }
  1048. </style>