123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <script setup lang="ts">
- import { storeToRefs } from "pinia";
- import { useRoute, useRouter } from "vue-router";
- import { useAppStore } from "@/store/modules/app";
- import { useTagsViewStore } from "@/store/modules/tagsView";
- import { useUserStore } from "@/store/modules/user";
- import { SchoolList } from "@/api/school/types";
- import { getSchoolSelect } from "@/api/school";
- import { watch } from "vue";
- import SvgIcon from "@/components/SvgIcon/index.vue";
- import { CaretBottom } from "@element-plus/icons-vue";
- const appStore = useAppStore();
- const tagsViewStore = useTagsViewStore();
- const userStore = useUserStore();
- const route = useRoute();
- const router = useRouter();
- const { device } = storeToRefs(appStore); // 设备类型:desktop-宽屏设备 || mobile-窄屏设备
- /**
- * 左侧菜单栏显示/隐藏
- */
- function toggleSideBar() {
- appStore.toggleSidebar(true);
- }
- /**
- * vueUse 全屏
- */
- const { isFullscreen, toggle } = useFullscreen();
- /**
- * 注销
- */
- function logout() {
- ElMessageBox.confirm("确定退出系统吗?", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- }).then(() => {
- userStore
- .logout()
- .then(() => {
- tagsViewStore.delAllViews();
- })
- .then(() => {
- router.push(`/login?redirect=${route.fullPath}`);
- });
- });
- }
- /**
- * 学校数据
- */
- const schoolData = ref<SchoolList[]>();
- const schoolId = ref(0);
- const schoolNum = ref("");
- async function getSchoolData() {
- getSchoolSelect()
- .then(({ data }) => {
- schoolData.value = data;
- if (schoolId.value == 0) {
- schoolId.value = data[0].school_id;
- schoolNum.value = data[0].num;
- userStore.changeSchool(schoolId.value, schoolNum.value);
- }
- })
- .catch((error) => {
- console.log(error);
- });
- }
- onMounted(() => {
- getSchoolData();
- });
- watch(
- () => schoolId.value,
- (newValue, oldValue) => {
- let num: string = "";
- schoolData.value?.some((school) => {
- if (newValue == school.school_id) {
- num = school.num;
- return true;
- }
- });
- //console.log("school", newValue, num);
- userStore.changeSchool(newValue, num);
- }
- );
- </script>
- <template>
- <!-- 顶部导航栏 -->
- <div class="navbar">
- <!-- 左侧面包屑 -->
- <div class="flex">
- <Hamburger
- :is-active="appStore.sidebar.opened"
- @toggle-click="toggleSideBar"
- />
- <Breadcrumb />
- </div>
- <!-- 右侧导航设置 -->
- <div class="flex">
- <!-- 导航栏设置(窄屏隐藏)-->
- <div v-if="device !== 'mobile'" class="setting-container">
- <!--全屏 -->
- <div class="setting-item" @click="toggle">
- <svg-icon
- :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
- size="16px"
- />
- </div>
- </div>
- <!-- 学校选择下拉框 -->
- <div class="nav-select">
- <el-select
- v-model="schoolId"
- size="large"
- placeholder="请选择学校"
- :suffix-icon="CaretBottom"
- >
- <el-option
- v-for="item in schoolData"
- :key="item.school_id"
- :label="item.name"
- :value="item.school_id"
- />
- </el-select>
- </div>
- <!-- 用户头像 -->
- <div class="avatar-container">
- <span>学校编码:{{ userStore.schoolNum }}</span>
- <span class="spl">|</span>
- <img src="../../assets/login/avatar.png" alt="头像" />
- <span class="">{{ userStore.nickname + " " + userStore.phone }}</span>
- <span @click="logout"
- ><svg-icon icon-class="exit" color="#006eff" size="20px"
- /></span>
- </div>
- </div>
- </div>
- </template>
- <style lang="scss" scoped>
- .navbar {
- display: flex;
- align-items: center;
- justify-content: space-between;
- height: 70px;
- background-color: #fff;
- box-shadow: 0 0 1px #0003;
- .setting-container {
- display: flex;
- align-items: center;
- .setting-item {
- display: inline-block;
- width: 30px;
- height: 70px;
- line-height: 70px;
- color: #5a5e66;
- text-align: center;
- cursor: pointer;
- &:hover {
- background: rgb(249 250 251 / 100%);
- }
- }
- }
- .avatar-container {
- display: flex;
- align-items: center;
- justify-items: center;
- margin: 0 20px 0 0;
- cursor: pointer;
- img {
- width: 40px;
- height: 40px;
- line-height: 40px;
- text-align: center;
- border-radius: 20px;
- background: #494949;
- }
- span {
- margin-left: 12px;
- font-size: 16px;
- color: #494949;
- &.spl {
- margin: 0 12px 0 12px;
- color: #d7d8d8;
- }
- }
- }
- .svg-icon {
- margin-bottom: -2px;
- }
- .el-select {
- padding: 15px 0;
- width: 280px;
- margin-left: 12px;
- }
- }
- /* 自定义 el-select 样式 */
- :deep(.el-input__wrapper) {
- background: #efefef;
- border-radius: 12px;
- }
- /* el-select 各种边框线隐藏**/
- :deep(.el-select) {
- --el-select-input-focus-border-color: none !important;
- }
- :deep(.el-input__wrapper) {
- box-shadow: none !important;
- }
- :deep(.el-select .el-input.is-focus .el-input__wrapper) {
- box-shadow: none !important;
- }
- :deep(.el-select .el-input__wrapper.is-focus) {
- box-shadow: none !important;
- }
- :deep(.el-select:hover:not(.el-select--disabled) .el-input__wrapper) {
- box-shadow: none !important;
- }
- //移动端兼容
- .mobile {
- .navbar {
- .nav-select {
- position: absolute;
- left: 0;
- top: 80px;
- z-index: 1;
- width: 100%;
- box-sizing: border-box;
- padding: 0 24px;
- .el-select {
- width: 100%;
- padding: 0;
- margin: 0;
- }
- :deep(.el-input__wrapper) {
- background: #ffffff;
- }
- }
- }
- }
- </style>
|