user.vue 37 KB

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