index.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. <template>
  2. <div class="app-container">
  3. <layoutCom>
  4. <org-tree
  5. slot="leftBar"
  6. v-model="queryParams.orgId"
  7. @defaultKey="getDefaultKey"
  8. @checkChange="checkChange"
  9. @click="clickTreeNode"
  10. ></org-tree>
  11. <el-row slot="rightBar">
  12. <!--用户数据-->
  13. <el-col>
  14. <!-- 搜索条件 -->
  15. <el-form
  16. :model="queryParams"
  17. ref="queryForm"
  18. size="small"
  19. :inline="true"
  20. v-show="showSearch"
  21. label-width="68px"
  22. >
  23. <el-form-item label="用户名称" prop="username">
  24. <el-input
  25. v-model="queryParams.username"
  26. placeholder="请输入用户名称"
  27. clearable
  28. style="width: 240px"
  29. @keyup.enter.native="handleQuery"
  30. />
  31. </el-form-item>
  32. <el-form-item label="手机号码" prop="phone">
  33. <el-input
  34. v-model="queryParams.phone"
  35. placeholder="请输入手机号码"
  36. clearable
  37. style="width: 240px"
  38. @keyup.enter.native="handleQuery"
  39. />
  40. </el-form-item>
  41. <el-form-item label="状态" prop="isLock">
  42. <el-select
  43. v-model="queryParams.isLock"
  44. placeholder="用户状态"
  45. clearable
  46. style="width: 240px"
  47. >
  48. <el-option
  49. v-for="dict in dict.type.sys_normal_disable"
  50. :key="dict.value"
  51. :label="dict.label"
  52. :value="dict.value"
  53. />
  54. </el-select>
  55. </el-form-item>
  56. <!-- <el-form-item label="创建时间">
  57. <el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"
  58. range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
  59. </el-form-item> -->
  60. <el-form-item>
  61. <el-button
  62. type="primary"
  63. icon="el-icon-search"
  64. size="mini"
  65. @click="handleQuery"
  66. >搜索</el-button
  67. >
  68. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  69. >重置</el-button
  70. >
  71. </el-form-item>
  72. </el-form>
  73. <!-- 按纽 -->
  74. <el-row :gutter="10" class="mb8">
  75. <el-col :span="1.5">
  76. <el-button
  77. type="primary"
  78. plain
  79. icon="el-icon-plus"
  80. size="mini"
  81. @click="handleAdd"
  82. v-hasPermi="['system:user:add']"
  83. >新增</el-button
  84. >
  85. </el-col>
  86. <!-- <el-col :span="1.5">
  87. <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
  88. v-hasPermi="['system:user:edit']">修改</el-button>
  89. </el-col>
  90. <el-col :span="1.5">
  91. <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
  92. v-hasPermi="['system:user:remove']">删除</el-button>
  93. </el-col> -->
  94. <!-- <el-col :span="1.5">-->
  95. <!-- <el-button-->
  96. <!-- type="info"-->
  97. <!-- plain-->
  98. <!-- icon="el-icon-upload2"-->
  99. <!-- size="mini"-->
  100. <!-- @click="handleImport"-->
  101. <!-- v-hasPermi="['system:user:import']"-->
  102. <!-- >导入</el-button>-->
  103. <!-- </el-col>-->
  104. <!-- <el-col :span="1.5">-->
  105. <!-- <el-button-->
  106. <!-- type="warning"-->
  107. <!-- plain-->
  108. <!-- icon="el-icon-download"-->
  109. <!-- size="mini"-->
  110. <!-- @click="handleExport"-->
  111. <!-- v-hasPermi="['system:user:export']"-->
  112. <!-- >导出</el-button>-->
  113. <!-- </el-col>-->
  114. <right-toolbar
  115. :showSearch.sync="showSearch"
  116. @queryTable="getList"
  117. :columns="columns"
  118. ></right-toolbar>
  119. </el-row>
  120. <el-table
  121. v-loading="loading"
  122. :data="userList"
  123. @selection-change="handleSelectionChange"
  124. >
  125. <el-table-column
  126. v-if="false"
  127. type="selection"
  128. width="50"
  129. align="center"
  130. />
  131. <el-table-column
  132. label="用户名称"
  133. align="center"
  134. key="username"
  135. prop="username"
  136. v-if="columns[0].visible"
  137. />
  138. <el-table-column
  139. label="用户昵称"
  140. align="center"
  141. key="name"
  142. prop="name"
  143. v-if="columns[1].visible"
  144. :show-overflow-tooltip="true"
  145. />
  146. <el-table-column
  147. label="所属机构"
  148. align="center"
  149. key="orgName"
  150. prop="orgName"
  151. v-if="columns[3].visible"
  152. :show-overflow-tooltip="true"
  153. />
  154. <el-table-column
  155. label="用户角色"
  156. align="center"
  157. prop="roles"
  158. v-if="columns[2].visible"
  159. :show-overflow-tooltip="true"
  160. >
  161. <template slot-scope="scope">
  162. <template v-for="item in scope.row.roles">
  163. {{ item.roleName }}
  164. <br />
  165. </template>
  166. </template>
  167. </el-table-column>
  168. <el-table-column
  169. label="状态"
  170. align="center"
  171. key="isLock"
  172. prop="isLock"
  173. v-if="columns[4].visible"
  174. width="80"
  175. >
  176. <template slot-scope="scope">
  177. <dict-tag
  178. :options="dict.type.sys_normal_disable"
  179. :value="scope.row.isLock"
  180. />
  181. </template>
  182. </el-table-column>
  183. <el-table-column
  184. label="是否管理人员"
  185. align="center"
  186. key="isManager"
  187. prop="isManager"
  188. v-if="columns[5].visible"
  189. width="120"
  190. >
  191. <template slot-scope="scope">
  192. {{ scope.row.isManager > 0 ? "是" : "否" }}
  193. </template>
  194. </el-table-column>
  195. <el-table-column
  196. label="登录IP"
  197. align="center"
  198. key="lastIp"
  199. prop="lastIp"
  200. v-if="columns[6].visible"
  201. width="120"
  202. />
  203. <el-table-column
  204. label="登录时间"
  205. align="center"
  206. key="lastTime"
  207. prop="lastTime"
  208. v-if="columns[7].visible"
  209. width="120"
  210. />
  211. <el-table-column
  212. label="操作"
  213. align="center"
  214. width="160"
  215. class-name="small-padding fixed-width"
  216. >
  217. <template slot-scope="scope" v-if="scope.row.userId !== 1">
  218. <el-button
  219. size="mini"
  220. type="text"
  221. icon="el-icon-plus"
  222. @click="handleExtend(scope.row)"
  223. v-hasPermi="['system:user:extend']"
  224. >补充信息</el-button
  225. >
  226. <!-- <el-button
  227. size="mini"
  228. type="text"
  229. icon="el-icon-plus"
  230. v-hasPermi="['system:user:extend']"
  231. >补充信息</el-button
  232. > -->
  233. <el-button
  234. size="mini"
  235. type="text"
  236. icon="el-icon-edit"
  237. @click="handleUpdate(scope.row)"
  238. v-hasPermi="['system:user:edit']"
  239. >编辑</el-button
  240. >
  241. <el-button
  242. v-if="!scope.row.source"
  243. size="mini"
  244. type="text"
  245. icon="el-icon-delete"
  246. @click="handleDelete(scope.row)"
  247. v-hasPermi="['system:user:remove']"
  248. >删除</el-button
  249. >
  250. <el-dropdown
  251. size="mini"
  252. @command="(command) => handleCommand(command, scope.row)"
  253. v-hasPermi="['system:user:resetPwd', 'system:user:edit']"
  254. >
  255. <el-button
  256. size="mini"
  257. type="text"
  258. icon="el-icon-d-arrow-right"
  259. >更多</el-button
  260. >
  261. <el-dropdown-menu slot="dropdown">
  262. <el-dropdown-item
  263. command="handleResetPwd"
  264. icon="el-icon-key"
  265. v-hasPermi="['system:user:resetPwd']"
  266. >重置密码</el-dropdown-item
  267. >
  268. <el-dropdown-item
  269. command="handleAuthRole"
  270. v-if="false"
  271. icon="el-icon-circle-check"
  272. v-hasPermi="['system:user:edit']"
  273. >分配角色</el-dropdown-item
  274. >
  275. </el-dropdown-menu>
  276. </el-dropdown>
  277. </template>
  278. </el-table-column>
  279. </el-table>
  280. <pagination
  281. v-show="total > 0"
  282. :total="total"
  283. :page.sync="queryParams.pageNum"
  284. :limit.sync="queryParams.pageSize"
  285. @pagination="getList"
  286. />
  287. </el-col>
  288. </el-row>
  289. </layoutCom>
  290. <!-- 添加或修改用户配置对话框 -->
  291. <DialogCom :title="title" :visible.sync="open" width="800px" append-to-body>
  292. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  293. <el-row>
  294. <el-col :span="10">
  295. <el-form-item label="用户名称" prop="username">
  296. <el-input
  297. v-model="form.username"
  298. placeholder="请输入用户名"
  299. maxlength="30"
  300. :readonly="form.source == 1"
  301. />
  302. </el-form-item>
  303. </el-col>
  304. <el-col :span="10">
  305. <el-form-item label="用户昵称" prop="name">
  306. <el-input
  307. v-model="form.name"
  308. placeholder="请输入用户昵称"
  309. maxlength="30"
  310. :readonly="form.source == 1"
  311. />
  312. </el-form-item>
  313. </el-col>
  314. </el-row>
  315. <el-row>
  316. <el-col :span="10">
  317. <el-form-item label="所属机构" prop="orgId">
  318. <tree-select
  319. v-model="form.orgId"
  320. :options="deptOptions"
  321. :show-count="true"
  322. :normalizer="tenantIdnormalizer"
  323. :props="{ checkStrictly: true, label: 'name' }"
  324. placeholder="请选择归属机构"
  325. :disabled="form.source == 1"
  326. />
  327. </el-form-item>
  328. </el-col>
  329. <el-col :span="10">
  330. <el-form-item label="用户角色" prop="roleIds">
  331. <el-select
  332. @visible-change="selectRoles"
  333. style="width: 100%"
  334. v-model="form.roleIds"
  335. multiple
  336. placeholder="请选择角色"
  337. >
  338. <el-option
  339. v-for="item in roleOptions"
  340. :key="item.id"
  341. :label="item.roleName"
  342. :value="item.id"
  343. :disabled="item.status == 1"
  344. ></el-option>
  345. </el-select>
  346. </el-form-item>
  347. </el-col>
  348. </el-row>
  349. <el-row>
  350. <el-col :span="10">
  351. <el-form-item label="手机号码" prop="phone">
  352. <el-input
  353. v-model="form.phone"
  354. placeholder="请输入手机号码"
  355. maxlength="11"
  356. :readonly="form.source == 1"
  357. />
  358. </el-form-item>
  359. </el-col>
  360. <el-col :span="10">
  361. <el-form-item label="用户性别">
  362. <el-select
  363. style="width: 100%"
  364. v-model="form.gender"
  365. placeholder="请选择性别"
  366. :disabled="form.source == 1"
  367. >
  368. <el-option
  369. v-for="dict in dict.type.sys_user_sex"
  370. :key="dict.value"
  371. :label="dict.label"
  372. :value="`${dict.value}`"
  373. ></el-option>
  374. </el-select>
  375. </el-form-item>
  376. </el-col>
  377. <!-- <el-col :span="12">
  378. <el-form-item label="邮箱" prop="email">
  379. <el-input v-model="form.phone" placeholder="请输入邮箱" maxlength="50" />
  380. </el-form-item>
  381. </el-col> -->
  382. </el-row>
  383. <el-row>
  384. <!-- <el-col :span="10">
  385. <el-form-item v-if="!form.id" label="用户名称" prop="username">
  386. <el-input v-model="form.username" placeholder="请输入用户名称" maxlength="30" />
  387. </el-form-item>
  388. </el-col> -->
  389. <el-col :span="14">
  390. <el-form-item v-if="!form.id" label="用户密码" prop="password">
  391. <el-input
  392. v-model="form.password"
  393. placeholder="请输入用户密码"
  394. type="password"
  395. maxlength="20"
  396. show-password
  397. />
  398. </el-form-item>
  399. </el-col>
  400. </el-row>
  401. <el-row>
  402. <el-col :span="14">
  403. <el-form-item label="状态">
  404. <el-radio-group v-model="form.isLock">
  405. <el-radio
  406. v-for="dict in dict.type.sys_normal_disable"
  407. :key="`${dict.value}`"
  408. :label="dict.value"
  409. :disabled="form.source == 1"
  410. >{{ dict.label }}</el-radio
  411. >
  412. </el-radio-group>
  413. </el-form-item>
  414. </el-col>
  415. </el-row>
  416. </el-form>
  417. <div slot="footer" class="dialog-footer">
  418. <el-button type="primary" @click="submitForm">确 定</el-button>
  419. <el-button @click="cancel">取 消</el-button>
  420. </div>
  421. </DialogCom>
  422. <!-- 用户导入对话框 -->
  423. <DialogCom
  424. :title="upload.title"
  425. :visible.sync="upload.open"
  426. width="400px"
  427. append-to-body
  428. >
  429. <el-upload
  430. ref="upload"
  431. :limit="1"
  432. accept=".xlsx, .xls"
  433. :headers="upload.headers"
  434. :action="upload.url + '?updateSupport=' + upload.updateSupport"
  435. :disabled="upload.isUploading"
  436. :on-progress="handleFileUploadProgress"
  437. :on-success="handleFileSuccess"
  438. :auto-upload="false"
  439. drag
  440. >
  441. <i class="el-icon-upload"></i>
  442. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  443. <div class="el-upload__tip text-center" slot="tip">
  444. <div class="el-upload__tip" slot="tip">
  445. <el-checkbox v-model="upload.updateSupport" />
  446. 是否更新已经存在的用户数据
  447. </div>
  448. <span>仅允许导入xls、xlsx格式文件。</span>
  449. <el-link
  450. type="primary"
  451. :underline="false"
  452. style="font-size: 12px; vertical-align: baseline"
  453. @click="importTemplate"
  454. >下载模板</el-link
  455. >
  456. </div>
  457. </el-upload>
  458. <div slot="footer" class="dialog-footer">
  459. <el-button type="primary" @click="submitFileForm">确 定</el-button>
  460. <el-button @click="upload.open = false">取 消</el-button>
  461. </div>
  462. </DialogCom>
  463. </div>
  464. </template>
  465. <script>
  466. import OrgTree from "@/components/orgTree";
  467. import {
  468. listUser,
  469. getUser,
  470. delUser,
  471. addUser,
  472. updateUser,
  473. resetUserPwd,
  474. changeUserStatus,
  475. selectrolesByOrgId,
  476. } from "@/api/system/user";
  477. import { getToken } from "@/utils/auth";
  478. import { deptTreeSelect } from "@/api/system/public";
  479. import tableList from "@/mixins/tableList";
  480. export default {
  481. name: "User",
  482. dicts: ["sys_normal_disable", "sys_user_sex"],
  483. components: { OrgTree },
  484. mixins: [tableList],
  485. data() {
  486. return {
  487. defaultProps: {
  488. children: "children",
  489. label: "shortName",
  490. },
  491. // 遮罩层
  492. loading: true,
  493. // 选中数组
  494. ids: [],
  495. // 非单个禁用
  496. single: true,
  497. // 非多个禁用
  498. multiple: true,
  499. // 显示搜索条件
  500. showSearch: true,
  501. // 总条数
  502. total: 0,
  503. // 用户表格数据
  504. userList: null,
  505. //是否是管理员
  506. check: false,
  507. // 弹出层标题
  508. title: "",
  509. // 是否显示弹出层
  510. open: false,
  511. // 机构名称
  512. deptName: null,
  513. // 默认密码
  514. initPassword: null,
  515. // 日期范围
  516. dateRange: [],
  517. // 岗位选项
  518. postOptions: [],
  519. // 角色选项
  520. roleOptions: [],
  521. // 表单参数
  522. form: {},
  523. // 用户导入参数
  524. upload: {
  525. // 是否显示弹出层(用户导入)
  526. open: false,
  527. // 弹出层标题(用户导入)
  528. title: "",
  529. // 是否禁用上传
  530. isUploading: false,
  531. // 是否更新已经存在的用户数据
  532. updateSupport: 0,
  533. // 设置上传的请求头部
  534. headers: { Authorization: "Bearer " + getToken() },
  535. // 上传的地址
  536. url: process.env.VUE_APP_BASE_API + "/system/user/importData",
  537. },
  538. // 查询参数
  539. queryParams: {
  540. pageNum: 1,
  541. pageSize: 10,
  542. username: null,
  543. phone: null,
  544. status: null,
  545. orgId: null,
  546. checkSub: true,
  547. },
  548. // 列信息
  549. columns: [
  550. { key: 0, label: `用户名`, visible: true },
  551. { key: 1, label: `姓名`, visible: true },
  552. { key: 2, label: `手机`, visible: true },
  553. { key: 3, label: `所属机构`, visible: true },
  554. { key: 4, label: `状态`, visible: true },
  555. { key: 5, label: `是否管理人员`, visible: true },
  556. { key: 6, label: `登录IP`, visible: true },
  557. { key: 7, label: `登录时间`, visible: true },
  558. ],
  559. // 表单校验
  560. rules: {
  561. username: [
  562. { required: true, message: "用户名称不能为空", trigger: "blur" },
  563. {
  564. min: 2,
  565. max: 20,
  566. message: "用户名称长度必须介于 2 和 20 之间",
  567. trigger: "blur",
  568. },
  569. ],
  570. name: [
  571. { required: true, message: "用户昵称不能为空", trigger: "blur" },
  572. ],
  573. roleIds: [
  574. { required: true, message: "用户角色不能为空", trigger: "blur" },
  575. ],
  576. password: [
  577. { required: true, message: "密码不能为空", trigger: "blur" },
  578. { min: 8, message: "密码至少为8位", trigger: "blur" },
  579. {
  580. validator: (rule, value, callback) => {
  581. if (
  582. !/[a-z]/.test(value) ||
  583. !/[A-Z]/.test(value) ||
  584. !/\d/.test(value)
  585. ) {
  586. callback(new Error("密码必须包含大小写字母和数字"));
  587. } else {
  588. callback();
  589. }
  590. },
  591. trigger: "blur",
  592. },
  593. ],
  594. orgId: [
  595. { required: true, message: "所属机构不能为空", trigger: "blur" },
  596. ],
  597. // email: [
  598. // {
  599. // type: "email",
  600. // message: "请输入正确的邮箱地址",
  601. // trigger: ["blur", "change"]
  602. // }
  603. // ],
  604. phone: [
  605. {
  606. pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
  607. message: "请输入正确的手机号码",
  608. trigger: "blur",
  609. },
  610. ],
  611. },
  612. //默认选中节点
  613. defaultKeys: null,
  614. //修改新增中的机构树
  615. deptOptions: [],
  616. };
  617. },
  618. created() {
  619. this.getDeptTree();
  620. // this.getConfigKey("sys.user.initPassword").then(response => {
  621. // this.initPassword = response.msg;
  622. // });
  623. },
  624. mounted() {},
  625. methods: {
  626. selectRoles(){
  627. selectrolesByOrgId({orgId:this.form.orgId}).then((res)=>{
  628. // console.log(res);
  629. this.roleOptions=res.data;
  630. })
  631. },
  632. /** 查询机构树数据 */
  633. getDeptTree() {
  634. deptTreeSelect().then((response) => {
  635. this.deptOptions = response.data;
  636. });
  637. },
  638. // 节点单击事件
  639. clickTreeNode(data) {
  640. this.queryParams.orgId = data.id;
  641. this.handleQuery();
  642. },
  643. /** 分配角色操作 */
  644. handleExtend(row) {
  645. const userId = row.id;
  646. this.$router.push("/system/user-extend/extend/" + userId);
  647. },
  648. /** treeSelect组件自定义数据*/
  649. tenantIdnormalizer(node, instanceId) {
  650. if (node.children && !node.children.length) {
  651. delete node.children;
  652. }
  653. return {
  654. id: node.id,
  655. label: node.name,
  656. children: node.children,
  657. };
  658. },
  659. /** 搜索按钮操作 */
  660. handleQuery() {
  661. this.queryParams.pageNum = 1;
  662. this.getList();
  663. },
  664. /** 重置按钮操作 */
  665. resetQuery() {
  666. this.resetForm("queryForm");
  667. this.handleQuery();
  668. },
  669. /** 查询列表 */
  670. getList() {
  671. this.loading = true;
  672. listUser(this.addDateRange(this.queryParams, this.dateRange))
  673. .then((response) => {
  674. //兼容框架userId字段
  675. response.data.rows.forEach((v) => {
  676. v.userId = v.id;
  677. });
  678. this.userList = response.data.rows;
  679. this.total = response.data.total;
  680. this.check = response.check;
  681. this.loading = false;
  682. })
  683. .catch((err) => {
  684. this.loading = false;
  685. });
  686. },
  687. getDefaultKey(key) {
  688. this.queryParams.orgId = key;
  689. this.getList();
  690. },
  691. //单选框状态改变
  692. checkChange(state) {
  693. this.queryParams.checkSub = state;
  694. this.handleQuery();
  695. },
  696. // 用户状态修改
  697. handleStatusChange(row) {
  698. let text = row.status === "1" ? "启用" : "停用";
  699. this.$modal
  700. .confirm("确认要" + text + '"' + row.name + '"用户吗?')
  701. .then(function () {
  702. const data = {
  703. id: row.id,
  704. isLock: row.isLock,
  705. };
  706. return changeUserStatus(data);
  707. })
  708. .then(() => {
  709. this.$modal.msgSuccess(text + "成功");
  710. })
  711. .catch(function () {
  712. row.status = row.status === "0" ? "1" : "0";
  713. });
  714. },
  715. // 取消按钮
  716. cancel() {
  717. this.open = false;
  718. this.reset();
  719. },
  720. // 表单重置
  721. reset() {
  722. this.form = {
  723. id: undefined,
  724. orgId: undefined,
  725. username: undefined,
  726. name: undefined,
  727. password: undefined,
  728. phone: undefined,
  729. email: undefined,
  730. sex: undefined,
  731. status: "0",
  732. remark: undefined,
  733. postIds: [],
  734. roleIds: [],
  735. isLock: "0",
  736. };
  737. this.resetForm("form");
  738. },
  739. // 多选框选中数据
  740. handleSelectionChange(selection) {
  741. this.ids = selection.map((item) => item.userId);
  742. this.single = selection.length != 1;
  743. this.multiple = !selection.length;
  744. },
  745. // 更多操作触发
  746. handleCommand(command, row) {
  747. switch (command) {
  748. case "handleResetPwd":
  749. this.handleResetPwd(row);
  750. break;
  751. case "handleAuthRole":
  752. this.handleAuthRole(row);
  753. break;
  754. default:
  755. break;
  756. }
  757. },
  758. /** 新增按钮操作 */
  759. handleAdd() {
  760. this.reset();
  761. getUser().then((response) => {
  762. this.postOptions = response.posts;
  763. this.roleOptions = response.roles;
  764. this.open = true;
  765. this.title = "添加用户";
  766. this.form.password = this.initPassword;
  767. });
  768. },
  769. /** 修改按钮操作 */
  770. handleUpdate(row) {
  771. console.log(row);
  772. this.reset();
  773. const userId = row.id || this.ids;
  774. getUser(userId).then((response) => {
  775. console.log(response.data, "data");
  776. this.form = response.data;
  777. this.postOptions = response.posts;
  778. this.roleOptions = response.roles;
  779. this.$set(this.form, "postIds", response.postIds);
  780. this.$set(this.form, "roleIds", response.roleIds);
  781. this.open = true;
  782. this.title = "修改用户";
  783. this.form.password = "";
  784. });
  785. },
  786. /** 重置密码按钮操作 */
  787. handleResetPwd(row) {
  788. console.log(row, "row");
  789. this.$prompt('请输入"' + row.name + '"的新密码', "提示", {
  790. confirmButtonText: "确定",
  791. cancelButtonText: "取消",
  792. closeOnClickModal: false,
  793. inputPattern: /^.{5,20}$/,
  794. inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
  795. })
  796. .then(({ value }) => {
  797. let data = {
  798. id: row.userId,
  799. password: value,
  800. };
  801. resetUserPwd(data).then((response) => {
  802. this.$modal.msgSuccess("修改成功,新密码是:" + value);
  803. });
  804. })
  805. .catch(() => {});
  806. },
  807. /** 分配角色操作 */
  808. handleAuthRole: function (row) {
  809. const userId = row.id;
  810. this.$router.push("/system/user-auth/role/" + userId);
  811. },
  812. /** 提交按钮 */
  813. submitForm: function () {
  814. this.$refs["form"].validate((valid) => {
  815. if (valid) {
  816. if (this.form.id != undefined) {
  817. updateUser(this.form).then((response) => {
  818. this.$modal.msgSuccess("修改成功");
  819. this.open = false;
  820. this.getList();
  821. });
  822. } else {
  823. addUser(this.form).then((response) => {
  824. this.$modal.msgSuccess("新增成功");
  825. this.open = false;
  826. this.getList();
  827. });
  828. }
  829. }
  830. });
  831. },
  832. /** 删除按钮操作 */
  833. handleDelete(row) {
  834. console.log(row);
  835. const userIds = row.id || this.ids;
  836. this.$modal
  837. .confirm('是否确认删除用户昵称为"' + row.name + '"的数据项?')
  838. .then(function () {
  839. return delUser(userIds);
  840. })
  841. .then(() => {
  842. this.getList();
  843. this.$modal.msgSuccess("删除成功");
  844. })
  845. .catch(() => {});
  846. },
  847. /** 导出按钮操作 */
  848. handleExport() {
  849. this.download(
  850. "system/user/export",
  851. {
  852. ...this.queryParams,
  853. },
  854. `user_${new Date().getTime()}.xlsx`
  855. );
  856. },
  857. /** 导入按钮操作 */
  858. handleImport() {
  859. this.upload.title = "用户导入";
  860. this.upload.open = true;
  861. },
  862. /** 下载模板操作 */
  863. importTemplate() {
  864. this.download(
  865. "system/user/importTemplate",
  866. {},
  867. `user_template_${new Date().getTime()}.xlsx`
  868. );
  869. },
  870. // 文件上传中处理
  871. handleFileUploadProgress(event, file, fileList) {
  872. this.upload.isUploading = true;
  873. },
  874. // 文件上传成功处理
  875. handleFileSuccess(response, file, fileList) {
  876. this.upload.open = false;
  877. this.upload.isUploading = false;
  878. this.$refs.upload.clearFiles();
  879. this.$alert(
  880. "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
  881. response.msg +
  882. "</div>",
  883. "导入结果",
  884. { dangerouslyUseHTMLString: true }
  885. );
  886. this.getList();
  887. },
  888. // 提交上传文件
  889. submitFileForm() {
  890. this.$refs.upload.submit();
  891. },
  892. },
  893. };
  894. </script>
  895. <style lang="scss"></style>
  896. <style lang="scss" scoped></style>