369 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			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>
 |