index.vue 32 KB

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