index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="24">
  4. <!--用户数据-->
  5. <el-col :span="24" :xs="24">
  6. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
  7. <el-form-item label="用户账号" prop="username">
  8. <el-input
  9. v-model="queryParams.username"
  10. placeholder="请输入用户账号"
  11. clearable
  12. style="width: 240px"
  13. @keyup.enter.native="handleQuery"
  14. />
  15. </el-form-item>
  16. <el-form-item label="手机号码" prop="phonenumber">
  17. <el-input
  18. v-model="queryParams.phonenumber"
  19. placeholder="请输入手机号码"
  20. clearable
  21. style="width: 240px"
  22. @keyup.enter.native="handleQuery"
  23. />
  24. </el-form-item>
  25. <el-form-item label="用户状态" prop="status">
  26. <el-select
  27. v-model="queryParams.status"
  28. placeholder="请选择用户状态"
  29. clearable
  30. style="width: 240px"
  31. >
  32. <el-option
  33. v-for="item in statusOptions"
  34. :key="item.value"
  35. :label="item.label"
  36. :value="item.value">
  37. </el-option>
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item>
  41. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  42. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  43. </el-form-item>
  44. </el-form>
  45. <el-row :gutter="10" class="mb8">
  46. <el-col :span="1.5">
  47. <el-button
  48. type="primary"
  49. plain
  50. icon="el-icon-plus"
  51. size="mini"
  52. @click="handleAdd"
  53. >新增
  54. </el-button>
  55. </el-col>
  56. <el-col :span="1.5">
  57. <el-button
  58. type="success"
  59. plain
  60. icon="el-icon-edit"
  61. size="mini"
  62. @click="handleUpdate"
  63. >修改
  64. </el-button>
  65. </el-col>
  66. <el-col :span="1.5">
  67. <el-button
  68. type="danger"
  69. plain
  70. icon="el-icon-delete"
  71. size="mini"
  72. @click="handleDelete"
  73. >删除
  74. </el-button>
  75. </el-col>
  76. </el-row>
  77. <div style="padding-top: 10px">
  78. <vxe-table
  79. ref="userTable"
  80. align="center"
  81. :loading="loading"
  82. class="mytable-style"
  83. auto-resize
  84. border
  85. resizable
  86. export-config
  87. highlight-current-row
  88. show-overflow
  89. max-height="700"
  90. :data="userList"
  91. :radio-config="{trigger: 'row'}"
  92. >
  93. <vxe-column type="radio" width="60"/>
  94. <vxe-table-column field="username" title="用户账号"/>
  95. <vxe-table-column field="nickname" title="用户姓名"/>
  96. <vxe-table-column field="mailbox" title="邮箱"/>
  97. <vxe-table-column field="phonenumber" title="手机号码"/>
  98. <vxe-table-column field="status" title="状态" :formatter="statusFormat"/>
  99. <vxe-table-column title="操作" width="320">
  100. <template slot-scope="scope" v-if="scope.row.userId !== 1">
  101. <el-button
  102. size="mini"
  103. type="text"
  104. icon="el-icon-edit"
  105. @click="handleResetPwd(scope.row)"
  106. >初始/重置密码
  107. </el-button>
  108. <el-button
  109. size="mini"
  110. type="text"
  111. icon="el-icon-delete"
  112. @click="handleAuthRole(scope.row)"
  113. >分配角色
  114. </el-button>
  115. </template>
  116. </vxe-table-column>
  117. </vxe-table>
  118. <vxe-pager
  119. v-show="showTable"
  120. perfect
  121. :current-page.sync="currentPage"
  122. :page-size.sync="pageSize"
  123. :total="total"
  124. :page-sizes="[10,50,100]"
  125. :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
  126. @page-change="handlePageChange"
  127. >
  128. </vxe-pager>
  129. </div>
  130. </el-col>
  131. </el-row>
  132. <!-- 添加或修改用户配置对话框 -->
  133. <el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
  134. <el-form ref="form" :model="form" :rules="rules" width="630px" label-width="80px">
  135. <el-row>
  136. <el-col :span="12">
  137. <el-form-item label="用户账号" prop="username">
  138. <el-input id="un" ref="un" style="width: 220px" v-model="form.username" placeholder="请输入用户账号"
  139. maxlength="20" :disabled="edit"/>
  140. </el-form-item>
  141. </el-col>
  142. <el-col :span="12">
  143. <el-form-item label="用户姓名" prop="nickname">
  144. <el-input style="width: 220px" v-model="form.nickname" placeholder="请输入用户姓名" maxlength="30"/>
  145. </el-form-item>
  146. </el-col>
  147. </el-row>
  148. <el-row>
  149. <el-col :span="12">
  150. <el-form-item label="邮箱" prop="mailbox">
  151. <el-input style="width: 220px" v-model="form.mailbox" placeholder="请输入邮箱" maxlength="50"/>
  152. </el-form-item>
  153. </el-col>
  154. <el-col :span="12">
  155. <el-form-item label="手机号码" prop="phonenumber">
  156. <el-input style="width: 220px" v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11"/>
  157. </el-form-item>
  158. </el-col>
  159. </el-row>
  160. <el-row>
  161. <el-col :span="12">
  162. <el-form-item label="状态">
  163. <el-select style="width: 220px" v-model="form.status" placeholder="请选择状态">
  164. <el-option
  165. v-for="item in statusOptions"
  166. :key="item.value"
  167. :label="item.label"
  168. :value="item.value"
  169. ></el-option>
  170. </el-select>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="12">
  174. <el-form-item label="角色">
  175. <el-select style="width: 220px" v-model="form.roleIds" multiple placeholder="请选择角色">
  176. <el-option
  177. v-for="item in roleOptions"
  178. :key="item.roleId"
  179. :label="item.roleName"
  180. :value="item.roleId"
  181. :disabled="item.status == 1"
  182. ></el-option>
  183. </el-select>
  184. </el-form-item>
  185. </el-col>
  186. </el-row>
  187. </el-form>
  188. <div slot="footer" class="dialog-footer">
  189. <el-button type="primary" @click="submitForm">确 定</el-button>
  190. <el-button @click="cancel">取 消</el-button>
  191. </div>
  192. </el-dialog>
  193. </div>
  194. </template>
  195. <script>
  196. import { debounce } from 'lodash'
  197. export default {
  198. name: "User",
  199. data() {
  200. return {
  201. statusOptions: [
  202. {value: '0', label: '正常'},
  203. {value: '1', label: '锁定'},
  204. {value: '2', label: '注销'}
  205. ],
  206. // 遮罩层
  207. loading: true,
  208. showTable: true,
  209. // 选中数组
  210. ids: [],
  211. // 非单个禁用
  212. single: true,
  213. // 非多个禁用
  214. multiple: true,
  215. currentPage: 1,
  216. pageSize: 10,
  217. // 总条数
  218. total: 0,
  219. // 用户表格数据
  220. userList: null,
  221. // 弹出层标题
  222. title: "",
  223. // 是否显示弹出层
  224. open: false,
  225. // 默认密码
  226. initPassword: undefined,
  227. // 角色选项
  228. roleOptions: [],
  229. // 表单参数
  230. form: {},
  231. // 查询参数
  232. queryParams: {
  233. username: undefined,
  234. phonenumber: undefined,
  235. status: undefined
  236. },
  237. edit:false,
  238. // 表单校验
  239. rules: {
  240. username: [
  241. {required: true, message: "用户账号不能为空", trigger: "blur"},
  242. {min: 5, max: 20, message: '用户账号长度必须介于 5 和 20 之间', trigger: 'blur'}
  243. ],
  244. nickname: [
  245. {required: true, message: "用户姓名不能为空", trigger: "blur"},
  246. {min: 2, max: 20, message: '用户姓名长度必须介于 2 和 20 之间', trigger: 'blur'}
  247. ],
  248. mailbox: [
  249. {required: true, message: "邮箱不能为空", trigger: "blur"},
  250. {type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"]}
  251. ],
  252. phonenumber: [
  253. {required: true, message: "手机号码不能为空", trigger: "blur"},
  254. {pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}
  255. ]
  256. }
  257. };
  258. },
  259. watch: {},
  260. created() {
  261. this.getList()
  262. },
  263. methods: {
  264. handlePageChange({currentPage, pageSize}) {
  265. this.currentPage = currentPage
  266. this.pageSize = pageSize
  267. this.getList()
  268. },
  269. // 时间格式化
  270. statusFormat({cellValue}) {
  271. let belongTo = '未知的类型'
  272. for (let i = 0; i < this.statusOptions.length; i++) {
  273. if (cellValue == "0") {
  274. belongTo = "正常"
  275. } else if (cellValue == "1") {
  276. belongTo = "锁定"
  277. } else if (cellValue == "2") {
  278. belongTo = "注销"
  279. }
  280. }
  281. return belongTo
  282. },
  283. /** 查询用户列表 */
  284. getList:debounce(function(){
  285. this.loading = true;
  286. var searchParams = {
  287. currentPage: this.currentPage,
  288. pageSize: this.pageSize,
  289. username: this.queryParams.username,
  290. phonenumber: this.queryParams.phonenumber,
  291. status: this.queryParams.status
  292. }
  293. this.$axios.get('/sysUserController/getAll',
  294. {params: searchParams}).then((res) => {
  295. this.userList = res.data.records
  296. this.total = res.data.total
  297. if (res.data.records == '') {
  298. this.showTable = false
  299. } else {
  300. this.showTable = true
  301. }
  302. this.loading = false
  303. }).catch((error) => {
  304. this.$message.error('获取数据出错' + error)
  305. })
  306. },1000),
  307. // 用户状态修改
  308. handleStatusChange(row) {
  309. let text = row.status === "0" ? "启用" : "停用";
  310. this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
  311. return changeUserStatus(row.userId, row.status);
  312. }).then(() => {
  313. this.$modal.msgSuccess(text + "成功");
  314. }).catch(function () {
  315. row.status = row.status === "0" ? "1" : "0";
  316. });
  317. },
  318. // 取消按钮
  319. cancel() {
  320. this.open = false;
  321. this.reset();
  322. },
  323. // 表单重置
  324. reset() {
  325. this.edit = false;
  326. this.form = {
  327. id: undefined,
  328. username: undefined,
  329. nickname: undefined,
  330. phonenumber: undefined,
  331. mailbox: undefined,
  332. status: "0",
  333. remark: undefined
  334. };
  335. this.resetForm("form");
  336. },
  337. /** 搜索按钮操作 */
  338. handleQuery() {
  339. this.getList();
  340. },
  341. /** 重置按钮操作 */
  342. resetQuery() {
  343. this.resetForm("queryForm");
  344. },
  345. /** 新增按钮操作 */
  346. handleAdd() {
  347. this.reset();
  348. this.edit=false;
  349. this.open = true;
  350. this.title = "添加用户";
  351. this.form.password = this.initPassword;
  352. },
  353. /** 提交按钮 */
  354. submitForm:debounce(function(){
  355. this.$refs["form"].validate(valid => {
  356. if (valid) {
  357. if (this.form.id != undefined) {
  358. // 更新操作
  359. this.$axios.put('/sysUserController', this.form).then((res) => {
  360. if (res.code == 0) {
  361. this.$message.success('修改成功')
  362. this.open = false;
  363. this.reset();
  364. this.getList();
  365. }
  366. if (res.code == 1) {
  367. this.$message.error(res.data)
  368. }
  369. this.loading = false
  370. }).catch((error) => {
  371. this.$message.error(error)
  372. this.loading = false
  373. })
  374. } else {
  375. // const param = {
  376. // username: this.form.username,
  377. // nickname: this.form.nickname,
  378. // phonenumber: this.form.phonenumber,
  379. // mailbox: this.form.mailbox
  380. // }
  381. this.$axios.post('/sysUserController', this.form).then((res) => {
  382. if (res.code == 0) {
  383. this.$message.success('新增成功')
  384. this.open = false;
  385. this.reset();
  386. this.getList();
  387. }
  388. if (res.code == 1) {
  389. this.$message.error(res.data)
  390. }
  391. this.loading = false
  392. }).catch((error) => {
  393. this.$message.error(error)
  394. this.loading = false
  395. })
  396. }
  397. }
  398. });
  399. },1000),
  400. /** 重置密码按钮操作 */
  401. handleResetPwd:debounce(function(row){
  402. this.$confirm('创建密码并发送到邮箱:' + row.mailbox, '提示', {
  403. confirmButtonText: '确定',
  404. cancelButtonText: '取消',
  405. type: 'warning'
  406. }).then(() => {
  407. const param = {
  408. id: row.id
  409. }
  410. this.$axios.post('/sysUserController/resetPassword', param).then((res) => {
  411. if (res.code == 0) {
  412. this.$message({
  413. type: 'success',
  414. message: '创建并发送成功!'
  415. });
  416. } else {
  417. this.$message({
  418. type: 'error',
  419. message: '创建密码失败!'
  420. });
  421. }
  422. }).catch((error) => {
  423. console.log(error)
  424. this.loading = false
  425. })
  426. }).catch(() => {
  427. });
  428. },1000),
  429. /** 删除按钮操作 */
  430. handleDelete(){
  431. const _selectData = this.$refs.userTable.getRadioRecord(true)
  432. if (_selectData == null) {
  433. this.$message({
  434. type: 'warning',
  435. message: '请选择记录!'
  436. });
  437. return
  438. }
  439. this.$confirm('是否确认删除用户?', '提示', {
  440. confirmButtonText: '确定',
  441. cancelButtonText: '取消',
  442. type: 'warning'
  443. }).then(() => {
  444. const param = {
  445. id: _selectData.id
  446. }
  447. this.$axios.post('/sysUserController/delUser', param).then((res) => {
  448. if (res.code == 0) {
  449. this.$message({
  450. type: 'success',
  451. message: '删除成功!'
  452. });
  453. this.getList();
  454. } else {
  455. this.$message({
  456. type: 'error',
  457. message: '删除失败!'
  458. });
  459. }
  460. }).catch((error) => {
  461. console.log(error)
  462. this.loading = false
  463. })
  464. }).catch(() => {
  465. });
  466. },
  467. /** 修改按钮操作 */
  468. handleUpdate() {
  469. this.reset();
  470. const _selectData = this.$refs.userTable.getRadioRecord(true)
  471. if (_selectData == null) {
  472. this.$message({
  473. type: 'warning',
  474. message: '请选择记录!'
  475. });
  476. return
  477. }
  478. this.form = _selectData;
  479. this.open = true;
  480. this.title = "修改用户";
  481. this.edit=true;
  482. },
  483. /** 分配角色操作 */
  484. handleAuthRole: function (row) {
  485. const userId = row.userId;
  486. this.$router.push("/system/user-auth/role/" + userId);
  487. }
  488. }
  489. };
  490. </script>