user-add-or-update.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <template>
  2. <el-dialog :visible.sync="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
  3. <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmitHandle()" label-width="120px">
  4. <el-form-item prop="username" :label="$t('user.username')">
  5. <el-input v-model="dataForm.username" :placeholder="$t('user.username')"></el-input>
  6. </el-form-item>
  7. <!-- <el-form-item prop="deptName" :label="$t('user.deptName')">
  8. <ren-dept-tree v-model="dataForm.deptId" :placeholder="$t('dept.title')" :dept-name.sync="dataForm.deptName"></ren-dept-tree>
  9. </el-form-item> -->
  10. <el-form-item prop="password" :label="$t('user.password')" :class="{ 'is-required': !dataForm.id }">
  11. <el-input v-model="dataForm.password" type="password" :placeholder="$t('user.password')"></el-input>
  12. </el-form-item>
  13. <el-form-item prop="confirmPassword" :label="$t('user.confirmPassword')" :class="{ 'is-required': !dataForm.id }">
  14. <el-input v-model="dataForm.confirmPassword" type="password" :placeholder="$t('user.confirmPassword')"></el-input>
  15. </el-form-item>
  16. <el-form-item prop="realName" :label="$t('user.realName')">
  17. <el-input v-model="dataForm.realName" :placeholder="$t('user.realName')"></el-input>
  18. </el-form-item>
  19. <el-form-item prop="gender" :label="$t('user.gender')">
  20. <ren-radio-group v-model="dataForm.gender" dict-type="gender"></ren-radio-group>
  21. </el-form-item>
  22. <el-form-item prop="email" :label="$t('user.email')">
  23. <el-input v-model="dataForm.email" :placeholder="$t('user.email')"></el-input>
  24. </el-form-item>
  25. <el-form-item prop="mobile" :label="$t('user.mobile')">
  26. <el-input v-model="dataForm.mobile" :placeholder="$t('user.mobile')"></el-input>
  27. </el-form-item>
  28. <el-form-item prop="roleIdList" :label="$t('user.roleIdList')" class="role-list">
  29. <el-select v-model="dataForm.roleIdList" multiple :placeholder="$t('user.roleIdList')">
  30. <el-option v-for="role in roleList" :key="role.id" :label="role.name" :value="role.id"></el-option>
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item prop="status" :label="$t('user.status')" size="mini">
  34. <el-radio-group v-model="dataForm.status">
  35. <el-radio :label="0">{{ $t('user.status0') }}</el-radio>
  36. <el-radio :label="1">{{ $t('user.status1') }}</el-radio>
  37. </el-radio-group>
  38. </el-form-item>
  39. </el-form>
  40. <template slot="footer">
  41. <el-button @click="visible = false">{{ $t('cancel') }}</el-button>
  42. <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
  43. </template>
  44. </el-dialog>
  45. </template>
  46. <script>
  47. import debounce from 'lodash/debounce'
  48. import { isEmail, isMobile } from '@/utils/validate'
  49. export default {
  50. data () {
  51. return {
  52. visible: false,
  53. roleList: [],
  54. roleIdListDefault: [],
  55. dataForm: {
  56. id: '',
  57. username: '',
  58. deptId: '',
  59. deptName: '',
  60. password: '',
  61. confirmPassword: '',
  62. realName: '',
  63. gender: 0,
  64. email: '',
  65. mobile: '',
  66. roleIdList: [],
  67. status: 1
  68. }
  69. }
  70. },
  71. computed: {
  72. dataRule () {
  73. var validatePassword = (rule, value, callback) => {
  74. if (!this.dataForm.id && !/\S/.test(value)) {
  75. return callback(new Error(this.$t('validate.required')))
  76. }
  77. callback()
  78. }
  79. var validateConfirmPassword = (rule, value, callback) => {
  80. if (!this.dataForm.id && !/\S/.test(value)) {
  81. return callback(new Error(this.$t('validate.required')))
  82. }
  83. if (this.dataForm.password !== value) {
  84. return callback(new Error(this.$t('user.validate.confirmPassword')))
  85. }
  86. callback()
  87. }
  88. var validateEmail = (rule, value, callback) => {
  89. if (value && !isEmail(value)) {
  90. return callback(new Error(this.$t('validate.format', { 'attr': this.$t('user.email') })))
  91. }
  92. callback()
  93. }
  94. var validateMobile = (rule, value, callback) => {
  95. if (value && !isMobile(value)) {
  96. return callback(new Error(this.$t('validate.format', { 'attr': this.$t('user.mobile') })))
  97. }
  98. callback()
  99. }
  100. return {
  101. username: [
  102. { required: true, message: this.$t('validate.required'), trigger: 'blur' }
  103. ],
  104. password: [
  105. { validator: validatePassword, trigger: 'blur' }
  106. ],
  107. confirmPassword: [
  108. { validator: validateConfirmPassword, trigger: 'blur' }
  109. ],
  110. realName: [
  111. { required: true, message: this.$t('validate.required'), trigger: 'blur' }
  112. ],
  113. email: [
  114. { validator: validateEmail, trigger: 'blur' }
  115. ],
  116. mobile: [
  117. { validator: validateMobile, trigger: 'blur' }
  118. ]
  119. }
  120. }
  121. },
  122. methods: {
  123. init () {
  124. this.visible = true
  125. this.dataForm.deptId = ''
  126. this.$nextTick(() => {
  127. this.$refs['dataForm'].resetFields()
  128. this.roleIdListDefault = []
  129. Promise.all([
  130. this.getRoleList()
  131. ]).then(() => {
  132. if (this.dataForm.id) {
  133. this.getInfo()
  134. }
  135. })
  136. })
  137. },
  138. // 获取角色列表
  139. getRoleList () {
  140. return this.$http.get('/sys/role/list').then(({ data: res }) => {
  141. if (res.code !== 0) {
  142. return this.$message.error(res.msg)
  143. }
  144. this.roleList = res.data
  145. }).catch(() => {})
  146. },
  147. // 获取信息
  148. getInfo () {
  149. this.$http.get(`/sys/user/${this.dataForm.id}`).then(({ data: res }) => {
  150. if (res.code !== 0) {
  151. return this.$message.error(res.msg)
  152. }
  153. this.dataForm = {
  154. ...this.dataForm,
  155. ...res.data,
  156. roleIdList: []
  157. }
  158. // 角色配置, 区分是否为默认角色
  159. for (var i = 0; i < res.data.roleIdList.length; i++) {
  160. if (this.roleList.filter(item => item.id === res.data.roleIdList[i])[0]) {
  161. this.dataForm.roleIdList.push(res.data.roleIdList[i])
  162. continue
  163. }
  164. this.roleIdListDefault.push(res.data.roleIdList[i])
  165. }
  166. }).catch(() => {})
  167. },
  168. // 表单提交
  169. dataFormSubmitHandle: debounce(function () {
  170. this.$refs['dataForm'].validate((valid) => {
  171. if (!valid) {
  172. return false
  173. }
  174. this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/user', {
  175. ...this.dataForm,
  176. roleIdList: [
  177. ...this.dataForm.roleIdList,
  178. ...this.roleIdListDefault
  179. ]
  180. }).then(({ data: res }) => {
  181. if (res.code !== 0) {
  182. return this.$message.error(res.msg)
  183. }
  184. this.$message({
  185. message: this.$t('prompt.success'),
  186. type: 'success',
  187. duration: 500,
  188. onClose: () => {
  189. this.visible = false
  190. this.$emit('refreshDataList')
  191. }
  192. })
  193. }).catch(() => {})
  194. })
  195. }, 1000, { 'leading': true, 'trailing': false })
  196. }
  197. }
  198. </script>
  199. <style lang="scss">
  200. .mod-sys__user {
  201. .role-list {
  202. .el-select {
  203. width: 100%;
  204. }
  205. }
  206. }
  207. </style>