feat: 路由2

This commit is contained in:
Litrix2 2024-04-09 17:57:51 +08:00
parent feb0bfc369
commit b57767a455
7 changed files with 84 additions and 41 deletions

1
components.d.ts vendored
View File

@ -13,6 +13,7 @@ declare module 'vue' {
ElCard: typeof import('element-plus/es')['ElCard']
ElCol: typeof import('element-plus/es')['ElCol']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']

View File

@ -1,15 +1,54 @@
<style scoped lang="scss">
.el-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid var(--el-border-color);
}
.title-container {
font-size: 1.2em;
}
</style>
<template>
<el-dialog></el-dialog>
<el-container>
<el-header height="50px">
<div class="logo-container">社团展示系统</div>
<div class="content">
<el-dropdown>
<el-icon :size="30"><icon-ep-avatar></icon-ep-avatar></el-icon>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item :icon="Avatar">登录/注册</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</el-header>
</el-container>
<router-view />
</template>
<style scoped lang="scss">
.el-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid var(--el-border-color);
}
.title-container {
font-size: 1.2em;
}
</style>
<script setup lang="ts">
import { useBackgroundStore } from '@/stores';
import { useRouter, useRoute } from 'vue-router';
import axios from 'axios';
import { Avatar } from '@element-plus/icons-vue';
import { onBeforeMount, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import axiosInstance from './api';
const backgroundStore = useBackgroundStore();
import { onMounted } from 'vue';
import { onBeforeMount } from 'vue';
const router = useRouter();
onBeforeMount(async () => {
router.addRoute({ path: '/', component: () => import('@/views/MainPage.vue') });
});
// onBeforeMount(async () => {
// // router.addRoute({ path: '/', component: () => import('@/views/MainPage.vue') });
// });
// onMounted(async () => {});
</script>

View File

@ -1,6 +1,19 @@
import axios from 'axios';
const instance = axios.create({
import { useUserStore } from '@/stores';
const axiosInstance = axios.create({
baseURL: 'http://wzpmc.cn:18080/'
});
//TODO 拦截器
export default instance;
axiosInstance.interceptors.request.use((config) => {
const userStore = useUserStore();
config.headers.setAuthorization(userStore.token, false);
return config;
});
axiosInstance.interceptors.response.use((response) => {
const userStore = useUserStore();
const authorization = response.headers['Set-Authorization'] as string | undefined;
if (authorization !== undefined) {
userStore.token = authorization;
}
return response;
});
export default axiosInstance;

View File

@ -1,3 +1,5 @@
import axiosInstance from '@/api';
import MainPage from '@/views/MainPage.vue';
import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router';
type Route = RouteRecordRaw;
const routes: Route[] = [];
@ -5,4 +7,15 @@ const router = createRouter({
history: createWebHistory(),
routes: routes
});
let status = false;
router.beforeEach(async (to) => {
console.log(2);
if (!status) {
const value = await axiosInstance.get('/api/user/info');
router.addRoute({ name: 'test', path: '/', component: MainPage });
status = true;
return to.fullPath;
}
return true;
});
export default router;

View File

@ -1,2 +1,3 @@
export * from './background';
export * from './2048';
export * from './user'

6
src/stores/user.ts Normal file
View File

@ -0,0 +1,6 @@
import { defineStore } from 'pinia';
import { useLocalStorage } from '@vueuse/core';
export const useUserStore = defineStore('user', () => {
const token = useLocalStorage<string | null>('token', null);
return { token };
});

View File

@ -1,34 +1,4 @@
<template>
<div class="page-root">
<el-container>
<el-header height="50px">
<div class="logo-container">社团展示系统</div>
<div class="content">
<el-dropdown>
<el-icon :size="30"><icon-ep-avatar></icon-ep-avatar></el-icon>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item :icon="Avatar">登录/注册</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<!-- <el-avatar :size="30"></el-avatar> -->
</div>
</el-header>
</el-container>
</div>
</template>
<style scoped lang="scss">
.el-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid var(--el-border-color);
}
.title-container {
font-size: 1.2em;
}
</style>
<template>test</template>
<script setup lang="ts">
import { Avatar } from '@element-plus/icons-vue';