New file |
| | |
| | | <template> |
| | | <page> |
| | | <div class="contentBox"> |
| | | <div class="breadcrumbBox"> |
| | | <span>位置:</span> |
| | | <el-breadcrumb :separator-icon="ArrowRight"> |
| | | <el-breadcrumb-item>个人中心</el-breadcrumb-item> |
| | | <el-breadcrumb-item>{{ label }}</el-breadcrumb-item> |
| | | </el-breadcrumb> |
| | | </div> |
| | | <el-divider /> |
| | | <div class="personalPage clear"> |
| | | <div class="leftList fl"> |
| | | <ul class="menu"> |
| | | <li |
| | | v-for="item in listMenu" |
| | | :key="item.key" |
| | | @click="goRouter(item)" |
| | | :class="`/${item.path}` === path ? 'activeItem hover' : 'menuItem hover'" |
| | | > |
| | | <span |
| | | :style="{ |
| | | fill: `/${item.path}` === path ? '#fff' : '#000', |
| | | }" |
| | | v-html="item.icon" |
| | | > |
| | | </span> |
| | | <span>{{ item.label }}</span> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | <div class="rightContent"> |
| | | <div> |
| | | <!-- 让主体做子路由的显示 --> |
| | | <router-view /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </page> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { ArrowRight } from "@element-plus/icons-vue"; |
| | | import { menu } from "./config.ts"; |
| | | import { useRouter, onBeforeRouteUpdate } from "vue-router"; |
| | | import { ref, onMounted, inject } from "vue"; |
| | | const router = useRouter(); |
| | | const routerVal = router.currentRoute.value; |
| | | const path = ref(routerVal.path); |
| | | const label = ref(""); |
| | | const listMenu: any = ref([]); |
| | | const MG: any = inject("MG"); |
| | | const config: any = inject("config"); |
| | | onBeforeRouteUpdate(async (to, from) => { |
| | | path.value = to.fullPath; |
| | | }); |
| | | onMounted(() => { |
| | | menu.forEach((item) => { |
| | | if ("/" + item.path === path.value) { |
| | | label.value = item.label; |
| | | } |
| | | }); |
| | | const userCache: any = localStorage.getItem(config.userInfoKey); |
| | | const userInfo = JSON.parse(userCache); |
| | | if (!userInfo) { |
| | | router.push({ |
| | | path: "/", |
| | | }); |
| | | return false; |
| | | } |
| | | if (userInfo.role == "Teacher") { |
| | | const data: any = menu.filter((item) => item.path != "myClass"); |
| | | listMenu.value = data; |
| | | } else { |
| | | const data: any = menu.filter((item) => item.path != "myCourse"); |
| | | listMenu.value = data; |
| | | } |
| | | }); |
| | | const goRouter = (item: any) => { |
| | | if ( |
| | | !localStorage.getItem(config.tokenKey) || |
| | | localStorage.getItem(config.tokenKey) == null |
| | | ) { |
| | | router.push({ |
| | | path: "/home", |
| | | query: { |
| | | showLogin: "1", |
| | | }, |
| | | }); |
| | | } else { |
| | | label.value = item.label; |
| | | router.push({ path: item.path }); |
| | | } |
| | | }; |
| | | </script> |
| | | <style lang="less" scoped> |
| | | .breadcrumbBox { |
| | | display: flex; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .personalPage { |
| | | padding: 20px 10px; |
| | | display: flex; |
| | | |
| | | .leftList { |
| | | width: 275px; |
| | | border-radius: 10px 10px 10px 10px; |
| | | background: #e1ebe3; |
| | | height: max-content; |
| | | .menu { |
| | | li { |
| | | height: 50px; |
| | | padding: 10px 40px; |
| | | font-size: 16px; |
| | | display: flex; |
| | | align-items: center; |
| | | border-bottom: 1px solid #ffffff; |
| | | |
| | | img { |
| | | width: 19px; |
| | | height: 24px; |
| | | } |
| | | |
| | | span { |
| | | margin-left: 10px; |
| | | } |
| | | } |
| | | |
| | | .activeItem { |
| | | background: linear-gradient(90deg, #019e58 0%, #144941 100%); |
| | | background-size: 100% 100%; |
| | | color: #fff; |
| | | svg { |
| | | fill: #fff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .rightContent { |
| | | flex: 1; |
| | | overflow: auto; |
| | | margin-left: 15px; |
| | | background-color: #fff; |
| | | } |
| | | } |
| | | </style> |