lilishop-ui/im/src/views/layout/MainLayout.vue

369 lines
7.2 KiB
Vue

<template>
<div class="body-bag" :class="themeBagImg">
<el-container class="main-layout" :class="{ 'full-mode': themeMode }">
<!-- <el-aside width="70px" class="side-edge">
<el-container class="full-height">
<el-header height="118px" class="logo-header">
<div class="user-login" v-popover:usercard>
<div class="user-box">
<face :text="face"></face>
</div>
</div>
<p class="user-status">
<span v-if="name">{{ name }}</span>
<span v-else></span>
</p>
</el-header>
<el-main class="sidebar-menu">
<el-tooltip content="我的消息" placement="right" :visible-arrow="false">
<router-link to="/message">
<div class="menu-items" :class="{ active: idx == 0 }">
<i class="el-icon-chat-line-round" />
<span v-show="unreadNum" class="notify"></span>
</div>
</router-link>
</el-tooltip>
</el-main>
<el-footer height="60px" class="fixed-sidebar">
<div class="menu-items" @click="logout">
<span class="logout">退出</span>
</div>
</el-footer>
</el-container>
</el-aside> -->
<el-main class="no-padding" style="background: white">
<slot name="container"></slot>
</el-main>
</el-container>
<!-- 语音消息提示 -->
<audio id="audio" preload="auto">
<source src="~@/assets/image/1701.mp3" type="audio/mp3" />
</audio>
</div>
</template>
<script>
import Face from '../../components/face'
import { mapState } from "vuex";
import { ServeFindFriendApplyNum } from "@/api/contacts";
export default {
components: { Face },
name: "MainLayout",
props: {
idx: {
type: Number,
default: 0,
},
},
computed: {
...mapState({
face: (state) => state.user.face,
name: (state) => state.user.name,
id: (state) => state.user.id,
defaultAvatar: (state) => state.defaultAvatar,
socketStatus: (state) => state.socketStatus,
unreadNum: (state) => state.notify.unreadNum,
applyNum: (state) => state.notify.applyNum,
notifyCueTone: (state) => state.settings.notifyCueTone,
themeMode: (state) => state.settings.themeMode,
themeBagImg: (state) => state.settings.themeBagImg,
}),
},
watch: {
unreadNum (n, o) {
if (n > 0 && n > o && this.notifyCueTone) {
this.play();
}
},
},
created () {
this.setApplyNum();
},
methods: {
play () {
document
.querySelector("#audio")
.play()
.catch(() => {
console.error("消息提示音播放异常");
});
},
logout () {
this.$store.dispatch("ACT_USER_LOGOUT");
},
setApplyNum () {
// TODO 暂且return
return;
ServeFindFriendApplyNum().then((res) => {
if (res.code == 200 && res.data.unread > 0) {
this.$store.commit("INCR_APPLY_NUM");
}
});
},
},
};
</script>
<style lang="less" >
.main-layout {
position: fixed;
width: 80%;
height: 80%;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
overflow: hidden;
transition: ease 0.5s;
border-radius: 5px;
&.full-mode {
width: 1200px;
height: 85%;
border-radius: 0;
}
.side-edge {
display: block;
user-select: none;
background-color: #fff;
box-sizing: border-box;
border-right: 1px solid #ededed;
.logo-header {
padding: 0;
.user-status {
text-align: center;
margin-top: 10px;
color: #ccc9c9;
font-size: 13px;
font-weight: 300;
.online {
color: #0d710d;
}
}
}
}
.sidebar-menu {
width: 60px;
margin: 0 auto;
text-align: center;
padding: 0;
overflow: hidden;
a {
text-decoration: none;
}
.menu-items {
cursor: pointer;
color: #706d6d;
position: relative;
width: 45px;
height: 45px;
margin: 6px auto 0;
line-height: 45px;
text-align: center;
i {
font-size: 20px;
&:hover {
transform: scale(1.3);
}
}
.notify {
width: 5px;
height: 5px;
background: #ff1e1e;
display: inline-block;
border-radius: 5px;
position: absolute;
right: 5px;
top: 9px;
animation: notifymove 3s infinite;
animation-direction: alternate;
-webkit-animation: notifymove 3s infinite;
}
&.active {
color: #416641 !important;
}
}
}
}
.fixed-sidebar {
padding: 0;
.menu-items {
height: 25px;
line-height: 25px;
padding: 10px 5px;
cursor: pointer;
box-shadow: 0 0 0 0 #ccc9c9;
text-align: center;
color: #afabab;
i {
font-size: 20px;
}
.logout {
font-weight: 300;
font-size: 15px;
color: #9e9e9e;
transition: ease 0.5;
&:hover {
font-size: 16px;
}
}
}
}
/* 主题背景图片 */
.body-bag {
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
top: 0;
left: 0;
background-color: #121212;
transition: ease-in 0.5s;
&.bag001 {
background: url(~@/assets/image/background/001.jpg);
background-repeat: no-repeat;
background-size: 100% 100%;
}
&.bag002 {
background: url(~@/assets/image/background/002.jpg);
background-repeat: no-repeat;
background-size: 100% 100%;
}
&.bag003 {
background: url(~@/assets/image/background/003.jpg);
background-repeat: no-repeat;
background-size: 100% 100%;
}
&.bag004 {
background: url(~@/assets/image/background/005.png);
background-repeat: no-repeat;
background-size: 100% 100%;
}
}
@keyframes notifymove {
0% {
background: #ff1e1e;
}
25% {
background: #2e3238;
}
50% {
background: #ff1e1e;
}
75% {
background: #2e3238;
}
100% {
background: #ff1e1e;
}
}
@-webkit-keyframes notifymove {
0% {
background: #ff1e1e;
}
25% {
background: #2e3238;
}
50% {
background: #ff1e1e;
}
75% {
background: #2e3238;
}
100% {
background: #ff1e1e;
}
}
@media screen and (max-width: 1000px) {
.main-layout {
width: 100%;
height: 100%;
border-radius: 0;
}
}
// iphone
@media screen and (max-width: 767px) {
.side-edge {
display: none !important;
}
}
.user-box {
margin: 20px auto 10px auto;
height: 35px;
width: 35px;
flex-shrink: 0;
background-color: #508afe;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
color: white;
user-select: none;
transition: ease 1s;
position: relative;
overflow: hidden;
img {
width: 100%;
height: 100%;
background-color: white;
border-radius: 3px;
}
.top-mask {
width: 100%;
height: 100%;
background-color: rgba(22, 25, 29, 0.6);
position: absolute;
top: 0;
left: 0;
color: white;
display: none;
align-items: center;
justify-content: center;
font-weight: bold;
}
&:hover .top-mask {
display: flex;
}
}
</style>