index.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  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="$t('请输入') + $t('部门名称')"
  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 :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  31. <el-form-item :label="$t('用户名称')" prop="userName">
  32. <el-input
  33. v-model="queryParams.userName"
  34. :placeholder="$t('请输入') + $t('用户名称')"
  35. clearable
  36. size="small"
  37. style="width: 240px"
  38. @keyup.enter.native="handleQuery"
  39. />
  40. </el-form-item>
  41. <el-form-item :label="$t('员工编号')" prop="staffId">
  42. <el-input
  43. v-model="queryParams.staffId"
  44. :placeholder="$t('请输入') + $t('员工编号')"
  45. clearable
  46. size="small"
  47. style="width: 240px"
  48. @keyup.enter.native="handleQuery"
  49. />
  50. </el-form-item>
  51. <el-form-item :label="$t('姓名')" prop="nickName">
  52. <el-input
  53. v-model="queryParams.nickName"
  54. :placeholder="$t('请输入') + $t('姓名')"
  55. clearable
  56. size="small"
  57. style="width: 240px"
  58. @keyup.enter.native="handleQuery"
  59. />
  60. </el-form-item>
  61. <el-form-item :label="$t('手机号码')" prop="phonenumber">
  62. <el-input
  63. v-model="queryParams.phonenumber"
  64. :placeholder="$t('请输入') + $t('手机号码')"
  65. clearable
  66. size="small"
  67. style="width: 240px"
  68. @keyup.enter.native="handleQuery"
  69. />
  70. </el-form-item>
  71. <el-form-item :label="$t('状态')" prop="status">
  72. <el-select
  73. v-model="queryParams.status"
  74. :placeholder="$t('用户状态')"
  75. clearable
  76. size="small"
  77. style="width: 240px"
  78. >
  79. <el-option
  80. v-for="dict in statusOptions"
  81. :key="dict.dictValue"
  82. :label="dict.dictLabel"
  83. :value="dict.dictValue"
  84. />
  85. </el-select>
  86. </el-form-item>
  87. <el-form-item :label="$t('创建时间')">
  88. <el-date-picker
  89. v-model="dateRange"
  90. size="small"
  91. style="width: 240px"
  92. value-format="yyyy-MM-dd"
  93. type="daterange"
  94. range-separator="-"
  95. :start-placeholder="$t('开始日期')"
  96. :end-placeholder="$t('结束日期')"
  97. ></el-date-picker>
  98. </el-form-item>
  99. <el-form-item>
  100. <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">{{ $t('搜索') }}</el-button>
  101. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t('重置') }}</el-button>
  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. icon="el-icon-plus"
  109. size="mini"
  110. @click="handleAdd"
  111. v-hasPermi="['system:user:add']"
  112. >{{ $t('新增') }}</el-button>
  113. </el-col>
  114. <el-col :span="1.5">
  115. <el-button
  116. type="success"
  117. icon="el-icon-edit"
  118. size="mini"
  119. :disabled="single"
  120. @click="handleUpdate"
  121. v-hasPermi="['system:user:edit']"
  122. >{{ $t('修改') }}</el-button>
  123. </el-col>
  124. <el-col :span="1.5">
  125. <el-button
  126. type="danger"
  127. icon="el-icon-delete"
  128. size="mini"
  129. :disabled="multiple"
  130. @click="handleDelete"
  131. v-hasPermi="['system:user:remove']"
  132. >{{ $t('删除') }}</el-button>
  133. </el-col>
  134. <el-col :span="1.5">
  135. <el-button
  136. type="info"
  137. icon="el-icon-upload2"
  138. size="mini"
  139. @click="handleImport"
  140. v-hasPermi="['system:user:import']"
  141. >{{ $t('导入') }}</el-button>
  142. </el-col>
  143. <el-col :span="1.5">
  144. <el-button
  145. type="warning"
  146. icon="el-icon-download"
  147. size="mini"
  148. @click="handleExport"
  149. v-hasPermi="['system:user:export']"
  150. >{{ $t('导出') }}</el-button>
  151. </el-col>
  152. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  153. </el-row>
  154. <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
  155. <el-table-column type="selection" width="50" align="center" />
  156. <!-- <el-table-column :label="$t('用户编号')" align="center" prop="userId" />-->
  157. <el-table-column :label="$t('员工编号')" align="center" prop="staffId" />
  158. <el-table-column :label="$t('用户名称')" align="center" prop="userName" :show-overflow-tooltip="true" />
  159. <el-table-column :label="$t('姓名')" align="center" prop="nickName" :show-overflow-tooltip="true" />
  160. <el-table-column :label="$t('部门')" align="center" prop="dept.deptName" :show-overflow-tooltip="true" />
  161. <el-table-column :label="$t('手机号码')" align="center" prop="phonenumber" width="120" />
  162. <el-table-column :label="$t('状态')" align="center">
  163. <template slot-scope="scope">
  164. <el-switch
  165. v-model="scope.row.status"
  166. active-value="0"
  167. inactive-value="1"
  168. @change="handleStatusChange(scope.row)"
  169. ></el-switch>
  170. </template>
  171. </el-table-column>
  172. <el-table-column :label="$t('创建时间')" align="center" prop="createTime" width="160">
  173. <template slot-scope="scope">
  174. <span>{{ parseTime(scope.row.createTime) }}</span>
  175. </template>
  176. </el-table-column>
  177. <el-table-column
  178. :label="$t('操作')"
  179. align="center"
  180. width="230"
  181. class-name="small-padding fixed-width"
  182. >
  183. <template slot-scope="scope">
  184. <el-button
  185. size="mini"
  186. type="text"
  187. icon="el-icon-edit"
  188. @click="handleUpdate(scope.row)"
  189. v-hasPermi="['system:user:edit']"
  190. >{{ $t('修改') }}</el-button>
  191. <el-button
  192. size="mini"
  193. type="text"
  194. icon="el-icon-circle-check"
  195. @click="handleDataScope(scope.row)"
  196. v-hasPermi="['system:user:edit']"
  197. >{{ $t('数据权限') }}</el-button>
  198. <el-button
  199. v-if="scope.row.userId !== 1"
  200. size="mini"
  201. type="text"
  202. icon="el-icon-delete"
  203. @click="handleDelete(scope.row)"
  204. v-hasPermi="['system:user:remove']"
  205. >{{ $t('删除') }}</el-button>
  206. <el-button
  207. size="mini"
  208. type="text"
  209. icon="el-icon-key"
  210. @click="handleResetPwd(scope.row)"
  211. v-hasPermi="['system:user:resetPwd']"
  212. >{{ $t('重置') }}</el-button>
  213. </template>
  214. </el-table-column>
  215. </el-table>
  216. <pagination
  217. v-show="total>0"
  218. :total="total"
  219. :page.sync="queryParams.pageNum"
  220. :limit.sync="queryParams.pageSize"
  221. @pagination="getList"
  222. />
  223. </el-col>
  224. </el-row>
  225. <!-- 添加或修改参数配置对话框 -->
  226. <el-dialog v-dialogDrag :title="title" :visible.sync="open" width="600px" append-to-body>
  227. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  228. <el-row>
  229. <el-col :span="12">
  230. <el-form-item :label="$t('姓名')" prop="nickName">
  231. <el-input v-model="form.nickName" :placeholder="$t('请输入') + $t('姓名')" />
  232. </el-form-item>
  233. </el-col>
  234. <el-col :span="12">
  235. <el-form-item :label="$t('归属部门')" prop="deptId">
  236. <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" :placeholder="$t('请选择') + $t('归属部门')" />
  237. </el-form-item>
  238. </el-col>
  239. </el-row>
  240. <el-row>
  241. <el-col :span="12">
  242. <el-form-item :label="$t('手机号码')" prop="phonenumber">
  243. <el-input v-model="form.phonenumber" :placeholder="$t('请输入') + $t('手机号码')" maxlength="11" />
  244. </el-form-item>
  245. </el-col>
  246. <el-col :span="12">
  247. <el-form-item :label="$t('邮箱')" prop="email">
  248. <el-input v-model="form.email" :placeholder="$t('请输入') + $t('邮箱')" maxlength="50" />
  249. </el-form-item>
  250. </el-col>
  251. </el-row>
  252. <el-row>
  253. <el-col :span="12">
  254. <el-form-item v-if="form.userId == undefined" :label="$t('用户名称')" prop="userName">
  255. <el-input v-model="form.userName" :placeholder="$t('请输入') + $t('用户名称')" />
  256. </el-form-item>
  257. </el-col>
  258. <el-col :span="12">
  259. <el-form-item v-if="form.userId == undefined" :label="$t('用户密码')" prop="password">
  260. <el-input v-model="form.password" :placeholder="$t('请输入') + $t('用户密码')" type="password" />
  261. </el-form-item>
  262. </el-col>
  263. </el-row>
  264. <el-row>
  265. <el-col :span="12">
  266. <el-form-item :label="$t('用户性别')">
  267. <el-select v-model="form.sex" :placeholder="$t('请选择')">
  268. <el-option
  269. v-for="dict in sexOptions"
  270. :key="dict.dictValue"
  271. :label="dict.dictLabel"
  272. :value="dict.dictValue"
  273. ></el-option>
  274. </el-select>
  275. </el-form-item>
  276. </el-col>
  277. <el-col :span="12">
  278. <el-form-item :label="$t('状态')">
  279. <el-radio-group v-model="form.status">
  280. <el-radio
  281. v-for="dict in statusOptions"
  282. :key="dict.dictValue"
  283. :label="dict.dictValue"
  284. >{{dict.dictLabel}}</el-radio>
  285. </el-radio-group>
  286. </el-form-item>
  287. </el-col>
  288. </el-row>
  289. <el-row>
  290. <el-col :span="12">
  291. <el-form-item :label="$t('岗位')">
  292. <el-select v-model="form.postIds" multiple :placeholder="$t('请选择')">
  293. <el-option
  294. v-for="item in postOptions"
  295. :key="item.postId"
  296. :label="item.postName"
  297. :value="item.postId"
  298. :disabled="item.status == 1"
  299. ></el-option>
  300. </el-select>
  301. </el-form-item>
  302. </el-col>
  303. <el-col :span="12">
  304. <el-form-item :label="$t('角色')">
  305. <el-select v-model="form.roleIds" multiple :placeholder="$t('请选择')">
  306. <el-option
  307. v-for="item in roleOptions"
  308. :key="item.roleId"
  309. :label="item.roleName"
  310. :value="item.roleId"
  311. :disabled="item.status == 1"
  312. ></el-option>
  313. </el-select>
  314. </el-form-item>
  315. </el-col>
  316. </el-row>
  317. <el-row>
  318. <el-col :span="12">
  319. <el-form-item :label="$t('员工编号')" prop="staffId">
  320. <el-input v-model="form.staffId" :placeholder="$t('请输入') + $t('员工编号')" />
  321. </el-form-item>
  322. </el-col>
  323. <el-col :span="12">
  324. <el-form-item :label="$t('首页类型')">
  325. <el-select v-model="form.homeType" :placeholder="$t('请选择')">
  326. <el-option
  327. v-for="dict in homeTypeOptions"
  328. :key="dict.dictValue"
  329. :label="dict.dictLabel"
  330. :value="dict.dictValue"
  331. ></el-option>
  332. </el-select>
  333. </el-form-item>
  334. </el-col>
  335. </el-row>
  336. <el-row>
  337. <el-col :span="24">
  338. <el-form-item :label="$t('备注')">
  339. <el-input v-model="form.remark" type="textarea" :placeholder="$t('请输入') + $t('内容')"></el-input>
  340. </el-form-item>
  341. </el-col>
  342. </el-row>
  343. </el-form>
  344. <div slot="footer" class="dialog-footer">
  345. <el-button type="primary" @click="submitForm">{{ $t('确 定') }}</el-button>
  346. <el-button @click="cancel">{{ $t('取 消') }}</el-button>
  347. </div>
  348. </el-dialog>
  349. <!-- 用户导入对话框 -->
  350. <el-dialog v-dialogDrag :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
  351. <el-upload
  352. ref="upload"
  353. :limit="1"
  354. accept=".xlsx, .xls"
  355. :headers="upload.headers"
  356. :action="upload.url + '?updateSupport=' + upload.updateSupport"
  357. :disabled="upload.isUploading"
  358. :on-progress="handleFileUploadProgress"
  359. :on-success="handleFileSuccess"
  360. :auto-upload="false"
  361. drag
  362. >
  363. <i class="el-icon-upload"></i>
  364. <div class="el-upload__text">
  365. {{ $t('将文件拖到此处,或') }}
  366. <em>{{ $t('点击上传') }}</em>
  367. </div>
  368. <div class="el-upload__tip" slot="tip">
  369. <!--<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据-->
  370. <el-link type="info" style="font-size:12px" @click="importTemplate">{{ $t('下载模板') }}</el-link>
  371. </div>
  372. <div class="el-upload__tip" style="color:red" slot="tip">{{ $t('提示:仅允许导入“xls”或“xlsx”格式文件!') }}</div>
  373. </el-upload>
  374. <div slot="footer" class="dialog-footer">
  375. <el-button type="primary" @click="submitFileForm">{{ $t('确 定') }}</el-button>
  376. <el-button @click="upload.open = false">{{ $t('取 消') }}</el-button>
  377. </div>
  378. </el-dialog>
  379. <!-- 分配角色数据权限对话框 -->
  380. <el-dialog v-dialogDrag :title="title" :visible.sync="openDataScope" width="500px" append-to-body>
  381. <el-form :model="form" label-width="80px">
  382. <el-form-item :label="$t('姓名')">
  383. <el-input v-model="form.nickName" :disabled="true" />
  384. </el-form-item>
  385. <!-- <el-form-item :label="$t('权限字符')">-->
  386. <!-- <el-input v-model="form.roleKey" :disabled="true" />-->
  387. <!-- </el-form-item>-->
  388. <el-form-item :label="$t('权限范围')">
  389. <el-select v-model="form.dataScope">
  390. <el-option
  391. v-for="item in dataScopeOptions"
  392. :key="item.value"
  393. :label="item.label"
  394. :value="item.value"
  395. ></el-option>
  396. </el-select>
  397. </el-form-item>
  398. <el-form-item :label="$t('数据权限')" v-show="form.dataScope == 2">
  399. <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">{{$t('展开/折叠')}}</el-checkbox>
  400. <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">{{$t('全选/全不选')}}</el-checkbox>
  401. <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">{{$t('父子联动')}}</el-checkbox>
  402. <el-tree
  403. class="tree-border"
  404. :data="deptOptions"
  405. show-checkbox
  406. default-expand-all
  407. ref="dept"
  408. node-key="id"
  409. :check-strictly="!form.deptCheckStrictly"
  410. empty-text="加载中,请稍后"
  411. :props="defaultProps"
  412. ></el-tree>
  413. </el-form-item>
  414. </el-form>
  415. <div slot="footer" class="dialog-footer">
  416. <el-button type="primary" @click="submitDataScope">{{ $t('确 定') }}</el-button>
  417. <el-button @click="cancelDataScope">{{ $t('取 消') }}</el-button>
  418. </div>
  419. </el-dialog>
  420. </div>
  421. </template>
  422. <script>
  423. import { listUser, getUser, delUser, addUser, updateUser, exportUser, resetUserPwd, changeUserStatus, importTemplate,userDataScope } from "@/api/system/user";
  424. import { getToken } from "@/utils/auth";
  425. import {userDeptTreeselect, treeselect} from "@/api/system/dept";
  426. import Treeselect from "@riophae/vue-treeselect";
  427. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  428. export default {
  429. name: "User",
  430. components: { Treeselect },
  431. data() {
  432. return {
  433. // 遮罩层
  434. loading: true,
  435. // 选中数组
  436. ids: [],
  437. // 非单个禁用
  438. single: true,
  439. // 非多个禁用
  440. multiple: true,
  441. // 显示搜索条件
  442. showSearch: true,
  443. openDataScope: false,
  444. menuExpand: false,
  445. menuNodeAll: false,
  446. deptExpand: true,
  447. deptNodeAll: false,
  448. // 总条数
  449. total: 0,
  450. // 用户表格数据
  451. userList: null,
  452. // 弹出层标题
  453. title: "",
  454. // 部门树选项
  455. deptOptions: undefined,
  456. // 是否显示弹出层
  457. open: false,
  458. // 部门名称
  459. deptName: undefined,
  460. // 默认密码
  461. initPassword: undefined,
  462. // 日期范围
  463. dateRange: [],
  464. // 状态数据字典
  465. statusOptions: [],
  466. // 性别状态字典
  467. sexOptions: [],
  468. homeTypeOptions: [],
  469. // 岗位选项
  470. postOptions: [],
  471. // 角色选项
  472. roleOptions: [],
  473. // 数据范围选项
  474. dataScopeOptions: [
  475. {
  476. value: "1",
  477. label: "全部数据权限"
  478. },
  479. {
  480. value: "2",
  481. label: "自定数据权限"
  482. },
  483. {
  484. value: "3",
  485. label: "本部门数据权限"
  486. }
  487. ],
  488. // 表单参数
  489. form: {},
  490. defaultProps: {
  491. children: "children",
  492. label: "label"
  493. },
  494. // 用户导入参数
  495. upload: {
  496. // 是否显示弹出层(用户导入)
  497. open: false,
  498. // 弹出层标题(用户导入)
  499. title: "",
  500. // 是否禁用上传
  501. isUploading: false,
  502. // 是否更新已经存在的用户数据
  503. updateSupport: 0,
  504. // 设置上传的请求头部
  505. headers: { Authorization: "Bearer " + getToken() },
  506. // 上传的地址
  507. url: process.env.VUE_APP_BASE_API + "/system/user/importData"
  508. },
  509. // 查询参数
  510. queryParams: {
  511. pageNum: 1,
  512. pageSize: 10,
  513. userName: undefined,
  514. phonenumber: undefined,
  515. status: undefined,
  516. deptId: undefined,
  517. nickName:undefined,
  518. staffId:undefined
  519. },
  520. // 表单校验
  521. rules: {
  522. userName: [
  523. { required: true, message: this.$t('用户名称') + this.$t('不能为空'), trigger: "blur" }
  524. ],
  525. nickName: [
  526. { required: true, message: this.$t('用户姓名') + this.$t('不能为空'), trigger: "blur" }
  527. ],
  528. deptId: [
  529. { required: true, message: this.$t('归属部门') + this.$t('不能为空'), trigger: "change" }
  530. ],
  531. password: [
  532. { required: true, message: this.$t('用户密码') + this.$t('不能为空'), trigger: "blur" }
  533. ],
  534. email: [
  535. { required: true, message: this.$t('邮箱') + this.$t('不能为空'), trigger: "blur" },
  536. {
  537. type: "email",
  538. message: this.$t('请输入正确的邮箱地址'),
  539. trigger: ["blur", "change"]
  540. }
  541. ],
  542. phonenumber: [
  543. { required: true, message: this.$t('手机号码') + this.$t('不能为空'), trigger: "blur" },
  544. {
  545. pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
  546. message:this.$t('请输入正确的手机号码') ,
  547. trigger: "blur"
  548. }
  549. ]
  550. }
  551. };
  552. },
  553. watch: {
  554. // 根据名称筛选部门树
  555. deptName(val) {
  556. this.$refs.tree.filter(val);
  557. }
  558. },
  559. created() {
  560. this.getList();
  561. this.getTreeselect();
  562. this.getDicts("sys_normal_disable").then(response => {
  563. this.statusOptions = response.data;
  564. });
  565. this.getDicts("sys_user_sex").then(response => {
  566. this.sexOptions = response.data;
  567. });
  568. this.getDicts("sys_user_hometype").then(response => {
  569. this.homeTypeOptions = response.data;
  570. });
  571. this.getConfigKey("sys.user.initPassword").then(response => {
  572. this.initPassword = response.msg;
  573. });
  574. },
  575. methods: {
  576. /** 查询用户列表 */
  577. getList() {
  578. this.loading = true;
  579. listUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
  580. this.userList = response.rows;
  581. this.total = response.total;
  582. this.loading = false;
  583. }
  584. );
  585. },
  586. /** 查询部门下拉树结构 */
  587. getTreeselect() {
  588. treeselect().then(response => {
  589. this.deptOptions = response.data;
  590. });
  591. },
  592. // 筛选节点
  593. filterNode(value, data) {
  594. if (!value) return true;
  595. return data.label.indexOf(value) !== -1;
  596. },
  597. // 节点单击事件
  598. handleNodeClick(data) {
  599. this.queryParams.deptId = data.id;
  600. this.getList();
  601. },
  602. // 用户状态修改
  603. handleStatusChange(row) {
  604. let text = row.status === "0" ? this.$t('启用') : this.$t('停用');
  605. this.$confirm(this.$t('确认要') + text + ' "' + row.userName + this.$t('"用户吗?'), this.$t('警告'), {
  606. confirmButtonText: this.$t('确定'),
  607. cancelButtonText: this.$t('取消'),
  608. type: "warning"
  609. }).then(function() {
  610. return changeUserStatus(row.userId, row.status);
  611. }).then(() => {
  612. this.msgSuccess(text + this.$t('成功'));
  613. }).catch(function() {
  614. row.status = row.status === "0" ? "1" : "0";
  615. });
  616. },
  617. // 取消按钮
  618. cancel() {
  619. this.open = false;
  620. this.reset();
  621. },
  622. // 表单重置
  623. reset() {
  624. this.form = {
  625. userId: undefined,
  626. deptId: undefined,
  627. userName: undefined,
  628. staffId: undefined,
  629. nickName: undefined,
  630. password: undefined,
  631. phonenumber: undefined,
  632. email: undefined,
  633. sex: undefined,
  634. homeType: undefined,
  635. status: "0",
  636. remark: undefined,
  637. postIds: [],
  638. roleIds: [],
  639. deptIds: [],
  640. deptCheckStrictly: true
  641. };
  642. this.resetForm("form");
  643. },
  644. /** 搜索按钮操作 */
  645. handleQuery() {
  646. this.queryParams.page = 1;
  647. this.getList();
  648. },
  649. /** 重置按钮操作 */
  650. resetQuery() {
  651. this.dateRange = [];
  652. this.resetForm("queryForm");
  653. this.handleQuery();
  654. },
  655. // 多选框选中数据
  656. handleSelectionChange(selection) {
  657. this.ids = selection.map(item => item.userId);
  658. this.single = selection.length != 1;
  659. this.multiple = !selection.length;
  660. },
  661. /** 新增按钮操作 */
  662. handleAdd() {
  663. this.reset();
  664. this.getTreeselect();
  665. getUser().then(response => {
  666. this.postOptions = response.posts;
  667. this.roleOptions = response.roles;
  668. this.open = true;
  669. this.title = this.$t('新增') + " " + this.$t('用户');
  670. this.form.password = this.initPassword;
  671. });
  672. },
  673. /** 修改按钮操作 */
  674. handleUpdate(row) {
  675. this.reset();
  676. this.getTreeselect();
  677. const userId = row.userId || this.ids;
  678. getUser(userId).then(response => {
  679. this.form = response.data;
  680. this.postOptions = response.posts;
  681. this.roleOptions = response.roles;
  682. this.form.postIds = response.postIds;
  683. this.form.roleIds = response.roleIds;
  684. this.open = true;
  685. this.title = this.$t('修改') + " " + this.$t('用户');
  686. this.form.password = "";
  687. });
  688. },
  689. /** 重置密码按钮操作 */
  690. handleResetPwd(row) {
  691. this.$prompt(this.$t('请输入') + row.userName + this.$t('的新密码'), this.$t('提示'), {
  692. confirmButtonText: this.$t('确定'),
  693. cancelButtonText: this.$t('取消')
  694. }).then(({ value }) => {
  695. resetUserPwd(row.userId, value).then(response => {
  696. this.msgSuccess(this.$t('修改成功,新密码是:') + value);
  697. });
  698. }).catch(() => {});
  699. },
  700. /** 提交按钮 */
  701. submitForm: function() {
  702. this.$refs["form"].validate(valid => {
  703. if (valid) {
  704. if (this.form.userId != undefined) {
  705. updateUser(this.form).then(response => {
  706. this.msgSuccess(this.$t('修改成功'));
  707. this.open = false;
  708. this.getList();
  709. });
  710. } else {
  711. addUser(this.form).then(response => {
  712. this.msgSuccess(this.$t('新增成功'));
  713. this.open = false;
  714. this.getList();
  715. });
  716. }
  717. }
  718. });
  719. },
  720. /** 删除按钮操作 */
  721. handleDelete(row) {
  722. const userIds = row.userId || this.ids;
  723. this.$confirm(this.$t('是否确认删除用户编号为"') + userIds + this.$t('"的数据?'), this.$t('警告'), {
  724. confirmButtonText: this.$t('确定'),
  725. cancelButtonText: this.$t('取消'),
  726. type: "warning"
  727. }).then(function() {
  728. return delUser(userIds);
  729. }).then(() => {
  730. this.getList();
  731. this.msgSuccess(this.$t('删除成功'));
  732. })
  733. },
  734. /** 导出按钮操作 */
  735. handleExport() {
  736. const queryParams = this.queryParams;
  737. this.$confirm(this.$t('是否确认导出所有用户数据项?'), this.$t('警告'), {
  738. confirmButtonText: this.$t('确定'),
  739. cancelButtonText: this.$t('取消'),
  740. type: "warning"
  741. }).then(function() {
  742. return exportUser(queryParams);
  743. }).then(response => {
  744. this.download(response.msg);
  745. })
  746. },
  747. /** 导入按钮操作 */
  748. handleImport() {
  749. this.upload.title = this.$t('用户导入');
  750. this.upload.open = true;
  751. },
  752. /** 下载模板操作 */
  753. importTemplate() {
  754. importTemplate().then(response => {
  755. this.download(response.msg);
  756. });
  757. },
  758. // 文件上传中处理
  759. handleFileUploadProgress(event, file, fileList) {
  760. this.upload.isUploading = true;
  761. },
  762. // 文件上传成功处理
  763. handleFileSuccess(response, file, fileList) {
  764. this.upload.open = false;
  765. this.upload.isUploading = false;
  766. this.$refs.upload.clearFiles();
  767. this.$alert(response.msg, this.$t('导入结果'), { dangerouslyUseHTMLString: true });
  768. this.getList();
  769. },
  770. // 提交上传文件
  771. submitFileForm() {
  772. this.$refs.upload.submit();
  773. },
  774. /** 根据角色ID查询部门树结构 */
  775. getUserDeptTreeselect(userId) {
  776. return userDeptTreeselect(userId).then(response => {
  777. this.deptOptions = response.depts;
  778. return response;
  779. });
  780. },
  781. /** 分配数据权限操作 */
  782. handleDataScope(row) {
  783. this.reset();
  784. const userDeptTreeselect = this.getUserDeptTreeselect(row.userId);
  785. getUser(row.userId).then(response => {
  786. this.form = response.data;
  787. this.openDataScope = true;
  788. this.$nextTick(() => {
  789. userDeptTreeselect.then(res => {
  790. this.$refs.dept.setCheckedKeys(res.checkedKeys);
  791. });
  792. });
  793. this.title = this.$t('分配数据权限');
  794. });
  795. },
  796. /** 提交按钮(数据权限) */
  797. submitDataScope: function() {
  798. if (this.form.userId != undefined) {
  799. this.form.deptIds = this.getDeptAllCheckedKeys();
  800. userDataScope(this.form).then(response => {
  801. this.msgSuccess(this.$t('修改成功'));
  802. this.openDataScope = false;
  803. this.getList();
  804. });
  805. }
  806. },
  807. // 取消按钮(数据权限)
  808. cancelDataScope() {
  809. this.openDataScope = false;
  810. this.reset();
  811. },
  812. // 树权限(展开/折叠)
  813. handleCheckedTreeExpand(value, type) {
  814. if (type == 'menu') {
  815. let treeList = this.menuOptions;
  816. for (let i = 0; i < treeList.length; i++) {
  817. this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
  818. }
  819. } else if (type == 'dept') {
  820. let treeList = this.deptOptions;
  821. for (let i = 0; i < treeList.length; i++) {
  822. this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
  823. }
  824. }
  825. },
  826. // 树权限(全选/全不选)
  827. handleCheckedTreeNodeAll(value, type) {
  828. if (type == 'menu') {
  829. this.$refs.menu.setCheckedNodes(value ? this.menuOptions: []);
  830. } else if (type == 'dept') {
  831. this.$refs.dept.setCheckedNodes(value ? this.deptOptions: []);
  832. }
  833. },
  834. // 树权限(父子联动)
  835. handleCheckedTreeConnect(value, type) {
  836. if (type == 'menu') {
  837. this.form.menuCheckStrictly = value ? true: false;
  838. } else if (type == 'dept') {
  839. this.form.deptCheckStrictly = value ? true: false;
  840. }
  841. },
  842. // 所有部门节点数据
  843. getDeptAllCheckedKeys() {
  844. // 目前被选中的部门节点
  845. let checkedKeys = this.$refs.dept.getCheckedKeys();
  846. // 半选中的部门节点
  847. let halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys();
  848. checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
  849. return checkedKeys;
  850. },
  851. }
  852. };
  853. </script>