1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216 |
- <template>
- <div class="left">
- <div class="top">
- <el-dropdown>
- <span class="mail">
- <el-badge
- :value="selectMail.allUnreadMessageCount"
- :max="99"
- class="item"
- >
- {{ selectMail.mailUser }}
- <el-icon class="el-icon--right" style="margin-right: 15px">
- <arrow-down />
- </el-icon>
- </el-badge>
- </span>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item
- v-for="item in mailList"
- :key="item.id"
- @click="handleClickMail(item)"
- >{{ item.mailUser }}</el-dropdown-item
- >
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- <el-tabs v-model="activeName" class="demo-tabs" stretch>
- <el-tab-pane label="邮箱" name="first">
- <template #label>
- <div>
- <i
- class="iconfont icon-iconm_dianzyx"
- style="margin-right: 5px"
- ></i>
- <span>邮箱</span>
- </div>
- </template>
- </el-tab-pane>
- <el-tab-pane label="联系人" name="second">
- <template #label>
- <div>
- <i
- class="iconfont icon-icomm_contact"
- style="margin-right: 5px"
- ></i>
- <span>联系人</span>
- </div>
- </template>
- </el-tab-pane>
- <el-tab-pane label="客户" name="third">
- <template #label>
- <div>
- <i class="iconfont icon-icon_kh" style="margin-right: 5px"></i>
- <span>客户</span>
- </div>
- </template>
- </el-tab-pane>
- </el-tabs>
- <div>
- <el-button
- type="primary"
- style="width: 100%; font-size: 12px"
- @click="handleGoWrite()"
- >写信</el-button
- >
- </div>
- </div>
- <div class="body">
- <div v-if="activeName === 'first'">
- <ul class="mail-menu">
- <li
- class="menu-item"
- v-bind:class="{ 'select-menu': item.id === selectFloderId }"
- v-for="item in selectMail.mailFolderInfoListCopy"
- :key="item.id"
- @click="handleOpenMenu(item, '10')"
- >
- <i
- class="iconfont icon-iconm_inbox leftIcon"
- v-if="item.sort === 1"
- ></i>
- <i
- class="iconfont icon-iconm_unread leftIcon"
- v-else-if="item.sort === 2"
- ></i>
- <i
- class="iconfont icon-icomm_draftbox leftIcon"
- v-else-if="item.sort === 3"
- ></i>
- <i
- class="iconfont icon-iconm_sent leftIcon"
- v-else-if="item.sort === 4"
- ></i>
- <i
- class="iconfont icon-icomm_delete leftIcon"
- v-else-if="item.sort === 5"
- ></i>
- <i
- class="iconfont icon-iconm_ljyx leftIcon"
- v-else-if="item.sort === 6"
- ></i>
- <span style="margin-left: 5px">{{ item.name }}</span>
- <div v-if="item.sort === 1" class="badge">
- <span> {{ item.unreadMessageCount }} </span>
- </div>
- </li>
- </ul>
- <!-- 员工邮箱 -->
- <div
- class="tree"
- v-if="staffMailData[0] && staffMailData[0].children.length > 0"
- >
- <el-tree
- :data="staffMailData"
- node-key="id"
- :expand-on-click-node="false"
- default-expand-all
- @node-click="(data, node) => handleTreeNodeNewClick(data, node)"
- v-loading="staffLoading"
- >
- <template #default="{ node, data }">
- <span class="tree-content">
- <i
- class="iconfont icon-icomm_ygyx iconColor"
- v-if="data.id == '0'"
- style="margin-right: 5px"
- ></i>
- <span
- >{{ data.name }}
- <span v-if="data.userId && data.children.length === 0">
- (点击获取员工邮箱)</span
- ></span
- >
- <div v-if="data.isMailUser" class="badge">
- <span> {{ data.allUnreadMessageCount }} </span>
- </div>
- </span>
- </template>
- </el-tree>
- </div>
- <!-- 官方文件夹 -->
- <div
- class="tree"
- v-if="selectMail.otherFolder && selectMail.otherFolder.length > 0"
- >
- <el-tree
- :data="selectMail.otherFolder"
- node-key="id"
- default-expand-all
- :expand-on-click-node="false"
- @node-click="(data) => handleTreeNodeClick(data, 'official')"
- >
- <template #default="{ node, data }">
- <span class="tree-content">
- <i
- class="iconfont icon-iconm_gfwjj iconColor"
- v-if="data.id == '0'"
- style="margin-right: 5px"
- ></i>
- <span>{{ data.name }}</span>
- </span>
- </template></el-tree
- >
- </div>
- <!-- 我的文件夹 -->
- <div
- class="tree"
- v-if="myFolderTreeData && myFolderTreeData.length > 0"
- >
- <el-tree
- :data="myFolderTreeData"
- node-key="id"
- default-expand-all
- :expand-on-click-node="false"
- @node-click="(data) => handleTreeNodeClick(data, 'folder')"
- >
- <template #default="{ node, data }">
- <span class="tree-content">
- <i
- class="iconfont icon-icomm_wdwjj iconColor"
- v-if="data.id == '0'"
- style="margin-right: 5px"
- ></i>
- <span>{{ data.label }}</span>
- <el-popover
- placement="bottom-start"
- title=""
- :width="200"
- trigger="click"
- >
- <div default style="display: flex">
- <el-button
- size="small"
- @click.stop="handleEditFolder(data, 'add')"
- >添加</el-button
- >
- <el-button
- size="small"
- v-if="data.id != '0'"
- @click.stop="handleEditFolder(data, 'edit')"
- >编辑</el-button
- >
- <el-button
- size="small"
- v-if="data.id != '0'"
- @click.stop="handleDelFolder(data)"
- >删除</el-button
- >
- </div>
- <template #reference>
- <span
- class="iconfont icon_more iconColor"
- style="padding-bottom: 5px; margin-left: auto"
- >...</span
- >
- </template>
- </el-popover>
- </span>
- </template>
- </el-tree>
- </div>
- <!-- 我的标签 -->
- <div class="tree" v-if="tagsTreeData && tagsTreeData.length > 0">
- <el-tree
- :data="tagsTreeData"
- node-key="id"
- default-expand-all
- :expand-on-click-node="false"
- @node-click="(data) => handleTreeNodeClick(data, 'tag')"
- >
- <template #default="{ node, data }">
- <span class="tree-content">
- <i
- class="iconfont icon-icomm_label iconColor"
- v-if="data.id == '0'"
- style="margin-right: 5px"
- ></i>
- <span>{{ data.name }}</span>
- <el-popover
- placement="bottom-start"
- title=""
- :width="150"
- trigger="click"
- >
- <div default style="display: flex">
- <el-button
- size="small"
- v-if="data.id == '0'"
- @click.stop="handleEditTag(data, 'add')"
- >添加</el-button
- >
- <el-button
- size="small"
- v-if="data.id != '0'"
- @click.stop="handleEditTag(data, 'edit')"
- >编辑</el-button
- >
- <el-button
- size="small"
- v-if="data.id != '0'"
- @click.stop="handleDelTag(data)"
- >删除</el-button
- >
- </div>
- <template #reference>
- <span
- class="iconfont icon_more iconColor"
- style="padding-bottom: 5px; margin-left: auto"
- >...</span
- >
- </template>
- </el-popover>
- </span>
- </template>
- </el-tree>
- </div>
- </div>
- <div v-if="activeName === 'second'">
- <div
- class="tree"
- v-if="contactsTreeData && contactsTreeData.length > 0"
- style="border-top: none; margin-top: 0px"
- >
- <el-tree
- :data="contactsTreeData"
- node-key="id"
- default-expand-all
- :expand-on-click-node="false"
- @node-click="
- (data, node) => handleCustomerTreeClick(data, node, 'contacts')
- "
- v-loading="contactsTreeLoading"
- >
- <template #default="{ node, data }">
- <span class="tree-content">
- <span>{{ data.name }}</span>
- <el-popover
- placement="bottom-start"
- title=""
- :width="150"
- trigger="click"
- v-if="data.parentId === '0'"
- >
- <div default style="display: flex">
- <el-button
- size="small"
- @click.stop="handleEditContacts(data)"
- >编辑</el-button
- >
- <el-button
- size="small"
- @click.stop="handleDelContacts(data)"
- >删除</el-button
- >
- </div>
- <template #reference>
- <span
- class="iconfont icon_more iconColor"
- style="padding-bottom: 5px; margin-left: auto"
- >...</span
- >
- </template>
- </el-popover>
- </span>
- </template>
- </el-tree>
- </div>
- <div style="padding: 0 10px; margin-top: 15px">
- <el-button
- type="primary"
- plain
- :icon="Plus"
- style="width: 100%; font-size: 12px"
- @click="handleAddContact"
- >添加联系人</el-button
- >
- </div>
- </div>
- <div v-if="activeName === 'third'">
- <div
- class="tree"
- v-if="customerList && customerList.length > 0"
- style="border-top: none; margin-top: 0px"
- >
- <el-tree
- :data="customerList"
- node-key="id"
- :expand-on-click-node="false"
- default-expand-all
- @node-click="
- (data, node) => handleCustomerTreeClick(data, node, 'customer')
- "
- v-loading="customerLoading"
- >
- <template #default="{ node, data }">
- <span class="tree-content">
- <span v-if="data.parentId === '0'"
- >{{ data.name }}
- <span
- v-if="data.parentId === '0' && data.children.length === 0"
- >
- (点击获取客户邮箱)</span
- ></span
- >
- <span v-else> {{ data.name }} {{ data.email }} </span>
- </span>
- </template>
- </el-tree>
- </div>
- </div>
- </div>
- <el-dialog
- :title="editType === 'add' ? '添加文件夹' : '编辑文件夹'"
- 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>
- <el-dialog
- :title="editType === 'add' ? '添加标签' : '编辑标签'"
- v-model="tagDialog"
- width="300px"
- destroy-on-close
- v-loading="submitLoading"
- >
- <byForm
- :formConfig="tagFormConfig"
- :formOption="formOption"
- v-model="formData.tagData"
- :rules="tagRules"
- ref="tagForm"
- >
- </byForm>
- <template #footer>
- <el-button @click="tagDialog = false" size="large">取 消</el-button>
- <el-button
- type="primary"
- @click="submitTagForm()"
- size="large"
- :loading="submitLoading"
- >
- 确 定
- </el-button>
- </template>
- </el-dialog>
- <el-dialog
- :title="editType === 'add' ? '添加联系人' : '编辑联系人'"
- v-model="contactsDialog"
- width="400px"
- destroy-on-close
- v-loading="submitLoading"
- >
- <byForm
- :formConfig="contactsFormConfig"
- :formOption="formOption"
- v-model="formData.contactsData"
- :rules="contactsRules"
- ref="contactsForm"
- >
- <template #mailSet>
- <div style="width: 100%">
- <el-button type="primary" @click="clickAddRow">添 加</el-button>
- <el-table
- :data="formData.contactsData.mailSet"
- style="width: 100%; margin-top: 16px"
- >
- <el-table-column label="电子邮箱">
- <template #default="{ row, $index }">
- <div style="width: 100%">
- <el-form-item
- :prop="'mailSet.' + $index + '.email'"
- :rules="contactsRules.email"
- :inline-message="true"
- >
- <el-input
- v-model="row.email"
- placeholder="请输入电子邮箱"
- />
- </el-form-item>
- </div>
- </template>
- </el-table-column>
- <el-table-column
- align="center"
- label="操作"
- width="80"
- fixed="right"
- >
- <template #default="{ row, $index }">
- <el-button
- type="primary"
- link
- @click="handleRemoveRow($index)"
- >删除</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </div>
- </template>
- </byForm>
- <template #footer>
- <el-button @click="contactsDialog = false" size="large"
- >取 消</el-button
- >
- <el-button
- type="primary"
- @click="submitContactsForm()"
- size="large"
- :loading="submitLoading"
- >
- 确 定
- </el-button>
- </template>
- </el-dialog>
- </div>
- </template>
- <script setup>
- import { Plus } from "@element-plus/icons-vue";
- import useMailStore from "@/store/modules/mail";
- import useUserStore from "@/store/modules/user";
- import byForm from "@/components/byForm/index";
- import { ElMessage, ElMessageBox } from "element-plus";
- const mailStore = useMailStore();
- const { proxy } = getCurrentInstance();
- let selectMail = ref({});
- let activeName = ref("first");
- const mailMapData = {
- inbox: ["INBOX"],
- unread: ["UNREAD"],
- draft: ["草稿箱", "Drafts", "[Gmail]/草稿"],
- sent: ["已发送", "Sent Messages", "[Gmail]/已发邮件"],
- delete: ["已删除", "Deleted Messages", "[Gmail]/已删除邮件"],
- waste: ["垃圾邮件", "Junk", "[Gmail]/垃圾邮件"],
- };
- let selectFloderId = ref("");
- const mailList = ref([]);
- const staffMailData = ref([
- {
- name: "员工邮箱",
- id: "0",
- children: [],
- },
- ]);
- const staffLoading = ref(false);
- const userList = 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: "input",
- prop: "name",
- label: "文件夹名称",
- disabled: false,
- itemWidth: 100,
- },
- ]);
- const formData = reactive({
- myFolderData: {},
- tagData: {},
- contactsData: {},
- });
- const rules = ref({
- name: [{ required: true, message: "请输入文件夹名称", trigger: "blur" }],
- });
- const tagForm = ref(null);
- const tagsTreeData = ref([]);
- const tagDialog = ref(false);
- const tagFormConfig = computed(() => [
- {
- type: "input",
- prop: "name",
- label: "标签名称",
- disabled: false,
- itemWidth: 100,
- },
- ]);
- const tagRules = ref({
- name: [{ required: true, message: "请输入标签名称", trigger: "blur" }],
- });
- const customerList = ref([]);
- const customerLoading = ref([]);
- const getCustomerList = () => {
- customerLoading.value = true;
- proxy.post("/myCustomer/list").then((res) => {
- customerList.value = res.map((x) => ({
- ...x,
- parentId: "0",
- children: [],
- }));
- customerLoading.value = false;
- });
- };
- const contactsTreeData = ref([]);
- const contactsTreeLoading = ref([]);
- const contactsForm = ref(null);
- const contactsDialog = ref(false);
- const contactsFormConfig = computed(() => [
- {
- type: "input",
- prop: "name",
- label: "联系人名称",
- disabled: false,
- itemWidth: 100,
- },
- {
- type: "slot",
- prop: "mailSet",
- slotName: "mailSet",
- },
- ]);
- const contactsRules = ref({
- name: [{ required: true, message: "请输入联系人名称", trigger: "blur" }],
- email: [{ required: true, message: "请输入电子邮箱", trigger: "blur" }],
- });
- const submitContactsForm = () => {
- contactsForm.value.handleSubmit(() => {
- if (formData.contactsData.mailSet.length > 0) {
- submitLoading.value = true;
- formData.contactsData.mailSet = formData.contactsData.mailSet
- .map((x) => x.email)
- .join();
- proxy
- .post("/myContactPerson/" + editType.value, formData.contactsData)
- .then(
- (res) => {
- ElMessage({
- message: `操作成功!`,
- type: "success",
- });
- contactsDialog.value = false;
- submitLoading.value = false;
- getContactsTreeData();
- },
- (err) => {
- submitLoading.value = false;
- }
- );
- } else {
- ElMessage({
- message: "请添加邮箱",
- type: "info",
- });
- }
- });
- };
- const clickAddRow = () => {
- formData.contactsData.mailSet.push({
- email: "",
- });
- };
- const handleRemoveRow = (index) => {
- formData.contactsData.mailSet.splice(index, 1);
- };
- const getContactsTreeData = () => {
- contactsTreeLoading.value = true;
- proxy.post("/myContactPerson/page").then((res) => {
- contactsTreeData.value = res.rows.map((x) => ({
- ...x,
- parentId: "0",
- children: x.mailSet.split(",").map((y) => ({ name: y })),
- }));
- contactsTreeLoading.value = false;
- });
- };
- const handleAddContact = () => {
- formData.contactsData = {
- name: "",
- mailSet: [],
- };
- editType.value = "add";
- contactsDialog.value = true;
- };
- const handleEditContacts = (data) => {
- editType.value = "edit";
- proxy.post("/myContactPerson/detail", { id: data.id }).then((res) => {
- res.mailSet = res.mailSet.split(",").map((x) => ({ email: x }));
- formData.contactsData = res;
- contactsDialog.value = true;
- });
- };
- const handleDelContacts = (data) => {
- ElMessageBox.confirm(`此操作将删除该联系人, 是否继续?`, "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- }).then(() => {
- // 删除
- proxy.post("/myContactPerson/delete", { id: data.id }).then((res) => {
- ElMessage({
- message: `操作成功!`,
- type: "success",
- });
- getContactsTreeData();
- });
- });
- };
- const getTagsList = () => {
- proxy
- .post("/myTag/page", {
- pageNum: 1,
- pageSize: 9999,
- id: useUserStore().user.userId,
- })
- .then((res) => {
- tagsTreeData.value = [
- {
- name: "我的标签",
- id: "0",
- children: res.rows,
- },
- ];
- });
- };
- const submitTagForm = () => {
- tagForm.value.handleSubmit(() => {
- submitLoading.value = true;
- proxy.post("/myTag/" + editType.value, formData.tagData).then(
- (res) => {
- ElMessage({
- message: `操作成功!`,
- type: "success",
- });
- tagDialog.value = false;
- submitLoading.value = false;
- getTagsList(selectMail.value);
- },
- (err) => {
- submitLoading.value = false;
- }
- );
- });
- };
- const handleEditTag = (data, type) => {
- editType.value = type;
- if (type === "add") {
- formData.tagData.name = "";
- formData.tagData.type = selectMail.value.type;
- formData.tagData.mailboxId = selectMail.value.id;
- } else {
- formData.tagData = data;
- }
- tagDialog.value = true;
- };
- const handleDelTag = (data) => {
- ElMessageBox.confirm(`此操作将删除该标签, 是否继续?`, "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- }).then(() => {
- // 删除
- proxy.post("/myTag/delete", { id: data.id }).then((res) => {
- ElMessage({
- message: `操作成功!`,
- type: "success",
- });
- getTagsList();
- });
- });
- };
- const getMyFolderTree = (data) => {
- proxy.post("/myFolder/tree", { mailboxId: data.id }).then((res) => {
- myFolderTreeData.value = [
- {
- label: "我的文件夹",
- id: "0",
- children: res,
- },
- ];
- });
- };
- const submitMyFolderForm = () => {
- myFolderForm.value.handleSubmit(() => {
- submitLoading.value = true;
- proxy.post("/myFolder/" + editType.value, formData.myFolderData).then(
- (res) => {
- ElMessage({
- message: `操作成功!`,
- type: "success",
- });
- myFolderDialog.value = false;
- submitLoading.value = false;
- getMyFolderTree(selectMail.value);
- },
- (err) => {
- submitLoading.value = false;
- }
- );
- });
- };
- const handleEditFolder = (data, type) => {
- formData.myFolderData = {};
- editType.value = type;
- if (type === "add") {
- formData.myFolderData.parentId = data.id;
- } else {
- formData.myFolderData = data;
- formData.myFolderData.name = data.label;
- }
- formData.myFolderData.type = selectMail.value.type;
- formData.myFolderData.mailboxId = selectMail.value.id;
- myFolderDialog.value = true;
- };
- const handleDelFolder = (data) => {
- ElMessageBox.confirm(`此操作将删除该文件夹, 是否继续?`, "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- }).then(() => {
- // 删除
- proxy.post("/myFolder/delete", { id: data.id }).then((res) => {
- ElMessage({
- message: `操作成功!`,
- type: "success",
- });
- getMyFolderTree(selectMail.value);
- });
- });
- };
- const handleMapMailListData = (arr) => {
- for (let i = 0; i < arr.length; i++) {
- const iele = arr[i];
- iele.mailFolderInfoListCopy = [];
- iele.otherFolder = [];
- iele.allUnreadMessageCount = 0;
- for (let j = 0; j < iele.mailFolderInfoList.length; j++) {
- const jele = iele.mailFolderInfoList[j];
- iele.allUnreadMessageCount += jele.unreadMessageCount;
- if (mailMapData["inbox"].includes(jele.name)) {
- iele.mailFolderInfoListCopy.push({
- ...jele,
- oldName: jele.name,
- name: "收件箱",
- sort: 1,
- });
- } else if (mailMapData["unread"].includes(jele.name)) {
- iele.mailFolderInfoListCopy.push({
- ...jele,
- oldName: jele.name,
- name: "未读邮件",
- sort: 2,
- });
- } else if (mailMapData["draft"].includes(jele.name)) {
- iele.mailFolderInfoListCopy.push({
- ...jele,
- oldName: jele.name,
- name: "草稿箱",
- sort: 3,
- });
- } else if (mailMapData["sent"].includes(jele.name)) {
- iele.mailFolderInfoListCopy.push({
- ...jele,
- oldName: jele.name,
- name: "已发送",
- sort: 4,
- });
- } else if (mailMapData["delete"].includes(jele.name)) {
- iele.mailFolderInfoListCopy.push({
- ...jele,
- oldName: jele.name,
- name: "已删除",
- sort: 5,
- });
- } else if (mailMapData["waste"].includes(jele.name)) {
- iele.mailFolderInfoListCopy.push({
- ...jele,
- oldName: jele.name,
- name: "垃圾邮件",
- sort: 6,
- });
- } else {
- iele.otherFolder.push(jele);
- }
- }
- if (iele.otherFolder.length > 0) {
- iele.otherFolder = [
- {
- name: "官方文件夹",
- id: "0",
- children: iele.otherFolder,
- },
- ];
- }
- iele.mailFolderInfoListCopy.sort((a, b) => a.sort - b.sort);
- }
- return arr;
- };
- const getMialList = () => {
- proxy.get("/mailService/getUserEmailList").then((res) => {
- const arr = handleMapMailListData(res.data);
- mailList.value = arr;
- mailStore.userMailList = arr;
- if (mailList.value.length) {
- // 默认赋值第一邮箱
- selectMail.value = mailList.value[0];
- mailStore.selectMail = mailList.value[0];
- // 获取我的文件夹树形
- getMyFolderTree(selectMail.value);
- // 默认打开第一邮箱文件夹
- if (selectMail.value.mailFolderInfoListCopy.length > 0) {
- if (mailStore.mailMenuList.length === 0) {
- handleOpenMenu(selectMail.value.mailFolderInfoListCopy[0], "10");
- }
- }
- }
- });
- proxy.post("/mailInfo/getUserList").then((res) => {
- if (res && res.length > 0) {
- res = res.map((x) => ({
- ...x,
- name: x.nickName,
- children: [],
- }));
- }
- staffMailData.value[0].children = res;
- });
- };
- const handleClickMail = (item, flag = true) => {
- mailStore.mailMenuList = [];
- selectMail.value = item;
- mailStore.selectMail = item;
- // 默认打开第一邮箱文件夹
- if (selectMail.value.mailFolderInfoListCopy.length > 0 && flag) {
- handleOpenMenu(selectMail.value.mailFolderInfoListCopy[0], "10");
- }
- };
- const changeFloderId = (val) => {
- selectFloderId.value = val;
- };
- const handleOpenMenu = (item, listPageType = "10") => {
- // 10为官方文件夹以及六个外侧文件夹 20为我的文件夹 30为标签文件夹
- selectFloderId.value = item.id;
- const menu = {
- oldName: item.oldName,
- unReadCount: item.unreadMessageCount || 0,
- title: item.name,
- type: selectMail.value.type,
- folderId: item.id,
- id: "folder" + "," + item.id,
- listPageType,
- };
- // 如没有这个菜单则push
- const menuItem = mailStore.mailMenuList.find((x) => x.id === menu.id);
- if (menuItem === undefined) {
- mailStore.mailMenuList.push(menu);
- }
- // 更新当前选择的tab数据和tab的Id值
- mailStore.currentMenu = menu;
- mailStore.currentId = menu.id;
- };
- const handleGoWrite = (mail = {}, pageType = "0") => {
- const menu = {
- title: "写信",
- type: selectMail.value.type,
- id: "write",
- pageType,
- };
- if (mail) {
- menu.reMail = mail;
- }
- 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 handleTreeNodeClick = (data, type) => {
- if (data.id != "0") {
- let menuData = {
- id: data.id,
- };
- let listPageType = "10";
- if (type === "official") {
- menuData.name = data.name;
- } else if (type === "folder") {
- menuData.name = data.label;
- listPageType = "20";
- } else if (type === "tag") {
- menuData.name = data.name;
- listPageType = "30";
- }
- handleOpenMenu(menuData, listPageType);
- }
- };
- const clickTreeMail = (data, node) => {
- let mailData = node.parent.data;
- if (mailStore.selectMail.id === mailData.id) {
- const menuData = {
- id: data.id,
- name: data.name,
- };
- handleOpenMenu(menuData, "10");
- } else {
- handleClickMail(mailData, false);
- handleOpenMenu(data, "10");
- }
- };
- const handleTreeNodeNewClick = (data, node) => {
- if (data.id == "0") {
- return;
- } else if (data.userId) {
- const index = staffMailData.value[0].children.findIndex(
- (x) => x.userId === data.userId
- );
- if (index >= 0) {
- if (
- staffMailData.value[0].children[index].children &&
- staffMailData.value[0].children[index].children.length > 0
- ) {
- return;
- } else {
- staffLoading.value = true;
- proxy.post("/mailInfo/getUserEmailList", { id: data.userId }).then(
- (res) => {
- let arr = handleMapMailListData(res);
- arr = arr.map((x) => ({
- ...x,
- name: x.mailUser,
- isMailUser: true,
- children: x.mailFolderInfoList.map((x) => ({
- ...x,
- isFolder: true,
- })),
- }));
- staffMailData.value[0].children[index].children = arr;
- setTimeout(() => {
- staffLoading.value = false;
- }, 200);
- },
- (err) => {
- staffLoading.value = false;
- return ElMessage({
- message: `获取员工邮箱失败,请联系管理员`,
- type: "info",
- });
- }
- );
- }
- }
- } else if (data.isFolder) {
- clickTreeMail(data, node);
- }
- };
- const handleCustomerTreeClick = (data, node, type) => {
- if (type === "customer") {
- if (data.parentId === "0") {
- const index = customerList.value.findIndex((x) => x.id === data.id);
- if (index !== -1 && customerList.value[index].children.length === 0) {
- customerLoading.value = true;
- proxy.post("/customer/detail", { id: data.id }).then((res) => {
- if (res.customerUserList && res.customerUserList.length > 0) {
- customerList.value[index].children = res.customerUserList;
- }
- customerLoading.value = false;
- });
- }
- } else {
- handleGoWrite({ email: data.email, personal: data.name }, "0");
- }
- } else if (type === "contacts") {
- if (data.parentId === "0") {
- return;
- } else {
- handleGoWrite({ email: data.name, personal: node.parent.data.name }, "0");
- }
- }
- };
- onMounted(() => {
- getMialList();
- getCustomerList();
- getTagsList();
- getContactsTreeData();
- });
- defineExpose({
- handleGoWrite,
- changeFloderId,
- });
- </script>
- <style lang="scss" scoped>
- .left {
- font-size: 12px;
- .top {
- padding: 10px;
- text-align: center;
- border-bottom: 1px solid #ddd;
- .mail {
- color: #333333;
- font-weight: 700;
- font-size: 14px;
- }
- }
- .body {
- height: calc(100vh - 260px);
- overflow: auto;
- // padding: 10px;
- .mail-menu {
- list-style: none;
- margin-block-start: 0;
- margin-block-end: 0;
- padding: 0px;
- padding: 10px 10px 0 10px;
- .menu-item {
- display: flex;
- align-items: center;
- font-weight: 700;
- padding-left: 10px;
- font-size: 12px;
- width: 100%;
- height: 40px;
- line-height: 40px;
- border-radius: 3px;
- color: #333333;
- cursor: pointer;
- &:hover {
- background: #ddedfe;
- }
- .leftIcon {
- font-size: 16px;
- color: #999999;
- }
- }
- }
- }
- }
- .select-menu {
- // background: #ddedfe;
- color: #0084ff !important;
- .leftIcon {
- color: #0084ff !important;
- }
- }
- .tree {
- margin-top: 10px;
- border-top: 1px solid #ddd;
- padding: 10px 10px 0 10px;
- .tree-content {
- width: 100%;
- display: flex;
- // justify-content: space-between;
- padding-right: 10px;
- align-items: center;
- .iconColor {
- color: #666 !important;
- }
- }
- }
- .badge {
- background: #eeeeee;
- height: 20px;
- width: 30px;
- border-radius: 10px;
- line-height: 20px;
- text-align: center;
- font-weight: normal;
- margin-left: auto;
- margin-right: 10px;
- span {
- color: #666666;
- }
- }
- </style>
- <style lang="scss">
- .body {
- .el-tree-node__content {
- font-weight: 700;
- color: #333333 !important;
- font-size: 12px !important;
- }
- }
- .top {
- .el-badge__content.is-fixed {
- top: 8px;
- }
- .el-tabs__item {
- color: #616161;
- font-size: 12px;
- }
- .el-tabs__item:hover {
- color: #409eff;
- }
- .el-tabs__item.is-active {
- color: #409eff;
- }
- }
- </style>
|