Header.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <!--
  2. Description: 主页面Header布局
  3. Author: BaiQi
  4. Created Date: 2024-6-30
  5. -->
  6. <template>
  7. <el-row class="header">
  8. <!--产品图标与名称-->
  9. <el-col :span="2" class="header-icons">
  10. <div>
  11. <!-- 这个相对路径很迷 -->
  12. <img src="../Header/seecoderLogo_wide.png" alt="logo">
  13. </div>
  14. <div>
  15. </div>
  16. </el-col>
  17. <!--选择菜单-->
  18. <el-col :span="10" class="header-menu">
  19. <el-menu mode="horizontal" :default-active="activePage" @select="handleSelect" class="menu">
  20. <template v-if="role == 'student'">
  21. <el-menu-item v-for="item in studentMenuItems" :index="item.key" class="header-menu-item">
  22. <div>
  23. {{ item.value }}
  24. </div>
  25. </el-menu-item>
  26. </template>
  27. <template v-else>
  28. <el-menu-item v-for="item in teacherMenuItems" :index="item.key" class="header-menu-item">
  29. <div>
  30. {{ item.value }}
  31. </div>
  32. </el-menu-item>
  33. </template>
  34. </el-menu>
  35. </el-col>
  36. <!--用户头像和昵称-->
  37. <el-col :span="3" :offset="7">
  38. <el-dropdown @command="handleCommand" style="margin-top: 5px">
  39. <div class="header-userName">
  40. <!--如果是登录状态-->
  41. <template v-if="store.token !== ''">
  42. <!--用户有头像-->
  43. <template v-if="store.user.userAvatar !== ''">
  44. <el-avatar :size="32" :shape="'circle'" :src="store.user.userAvatar"/>
  45. </template>
  46. <!--用户没有头像-->
  47. <template v-else>
  48. <el-avatar :size="32" :shape="'circle'"> {{ store.user.name.charAt(0) }}</el-avatar>
  49. </template>
  50. <div class="nickName">
  51. {{store.user.name}}
  52. </div>
  53. </template>
  54. <!--如果是未登录状态-->
  55. <template v-else>
  56. <el-avatar :size="32" :shape="'circle'"> U</el-avatar>
  57. <div class="nickName">user</div>
  58. </template>
  59. </div>
  60. <template #dropdown>
  61. <el-dropdown-menu>
  62. <el-dropdown-item command="logout">退出登录</el-dropdown-item>
  63. </el-dropdown-menu>
  64. </template>
  65. </el-dropdown>
  66. <!-- <el-dropdown @command="handleCommand" style="position: absolute;top: 35%">-->
  67. <!-- <span style="color: blue">-->
  68. <!-- user-->
  69. <!-- <el-icon class="el-icon&#45;&#45;right">-->
  70. <!-- <arrow-down />-->
  71. <!-- </el-icon>-->
  72. <!-- </span>-->
  73. <!-- <template #dropdown>-->
  74. <!-- <el-dropdown-menu>-->
  75. <!-- <el-dropdown-item command="logout">退出登录</el-dropdown-item>-->
  76. <!-- </el-dropdown-menu>-->
  77. <!-- </template>-->
  78. <!-- </el-dropdown>-->
  79. </el-col>
  80. </el-row>
  81. </template>
  82. <script setup lang="ts">
  83. import router from "../../router/index.js";
  84. import {getCurrentInstance, onMounted, ref} from "vue";
  85. import './index.scss'
  86. import {useStore} from "@/store";
  87. import emitter from "@/utils/emitter";
  88. import {useRoute} from "vue-router";
  89. const store = useStore()
  90. const role:'teachers' | 'student' = store.user.role === 'STUDENT' ? 'student':'teachers';
  91. const studentMenuItems = [
  92. {
  93. value: "课程广场",
  94. key: "CourseSquare"
  95. },
  96. {
  97. value: "我的课程",
  98. key: "MyCourse"
  99. },
  100. {
  101. value: "我的作业",
  102. key: "MyWork"
  103. },
  104. ]
  105. const teacherMenuItems = [
  106. {
  107. value: "课程广场",
  108. key: "CourseSquare"
  109. },
  110. {
  111. value: "我的课程",
  112. key: "MyCourse"
  113. },
  114. {
  115. value: "我的批改",
  116. key: "MyWork"
  117. },
  118. ]
  119. const handleSelect = (index:string)=>{
  120. emitter.emit('change-page', index)
  121. }
  122. const handleCommand = (command:string)=>{
  123. if(command==="logout"){
  124. localStorage.clear()
  125. store.clear()
  126. router.push({path: "/login"})
  127. }
  128. }
  129. const route = useRoute()
  130. let activePage = ref('')
  131. //处理刷新页面时,菜单项和内容不匹配的问题
  132. onMounted(()=>{
  133. let path = route.path.split('/')[2].charAt(0).toUpperCase()+route.path.split('/')[2].slice(1)
  134. if(path === 'Assignment'){
  135. activePage.value = 'MyWork'
  136. }else {
  137. activePage.value = path
  138. }
  139. })
  140. </script>
  141. <script lang="ts">
  142. export default {
  143. name: "Layout"
  144. }
  145. </script>