user-dialog.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <ElDialog
  3. v-model="dialogVisible"
  4. :title="dialogType === 'add' ? '添加用户' : '编辑用户'"
  5. width="50%"
  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_id">
  25. <ElSelect v-model="formData.role_id" :empty-values="[0]" :value-on-clear="0">
  26. <ElOption v-for="role in roleList" :key="role.id" :value="role.id" :label="role.name" />
  27. </ElSelect>
  28. </ElFormItem>
  29. <ElFormItem label="分管学校" prop="school_ids" v-if="userData.date_auth_type == AuthTypeEnum.AUTH_TYPE_COMPANY_SCHOOL">
  30. <ElSelect v-model="formData.school_ids" multiple>
  31. <ElOption v-for="role in schoolList" :key="role.id" :value="role.id" :label="role.name" />
  32. </ElSelect>
  33. </ElFormItem>
  34. <ElFormItem label="分管餐饮公司" prop="school_ids" v-if="userData.date_auth_type == AuthTypeEnum.AUTH_TYPE_COMPANY_SCHOOL">
  35. <ElSelect v-model="formData.company_ids" multiple>
  36. <ElOption v-for="role in companyList" :key="role.id" :value="role.id" :label="role.name" />
  37. </ElSelect>
  38. </ElFormItem>
  39. <ElFormItem label="分管地区" prop="cities" v-if="userData.date_auth_type == AuthTypeEnum.AUTH_TYPE_CITY">
  40. <ElSelect v-model="formData.cities" multiple filterable>
  41. <ElOption v-for="item in cities" :key="item" :value="item" :label="item" />
  42. </ElSelect>
  43. </ElFormItem>
  44. </ElForm>
  45. <template #footer>
  46. <div class="dialog-footer">
  47. <ElButton @click="dialogVisible = false">取消</ElButton>
  48. <ElButton type="primary" @click="handleSubmit">提交</ElButton>
  49. </div>
  50. </template>
  51. </ElDialog>
  52. </template>
  53. <script setup lang="ts">
  54. import type { FormInstance, FormRules } from 'element-plus'
  55. import { UserService } from '@/api/usersApi'
  56. import {AuthTypeEnum} from "@/enums/appEnum";
  57. import {cities} from "@/router/utils/city";
  58. interface Props {
  59. visible: boolean
  60. type: string
  61. userData?: any
  62. roleList: Api.Common.SelectInfo[]
  63. schoolList: Api.Common.SelectInfo[]
  64. companyList: Api.Common.SelectInfo[]
  65. }
  66. interface Emits {
  67. (e: 'update:visible', value: boolean): void
  68. (e: 'submit'): void
  69. }
  70. const props = defineProps<Props>()
  71. const emit = defineEmits<Emits>()
  72. // 对话框显示控制
  73. const dialogVisible = computed({
  74. get: () => props.visible,
  75. set: (value) => emit('update:visible', value)
  76. })
  77. const dialogType = computed(() => props.type)
  78. // 表单实例
  79. const formRef = ref<FormInstance>()
  80. // 表单数据
  81. const formData = reactive<Form.UserEdit>({
  82. id: 0,
  83. username: '',
  84. password: '',
  85. phone: '',
  86. sex: 0,
  87. role_id: 0,
  88. school_ids: [],
  89. company_ids: [],
  90. cities:[]
  91. })
  92. // 表单验证规则
  93. const rules: FormRules = {
  94. username: [
  95. { required: true, message: '请输入用户名', trigger: 'blur' },
  96. { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
  97. ],
  98. phone: [
  99. { required: true, message: '请输入手机号', trigger: 'blur' },
  100. { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
  101. ],
  102. sex: [{ required: true, message: '请选择性别', trigger: 'blur' }],
  103. role_id: [{ required: true, message: '请选择角色', trigger: 'blur' }]
  104. }
  105. const isEdit = ref(false)
  106. // 初始化表单数据
  107. const initFormData = () => {
  108. isEdit.value = props.type === 'edit' && props.userData
  109. const row = props.userData
  110. Object.assign(formData, {
  111. id: isEdit.value ? row.id : 0,
  112. username: isEdit.value ? row.username || '' : '',
  113. password: '',
  114. phone: isEdit.value ? row.phone || '' : '',
  115. sex: isEdit.value ? row.sex : 0,
  116. role_id: isEdit.value ? row.role_id : 0,
  117. school_ids: isEdit.value ? row.school_ids || [] : [],
  118. company_ids: isEdit.value ? row.company_ids || [] : [],
  119. cities: isEdit.value ? row.cities || [] : [],
  120. })
  121. }
  122. // 统一监听对话框状态变化
  123. watch(
  124. () => [props.visible, props.type, props.userData],
  125. ([visible]) => {
  126. if (visible) {
  127. initFormData()
  128. console.log(`%c userData == `, 'background:#41b883 ; padding:1px; color:#fff', props.userData);
  129. nextTick(() => {
  130. formRef.value?.clearValidate()
  131. })
  132. }
  133. },
  134. { immediate: true }
  135. )
  136. // 提交表单
  137. const handleSubmit = async () => {
  138. if (!formRef.value) return
  139. await formRef.value.validate((valid) => {
  140. if (valid) {
  141. UserService.editUser(formData).then(() => {
  142. dialogVisible.value = false
  143. ElMessage.success('提交成功')
  144. emit('submit')
  145. })
  146. }
  147. })
  148. }
  149. </script>