| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <template>
- <ElDialog
- v-model="dialogVisible"
- :title="dialogType === 'add' ? '添加用户' : '编辑用户'"
- width="50%"
- align-center
- >
- <ElForm ref="formRef" :model="formData" :rules="rules" label-width="80px">
- <ElFormItem label="用户名" prop="username">
- <ElInput v-model="formData.username" />
- </ElFormItem>
- <ElFormItem label="密码" prop="password" v-if="!isEdit">
- <ElInput v-model="formData.password" />
- </ElFormItem>
- <ElFormItem label="手机号" prop="phone">
- <ElInput v-model="formData.phone" />
- </ElFormItem>
- <ElFormItem label="性别" prop="sex">
- <ElSelect v-model="formData.sex">
- <ElOption label="男" :value="0" />
- <ElOption label="女" :value="1" />
- </ElSelect>
- </ElFormItem>
- <ElFormItem label="角色" prop="role_id">
- <ElSelect v-model="formData.role_id" :empty-values="[0]" :value-on-clear="0">
- <ElOption v-for="role in roleList" :key="role.id" :value="role.id" :label="role.name" />
- </ElSelect>
- </ElFormItem>
- <ElFormItem label="分管学校" prop="school_ids" v-if="userData.date_auth_type == AuthTypeEnum.AUTH_TYPE_COMPANY_SCHOOL">
- <ElSelect v-model="formData.school_ids" multiple>
- <ElOption v-for="role in schoolList" :key="role.id" :value="role.id" :label="role.name" />
- </ElSelect>
- </ElFormItem>
- <ElFormItem label="分管餐饮公司" prop="school_ids" v-if="userData.date_auth_type == AuthTypeEnum.AUTH_TYPE_COMPANY_SCHOOL">
- <ElSelect v-model="formData.company_ids" multiple>
- <ElOption v-for="role in companyList" :key="role.id" :value="role.id" :label="role.name" />
- </ElSelect>
- </ElFormItem>
- <ElFormItem label="分管地区" prop="cities" v-if="userData.date_auth_type == AuthTypeEnum.AUTH_TYPE_CITY">
- <ElSelect v-model="formData.cities" multiple filterable>
- <ElOption v-for="item in cities" :key="item" :value="item" :label="item" />
- </ElSelect>
- </ElFormItem>
- </ElForm>
- <template #footer>
- <div class="dialog-footer">
- <ElButton @click="dialogVisible = false">取消</ElButton>
- <ElButton type="primary" @click="handleSubmit">提交</ElButton>
- </div>
- </template>
- </ElDialog>
- </template>
- <script setup lang="ts">
- import type { FormInstance, FormRules } from 'element-plus'
- import { UserService } from '@/api/usersApi'
- import {AuthTypeEnum} from "@/enums/appEnum";
- import {cities} from "@/router/utils/city";
- interface Props {
- visible: boolean
- type: string
- userData?: any
- roleList: Api.Common.SelectInfo[]
- schoolList: Api.Common.SelectInfo[]
- companyList: Api.Common.SelectInfo[]
- }
- interface Emits {
- (e: 'update:visible', value: boolean): void
- (e: 'submit'): void
- }
- const props = defineProps<Props>()
- const emit = defineEmits<Emits>()
- // 对话框显示控制
- const dialogVisible = computed({
- get: () => props.visible,
- set: (value) => emit('update:visible', value)
- })
- const dialogType = computed(() => props.type)
- // 表单实例
- const formRef = ref<FormInstance>()
- // 表单数据
- const formData = reactive<Form.UserEdit>({
- id: 0,
- username: '',
- password: '',
- phone: '',
- sex: 0,
- role_id: 0,
- school_ids: [],
- company_ids: [],
- cities:[]
- })
- // 表单验证规则
- const rules: FormRules = {
- username: [
- { required: true, message: '请输入用户名', trigger: 'blur' },
- { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
- ],
- phone: [
- { required: true, message: '请输入手机号', trigger: 'blur' },
- { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
- ],
- sex: [{ required: true, message: '请选择性别', trigger: 'blur' }],
- role_id: [{ required: true, message: '请选择角色', trigger: 'blur' }]
- }
- const isEdit = ref(false)
- // 初始化表单数据
- const initFormData = () => {
- isEdit.value = props.type === 'edit' && props.userData
- const row = props.userData
- Object.assign(formData, {
- id: isEdit.value ? row.id : 0,
- username: isEdit.value ? row.username || '' : '',
- password: '',
- phone: isEdit.value ? row.phone || '' : '',
- sex: isEdit.value ? row.sex : 0,
- role_id: isEdit.value ? row.role_id : 0,
- school_ids: isEdit.value ? row.school_ids || [] : [],
- company_ids: isEdit.value ? row.company_ids || [] : [],
- cities: isEdit.value ? row.cities || [] : [],
- })
- }
- // 统一监听对话框状态变化
- watch(
- () => [props.visible, props.type, props.userData],
- ([visible]) => {
- if (visible) {
- initFormData()
- console.log(`%c userData == `, 'background:#41b883 ; padding:1px; color:#fff', props.userData);
- nextTick(() => {
- formRef.value?.clearValidate()
- })
- }
- },
- { immediate: true }
- )
- // 提交表单
- const handleSubmit = async () => {
- if (!formRef.value) return
- await formRef.value.validate((valid) => {
- if (valid) {
- UserService.editUser(formData).then(() => {
- dialogVisible.value = false
- ElMessage.success('提交成功')
- emit('submit')
- })
- }
- })
- }
- </script>
|