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.

530 lines
15 KiB
Vue

<script setup lang="ts">
import { ElMessage, UploadProps } from "element-plus";
import { computed, onMounted, reactive, ref } from "vue";
import { Plus } from "@element-plus/icons-vue";
import WangEditor from "@/components/WangEditor/index.vue";
import { useKnowledgeCentreStoreHooks } from "@/store/modules/knowledgeCentre";
import { message } from "@/utils/message";
import { getUserInfo } from "@/utils/auth";
const ruleFormRef = ref();
const formData = reactive({
operate: "",
linkList: [
{
linkName: "",
linkUrl: ""
}
],
baseId: "",
execTime: undefined,
fileIdList: [],
excerpt: "",
publishDeptId: "",
knowledgeInfo: {
timeliness: undefined,
execTimeBegin: "",
execTimeEnd: "",
autoLoseEffect: undefined,
territory: "",
knowledgeTag: "",
policyType: "",
publishScope: "",
publishDate: undefined
},
fileList: []
});
let userInfo = reactive({
username: "",
deptName: ""
});
defineExpose({
getDetails(data) {
refWangEditor.value.initText(data.knowledgeContext.context);
refWangEditor.value.initTitle(data.knowledge.title);
const fileIdList = [];
const fileList = [];
data.fileInfoList.forEach(e => {
fileIdList.push(e.fileBlobId);
fileList.push({
name: e.fileName
});
});
const { baseId, excerpt, publishDeptId } = data.knowledge;
const obj = {
operate: "",
linkList: data.knowledgeLinkList,
baseId,
execTime: [
data.knowledgeInfo.execTimeBegin,
data.knowledgeInfo.execTimeEnd
],
fileIdList,
excerpt,
publishDeptId,
knowledgeInfo: data.knowledgeInfo,
fileList
};
for (const key in obj) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = obj[key];
}
}
console.log(formData);
}
});
const departmentList = computed(() => {
return useKnowledgeCentreStoreHooks().departmentList;
});
const applicationSubLibrary = computed(() => {
return useKnowledgeCentreStoreHooks().applicationSubLibrary;
});
const refWangEditor = ref();
const rules = {
publishDeptId: [{ required: true, message: "请选择", trigger: "change" }],
baseId: [{ required: true, message: "请选择", trigger: "change" }],
"knowledgeInfo.publishDate": [
{ required: true, message: "请选择", trigger: "change" }
],
"knowledgeInfo.timeliness": [
{ required: true, message: "请选择", trigger: "change" }
]
};
const handleSuccess: UploadProps["onSuccess"] = response => {
if (response.code === 200) {
formData.fileIdList.push(response.data);
}
};
const handleRemove: UploadProps["onRemove"] = (file, uploadFiles) => {
console.log(file, uploadFiles);
const list = [];
for (const item of uploadFiles) {
list.push(item.response.data);
}
formData.fileIdList = list;
};
const beforeUpload: UploadProps["beforeUpload"] = async rawFile => {
//上传图片格式和大小要求 png|jpg 10M
const type = rawFile.name.split(".")[rawFile.name.split(".").length - 1];
if (rawFile.size / 1024 / 1024 > 10) {
ElMessage.error("大小不能大于10M");
return false;
}
// fileInfo.fileName = rawFile.name;
return true;
};
const addUrl = () => {
formData.linkList.push({
linkName: "",
linkUrl: ""
});
};
const delUrl = index => {
formData.linkList.splice(index, 1);
};
const emit = defineEmits(["save"]);
const save = async (type, formEl) => {
if (!refWangEditor.value.title || !refWangEditor.value.valueHtml) {
message("请填写标题和正文", { type: "error" });
return;
}
const { excerpt, fileIdList, linkList, publishDeptId, execTime, baseId } =
formData;
if (execTime && execTime.length > 0) {
formData.knowledgeInfo.execTimeBegin = execTime[0];
formData.knowledgeInfo.execTimeEnd = execTime[1];
}
const params = {
operate: type,
title: refWangEditor.value.title,
content: refWangEditor.value.valueHtml,
excerpt,
fileIdList,
linkList,
publishDeptId,
baseId,
knowledgeInfo: formData.knowledgeInfo
};
if (type === 2) {
formEl.validate(async (valid, fields) => {
if (valid) {
emit("save", params);
} else {
return fields;
}
});
} else {
emit("save", params);
}
};
const changeType = val => {
if (val === 1) {
formData.execTime = [];
}
};
const reset = () => {
ruleFormRef.value.resetFields();
formData.linkList = [
{
linkName: "",
linkUrl: ""
}
];
refWangEditor.value.initText("");
refWangEditor.value.initTitle("");
};
onMounted(() => {
const obj: any = getUserInfo();
userInfo = JSON.parse(obj);
});
</script>
<template>
<div class="template-submission">
<el-scrollbar class="main-content" :show-scrollbar="false">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="100px"
>
<div class="main-card">
<div class="main-card-title">
<span>报送知识</span>
</div>
<el-row>
<el-form-item class="ml-2" label="报送人姓名" prop="username">
<el-input
disabled
v-model="userInfo.username"
placeholder="请输入"
/>
</el-form-item>
<el-form-item class="ml-8" label="报送人部门" prop="deptName">
<el-input
disabled
v-model="userInfo.deptName"
placeholder="请输入"
/>
</el-form-item>
</el-row>
</div>
<div class="Editortext">
<WangEditor ref="refWangEditor" />
</div>
<div class="main-card">
<el-row>
<el-col :span="24">
<el-form-item label="摘要" prop="excerpt">
<el-input
size="large"
v-model="formData.excerpt"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="相关附件" prop="fileList">
<el-upload
:file-list="formData.fileList"
:limit="5"
multiple
action="/know-sub/file/upload"
:on-success="handleSuccess"
:on-remove="handleRemove"
:before-upload="beforeUpload"
>
<div class="upload-btn">
<el-icon><Plus class="upload-btn-icon" /></el-icon>
<span>上传素材</span>
</div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="相关链接">
<div
class="url_list"
v-for="(item, index) in formData.linkList"
:key="index"
>
<el-row class="url_list_item">
<el-input
size="large"
style="width: 500px"
v-model="formData.linkList[index].linkName"
placeholder="请输入链接标题"
/>
<el-input
style="width: 600px; margin-left: 16px"
size="large"
v-model="formData.linkList[index].linkUrl"
placeholder="请输入链接"
><template #append>URL</template></el-input
>
<div v-if="index === 0" class="add_url" @click="addUrl">
<el-icon><Plus class="upload-btn-icon" /></el-icon>
<span>添加链接</span>
</div>
<div v-else @click="delUrl(index)" class="del_url">
<span>删除</span>
</div>
</el-row>
</div>
</el-form-item>
</div>
<div class="main-card">
<el-row>
<el-col :span="24">
<el-form-item label="发文部门" prop="publishDeptId">
<el-select
size="large"
filterable
v-model="formData.publishDeptId"
placeholder="请选择"
>
<el-option
v-for="item in departmentList"
:key="item.id"
:label="item.deptName"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="应用子库" prop="baseId">
<el-select
size="large"
filterable
v-model="formData.baseId"
placeholder="请选择"
>
<el-option
v-for="item in applicationSubLibrary"
:key="item.id"
:label="item.baseName"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="发布日期" prop="knowledgeInfo.publishDate">
<el-date-picker
v-model="formData.knowledgeInfo.publishDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择"
size="large"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="有效日期" prop="knowledgeInfo.timeliness">
<el-radio-group
@change="changeType"
v-model="formData.knowledgeInfo.timeliness"
class="ml-4"
>
<el-radio :label="1" size="large">长期有效</el-radio>
<el-radio :label="2" size="large">临时有效</el-radio>
</el-radio-group>
<el-date-picker
v-if="formData.knowledgeInfo.timeliness === 2"
class="ml-4"
v-model="formData.execTime"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="至"
start-placeholder="有效开始时间"
end-placeholder="有效结束时间"
size="large"
/>
<!-- <el-checkbox
class="ml-4"
:true-label="1"
:false-label="0"
v-model="formData.knowledgeInfo.autoLoseEffect"
label="到期自动失效"
size="large"
/> -->
</el-form-item>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="所属地域" prop="knowledgeInfo.territory">
<el-input
size="large"
v-model="formData.knowledgeInfo.territory"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="知识标签" prop="knowledgeInfo.knowledgeTag">
<el-input
size="large"
v-model="formData.knowledgeInfo.knowledgeTag"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="政策类型" prop="knowledgeInfo.policyType">
<el-input
size="large"
v-model="formData.knowledgeInfo.policyType"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="公开范围" prop="knowledgeInfo.publishScope">
<el-radio-group
v-model="formData.knowledgeInfo.publishScope"
class="ml-4"
>
<el-radio :label="0" size="large">公开</el-radio>
<el-radio :label="1" size="large">不公开</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</el-scrollbar>
<div class="footer-content">
<el-button
@click="save(2, ruleFormRef)"
size="large"
style="width: 150px; height: 50px"
type="primary"
>发布</el-button
>
<div class="normal_btn" @click="save(1, ruleFormRef)">存草稿</div>
<span class="reset_btn" @click="reset"></span>
</div>
</div>
</template>
<style lang="scss" scoped>
.template-submission {
margin: 0 80px;
.main-content {
height: calc(100vh - 280px);
overflow: auto;
.main-card {
width: 100%;
background: #ffffff;
border-radius: 6px 6px 6px 6px;
margin-bottom: 16px;
padding: 24px;
.main-card-title {
margin-bottom: 24px;
span {
font-size: 24px;
color: #333333;
padding-left: 8px;
border-left: 6px solid #0052d9;
}
}
.upload-btn {
width: 140px;
height: 50px;
background: #ffffff;
border-radius: 6px 6px 6px 6px;
border: 1px solid #0052d9;
font-size: 16px;
color: #0052d9;
display: flex;
align-items: center;
justify-content: center;
.upload-btn-icon {
color: #0052d9;
}
}
}
}
.url_list {
.url_list_item {
display: flex;
margin-bottom: 32px;
.add_url {
display: flex;
align-items: center;
justify-content: center;
margin-left: 16px;
font-size: 16px;
color: #0052d9;
cursor: pointer;
}
.del_url {
display: flex;
align-items: center;
justify-content: center;
margin-left: 16px;
font-size: 16px;
color: #999999;
cursor: pointer;
}
}
}
.footer-content {
width: 100%;
height: 99px;
box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.1);
background: #ffffff;
border-radius: 6px 6px 6px 6px;
display: flex;
align-items: center;
flex-direction: row-reverse;
padding: 24px;
margin-top: 16px;
.normal_btn {
width: 150px;
height: 50px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #0052d9;
line-height: 50px;
text-align: center;
font-size: 16px;
color: #0052d9;
margin-right: 40px;
cursor: pointer;
}
.reset_btn {
margin-right: 40px;
font-size: 16px;
color: #999999;
cursor: pointer;
}
}
.Editortext {
background: #ffffff;
border-radius: 6px 6px 6px 6px;
margin-bottom: 16px;
}
}
</style>