user.vue 32 KB

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