user.vue 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203
  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. rules: [{
  532. required: true,
  533. message: "请选择用户状态",
  534. trigger: "blur"
  535. }]
  536. },
  537. {
  538. label: "账号状态",
  539. prop: "statusName",
  540. hide: true,
  541. display: false
  542. }
  543. ]
  544. },
  545. {
  546. label: '银行信息',
  547. prop: 'bankInfo',
  548. icon: 'el-icon-s-finance',
  549. column: [
  550. {
  551. label: "开户行",
  552. prop: "bankDeposit",
  553. overHidden: true
  554. },
  555. {
  556. label: "银行户头",
  557. prop: "bankAccount",
  558. overHidden: true
  559. },
  560. {
  561. label: "账号",
  562. prop: "reimburseNumber",
  563. hide: true,
  564. overHidden: true
  565. }
  566. ]
  567. },
  568. {
  569. label: '职责信息',
  570. prop: 'dutyInfo',
  571. icon: 'el-icon-s-custom',
  572. column: [
  573. {
  574. label: "用户编号",
  575. prop: "code",
  576. },
  577. {
  578. label: "所属角色",
  579. prop: "roleId",
  580. multiple: true,
  581. type: "tree",
  582. dicData: [],
  583. props: {
  584. label: "title"
  585. },
  586. checkStrictly: true,
  587. slot: true,
  588. rules: [{
  589. required: true,
  590. message: "请选择所属角色",
  591. trigger: "click"
  592. }]
  593. },
  594. {
  595. label: "所属部门",
  596. prop: "deptId",
  597. type: "tree",
  598. multiple: true,
  599. dicData: [],
  600. props: {
  601. label: "title"
  602. },
  603. checkStrictly: true,
  604. slot: true,
  605. rules: [{
  606. required: true,
  607. message: "请选择所属部门",
  608. trigger: "click"
  609. }]
  610. },
  611. {
  612. label: "岗位(团队)",
  613. prop: "postId",
  614. type: "tree",
  615. multiple: true,
  616. dicData: [],
  617. props: {
  618. label: "postName",
  619. value: "id"
  620. },
  621. rules: [{
  622. required: true,
  623. message: "请选择所属岗位",
  624. trigger: "click"
  625. }],
  626. },
  627. ]
  628. },
  629. ]
  630. },
  631. data: [],
  632. platformQuery: {},
  633. platformSelectionList: [],
  634. platformData: [],
  635. platformForm: {},
  636. platformOption: {
  637. tip: false,
  638. searchShow: true,
  639. searchMenuSpan: 6,
  640. border: true,
  641. index: true,
  642. selection: true,
  643. viewBtn: true,
  644. dialogClickModal: false,
  645. menuWidth: 120,
  646. editBtnText: '配置',
  647. column: [
  648. {
  649. label: "登录账号",
  650. prop: "account",
  651. search: true,
  652. display: false
  653. },
  654. {
  655. label: "所属租户",
  656. prop: "tenantName",
  657. slot: true,
  658. display: false
  659. },
  660. {
  661. label: "用户姓名",
  662. prop: "realName",
  663. search: true,
  664. display: false
  665. },
  666. {
  667. label: "用户平台",
  668. prop: "userTypeName",
  669. slot: true,
  670. display: false
  671. },
  672. {
  673. label: "用户平台",
  674. type: "select",
  675. dicUrl: "/api/blade-system/dict/dictionary?code=user_type",
  676. props: {
  677. label: "dictValue",
  678. value: "dictKey"
  679. },
  680. dataType: "number",
  681. search: true,
  682. hide: true,
  683. display: false,
  684. prop: "userType",
  685. rules: [{
  686. required: true,
  687. message: "请选择用户平台",
  688. trigger: "blur"
  689. }]
  690. },
  691. {
  692. label: "用户拓展",
  693. prop: "userExt",
  694. type: "textarea",
  695. minRows: 8,
  696. span: 24,
  697. overHidden: true,
  698. row: true,
  699. hide: true,
  700. },
  701. ],
  702. },
  703. excelForm: {},
  704. excelOption: {
  705. submitBtn: false,
  706. emptyBtn: false,
  707. column: [
  708. {
  709. label: '模板上传',
  710. prop: 'excelFile',
  711. type: 'upload',
  712. drag: true,
  713. loadText: '模板上传中,请稍等',
  714. span: 24,
  715. propsHttp: {
  716. res: 'data'
  717. },
  718. tip: '请上传 .xls,.xlsx 标准格式文件',
  719. action: "/api/blade-user/import-user"
  720. },
  721. {
  722. label: "数据覆盖",
  723. prop: "isCovered",
  724. type: "switch",
  725. align: "center",
  726. width: 80,
  727. dicData: [
  728. {
  729. label: "否",
  730. value: 0
  731. },
  732. {
  733. label: "是",
  734. value: 1
  735. }
  736. ],
  737. value: 0,
  738. slot: true,
  739. rules: [
  740. {
  741. required: true,
  742. message: "请选择是否覆盖",
  743. trigger: "blur"
  744. }
  745. ]
  746. },
  747. {
  748. label: '模板下载',
  749. prop: 'excelTemplate',
  750. formslot: true,
  751. span: 24,
  752. }
  753. ]
  754. }
  755. };
  756. },
  757. watch: {
  758. 'form.tenantId'() {
  759. if (this.form.tenantId !== '' && this.initFlag) {
  760. this.initData(this.form.tenantId);
  761. }
  762. },
  763. 'excelForm.isCovered'() {
  764. if (this.excelForm.isCovered !== '') {
  765. const column = this.findObject(this.excelOption.column, "excelFile");
  766. column.action = `/api/blade-user/import-user?isCovered=${this.excelForm.isCovered}`;
  767. }
  768. }
  769. },
  770. computed: {
  771. ...mapGetters(["userInfo", "permission"]),
  772. permissionList() {
  773. return {
  774. addBtn: this.vaildData(this.permission.user_add, false),
  775. viewBtn: this.vaildData(this.permission.user_view, false),
  776. delBtn: this.vaildData(this.permission.user_delete, false),
  777. editBtn: this.vaildData(this.permission.user_edit, false)
  778. };
  779. },
  780. platformPermissionList() {
  781. return {
  782. addBtn: false,
  783. viewBtn: false,
  784. delBtn: false,
  785. editBtn: this.vaildData(this.permission.user_edit, false)
  786. };
  787. },
  788. ids() {
  789. let ids = [];
  790. this.selectionList.forEach(ele => {
  791. ids.push(ele.id);
  792. });
  793. return ids.join(",");
  794. },
  795. },
  796. created() {
  797. // 根据 租户好判断是否要显示 积分余额
  798. // const content = JSON.parse(localStorage.getItem('saber-tenantId')).content
  799. // if (content == 171757) {
  800. // this.$nextTick(()=>{
  801. // this.refsDisplay()
  802. // })
  803. // }
  804. let arr = localStorage.getItem('roleName').split(',')
  805. this.$nextTick(()=>{
  806. // 循环这个 实例
  807. for(let item of this.$refs.crud.option.group) {
  808. // 判断是不是详细详细里的
  809. if (item.prop == "detailInfo") {
  810. for (let ite of item.column) {
  811. // 判断是不是积分余额
  812. if (ite.prop == "pointsBalance") {
  813. // 判断是否是admin 权限
  814. if (arr.indexOf('admin') != -1) {
  815. ite.disabled = false
  816. }
  817. ite.addDisplay = true
  818. ite.editDisplay = true
  819. ite.viewDisplay = true
  820. }
  821. }
  822. }
  823. }
  824. })
  825. },
  826. mounted() {
  827. // 非租户模式默认加载管理组数据
  828. if (!website.tenantMode) {
  829. this.initData(website.tenantId);
  830. }
  831. },
  832. methods: {
  833. // 循环实例 修改积分余额是否显示
  834. refsDisplay(){
  835. let arr = localStorage.getItem('roleName').split(',')
  836. // 循环这个 实例
  837. for(let item of this.$refs.crud.option.group) {
  838. // 判断是不是详细详细里的
  839. if (item.prop == "detailInfo") {
  840. for (let ite of item.column) {
  841. // 判断是不是积分余额
  842. if (ite.prop == "pointsBalance") {
  843. // 判断是否是admin 权限
  844. if (arr.indexOf('admin') != -1) {
  845. ite.disabled = false
  846. }
  847. ite.addDisplay = true
  848. ite.editDisplay = true
  849. ite.viewDisplay = true
  850. }
  851. }
  852. }
  853. }
  854. },
  855. nodeClick(data) {
  856. this.treeDeptId = data.id;
  857. this.page.currentPage = 1;
  858. this.onLoad(this.page);
  859. },
  860. initData(tenantId) {
  861. getRoleTree(tenantId).then(res => {
  862. const column = this.findObject(this.option.group, "roleId");
  863. column.dicData = []
  864. if (localStorage.getItem('roleName').indexOf('admin') != -1) {
  865. column.dicData = res.data.data
  866. }else {
  867. for (let item of res.data.data) {
  868. if (item.title != '管理员') {
  869. column.dicData.push(item)
  870. }
  871. }
  872. }
  873. });
  874. getDeptTree(tenantId).then(res => {
  875. const column = this.findObject(this.option.group, "deptId");
  876. column.dicData = res.data.data;
  877. });
  878. getPostList(tenantId).then(res => {
  879. const column = this.findObject(this.option.group, "postId");
  880. column.dicData = res.data.data;
  881. });
  882. },
  883. submitRole() {
  884. const roleList = this.$refs.treeRole.getCheckedKeys().join(",");
  885. grant(this.ids, roleList).then(() => {
  886. this.roleBox = false;
  887. this.$message({
  888. type: "success",
  889. message: "操作成功!"
  890. });
  891. this.onLoad(this.page);
  892. });
  893. },
  894. rowSave(row, done, loading) {
  895. row.deptId = row.deptId.join(",");
  896. row.roleId = row.roleId.join(",");
  897. row.postId = row.postId.join(",");
  898. // 福达写死小程序
  899. let userObj = JSON.parse(localStorage.getItem("saber-userInfo")).content;
  900. if (userObj.tenant_id == '577435') {
  901. // row.userType = 4
  902. row.appletsId = 'wxa92adb24f1784863'
  903. }
  904. add(row).then(() => {
  905. this.initFlag = false;
  906. this.onLoad(this.page);
  907. this.$message({
  908. type: "success",
  909. message: "操作成功!"
  910. });
  911. done();
  912. }, error => {
  913. window.console.log(error);
  914. loading();
  915. });
  916. },
  917. rowUpdate(row, index, done, loading) {
  918. row.deptId = row.deptId.join(",");
  919. row.roleId = row.roleId.join(",");
  920. row.postId = row.postId.join(",");
  921. if (!row.workingStatus) {
  922. row.workingStatus = '0'
  923. }
  924. // 福达写死小程序
  925. let userObj = JSON.parse(localStorage.getItem("saber-userInfo")).content;
  926. if (userObj.tenant_id == '577435') {
  927. // row.userType = 4
  928. row.appletsId = 'wxa92adb24f1784863'
  929. }
  930. update(row).then(() => {
  931. this.initFlag = false;
  932. this.onLoad(this.page);
  933. this.$message({
  934. type: "success",
  935. message: "操作成功!"
  936. });
  937. done();
  938. }, error => {
  939. window.console.log(error);
  940. loading();
  941. });
  942. },
  943. rowDel(row) {
  944. this.$confirm("确定将选择数据删除?", {
  945. confirmButtonText: "确定",
  946. cancelButtonText: "取消",
  947. type: "warning"
  948. })
  949. .then(() => {
  950. return remove(row.id);
  951. })
  952. .then(() => {
  953. this.onLoad(this.page);
  954. this.$message({
  955. type: "success",
  956. message: "操作成功!"
  957. });
  958. });
  959. },
  960. searchReset() {
  961. this.query = {};
  962. this.treeDeptId = '';
  963. this.onLoad(this.page);
  964. },
  965. searchChange(params, done) {
  966. this.query = params;
  967. this.page.currentPage = 1;
  968. this.onLoad(this.page, params);
  969. done();
  970. },
  971. selectionChange(list) {
  972. this.selectionList = list;
  973. },
  974. selectionClear() {
  975. this.selectionList = [];
  976. this.$refs.crud.toggleSelection();
  977. },
  978. handleDelete() {
  979. if (this.selectionList.length === 0) {
  980. this.$message.warning("请选择至少一条数据");
  981. return;
  982. }
  983. this.$confirm("确定将选择数据删除?", {
  984. confirmButtonText: "确定",
  985. cancelButtonText: "取消",
  986. type: "warning"
  987. })
  988. .then(() => {
  989. return remove(this.ids);
  990. })
  991. .then(() => {
  992. this.onLoad(this.page);
  993. this.$message({
  994. type: "success",
  995. message: "操作成功!"
  996. });
  997. this.$refs.crud.toggleSelection();
  998. });
  999. },
  1000. handleReset() {
  1001. if (this.selectionList.length === 0) {
  1002. this.$message.warning("请选择至少一条数据");
  1003. return;
  1004. }
  1005. this.dialogVisible = true;
  1006. // this.$confirm("确定将选择账号密码重置为123456?", {
  1007. // confirmButtonText: "确定",
  1008. // cancelButtonText: "取消",
  1009. // type: "warning"
  1010. // })
  1011. // .then(() => {
  1012. // return resetPassword(this.ids);
  1013. // })
  1014. // .then(() => {
  1015. // this.$message({
  1016. // type: "success",
  1017. // message: "操作成功!"
  1018. // });
  1019. // this.$refs.crud.toggleSelection();
  1020. // });
  1021. },
  1022. // 重置密码为指定内容
  1023. resetPasswordDiy() {
  1024. resetPassword(this.ids, this.newPassword).then(res => {
  1025. console.log(res)
  1026. if (res.data.code === 200) {
  1027. this.$message({
  1028. message: '操作成功!',
  1029. type: 'success'
  1030. });
  1031. this.dialogVisible = false;
  1032. }
  1033. })
  1034. },
  1035. handleGrant() {
  1036. if (this.selectionList.length === 0) {
  1037. this.$message.warning("请选择至少一条数据");
  1038. return;
  1039. }
  1040. this.roleTreeObj = [];
  1041. if (this.selectionList.length === 1) {
  1042. this.roleTreeObj = this.selectionList[0].roleId.split(",");
  1043. }
  1044. getRoleTree().then(res => {
  1045. this.roleGrantList = res.data.data;
  1046. this.roleBox = true;
  1047. });
  1048. },
  1049. handlePlatform() {
  1050. this.platformBox = true;
  1051. },
  1052. handleImport() {
  1053. this.excelBox = true;
  1054. },
  1055. uploadAfter(res, done, loading, column) {
  1056. window.console.log(column);
  1057. this.excelBox = false;
  1058. this.refreshChange();
  1059. done();
  1060. },
  1061. handleExport() {
  1062. this.$confirm("是否导出用户数据?", "提示", {
  1063. confirmButtonText: "确定",
  1064. cancelButtonText: "取消",
  1065. type: "warning"
  1066. }).then(() => {
  1067. window.open(`/api/blade-user/export-user?${this.website.tokenHeader}=${getToken()}&account=${this.search.account}&realName=${this.search.realName}`);
  1068. });
  1069. },
  1070. handleTemplate() {
  1071. window.open(`/api/blade-user/export-template?${this.website.tokenHeader}=${getToken()}`);
  1072. },
  1073. beforeOpen(done, type) {
  1074. if (["edit", "view"].includes(type)) {
  1075. // if (localStorage.getItem('roleName').indexOf('admin') == -1) {
  1076. // this.findObject(this.option.group, "workingStatus").disabled = true;
  1077. // }
  1078. getUser(this.form.id).then(res => {
  1079. this.form = res.data.data;
  1080. if(this.form.hasOwnProperty("deptId")){
  1081. this.form.deptId = this.form.deptId.split(",");
  1082. }
  1083. if(this.form.hasOwnProperty("roleId")){
  1084. this.form.roleId = this.form.roleId.split(",");
  1085. }
  1086. if(this.form.hasOwnProperty("postId")){
  1087. this.form.postId = this.form.postId.split(",");
  1088. }
  1089. });
  1090. }
  1091. this.initFlag = true;
  1092. done();
  1093. },
  1094. currentChange(currentPage) {
  1095. this.page.currentPage = currentPage;
  1096. },
  1097. sizeChange(pageSize) {
  1098. this.page.pageSize = pageSize;
  1099. },
  1100. refreshChange() {
  1101. this.onLoad(this.page, this.query);
  1102. },
  1103. onLoad(page, params = {}) {
  1104. this.loading = true;
  1105. getList(page.currentPage, page.pageSize, Object.assign(params, this.query), this.treeDeptId).then(res => {
  1106. const data = res.data.data;
  1107. this.page.total = data.total;
  1108. this.data = data.records;
  1109. this.loading = false;
  1110. this.selectionClear();
  1111. });
  1112. },
  1113. platformRowUpdate(row, index, done, loading) {
  1114. updatePlatform(row.id, row.userType, row.userExt).then(() => {
  1115. this.platformOnLoad(this.platformPage);
  1116. this.$message({
  1117. type: "success",
  1118. message: "操作成功!"
  1119. });
  1120. done();
  1121. }, error => {
  1122. window.console.log(error);
  1123. loading();
  1124. });
  1125. },
  1126. platformBeforeOpen(done, type) {
  1127. if (["edit", "view"].includes(type)) {
  1128. getUserPlatform(this.platformForm.id).then(res => {
  1129. this.platformForm = res.data.data;
  1130. });
  1131. }
  1132. done();
  1133. },
  1134. platformSearchReset() {
  1135. this.platformQuery = {};
  1136. this.platformOnLoad(this.platformPage);
  1137. },
  1138. platformSearchChange(params, done) {
  1139. this.platformQuery = params;
  1140. this.platformPage.currentPage = 1;
  1141. this.platformOnLoad(this.platformPage, params);
  1142. done();
  1143. },
  1144. platformSelectionChange(list) {
  1145. this.platformSelectionList = list;
  1146. },
  1147. platformSelectionClear() {
  1148. this.platformSelectionList = [];
  1149. this.$refs.platformCrud.toggleSelection();
  1150. },
  1151. platformCurrentChange(currentPage) {
  1152. this.platformPage.currentPage = currentPage;
  1153. },
  1154. platformSizeChange(pageSize) {
  1155. this.platformPage.pageSize = pageSize;
  1156. },
  1157. platformRefreshChange() {
  1158. this.platformOnLoad(this.platformPage, this.platformQuery);
  1159. },
  1160. platformOnLoad(page, params = {}) {
  1161. this.platformLoading = true;
  1162. getList(page.currentPage, page.pageSize, Object.assign(params, this.query), this.treeDeptId).then(res => {
  1163. const data = res.data.data;
  1164. this.platformPage.total = data.total;
  1165. this.platformData = data.records;
  1166. this.platformLoading = false;
  1167. this.selectionClear();
  1168. });
  1169. }
  1170. }
  1171. };
  1172. </script>
  1173. <style>
  1174. .box {
  1175. height: 800px;
  1176. }
  1177. .el-scrollbar {
  1178. height: 100%;
  1179. }
  1180. .box .el-scrollbar__wrap {
  1181. overflow: scroll;
  1182. }
  1183. ::v-deep .el-dialog .el-dialog__body{
  1184. display: flex;
  1185. justify-content: center;
  1186. align-items: center;
  1187. }
  1188. </style>