<template> <div v-loading="loading" class="box"> <div style="margin-bottom: 10px"> <el-button :disabled="currentMailIndex === 0" @click="handleChangeEail('10')" >上一封</el-button > <el-button :disabled="currentMailIndex === allLength - 1" @click="handleChangeEail('20')" >下一封</el-button > <el-button type="primary" @click="handleReply('10')">回复</el-button> <el-button type="primary" @click="handleReply('30')">全部回复</el-button> <el-button type="warning" @click="handleReply('20')">转发</el-button> <el-button @click="handleReply('40')">再次编辑</el-button> <el-button @click="handleMove">移动</el-button> <el-button @click="handleRemove">删除</el-button> </div> <div class="top"> <div class="top-row"> <div class="label">发 件 人:</div> <div class="value"> <span v-for="item in replyTo" :key="item.id" style="margin-right: 10px" > {{ item.email || item.personalName }}</span > </div> </div> <div class="top-row"> <div class="label">收 件 人:</div> <div class="value"> <span v-for="item in to" :key="item.id" style="margin-right: 10px">{{ item.email || item.personalName }}</span> </div> </div> <div class="top-row" v-if="cc && cc.length > 0"> <div class="label">抄 送 人:</div> <div class="value"> <span v-for="item in cc" :key="item.id" style="margin-right: 10px"> {{ item.email || item.personalName }}</span > </div> </div> <div class="top-row" v-if="bcc && bcc.length > 0"> <div class="label">密 送 人:</div> <div class="value"> <span v-for="item in bcc" :key="item.id" style="margin-right: 10px"> {{ item.email || item.personalName }}</span > </div> </div> <div class="top-row"> <div class="label">时 间:</div> <div class="value"> {{ time }} </div> </div> <div class="top-row" v-if="fileList && fileList.length > 0"> <div class="label">附 件:</div> <div class="value"> <div v-for="(item, index) in fileList" style="margin-right: 20px; display: flex; align-items: center" :key="index" > <span style="cursor: pointer" @click="handleClickFile(item)">{{ item.name }}</span> <span style="margin-left: 8px; cursor: pointer" @click="handleClickDownload(item)" ><el-icon color="#0084FF"><Download /></el-icon ></span> </div> </div> </div> </div> <div class="body"> <iframe frameborder="0" allowTransparency="true" style=" width: 99% !important; overflow-x: scroll; padding-top: 10px; height: 500px; " :srcdoc="showBodyText(detailsData.data.content)" :ref="'iframeText_' + mailStore.currentId" :id="'iframeText_' + mailStore.currentId" > </iframe> </div> <el-dialog title="移动邮件" v-model="myFolderDialog" width="300px" destroy-on-close v-loading="submitLoading" > <byForm :formConfig="myFolderFormConfig" :formOption="formOption" v-model="formData.myFolderData" :rules="rules" ref="myFolderForm" > </byForm> <template #footer> <el-button @click="myFolderDialog = false" size="large" >取 消</el-button > <el-button type="primary" @click="submitMyFolderForm()" size="large" :loading="submitLoading" > 确 定 </el-button> </template> </el-dialog> </div> </template> <script setup> import useMailStore from "@/store/modules/mail"; import byForm from "@/components/byForm/index"; import { ElMessage, ElMessageBox } from "element-plus"; const { proxy } = getCurrentInstance(); const mailStore = useMailStore(); let loading = ref(false); const detailsData = reactive({ data: {}, }); const currentMailIndex = computed(() => mailStore.currentMailIndex); const allLength = computed(() => mailStore.mailDataList.length); const to = ref([]); const cc = ref([]); const bcc = ref([]); const replyTo = ref([]); const fileList = ref([]); const requestData = ref({}); const time = ref(""); // 移动文件夹 const formOption = reactive({ inline: true, labelWidth: 100, itemWidth: 100, }); const myFolderForm = ref(null); const myFolderTreeData = ref([]); const myFolderDialog = ref(false); const submitLoading = ref(false); const editType = ref("add"); const myFolderFormConfig = computed(() => [ { type: "treeSelect", prop: "myFolderId", label: "文件夹", disabled: false, itemWidth: 100, data: myFolderTreeData.value, style: { width: "100%", }, }, ]); const formData = reactive({ myFolderData: {}, }); const rules = ref({ myFolderId: [{ required: true, message: "请选择文件夹", trigger: "change" }], }); const getMyFolderTree = (flag) => { if (flag) { setTimeout(() => { proxy .post("/myFolder/tree", { mailboxId: mailStore.selectMail.id }) .then((res) => { myFolderTreeData.value = res.map((x) => ({ ...x, value: x.id })); }); }, 1000); } else { proxy .post("/myFolder/tree", { mailboxId: mailStore.selectMail.id }) .then((res) => { myFolderTreeData.value = res.map((x) => ({ ...x, value: x.id })); }); } }; const handleMove = () => { formData.myFolderData.messageId = mailStore.currentMenu.messageId; myFolderDialog.value = true; }; const handleRemove = () => { ElMessageBox.confirm(`此操作将删除该邮件, 是否继续?`, "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }).then(() => { // 删除 proxy .post("/mailService/deleteMail", { id: mailStore.currentMenu.messageId, type: mailStore.currentMenu.type, }) .then((res) => { ElMessage({ message: `操作成功!`, type: "success", }); }); }); }; const submitMyFolderForm = () => { myFolderForm.value.handleSubmit(() => { submitLoading.value = true; proxy.post("/myFolderMessage/add", formData.myFolderData).then( (res) => { ElMessage({ message: `操作成功!`, type: "success", }); myFolderDialog.value = false; submitLoading.value = false; getMyFolderTree(false); }, (err) => { submitLoading.value = false; } ); }); }; const getMailTag = () => { // proxy // .post("/myTagMessage/getListByMessageId", { // id: mailStore.currentMenu.messageId, // }) // .then((res) => { // console.log(res, "ada"); // }); }; const getDetails = (messageId) => { loading.value = true; proxy .post("/mailService/getMessageDetail", { type: mailStore.currentMenu.type, messageId, }) .then((res) => { if (mailStore.currentMenu.time) { time.value = mailStore.currentMenu.time; } detailsData.data = res; to.value = res.messageAddressList.filter((x) => x.type === 1); cc.value = res.messageAddressList.filter((x) => x.type === 2); bcc.value = res.messageAddressList.filter((x) => x.type === 3); replyTo.value = res.messageAddressList.filter((x) => x.type === 4); fileList.value = res.messageAttachmentList; loading.value = false; }); }; const showBodyText = (text) => { if (text) { let val = JSON.parse(JSON.stringify(text)); val = val.replace("body {", "tbody {"); val = val.replace( "td, p, li, th {", "tbody td, tbody p, tbody li, tbody th {" ); val = val.replace( /<p>/g, '<p style="margin-block-start: 0; margin-block-end: 0;">' ); return val; } else { return text; } }; const init = () => { //实时更换索引 if (mailStore.currentMenu.messageId) { mailStore.currentMailIndex = mailStore.mailDataList.findIndex( (x) => x.id === mailStore.currentMenu.messageId ); } getDetails(mailStore.currentMenu.messageId); }; onMounted(() => { // init(); }); const handleReply = (pageType) => { // pageType 10为回复 20为转发 30为全部回复 40为再次编辑 0为写信 let title = ""; if (pageType === "10") { title = "回复"; } else if (pageType === "20") { title = "转发"; } else if (pageType === "30") { title = "全部回复"; } else if (pageType === "40") { title = "再次编辑"; } const menu = { title: title, type: mailStore.currentMenu.type, id: "write", pageType: pageType, details: { ...detailsData.data, ...mailStore.currentMenu.row, }, }; const index = mailStore.mailMenuList.findIndex((x) => x.id === menu.id); if (index >= 0) { mailStore.mailMenuList[index] = menu; } else { mailStore.mailMenuList.push(menu); } mailStore.currentMenu = menu; mailStore.currentId = menu.id; }; const handleChangeEail = (type) => { if (type === "10") { mailStore.currentMailIndex = currentMailIndex.value - 1; } else if (type === "20") { mailStore.currentMailIndex = currentMailIndex.value + 1; } // 拿到更变索引之后的行数据 const row = mailStore.mailDataList[mailStore.currentMailIndex]; // 查当前菜单的数据 const arr = mailStore.currentMenu.id.split(","); if (arr.length > 1) { const index = mailStore.mailMenuList.findIndex( (x) => x.messageId === arr[1] ); const menu = { title: row.subject.slice(0, 4) + "...", type: mailStore.selectMail.type, messageId: row.id, id: "detail" + "," + row.id, time: row.sendDate, row: { ...row }, }; const menuItem = mailStore.mailMenuList.find((x) => x.id === menu.id); if (menuItem === undefined) { mailStore.mailMenuList[index] = menu; } mailStore.currentMenu = menu; mailStore.currentId = menu.id; } }; const handleClickFile = (file) => { const path = file.path ? file.path : file.url ? file.url : ""; if (path) { window.open(path, "_blank"); } }; const handleClickDownload = (file) => { let xhr = new XMLHttpRequest(); //域名是华为云的 xhr.open("GET", `${file.url}`, true); xhr.responseType = "blob"; xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { let url = window.URL.createObjectURL(xhr.response); const a = document.createElement("a"); a.href = url; a.download = file.name; // 下载后文件名 a.style.display = "none"; document.body.appendChild(a); a.click(); // 点击下载 window.URL.revokeObjectURL(a.href); document.body.removeChild(a); // 下载完成移除元素 } }; }; getMyFolderTree(true); getMailTag(); defineExpose({ initFn: init, }); </script> <style lang="scss" scoped> .box { padding: 0 10px; font-size: 12px; .top { padding: 10px; background: #f1f1f1; .top-row { display: flex; margin-bottom: 10px; .label { min-width: 60px; color: #999999; text-align: right; } .value { flex: 1; color: #333333; font-weight: 700; margin-right: 10px; display: flex; } } } } </style>