Navbar.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <div class="navbar">
  3. <hamburger
  4. :is-active="sidebar.opened"
  5. class="hamburger-container"
  6. @toggleClick="toggleSideBar"
  7. />
  8. <breadcrumb class="breadcrumb-container" />
  9. <div class="right-menu">
  10. <el-dropdown class="avatar-container" trigger="click">
  11. <div class="avatar-wrapper">
  12. <img :src="avatar" class="user-avatar" />
  13. <i class="el-icon-caret-bottom" />
  14. </div>
  15. <el-dropdown-menu slot="dropdown" class="user-dropdown">
  16. <router-link to="/">
  17. <el-dropdown-item>首页</el-dropdown-item>
  18. </router-link>
  19. <!-- <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
  20. <el-dropdown-item>Github</el-dropdown-item>
  21. </a>
  22. <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
  23. <el-dropdown-item>Docs</el-dropdown-item>
  24. </a>-->
  25. <el-dropdown-item divided @click.native="logout">
  26. <span style="display:block;">退出</span>
  27. </el-dropdown-item>
  28. </el-dropdown-menu>
  29. </el-dropdown>
  30. </div>
  31. <div class="user-name">{{ newName }}</div>
  32. </div>
  33. </template>
  34. <script>
  35. import { mapGetters } from "vuex";
  36. import Breadcrumb from "@/components/Breadcrumb";
  37. import Hamburger from "@/components/Hamburger";
  38. import logo from "@/assets/img/logo.png";
  39. export default {
  40. data() {
  41. return {
  42. logo,
  43. newName: "用户",
  44. avatar: "",
  45. };
  46. },
  47. mounted() {
  48. let userinfo = localStorage.getItem("userinfo");
  49. if (userinfo) {
  50. let newName = JSON.parse(userinfo).nickname;
  51. this.newName = newName;
  52. this.avatar = JSON.parse(userinfo).avatar || logo;
  53. }
  54. },
  55. components: {
  56. Breadcrumb,
  57. Hamburger,
  58. },
  59. computed: {
  60. ...mapGetters(["sidebar"]),
  61. },
  62. methods: {
  63. toggleSideBar() {
  64. this.$store.dispatch("app/toggleSideBar");
  65. },
  66. logout() {
  67. this.$store.dispatch("user/logout");
  68. this.$router.push(`/login?redirect=${this.$route.fullPath}`);
  69. },
  70. },
  71. };
  72. </script>
  73. <style lang="scss" scoped>
  74. .navbar {
  75. height: 50px;
  76. overflow: hidden;
  77. position: relative;
  78. background: #fff;
  79. box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
  80. .hamburger-container {
  81. line-height: 46px;
  82. height: 100%;
  83. float: left;
  84. cursor: pointer;
  85. transition: background 0.3s;
  86. -webkit-tap-highlight-color: transparent;
  87. &:hover {
  88. background: rgba(0, 0, 0, 0.025);
  89. }
  90. }
  91. .breadcrumb-container {
  92. float: left;
  93. }
  94. .user-name {
  95. float: right;
  96. margin-right: 10px;
  97. line-height: 46px;
  98. height: 100%;
  99. }
  100. .right-menu {
  101. float: right;
  102. height: 100%;
  103. line-height: 50px;
  104. &:focus {
  105. outline: none;
  106. }
  107. .right-menu-item {
  108. display: inline-block;
  109. padding: 0 8px;
  110. height: 100%;
  111. font-size: 18px;
  112. color: #5a5e66;
  113. vertical-align: text-bottom;
  114. &.hover-effect {
  115. cursor: pointer;
  116. transition: background 0.3s;
  117. &:hover {
  118. background: rgba(0, 0, 0, 0.025);
  119. }
  120. }
  121. }
  122. .avatar-container {
  123. padding-right: 30px;
  124. .avatar-wrapper {
  125. position: relative;
  126. .user-avatar {
  127. margin-top: 8px;
  128. cursor: pointer;
  129. width: 32px;
  130. height: 32px;
  131. border-radius: 50%;
  132. }
  133. .el-icon-caret-bottom {
  134. cursor: pointer;
  135. position: absolute;
  136. right: -20px;
  137. top: 25px;
  138. font-size: 12px;
  139. }
  140. }
  141. }
  142. }
  143. }
  144. </style>