user-tenant.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. <template>
  2. <div class='main-content'>
  3. <baseTable
  4. ref='userTable'
  5. :tableHeader='tableHeader'
  6. :tableData='tableData'
  7. :tableOperate='tableOperate'
  8. :searchParams='searchParams'
  9. @searchFn='searchFn'
  10. @resetFn='resetFn'
  11. :addBtn='false'
  12. :more-operation='false'
  13. >
  14. <template slot='search'>
  15. <el-form-item label='姓名'>
  16. <el-input v-model.trim='searchParams.fullName' placeholder='请输入姓名' />
  17. </el-form-item>
  18. <el-form-item label='手机号'>
  19. <el-input v-model.trim='searchParams.mobile' placeholder='请输入手机号' />
  20. </el-form-item>
  21. <el-form-item label='租户'>
  22. <el-input v-model.trim='searchParams.tenantName' placeholder='请输租户名称' />
  23. </el-form-item>
  24. </template>
  25. </baseTable>
  26. <el-dialog width='700px' :title='formDialog.title' :visible.sync='formDialog.visible' :close-on-click-modal='false'>
  27. <el-form
  28. ref='userForm'
  29. size='small'
  30. label-width='120px'
  31. :model='formDialog.formData'
  32. :rules='formDialog.formRules'
  33. >
  34. <el-form-item label='用户名' prop='username' v-if='formDialog.isAdd'>
  35. <el-input v-model.trim='formDialog.formData.username' />
  36. </el-form-item>
  37. <el-form-item label='姓名' prop='fullName'>
  38. <el-input v-model.trim='formDialog.formData.fullName' />
  39. </el-form-item>
  40. <el-form-item label='手机号码' prop='mobile'>
  41. <el-input v-model.trim='formDialog.formData.mobile' />
  42. </el-form-item>
  43. <el-form-item label='电子邮箱' prop='email'>
  44. <el-input v-model.trim='formDialog.formData.email' />
  45. </el-form-item>
  46. <el-form-item label='角色' prop='roleIds' v-if='formDialog.isAdd'>
  47. <el-select v-model.trim='formDialog.formData.roleIds' multiple style='width: 100%;'>
  48. <el-option v-for='item in roles' :key='item.id' :label='item.roleCnName' :value='item.id'></el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label='性别' prop='sex'>
  52. <el-radio-group v-model='formDialog.formData.sex'>
  53. <el-radio-button v-for='item in dictSex' :key='item.value' :label='item.value'>
  54. {{ item.label }}
  55. </el-radio-button>
  56. </el-radio-group>
  57. </el-form-item>
  58. </el-form>
  59. <div slot='footer' class='dialog-footer'>
  60. <el-button type='primary' :loading='formDialog.loading' @click='submitFn'>确定</el-button>
  61. <el-button @click='cancelFn'>取消</el-button>
  62. </div>
  63. </el-dialog>
  64. <el-dialog
  65. width='600px'
  66. :title='accountDialog.title'
  67. :visible.sync='accountDialog.visible'
  68. :close-on-click-modal='false'
  69. >
  70. <el-form ref='accountForm' size='small' label-width='120px' :model='accountDialog.formData'>
  71. <el-form-item label='用户名'>{{ accountDialog.formData.username }}</el-form-item>
  72. <el-form-item label='手机号'>{{ accountDialog.formData.mobile }}</el-form-item>
  73. <el-form-item label='密码过期时间'>{{ accountDialog.formData.pwdExpired | globalFormatDate('YYYY-MM-DD') }}
  74. </el-form-item>
  75. <el-form-item label='锁定账号'>
  76. <el-switch
  77. v-model='accountDialog.formData.locked'
  78. active-color='#13ce66'
  79. active-value='1'
  80. inactive-value='0'
  81. @change='changeLockedFn'
  82. />
  83. </el-form-item>
  84. <el-form-item label='角色'>
  85. <el-select v-model.trim='accountDialog.formData.roleIds' multiple @change='changeRole'>
  86. <el-option v-for='item in roles' :key='item.id' :label='item.roleCnName' :value='item.id'></el-option>
  87. </el-select>
  88. </el-form-item>
  89. <el-form-item label='修改密码'>
  90. <el-col :span='12'>
  91. <el-input v-model.trim='accountDialog.formData.password' type='password' />
  92. </el-col>
  93. <el-col :span='11' style='margin-left: 10px;'>
  94. <el-button type='primary' size='mini' @click='resetPwdFn'>修改密码</el-button>
  95. </el-col>
  96. </el-form-item>
  97. </el-form>
  98. <span slot='footer' class='dialog-footer'>
  99. <el-button @click='accountDialog.visible = false'>关闭</el-button>
  100. </span>
  101. </el-dialog>
  102. </div>
  103. </template>
  104. <script>
  105. import { formatDict } from '@utils/global';
  106. import { isMobile, isUsername } from '@utils/validate';
  107. import {
  108. addRole,
  109. changeLock,
  110. createUser,
  111. delRole,
  112. fetchUserById,
  113. queryUserAccount,
  114. queryUserPage,
  115. removeUser,
  116. resetPwd,
  117. updateUserDetail
  118. } from '@api/upms/api-user-tenant';
  119. export default {
  120. name: 'UserTenant',
  121. computed: {
  122. dictSex() {
  123. return this.$store.getters.dict.dictSex;
  124. }
  125. },
  126. data() {
  127. let validateUsername = (rule, value, callback) => {
  128. if (!isUsername(value)) {
  129. return callback(new Error('请输入正确的用户名,英文字母开头, 长度要求6~20位'));
  130. } else {
  131. return callback();
  132. }
  133. };
  134. let validateMobile = (rule, value, callback) => {
  135. if (!isMobile(value)) {
  136. return callback(new Error('请输入正确的手机号码'));
  137. } else {
  138. return callback();
  139. }
  140. };
  141. return {
  142. userId: '',
  143. roleIds: [],
  144. tableHeader: [
  145. {
  146. label: '租户',
  147. align: 'center',
  148. minWidth: 100,
  149. prop: 'tenantName'
  150. },
  151. {
  152. label: '姓名',
  153. align: 'center',
  154. minWidth: 100,
  155. prop: 'fullName'
  156. },
  157. {
  158. label: '角色',
  159. align: 'center',
  160. minWidth: 100,
  161. prop: 'roles'
  162. },
  163. {
  164. label: '用户名',
  165. align: 'center',
  166. minWidth: 100,
  167. prop: 'username'
  168. },
  169. {
  170. label: '性别',
  171. width: 80,
  172. align: 'center',
  173. type: 'render',
  174. render: (h, params) => {
  175. return h('span', formatDict(this.dictSex, params.row.sex));
  176. }
  177. },
  178. {
  179. label: '手机号',
  180. prop: 'mobile',
  181. align: 'center',
  182. minWidth: 120
  183. }
  184. ],
  185. tableData: [],
  186. tableOperate: [
  187. {
  188. label: '新增',
  189. type: 'success',
  190. icon: 'el-icon-plus',
  191. func: (row) => {
  192. this.addFn(row);
  193. }
  194. },
  195. {
  196. label: '编辑',
  197. type: 'primary',
  198. icon: 'el-icon-edit',
  199. func: (row) => {
  200. this.editFn(row);
  201. }
  202. },
  203. {
  204. icon: 'el-icon-s-check',
  205. type: 'info',
  206. label: '账号相关',
  207. func: (row) => {
  208. this.accountFn(row);
  209. }
  210. },
  211. {
  212. label: '删除',
  213. type: 'danger',
  214. icon: 'el-icon-delete',
  215. func: (row) => {
  216. this.delFn(row);
  217. }
  218. }
  219. ],
  220. searchParams: Object.assign({}, this.$search),
  221. roles: [],
  222. formDialog: {
  223. title: '',
  224. visible: false,
  225. loading: false,
  226. isAdd: false,
  227. formData: {},
  228. defaultData: {
  229. sex: '3',
  230. attachDataList: []
  231. },
  232. formRules: {
  233. username: [
  234. { required: true, message: '请输入用户名', trigger: 'blur' },
  235. { required: true, validator: validateUsername, trigger: 'blur' }
  236. ],
  237. fullName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
  238. mobile: [
  239. { required: true, message: '请输入手机号码', trigger: 'blur' },
  240. { len: 11, message: '长度11个字符', trigger: 'blur' },
  241. { required: true, validator: validateMobile, trigger: 'blur' }
  242. ],
  243. email: [
  244. {
  245. required: false,
  246. type: 'email',
  247. message: '请输入正确的电子邮箱',
  248. trigger: 'blur'
  249. }
  250. ],
  251. roleIds: [{ required: true, message: '请选择对应的角色', trigger: 'change' }]
  252. }
  253. },
  254. accountDialog: {
  255. title: '账号相关',
  256. visible: false,
  257. formData: {}
  258. },
  259. uploadParams: {}
  260. };
  261. },
  262. methods: {
  263. searchFn(isReset = false) {
  264. let vm = this;
  265. if (isReset) {
  266. vm.searchParams = Object.assign(vm.searchParams, vm.$search);
  267. }
  268. queryUserPage(vm.searchParams).then(
  269. (res) => {
  270. vm.tableData = res.data.records;
  271. vm.searchParams.total = res.data.total;
  272. },
  273. (error) => {
  274. vm.$notify.error({
  275. title: error.data.msg,
  276. message: error.data.data
  277. });
  278. }
  279. );
  280. },
  281. resetFn() {
  282. let vm = this;
  283. vm.searchParams = Object.assign({}, this.$search);
  284. vm.searchFn();
  285. },
  286. addFn(row) {
  287. let vm = this;
  288. queryUserAccount({ id: row.id }).then(
  289. (res) => {
  290. vm.roles = res.data.roles;
  291. },
  292. (error) => {
  293. vm.$notify.error({
  294. title: error.data.msg,
  295. message: error.data.data
  296. });
  297. }
  298. );
  299. vm.formDialog.title = '新增';
  300. vm.formDialog.visible = true;
  301. vm.formDialog.loading = false;
  302. vm.formDialog.isAdd = true;
  303. vm.formDialog.formData = Object.assign({ tenantId: row.tenantId }, vm.formDialog.defaultData);
  304. },
  305. editFn(row) {
  306. let vm = this;
  307. vm.formDialog.title = '编辑';
  308. vm.formDialog.loading = false;
  309. vm.formDialog.isAdd = false;
  310. let params = {
  311. id: row.id
  312. };
  313. fetchUserById(params).then(
  314. (res) => {
  315. vm.formDialog.formData = Object.assign({}, res.data);
  316. vm.formDialog.visible = true;
  317. },
  318. (error) => {
  319. vm.$notify.error({
  320. title: error.data.msg,
  321. message: error.data.data
  322. });
  323. }
  324. );
  325. },
  326. cancelFn() {
  327. let vm = this;
  328. vm.formDialog.visible = false;
  329. vm.formDialog.loading = false;
  330. vm.formDialog.isAdd = false;
  331. vm.formDialog.formData = Object.assign({}, vm.formDialog.defaultData);
  332. vm.$refs.userForm.resetFields();
  333. },
  334. submitFn() {
  335. let vm = this;
  336. vm.formDialog.loading = true;
  337. vm.$refs.userForm.validate((valid) => {
  338. if (!valid) {
  339. vm.formDialog.loading = false;
  340. return;
  341. }
  342. if (vm.formDialog.formData.id) {
  343. let formData = vm.formDialog.formData;
  344. updateUserDetail(formData).then(
  345. (res) => {
  346. vm.$message.success('修改成功');
  347. vm.formDialog.visible = false;
  348. vm.formDialog.loading = false;
  349. vm.searchFn(true);
  350. },
  351. (error) => {
  352. vm.$notify.error({
  353. title: error.data.msg,
  354. message: error.data.data
  355. });
  356. vm.formDialog.loading = false;
  357. }
  358. );
  359. } else {
  360. let formData = vm.formDialog.formData;
  361. createUser(formData).then(
  362. (res) => {
  363. vm.$message.success('新增成功');
  364. vm.formDialog.visible = false;
  365. vm.formDialog.loading = false;
  366. vm.searchFn(true);
  367. },
  368. (error) => {
  369. vm.$notify.error({
  370. title: error.data.msg,
  371. message: error.data.data
  372. });
  373. vm.formDialog.loading = false;
  374. }
  375. );
  376. }
  377. });
  378. },
  379. delFn(row) {
  380. let vm = this;
  381. vm.$confirm('此操作将删除该记录, 是否继续?', '提示', {
  382. type: 'warning'
  383. }).then(() => {
  384. let ids = [row.id];
  385. removeUser({ ids: ids }).then(
  386. (res) => {
  387. vm.$message.success('删除成功');
  388. vm.searchFn(true);
  389. },
  390. (error) => {
  391. vm.$notify.error({
  392. title: error.data.msg,
  393. message: error.data.data
  394. });
  395. }
  396. );
  397. });
  398. },
  399. accountFn(row) {
  400. let vm = this;
  401. vm.userId = row.id;
  402. let params = {
  403. id: row.id
  404. };
  405. queryUserAccount(params).then(
  406. (res) => {
  407. vm.accountDialog.formData = Object.assign({}, res.data);
  408. vm.roleIds = res.data.roleIds;
  409. vm.roles = res.data.roles;
  410. vm.accountDialog.visible = true;
  411. },
  412. (error) => {
  413. vm.$notify.error({
  414. title: error.data.msg,
  415. message: error.data.data
  416. });
  417. }
  418. );
  419. },
  420. changeLockedFn(val) {
  421. let vm = this;
  422. let params = {
  423. id: vm.accountDialog.formData.id,
  424. locked: val
  425. };
  426. changeLock(params).then(
  427. (res) => {
  428. vm.$message.success(res.msg);
  429. },
  430. (error) => {
  431. vm.$notify.error({
  432. title: error.data.msg,
  433. message: error.data.data
  434. });
  435. }
  436. );
  437. },
  438. resetPwdFn() {
  439. let vm = this;
  440. this.$confirm('此操作将修改密码, 是否继续?', '提示', {
  441. type: 'warning'
  442. }).then(() => {
  443. let params = {
  444. id: vm.accountDialog.formData.id,
  445. password: vm.accountDialog.formData.password
  446. };
  447. resetPwd(params).then(
  448. (res) => {
  449. vm.$message.success(res.msg);
  450. },
  451. (error) => {
  452. vm.$notify.error({
  453. title: error.data.msg,
  454. message: error.data.data
  455. });
  456. }
  457. );
  458. });
  459. },
  460. uploadFiles(fileList) {
  461. this.formDialog.formData.avatar = fileList.length > 0 ? fileList[0].id : '';
  462. },
  463. changeRole(val) {
  464. let vm = this;
  465. let params = {
  466. id: vm.userId
  467. };
  468. if (val.length > vm.roleIds.length) {
  469. params.roleIds = val.filter((o) => {
  470. return vm.roleIds.indexOf(o) === -1;
  471. });
  472. addRole(params).then(
  473. (res) => {
  474. vm.$message.success(res.msg);
  475. },
  476. (error) => {
  477. vm.$notify.error({
  478. title: error.data.msg,
  479. message: error.data.data
  480. });
  481. });
  482. } else {
  483. params.roleIds = vm.roleIds.filter((o) => {
  484. return val.indexOf(o) === -1;
  485. });
  486. delRole(params).then(
  487. (res) => {
  488. vm.$message.success(res.data.msg);
  489. },
  490. (error) => {
  491. vm.$notify.error({
  492. title: error.data.msg,
  493. message: error.data.data
  494. });
  495. }
  496. );
  497. }
  498. vm.roleIds = val;
  499. }
  500. },
  501. created() {
  502. this.searchFn();
  503. }
  504. };
  505. </script>
  506. <style scoped lang='less'></style>