mirror of
https://github.com/schroinerxy/cloud-mail.git
synced 2026-06-21 19:35:50 +08:00
184 lines
4.1 KiB
Vue
184 lines
4.1 KiB
Vue
<template>
|
|
<div :class="accountShow && hasPerm('account:query') ? 'main-box-show' : 'main-box-hide'">
|
|
<div :class="accountShow && hasPerm('account:query') ? 'block-show' : 'block-hide'" @click="uiStore.accountShow = false"></div>
|
|
<account :class="accountShow && hasPerm('account:query') ? 'show' : 'hide'" />
|
|
<router-view class="main-view" v-slot="{ Component,route }">
|
|
<keep-alive :include="['email','all-email','send','sys-setting','star','user','role','analysis','reg-key','draft']">
|
|
<component :is="Component" :key="route.name"/>
|
|
</keep-alive>
|
|
</router-view>
|
|
</div>
|
|
</template>
|
|
<script setup>
|
|
import account from '@/layout/account/index.vue'
|
|
import {useUiStore} from "@/store/ui.js";
|
|
import {useSettingStore} from "@/store/setting.js";
|
|
import {computed, onBeforeUnmount, onMounted, watch} from "vue";
|
|
import { useRoute } from 'vue-router'
|
|
import { hasPerm } from "@/perm/perm.js"
|
|
|
|
const settingStore = useSettingStore()
|
|
const uiStore = useUiStore();
|
|
const route = useRoute()
|
|
let innerWidth = window.innerWidth
|
|
|
|
let elNotification = null
|
|
|
|
const accountShow = computed(() => {
|
|
return uiStore.accountShow && settingStore.settings.manyEmail === 0
|
|
})
|
|
|
|
watch(() => uiStore.changeNotice, () => {
|
|
|
|
const settings = settingStore.settings
|
|
|
|
let data = {
|
|
notice: settings.notice,
|
|
noticeWidth: settings.noticeWidth,
|
|
noticeTitle: settings.noticeTitle,
|
|
noticeContent: settings.noticeContent,
|
|
noticeType: settings.noticeType,
|
|
noticeDuration: settings.noticeDuration,
|
|
noticePosition: settings.noticePosition,
|
|
noticeOffset: settings.noticeOffset
|
|
}
|
|
|
|
showNotice(data)
|
|
})
|
|
|
|
watch(() => uiStore.changePreview, () => {
|
|
showNotice(uiStore.previewData)
|
|
})
|
|
|
|
function showNotice(data) {
|
|
|
|
if (data.notice === 1) {
|
|
return;
|
|
}
|
|
|
|
if (elNotification) {
|
|
elNotification.close()
|
|
}
|
|
|
|
const style = document.createElement('style');
|
|
style.innerHTML = `
|
|
.custom-notice.el-notification {
|
|
--el-notification-width: min(${data.noticeWidth}px,calc(100% - 30px)) !important;
|
|
}
|
|
`;
|
|
|
|
document.head.appendChild(style);
|
|
|
|
elNotification = ElNotification({
|
|
title: data.noticeTitle,
|
|
message: `<div style="width: 100%;height: 100%;">${data.noticeContent}</div>`,
|
|
type: data.noticeType === 'none' ? '' : data.noticeType,
|
|
duration: data.noticeDuration,
|
|
position: data.noticePosition,
|
|
offset: data.noticeOffset,
|
|
dangerouslyUseHTMLString: true,
|
|
customClass: 'custom-notice'
|
|
})
|
|
}
|
|
|
|
onMounted(() => {
|
|
window.addEventListener('resize', handleResize)
|
|
handleResize()
|
|
})
|
|
|
|
onBeforeUnmount(() => {
|
|
window.removeEventListener('resize', handleResize)
|
|
})
|
|
|
|
const handleResize = () => {
|
|
if (['content','email','send'].includes(route.meta.name)) {
|
|
if (innerWidth !== window.innerWidth) {
|
|
innerWidth = window.innerWidth;
|
|
uiStore.accountShow = window.innerWidth >= 767;
|
|
}
|
|
}
|
|
}
|
|
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
|
|
.block-show {
|
|
position: fixed;
|
|
@media (max-width: 767px) {
|
|
position: absolute;
|
|
right: 0;
|
|
border: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
background: #000000;
|
|
opacity: 0.6;
|
|
z-index: 10;
|
|
transition: all 300ms;
|
|
}
|
|
}
|
|
|
|
.block-hide {
|
|
position: fixed;
|
|
pointer-events: none;
|
|
transition: all 300ms;
|
|
}
|
|
|
|
.show {
|
|
transition: all 100ms;
|
|
@media (max-width: 767px) {
|
|
position: fixed;
|
|
z-index: 100;
|
|
width: 250px;
|
|
}
|
|
}
|
|
|
|
.hide {
|
|
transition: all 100ms;
|
|
position: fixed;
|
|
transform: translateX(-100%);
|
|
opacity: 0;
|
|
@media (max-width: 1024px) {
|
|
width: 250px;
|
|
z-index: 100;
|
|
}
|
|
}
|
|
|
|
|
|
.main-box-show {
|
|
display: grid;
|
|
grid-template-columns: 260px 1fr;
|
|
height: calc(100% - 60px);
|
|
@media (max-width: 1200px) {
|
|
grid-template-columns: 250px 1fr;
|
|
}
|
|
@media (max-width: 767px) {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|
|
|
|
.main-box-hide {
|
|
display: grid;
|
|
grid-template-columns: 1fr;
|
|
height: calc(100% - 60px);
|
|
}
|
|
|
|
|
|
.main-view {
|
|
background: #FFFFFF;
|
|
}
|
|
|
|
|
|
.navigation {
|
|
height: 30px;
|
|
border-bottom: solid 1px var(--el-menu-border-color);
|
|
display: inline-flex;
|
|
justify-items: center;
|
|
align-items: center;
|
|
width: 100%;
|
|
.tag {
|
|
background: #FFFFFF;
|
|
margin-left: 5px;
|
|
}
|
|
}
|
|
</style>
|