user.vue 36 KB

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