DepartmentView.vue 32 KB

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