Navbar.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <script setup lang="ts">
  2. import { storeToRefs } from "pinia";
  3. import { useRoute, useRouter } from "vue-router";
  4. import { useAppStore } from "@/store/modules/app";
  5. import { useTagsViewStore } from "@/store/modules/tagsView";
  6. import { useUserStore } from "@/store/modules/user";
  7. import { SchoolList } from "@/api/school/types";
  8. import { getSchoolList } from "@/api/school";
  9. import { watch } from "vue";
  10. import SvgIcon from "@/components/SvgIcon/index.vue";
  11. const appStore = useAppStore();
  12. const tagsViewStore = useTagsViewStore();
  13. const userStore = useUserStore();
  14. const route = useRoute();
  15. const router = useRouter();
  16. const { device } = storeToRefs(appStore); // 设备类型:desktop-宽屏设备 || mobile-窄屏设备
  17. /**
  18. * 左侧菜单栏显示/隐藏
  19. */
  20. function toggleSideBar() {
  21. appStore.toggleSidebar(true);
  22. }
  23. /**
  24. * vueUse 全屏
  25. */
  26. const { isFullscreen, toggle } = useFullscreen();
  27. /**
  28. * 注销
  29. */
  30. function logout() {
  31. ElMessageBox.confirm("确定注销并退出系统吗?", "提示", {
  32. confirmButtonText: "确定",
  33. cancelButtonText: "取消",
  34. type: "warning",
  35. }).then(() => {
  36. userStore
  37. .logout()
  38. .then(() => {
  39. tagsViewStore.delAllViews();
  40. })
  41. .then(() => {
  42. router.push(`/login?redirect=${route.fullPath}`);
  43. });
  44. });
  45. }
  46. /**
  47. * 学校数据
  48. */
  49. const schoolData = ref<SchoolList[]>([
  50. {
  51. school_id: 0,
  52. name: "全部学校",
  53. },
  54. {
  55. school_id: 1,
  56. name: "学校1",
  57. },
  58. ]);
  59. const schoolNumber = ref(0);
  60. function querySchoolList() {
  61. getSchoolList()
  62. .then(({ data }) => {
  63. schoolData.value.concat(data);
  64. })
  65. .catch((error) => {
  66. console.log(error);
  67. });
  68. }
  69. onMounted(() => {
  70. // querySchoolList();
  71. });
  72. watch(
  73. () => schoolNumber.value,
  74. (newValue, oldValue) => {
  75. console.log("schoolNumber", newValue, oldValue);
  76. userStore.changeSchool(schoolNumber.value);
  77. }
  78. );
  79. </script>
  80. <template>
  81. <!-- 顶部导航栏 -->
  82. <div class="navbar">
  83. <!-- 左侧面包屑 -->
  84. <div class="flex">
  85. <hamburger
  86. :is-active="appStore.sidebar.opened"
  87. @toggle-click="toggleSideBar"
  88. />
  89. <breadcrumb />
  90. </div>
  91. <!-- 右侧导航设置 -->
  92. <div class="flex">
  93. <!-- 导航栏设置(窄屏隐藏)-->
  94. <div v-if="device !== 'mobile'" class="setting-container">
  95. <!--全屏 -->
  96. <div class="setting-item" @click="toggle">
  97. <svg-icon
  98. :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
  99. size="16px"
  100. />
  101. </div>
  102. </div>
  103. <!-- 学校选择下拉框 -->
  104. <el-select v-model="schoolNumber" size="large" placeholder="全部学校">
  105. <el-option
  106. v-for="item in schoolData"
  107. :key="item.school_id"
  108. :label="item.name"
  109. :value="item.school_id"
  110. />
  111. </el-select>
  112. <!-- 用户头像 -->
  113. <div class="avatar-container">
  114. <span class="spl">|</span>
  115. <img :src="userStore.avatar + '?imageView2/1/w/80/h/80'" />
  116. <span class="">{{ userStore.nickname }}</span>
  117. <span @click="logout"
  118. ><svg-icon icon-class="exit" color="#006eff" size="20px"
  119. /></span>
  120. </div>
  121. </div>
  122. </div>
  123. </template>
  124. <style lang="scss" scoped>
  125. .navbar {
  126. display: flex;
  127. align-items: center;
  128. justify-content: space-between;
  129. height: 70px;
  130. background-color: #fff;
  131. box-shadow: 0 0 1px #0003;
  132. .setting-container {
  133. display: flex;
  134. align-items: center;
  135. .setting-item {
  136. display: inline-block;
  137. width: 30px;
  138. height: 70px;
  139. line-height: 70px;
  140. color: #5a5e66;
  141. text-align: center;
  142. cursor: pointer;
  143. &:hover {
  144. background: rgb(249 250 251 / 100%);
  145. }
  146. }
  147. }
  148. .el-select {
  149. padding: 15px 0;
  150. margin-left: 12px;
  151. }
  152. .avatar-container {
  153. display: flex;
  154. align-items: center;
  155. justify-items: center;
  156. margin: 0 20px 0 0;
  157. cursor: pointer;
  158. img {
  159. width: 40px;
  160. height: 40px;
  161. border-radius: 20px;
  162. }
  163. span {
  164. margin-left: 12px;
  165. font-size: 16px;
  166. color: #494949;
  167. &.spl {
  168. margin: 0 12px 0 12px;
  169. color: #d7d8d8;
  170. }
  171. }
  172. }
  173. .svg-icon {
  174. margin-bottom: -2px;
  175. }
  176. }
  177. </style>