You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

422 lines
10 KiB
Vue

<script setup lang="ts">
import { onMounted, reactive, ref, watch } from "vue";
import { FormInstance, FormRules, UploadProps } from "element-plus";
import { getRoleManageList, getUserList } from "@/api/business";
import {
getDeptManageList,
saveUserInfo,
updateUserInfo,
downloadFile
} from "@/api/system";
import { message } from "@/utils/message";
import { Plus } from "@element-plus/icons-vue";
defineOptions({
name: "CreateForm"
});
const props = defineProps({
createFlag: {
type: Boolean,
default: false
},
updateFrom: {
type: Object,
default: () => {
return {};
}
},
accountFromType: {
type: String,
default: ""
},
closeDrawer: {
type: Function
}
});
const modalVisible = ref(false);
console.log(props.accountFromType);
// 监听 props.message 的变化,并更新 modalVisible
watch(
() => props.createFlag,
newValue => {
modalVisible.value = newValue; // 更新 modalVisible
if (newValue) {
if (
props.accountFromType === "edit" ||
props.accountFromType === "view"
) {
getFlowDetails(props.updateFrom);
}
}
}
);
watch(
() => props.accountFromType,
newValue => {
console.log(newValue, "newValue");
}
);
const ruleAccountFormRef = ref<FormInstance>();
const accountForm = reactive({
id: "",
headPicId: "",
account: "",
username: "",
deptId: "",
roleIds: [],
remark: ""
});
const deptList = ref([]);
const roleNameList = ref([]);
const userNameList = ref([]);
const rules = reactive<FormRules>({
headPicId: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
account: [{ required: true, message: "请输入", trigger: "blur" }],
username: [{ required: true, message: "请输入", trigger: "blur" }],
deptId: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
roleIds: [
{
required: true,
message: "请选择",
trigger: "change"
}
],
remark: [{ required: true, message: "请输入", trigger: "blur" }]
});
const imageUrl = ref("");
const handleAvatarSuccess: UploadProps["onSuccess"] = (
response,
uploadFile
) => {
console.log(response, "response");
accountForm.headPicId = response.data;
imageUrl.value = URL.createObjectURL(uploadFile.raw!);
};
const beforeAvatarUpload: UploadProps["beforeUpload"] = rawFile => {
console.log(rawFile);
// if (rawFile.type !== "image/jpeg") {
// // ElMessage.error("Avatar picture must be JPG format!");
// return false;
// } else if (rawFile.size / 1024 / 1024 > 2) {
// // ElMessage.error("Avatar picture size can not exceed 2MB!");
// return false;
// }
return true;
};
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
console.log(accountForm);
// // console.log("submit!");
// const createForm = {
// id: "",
// flowName: accountForm.flowName,
// remark: accountForm.remark,
// flowType: accountForm.flowType,
// roleIds: accountForm.roleIds,
// };
if (props.accountFromType === "edit") {
updateUserInfo(accountForm).then(res => {
if (res.code === 200) {
message("修改成功", { type: "success" });
props.closeDrawer();
}
});
} else {
saveUserInfo(accountForm).then(res => {
if (res.code === 200) {
message("新建成功", { type: "success" });
props.closeDrawer();
}
});
}
} else {
console.log("error submit!", fields);
}
});
};
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return;
// formEl.resetFields();
accountForm.id = "";
accountForm.headPicId = "";
accountForm.account = "";
accountForm.username = "";
accountForm.deptId = "";
accountForm.roleIds = [];
accountForm.remark = "";
};
const handleDrawerClosed = () => {
accountForm.id = "";
accountForm.headPicId = "";
accountForm.account = "";
accountForm.username = "";
accountForm.deptId = "";
accountForm.roleIds = [];
accountForm.remark = "";
props.closeDrawer();
};
const getDeptManageLists = async () => {
const res: any = await getDeptManageList({
baseName: "",
deptCode: "",
pageNum: 1,
pageSize: 20
});
console.log(res);
if (res.code == 200) {
deptList.value = res.data.records;
}
};
const getRoleManageLists = async () => {
const res: any = await getRoleManageList({
roleName: "",
pageNum: "1",
pageSize: "10"
});
// console.log(res);
if (res.code == 200) {
roleNameList.value = res.data.records;
}
};
const getUserLists = async () => {
const res: any = await getUserList({
userName: "",
deptId: "",
roleId: "",
pageNum: "1",
pageSize: "10"
});
// console.log(res);
if (res.code == 200) {
userNameList.value = res.data.records;
}
};
const getFlowDetails = (value: any) => {
accountForm.id = props.accountFromType === "edit" ? value.id : "";
accountForm.headPicId = value.headPicId;
accountForm.account = value.account;
accountForm.username = value.username;
accountForm.deptId = value.deptId;
accountForm.roleIds = value.userRoleList?.map(item => {
return item.roleId;
});
accountForm.remark = value.remark;
};
const drawerName = (type: any) => {
if (type === "edit") {
return "编辑账号";
} else if (type === "view") {
return "查看账号";
} else {
return "新建账号";
}
};
onMounted(() => {
getDeptManageLists();
getRoleManageLists();
getUserLists();
});
</script>
<template>
<div>
<el-drawer
v-model="modalVisible"
modal-class="drawer_content"
:with-header="false"
@closed="handleDrawerClosed"
>
<div class="drawer_header">
<span>{{ drawerName(props.accountFromType) }}</span>
</div>
<div class="drawer_box">
<el-form
:model="accountForm"
:rules="rules"
ref="ruleAccountFormRef"
label-width="auto"
>
<el-form-item label="头像" prop="headPicId">
<el-upload
class="avatar-uploader"
action="/know-sub/file/upload"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<!-- <img
v-if="accountForm.headPicId"
:src="imageUrl"
class="avatar"
/> -->
<img
v-if="accountForm.headPicId"
:src="
props.accountFromType === 'edit'
? downloadFile(accountForm.headPicId)
: imageUrl
"
class="avatar"
/>
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
<el-form-item label="用户名" prop="account">
<el-input
v-model="accountForm.account"
autocomplete="off"
placeholder="请输入"
/>
</el-form-item>
<el-form-item label="姓名" prop="username">
<el-input
v-model="accountForm.username"
autocomplete="off"
placeholder="请输入"
/>
</el-form-item>
<el-form-item label="所属部门" prop="deptId">
<el-select
v-model="accountForm.deptId"
clearable
placeholder="请选择"
class="w-full"
>
<el-option
v-for="item in deptList"
:key="item.id"
:label="item.deptName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="角色" prop="roleIds">
<el-select
v-model="accountForm.roleIds"
multiple
clearable
collapse-tags
placeholder="请选择"
popper-class="custom-header"
:max-collapse-tags="3"
class="w-full"
>
<el-option
v-for="item in roleNameList"
:key="item.id"
:label="item.roleName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="accountForm.remark"
type="textarea"
placeholder="请输入"
/>
</el-form-item>
</el-form>
<div class="drawer_footer" v-if="props.accountFromType !== 'view'">
<el-button plain @click="resetForm(ruleAccountFormRef)"
>重置</el-button
>
<el-button type="primary" @click="submitForm(ruleAccountFormRef)"
>确定</el-button
>
</div>
</div>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
:deep(.el-drawer__body) {
padding: 0 !important;
}
.drawer_content {
.drawer_header {
box-sizing: border-box;
height: 96px;
padding: 24px;
line-height: 65px;
border-bottom: 1px solid #e9e9e9;
span {
padding-left: 8px;
font-size: 20px;
border-left: 6px solid #0052d9;
}
}
.drawer_box {
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: space-between;
height: calc(100vh - 96px);
padding: 24px;
.drawer_footer {
display: flex;
justify-content: flex-end;
}
}
.avatar-uploader {
display: block;
width: 100px;
height: 100px;
border: 1px solid #d9d9d9;
border-radius: 6px;
}
.avatar-uploader .avatar {
width: 100px;
height: 100px;
// display: block;
// border: 1px solid #d9d9d9;
}
.avatar-uploader .el-upload {
position: relative;
overflow: hidden;
cursor: pointer;
border-radius: 6px;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
width: 100px;
height: 100px;
font-size: 28px;
color: #8c939d;
text-align: center;
}
}
</style>