index.vue 27 KB

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