182 lines
5.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<ElDialog
v-model="dialogVisible"
:title="dialogType === 'add' ? '添加用户' : '编辑用户'"
width="30%"
align-center
>
<ElForm ref="formRef" :model="formData" :rules="rules" label-width="80px">
<ElFormItem label="用户名" prop="username" v-if="dialogType === 'add'">
<ElInput v-model="formData.username" placeholder="请输入用户名" />
</ElFormItem>
<ElFormItem label="用户名" v-else>
<ElInput v-model="formData.username" disabled />
</ElFormItem>
<ElFormItem label="密码" prop="password" v-if="dialogType === 'add'">
<ElInput v-model="formData.password" type="password" placeholder="请输入密码默认123456" />
</ElFormItem>
<ElFormItem label="手机号" prop="phone">
<ElInput v-model="formData.phone" placeholder="请输入手机号" />
</ElFormItem>
<ElFormItem label="性别" prop="gender">
<ElSelect v-model="formData.gender">
<ElOption label="男" value="1" />
<ElOption label="女" value="2" />
</ElSelect>
</ElFormItem>
<ElFormItem label="角色" prop="role">
<ElSelect v-model="formData.role" multiple>
<ElOption
v-for="role in roleList"
:key="role.roleCode"
:value="role.roleCode"
:label="role.roleName"
/>
</ElSelect>
</ElFormItem>
</ElForm>
<template #footer>
<div class="dialog-footer">
<ElButton @click="dialogVisible = false">取消</ElButton>
<ElButton type="primary" @click="handleSubmit" :loading="loading">提交</ElButton>
</div>
</template>
</ElDialog>
</template>
<script setup lang="ts">
import { fetchCreateUser, fetchUpdateUser } from '@/api/system-manage'
import type { FormInstance, FormRules } from 'element-plus'
interface Props {
visible: boolean
type: string
userData?: Partial<Api.SystemManage.UserListItem>
}
interface Emits {
(e: 'update:visible', value: boolean): void
(e: 'submit'): void
}
const props = defineProps<Props>()
const emit = defineEmits<Emits>()
// 角色列表数据
const roleList = ref([
{ roleCode: 'R_SUPER', roleName: '超级管理员' },
{ roleCode: 'R_ADMIN', roleName: '管理员' },
{ roleCode: 'R_USER', roleName: '普通用户' }
])
// 加载状态
const loading = ref(false)
// 对话框显示控制
const dialogVisible = computed({
get: () => props.visible,
set: (value) => emit('update:visible', value)
})
const dialogType = computed(() => props.type)
// 表单实例
const formRef = ref<FormInstance>()
// 表单数据
const formData = reactive({
username: '',
password: '',
phone: '',
gender: '1',
role: [] as string[]
})
// 表单验证规则
const rules: FormRules = {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
],
phone: [
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
],
gender: [{ required: true, message: '请选择性别', trigger: 'blur' }],
role: [{ required: true, message: '请选择角色', trigger: 'blur' }]
}
/**
* 初始化表单数据
* 根据对话框类型(新增/编辑)填充表单
*/
const initFormData = () => {
const isEdit = props.type === 'edit' && props.userData
const row = props.userData
Object.assign(formData, {
username: isEdit && row ? row.userName || '' : '',
password: '',
phone: isEdit && row ? row.userPhone || '' : '',
gender: isEdit && row ? row.userGender || '1' : '1',
role: isEdit && row ? (Array.isArray(row.userRoles) ? row.userRoles : []) : []
})
}
/**
* 监听对话框状态变化
* 当对话框打开时初始化表单数据并清除验证状态
*/
watch(
() => [props.visible, props.type, props.userData],
([visible]) => {
if (visible) {
initFormData()
nextTick(() => {
formRef.value?.clearValidate()
})
}
},
{ immediate: true }
)
/**
* 提交表单
* 验证通过后调用 API
*/
const handleSubmit = async () => {
if (!formRef.value) return
await formRef.value.validate(async (valid) => {
if (valid) {
loading.value = true
try {
if (dialogType.value === 'add') {
await fetchCreateUser({
userName: formData.username,
password: formData.password || '123456',
phone: formData.phone,
gender: formData.gender,
roles: formData.role
})
} else {
const userId = props.userData?.id
if (userId) {
await fetchUpdateUser(userId, {
phone: formData.phone,
gender: formData.gender,
roles: formData.role
})
}
}
dialogVisible.value = false
emit('submit')
} catch (error) {
console.error('提交失败:', error)
} finally {
loading.value = false
}
}
})
}
</script>