Navbar.vue 6.33 KB
<template>
  <div class="navbar-con">
    <div class="navbar" v-theme.background="mTheme">
      <div class="logo">
        <img v-if="logo" :src="logo" class="header-logo">
      </div>
      <div class="backdrop">
        <theme style="float: right;height: 26px;width: 26px;margin-top: 26px;" @change="themeChange" />
      </div>
      <div class="right-menu">
        <svg-icon class="function" icon-class='function' />
        <div class="avatar-wrapper">
          <span style="padding-right:10px">{{ name }}</span>
          <img :src="avatar + '?imageView2/1/w/80/h/80'" class="user-avatar" />
        </div>
        <svg-icon class="shutdown" @click.native="logout" icon-class='shutdown' />
      </div>
    </div>
    <NoticeBar class="NoticeBar" :noticeList="noticeList" v-if="noticeList.length > 0" />
  </div>
</template>
<script>
  import axios from 'axios'
  import Cookies from 'js-cookie'
  import { mapGetters } from 'vuex'
  import NoticeBar from '@/components/NoticeBar/index'
  import { getHomeNoticeList } from "@/api/home"
  export default {
    components: {
      NoticeBar
    },
    computed: {
      ...mapGetters(['sidebar', 'avatar', 'name']),
      baseUrl () {
        return window._config.baseUrl;
      },
    },
    data () {
      return {
        logo: require('../../image/logo.png'),
        noticeList: []
      }
    },
    created () {
      this.queryNoticeList()
    },
    mounted () {
      let that = this
      window.addEventListener('message', function (messageEvent) {
        if (messageEvent.data.update) {
          that.queryNoticeList()
        }
      })
    },
    destroyed () {
      window.removeEventListener('message')
    },
    methods: {
      queryNoticeList () {
        getHomeNoticeList().then(res => {
          if (res.result) {
            this.noticeList = res.result.noticeList
          }
        })
      },
      logout () {
        axios.post(this.BASE_API.ip + "/management/logout").then(() => {
          if (process.env.NODE_ENV === 'development') {
            localStorage.removeItem('token')
          } else {
            Cookies.remove('ACCESS-TOKEN')
          }
          if (window._config.casEnable) {
            window.location.href = window._config.casBaseURL + '/logout?service=' + encodeURIComponent(window.location.href);
          } else {
            this.$router.push({
              path: '/login',
              replace: true,
              query: {
                redirect: router.currentRoute.value.fullPath
              }
            })
          }
        })
      },

      themeChange (val) {
        this.$store.dispatch('app/updateTheme', val)
      },
      searchMessageCenter () {
        this.$router.push({ name: 'messagecenter' })
      },
      handleCommand (command) {
        if (command == 'a') {
          //个人中心
          this.$router.push({ name: 'personal' })
        }
      }
    }
  }
</script>
<style lang="scss" scoped>
  .navbar-con {
    position: relative;
  }

  .NoticeBar {
    position: absolute;
    bottom: 0;
  }

  .el-dropdown-menu {
    padding: 0 !important;
    border: 1px solid #ebeef5;
    box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.12);
    border-radius: 4px 0 0 4px 4px;

    .el-dropdown-menu__item {
      text-align: center;
      margin-top: 0 !important;
      font-size: 14px;
      font-family: PingFangSC-Regular, PingFang SC;
      font-weight: 400;
      color: #4a4a4a;
      width: 140px;
      height: 36px;
      line-height: 36px;
    }

    .el-dropdown-menu__item:nth-child(6) {
      border-top: 1px solid #ebeef5;
    }

    .popper__arrow {
      top: -11px !important;
      left: 110px !important;
      transform: rotate(0deg) scale(2);
    }

    .el-dropdown-menu__item:not(.is-disabled):hover,
    .el-dropdown-menu__item:focus {
      background: #f6f7f9;
      color: #4a4a4a;
    }
  }

  .navbar {
    height: $headerHeight;
    overflow: hidden;
    position: relative;
    background: #fff;
    // background: linear-gradient(270deg, #148CEE 0%, #1870E3 100%); //默认颜色
    box-shadow: 0 1px 0px rgba(0, 21, 41, 0.08);
    display: flex;
    align-items: center;
    padding: 0 20px;
    justify-content: space-between;

    .header-logo {
      width: 300px;
    }

    .backdrop {
      flex: 1;
      width: 60%;
      background: url("../../image/backdrop.png");
      background-size: 100% 100%;
      height: $headerHeight;
    }

    .hamburger-container {
      line-height: 43px;
      height: 100%;
      float: left;
      cursor: pointer;
      transition: background 0.3s;
      -webkit-tap-highlight-color: transparent;

      &:hover {
        background: rgba(0, 0, 0, 0.025);
      }
    }

    .breadcrumb-container {
      float: left;
    }

    .right-menu {
      float: right;
      height: 100%;
      line-height: 50px;
      display: flex;
      align-items: center;

      .function {
        margin: 0 15px;
        cursor: pointer;
      }

      .shutdown {
        font-size: 20px;
        margin-left: 15px;
        cursor: pointer;
      }

      .organization-item {
        margin-right: 40px;
        margin-top: -40px !important;
      }

      .item {
        margin-right: 40px;
        margin-top: -20px;
        line-height: 18.4px;
        cursor: pointer;
        position: relative;

        .item-box {
          position: absolute;
          top: -5px;
          left: 3px;
          width: 100%;
          min-width: 25px;
          height: 25px;
          cursor: pointer;
          z-index: 100;
        }
      }

      &:focus {
        outline: none;
      }

      .right-menu-item {
        display: inline-block;
        font-size: 18px;
        color: #fff;
        vertical-align: text-bottom;

        &.hover-effect {
          cursor: pointer;
          transition: background 0.3s;
          display: flex;
          align-items: center;

          &:hover {
            background: rgba(0, 0, 0, 0.025);
          }
        }
      }

      .avatar-wrapper {
        position: relative;
        display: flex;
        height: 40px;
        align-items: center;
        color: #ffffff;

        .user-avatar {
          cursor: pointer;
          width: 35px;
          height: 35px;
          border-radius: 50%;
        }

        .el-icon-caret-bottom {
          cursor: pointer;
          position: absolute;
          right: -15px;
          top: 17px;
          font-size: 12px;
        }
      }
    }
  }
</style>