user-dialog.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <ElDialog
  3. v-model="dialogVisible"
  4. :title="dialogType === 'add' ? '添加用户' : '编辑用户'"
  5. width="30%"
  6. align-center
  7. >
  8. <ElForm ref="formRef" :model="formData" :rules="rules" label-width="80px">
  9. <ElFormItem label="用户名" prop="username">
  10. <ElInput v-model="formData.username" />
  11. </ElFormItem>
  12. <ElFormItem label="密码" prop="password" v-if="!isEdit">
  13. <ElInput v-model="formData.password" />
  14. </ElFormItem>
  15. <ElFormItem label="手机号" prop="phone">
  16. <ElInput v-model="formData.phone" />
  17. </ElFormItem>
  18. <ElFormItem label="性别" prop="sex">
  19. <ElSelect v-model="formData.sex">
  20. <ElOption label="男" value="0" />
  21. <ElOption label="女" value="1" />
  22. </ElSelect>
  23. </ElFormItem>
  24. <ElFormItem label="角色" prop="role">
  25. <ElSelect v-model="formData.role_name">
  26. <ElOption v-for="role in roleList" :key="role.id" :value="role.name" :label="role.name" />
  27. </ElSelect>
  28. </ElFormItem>
  29. </ElForm>
  30. <template #footer>
  31. <div class="dialog-footer">
  32. <ElButton @click="dialogVisible = false">取消</ElButton>
  33. <ElButton type="primary" @click="handleSubmit">提交</ElButton>
  34. </div>
  35. </template>
  36. </ElDialog>
  37. </template>
  38. <script setup lang="ts">
  39. import type { FormInstance, FormRules } from 'element-plus'
  40. import { UserService } from '@/api/usersApi'
  41. interface Props {
  42. visible: boolean
  43. type: string
  44. userData?: any
  45. roleList: Api.Common.SelectInfo[]
  46. }
  47. interface Emits {
  48. (e: 'update:visible', value: boolean): void
  49. (e: 'submit'): void
  50. }
  51. const props = defineProps<Props>()
  52. const emit = defineEmits<Emits>()
  53. // 对话框显示控制
  54. const dialogVisible = computed({
  55. get: () => props.visible,
  56. set: (value) => emit('update:visible', value)
  57. })
  58. const dialogType = computed(() => props.type)
  59. // 表单实例
  60. const formRef = ref<FormInstance>()
  61. // 表单数据
  62. const formData = reactive({
  63. id: 0,
  64. username: '',
  65. password: '',
  66. phone: '',
  67. sex: '男',
  68. role_name: ''
  69. })
  70. // 表单验证规则
  71. const rules: FormRules = {
  72. username: [
  73. { required: true, message: '请输入用户名', trigger: 'blur' },
  74. { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
  75. ],
  76. phone: [
  77. { required: true, message: '请输入手机号', trigger: 'blur' },
  78. { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
  79. ],
  80. sex: [{ required: true, message: '请选择性别', trigger: 'blur' }],
  81. role_name: [{ required: true, message: '请选择角色', trigger: 'blur' }]
  82. }
  83. const isEdit = ref(false)
  84. // 初始化表单数据
  85. const initFormData = () => {
  86. isEdit.value = props.type === 'edit' && props.userData
  87. const row = props.userData
  88. Object.assign(formData, {
  89. username: isEdit.value ? row.username || '' : '',
  90. phone: isEdit.value ? row.phone || '' : '',
  91. sex: isEdit.value ? (row.sex ? '女' : '男') : '男',
  92. role_name: isEdit.value ? row.role_name || '' : ''
  93. })
  94. }
  95. // 统一监听对话框状态变化
  96. watch(
  97. () => [props.visible, props.type, props.userData],
  98. ([visible]) => {
  99. if (visible) {
  100. initFormData()
  101. nextTick(() => {
  102. formRef.value?.clearValidate()
  103. })
  104. }
  105. },
  106. { immediate: true }
  107. )
  108. // 提交表单
  109. const handleSubmit = async () => {
  110. if (!formRef.value) return
  111. await formRef.value.validate((valid) => {
  112. if (valid) {
  113. let userData: Api.User.UserInfo = {
  114. id: props.userData.id,
  115. username: formData.username,
  116. password: formData.password,
  117. phone: formData.phone,
  118. sex: parseInt(formData.sex),
  119. role_id: props.roleList.find((item) => item.name === formData.role_name)?.id || 0
  120. }
  121. UserService.editUser(userData)
  122. dialogVisible.value = false
  123. emit('submit')
  124. }
  125. })
  126. }
  127. </script>