Files
admin-ui/src/views/system/user/component/editUser.vue

299 lines
9.8 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>
<div class="system-edit-user-container">
<el-dialog :title="(ruleForm.userId !== 0 ? '修改' : '添加') + '用户'" v-model="isShowDialog" width="769px">
<el-form ref="formRef" :model="ruleForm" :rules="rules" size="default" label-width="90px">
<el-row :gutter="35">
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="ruleForm.userId === 0">
<el-form-item label="用户名" prop="userName">
<el-input v-model="ruleForm.userName" placeholder="请输入账户名称" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-if="ruleForm.userId === 0">
<el-form-item label="账户密码" prop="password">
<el-input v-model="ruleForm.password" placeholder="请输入" type="password" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="ruleForm.nickName" placeholder="请输入用户昵称" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="关联角色" prop="roleIds">
<el-select v-model="ruleForm.roleIds" placeholder="请选择" clearable class="w100" multiple>
<el-option v-for="role in roleList" :key="'role-' + role.id" :label="role.name" :value="role.id"> </el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="部门" prop="deptId">
<el-cascader
:options="deptData"
:props="{ checkStrictly: true, emitPath: false, value: 'deptId', label: 'deptName' }"
placeholder="请选择部门"
clearable
class="w100"
v-model="ruleForm.deptId"
>
<template #default="{ node, data }">
<span>{{ data.deptName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="手机号" prop="mobile">
<el-input v-model="ruleForm.mobile" placeholder="请输入手机号" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="邮箱" prop="email">
<el-input v-model="ruleForm.email" placeholder="请输入" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="性别" prop="sex">
<el-select v-model="ruleForm.sex" placeholder="请选择" clearable class="w100">
<el-option v-for="gender in genderData" :key="'gender-' + gender.value" :label="gender.label" :value="gender.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<!-- 新增租户 -->
<!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="租户" prop="tenantId">
<el-select v-model="ruleForm.tenantId" placeholder="请选择租户" clearable class="w100" :disabled="ruleForm.userId !== 0">
<el-option v-for="tenant in tenantList" :key="'tenant-' + tenant.id" :label="tenant.name" :value="tenant.id"></el-option>
</el-select>
</el-form-item>
</el-col> -->
<!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="岗位" prop="postIds">
<el-select v-model="ruleForm.postIds" placeholder="请选择" clearable class="w100" multiple>
<el-option v-for="post in postList" :key="'post-' + post.postId" :label="post.postName" :value="post.postId"> </el-option>
</el-select>
</el-form-item>
</el-col> -->
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="用户状态">
<el-switch
v-model="ruleForm.status"
inline-prompt
:active-value="1"
:inactive-value="0"
active-text=""
inactive-text=""
></el-switch>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="用户类型">
<el-radio-group v-model="ruleForm.isAdmin">
<el-radio :label="1">后台管理员</el-radio>
<el-radio :label="0">前台用户</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="用户描述">
<el-input v-model="ruleForm.remark" type="textarea" placeholder="请输入用户描述" maxlength="150"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="onCancel" size="default"> </el-button>
<el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.userId !== 0 ? '修 改' : '添 加' }}</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script lang="ts">
import { reactive, toRefs, onMounted, defineComponent, ref, unref } from 'vue';
import { getParams, addUser, editUser, getEditUser } from '/@/api/system/user';
import { ElMessage } from 'element-plus';
export default defineComponent({
name: 'systemEditUser',
props: {
deptData: {
type: Array as () => any[],
default: () => [],
},
genderData: {
type: Array as () => any[],
default: () => [],
},
},
setup(prop, { emit }) {
const roleList = ref<any[]>([]);
const postList = ref<any[]>([]);
const tenantList = ref<any[]>([]); // 新增租户列表
const formRef = ref<HTMLElement | null>(null);
const state = reactive({
isShowDialog: false,
ruleForm: {
userId: 0,
deptId: 0,
userName: '',
nickName: '',
password: '',
mobile: '',
email: '',
sex: '',
status: 1,
remark: '',
postIds: [],
roleIds: [],
isAdmin: 0,
tenantId: '', // 新增租户ID字段
},
//表单校验
rules: {
userName: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }],
nickName: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '归属部门不能为空', trigger: 'blur' }],
password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }],
tenantId: [{ required: true, message: '请选择租户', trigger: 'change' }], // 新增租户校验
email: [
{
type: 'email',
message: "'请输入正确的邮箱地址",
trigger: ['blur', 'change'],
},
],
mobile: [
{ required: true, message: '手机号码不能为空', trigger: 'blur' },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: '请输入正确的手机号码',
trigger: 'blur',
},
],
},
});
// 打开弹窗
const openDialog = (row?: any) => {
resetForm();
if (row) {
getEditUser(row.id).then((res: any) => {
const user = res.data.user;
state.ruleForm = {
userId: user.id,
deptId: user.deptId,
userName: user.userName,
nickName: user.userNickname,
password: '-',
mobile: user.mobile,
email: user.userEmail,
sex: String(user.sex),
status: user.userStatus,
remark: user.remark,
postIds: res.data.checkedPosts ?? [],
roleIds: res.data.checkedRoleIds ?? [],
isAdmin: user.isAdmin,
tenantId: user.tenantId || '', // 设置租户ID
};
});
}
state.isShowDialog = true;
};
// 关闭弹窗
const closeDialog = () => {
state.isShowDialog = false;
};
// 取消
const onCancel = () => {
closeDialog();
};
// 新增
const onSubmit = () => {
const formWrap = unref(formRef) as any;
if (!formWrap) return;
formWrap.validate((valid: boolean) => {
if (valid) {
if (state.ruleForm.userId === 0) {
// 新增用户 - 包含租户信息
addUser(state.ruleForm)
.then(() => {
ElMessage.success('用户添加成功');
closeDialog(); // 关闭弹窗
emit('getUserList');
})
.catch((error) => {
ElMessage.error('用户添加失败:' + (error.message || '未知错误'));
});
} else {
// 修改用户 - 根据需求决定是否包含租户信息
const editData = { ...state.ruleForm };
// 如果修改时不允许修改租户可以删除tenantId字段
// delete editData.tenantId;
editUser(editData)
.then(() => {
ElMessage.success('用户修改成功');
closeDialog(); // 关闭弹窗
emit('getUserList');
})
.catch((error) => {
ElMessage.error('用户修改失败:' + (error.message || '未知错误'));
});
}
}
});
};
// 初始化部门数据
const initTableData = () => {
//获取角色岗位选项
getParams()
.then((res: any) => {
roleList.value = res.data.roleList ?? [];
postList.value = res.data.posts ?? [];
tenantList.value = res.data.tenantList ?? []; // 获取租户列表
})
.catch((error) => {
console.error('获取参数失败:', error);
ElMessage.error('获取初始化数据失败');
});
};
// 页面加载时
onMounted(() => {
initTableData();
});
const resetForm = () => {
state.ruleForm = {
userId: 0,
deptId: 0,
userName: '',
nickName: '',
password: '',
mobile: '',
email: '',
sex: '',
status: 1,
remark: '',
postIds: [],
roleIds: [],
isAdmin: 0,
tenantId: '', // 重置租户ID
};
};
return {
openDialog,
closeDialog,
onCancel,
onSubmit,
roleList,
postList,
tenantList, // 返回租户列表
formRef,
...toRefs(state),
};
},
});
</script>