fix: 修改了退出登录的逻辑,在登录和刷新页面时会重载路由、修改了初始化项目加载动画的逻辑
This commit is contained in:
parent
371b86a3dc
commit
9cf79cb079
@ -4,10 +4,15 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/src/assets/logo/snow.svg" />
|
<link rel="icon" type="image/svg+xml" href="/src/assets/logo/snow.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<link rel="stylesheet" href="/css/loading.css" type="text/css" />
|
||||||
<title><%= title %></title>
|
<title><%= title %></title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app">
|
||||||
|
<div class="init-page">
|
||||||
|
<div class="snow-loader"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<script type="module" src="/src/main.ts"></script>
|
<script type="module" src="/src/main.ts"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
61
public/css/loading.css
Normal file
61
public/css/loading.css
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.init-page {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
/* HTML: <div class="snow-loader"></div> */
|
||||||
|
.snow-loader {
|
||||||
|
width: 45px;
|
||||||
|
aspect-ratio: 1;
|
||||||
|
|
||||||
|
--c: no-repeat linear-gradient(rgb(22, 93, 255) 0 0);
|
||||||
|
|
||||||
|
background:
|
||||||
|
var(--c) 0% 50%,
|
||||||
|
var(--c) 50% 50%,
|
||||||
|
var(--c) 100% 50%;
|
||||||
|
background-size: 20% 100%;
|
||||||
|
animation: l1 1s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes l1 {
|
||||||
|
0% {
|
||||||
|
background-size:
|
||||||
|
20% 100%,
|
||||||
|
20% 100%,
|
||||||
|
20% 100%;
|
||||||
|
}
|
||||||
|
33% {
|
||||||
|
background-size:
|
||||||
|
20% 10%,
|
||||||
|
20% 100%,
|
||||||
|
20% 100%;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
background-size:
|
||||||
|
20% 100%,
|
||||||
|
20% 10%,
|
||||||
|
20% 100%;
|
||||||
|
}
|
||||||
|
66% {
|
||||||
|
background-size:
|
||||||
|
20% 100%,
|
||||||
|
20% 100%,
|
||||||
|
20% 10%;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
background-size:
|
||||||
|
20% 100%,
|
||||||
|
20% 100%,
|
||||||
|
20% 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,7 +5,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { loadingPage } from "@/utils/loading-page";
|
|
||||||
import { useThemeMethods } from "@/hooks/useThemeMethods";
|
import { useThemeMethods } from "@/hooks/useThemeMethods";
|
||||||
|
|
||||||
// 初始化主题
|
// 初始化主题
|
||||||
@ -14,12 +13,6 @@ const onTheme = () => {
|
|||||||
initTheme();
|
initTheme();
|
||||||
};
|
};
|
||||||
onTheme();
|
onTheme();
|
||||||
|
|
||||||
// 加载动画
|
|
||||||
loadingPage.start();
|
|
||||||
onMounted(() => {
|
|
||||||
loadingPage.done(200);
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|||||||
@ -112,7 +112,6 @@ import { useI18n } from "vue-i18n";
|
|||||||
import { Modal } from "@arco-design/web-vue";
|
import { Modal } from "@arco-design/web-vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { useRoutesConfigStore } from "@/store/modules/route-config";
|
|
||||||
import { useUserInfoStore } from "@/store/modules/user-info";
|
import { useUserInfoStore } from "@/store/modules/user-info";
|
||||||
import { useThemeConfig } from "@/store/modules/theme-config";
|
import { useThemeConfig } from "@/store/modules/theme-config";
|
||||||
import { useThemeMethods } from "@/hooks/useThemeMethods";
|
import { useThemeMethods } from "@/hooks/useThemeMethods";
|
||||||
@ -194,9 +193,6 @@ const logOut = () => {
|
|||||||
// 用户退出
|
// 用户退出
|
||||||
const store = useUserInfoStore();
|
const store = useUserInfoStore();
|
||||||
await store.logOut();
|
await store.logOut();
|
||||||
// 重置路由树
|
|
||||||
const route = useRoutesConfigStore();
|
|
||||||
await route.resetRoute();
|
|
||||||
router.replace("/login");
|
router.replace("/login");
|
||||||
return true;
|
return true;
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@ -9,7 +9,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { useThemeConfig } from "@/store/modules/theme-config";
|
import { useThemeConfig } from "@/store/modules/theme-config";
|
||||||
import { loadingPage } from "@/utils/loading-page";
|
|
||||||
|
|
||||||
const themeStore = useThemeConfig();
|
const themeStore = useThemeConfig();
|
||||||
const { layoutType } = storeToRefs(themeStore);
|
const { layoutType } = storeToRefs(themeStore);
|
||||||
@ -20,11 +19,6 @@ const layouts: any = {
|
|||||||
layoutHead: defineAsyncComponent(() => import("@/layout/layout-head/index.vue")),
|
layoutHead: defineAsyncComponent(() => import("@/layout/layout-head/index.vue")),
|
||||||
layoutMixing: defineAsyncComponent(() => import("@/layout/layout-mixing/index.vue"))
|
layoutMixing: defineAsyncComponent(() => import("@/layout/layout-mixing/index.vue"))
|
||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
// 页面渲染完毕,结束loading
|
|
||||||
loadingPage.done(200);
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import { storeToRefs } from "pinia";
|
|||||||
import { useUserInfoStore } from "@/store/modules/user-info";
|
import { useUserInfoStore } from "@/store/modules/user-info";
|
||||||
import { useRoutesConfigStore } from "@/store/modules/route-config";
|
import { useRoutesConfigStore } from "@/store/modules/route-config";
|
||||||
import { useRoutingMethod } from "@/hooks/useRoutingMethod";
|
import { useRoutingMethod } from "@/hooks/useRoutingMethod";
|
||||||
import { loadingPage } from "@/utils/loading-page";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建vue的路由示例
|
* 创建vue的路由示例
|
||||||
@ -32,16 +31,16 @@ const router = createRouter({
|
|||||||
* 1、去登录页,无token,放行
|
* 1、去登录页,无token,放行
|
||||||
* 2、没有token,直接重定向到登录页
|
* 2、没有token,直接重定向到登录页
|
||||||
* 3、去登录页,有token,直接重定向到home页
|
* 3、去登录页,有token,直接重定向到home页
|
||||||
* 4、去非登录页,有token,校验是否动态添加过路由,添加过则放行,未添加则执行路由初始化
|
* 4、去非登录页,有token,若是从登录页而来则重载路由,若是刷新页面则重载路由,重载后重新跳转
|
||||||
* 注意:
|
* 注意:
|
||||||
* 全局routeTree不能持久化缓存
|
* 全局routeTree不能持久化缓存
|
||||||
* 页面刷新会导致addRoute动态添加的路由失效,需要重新初始化路由
|
* 页面刷新会导致addRoute动态添加的路由失效,需要重新初始化路由
|
||||||
*/
|
*/
|
||||||
router.beforeEach(async (to, _, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
NProgress.start(); // 开启进度条
|
NProgress.start(); // 开启进度条
|
||||||
const store = useUserInfoStore(pinia);
|
const store = useUserInfoStore(pinia);
|
||||||
const { token } = storeToRefs(store);
|
const { token } = storeToRefs(store);
|
||||||
// console.log("去", to, "来自", from);
|
console.log("去", to, "来自", from);
|
||||||
// next()内部加了path等于跳转指定路由会再次触发router.beforeEach,内部无参数等于放行,不会触发router.beforeEach
|
// next()内部加了path等于跳转指定路由会再次触发router.beforeEach,内部无参数等于放行,不会触发router.beforeEach
|
||||||
if (to.path === "/login" && !token.value) {
|
if (to.path === "/login" && !token.value) {
|
||||||
// 1、去登录页,无token,放行
|
// 1、去登录页,无token,放行
|
||||||
@ -59,19 +58,22 @@ router.beforeEach(async (to, _, next) => {
|
|||||||
const routeStore = useRoutesConfigStore(pinia);
|
const routeStore = useRoutesConfigStore(pinia);
|
||||||
const { routeTree } = storeToRefs(routeStore);
|
const { routeTree } = storeToRefs(routeStore);
|
||||||
|
|
||||||
|
// 从登录页跳转过来,需要重置路由(登录后触发)
|
||||||
|
if (from.path === "/login") {
|
||||||
|
await routeStore.initSetRouter();
|
||||||
|
}
|
||||||
|
|
||||||
// 获取外链路由的处理函数
|
// 获取外链路由的处理函数
|
||||||
// 所有的路由正常放行,只不过额外判断是否是外链,如果是,则打开新窗口跳转外链
|
// 所有的路由正常放行,只不过额外判断是否是外链,如果是,则打开新窗口跳转外链
|
||||||
// 外链的页面依旧正常打开,只不过不会参与缓存与tabs显示,符合路由跳转的直觉
|
// 外链的页面依旧正常打开,只不过不会参与缓存与tabs显示,符合路由跳转的直觉
|
||||||
const { openExternalLinks } = useRoutingMethod();
|
const { openExternalLinks } = useRoutingMethod();
|
||||||
|
|
||||||
// 如果缓存的路由是0,则说明未动态添加路由,先添加再跳转
|
// 如果缓存的路由是0,则说明未动态添加路由,先添加再跳转(页面刷新时触发)
|
||||||
// 解决刷新页面404的问题
|
// 解决刷新页面404的问题
|
||||||
if (routeTree.value.length == 0) {
|
if (routeTree.value.length == 0) {
|
||||||
loadingPage.start();
|
|
||||||
await routeStore.initSetRouter();
|
await routeStore.initSetRouter();
|
||||||
// 处理外链跳转
|
// 处理外链跳转
|
||||||
openExternalLinks(to);
|
openExternalLinks(to);
|
||||||
// 处理完重新跳转
|
|
||||||
next({ path: to.path, query: to.query });
|
next({ path: to.path, query: to.query });
|
||||||
} else {
|
} else {
|
||||||
// 处理外链跳转
|
// 处理外链跳转
|
||||||
|
|||||||
@ -13,7 +13,7 @@ interface ThemeConfig {
|
|||||||
watermark: string;
|
watermark: string;
|
||||||
watermarkStyle: any;
|
watermarkStyle: any;
|
||||||
watermarkRotate: number;
|
watermarkRotate: number;
|
||||||
watermarkGap: Array<number>;
|
watermarkGap: [number, number];
|
||||||
layoutType: string;
|
layoutType: string;
|
||||||
grayMode: Boolean;
|
grayMode: Boolean;
|
||||||
colorWeakMode: Boolean;
|
colorWeakMode: Boolean;
|
||||||
|
|||||||
@ -12,16 +12,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { loadingPage } from "@/utils/loading-page";
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const onBack = () => {
|
const onBack = () => {
|
||||||
router.go(-1);
|
router.go(-1);
|
||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
loadingPage.done(200);
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@ -12,15 +12,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { loadingPage } from "@/utils/loading-page";
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const onBack = () => {
|
const onBack = () => {
|
||||||
router.go(-1);
|
router.go(-1);
|
||||||
};
|
};
|
||||||
onMounted(() => {
|
|
||||||
loadingPage.done(200);
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@ -12,7 +12,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { loadingPage } from "@/utils/loading-page";
|
|
||||||
import { Message } from "@arco-design/web-vue";
|
import { Message } from "@arco-design/web-vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@ -24,10 +23,6 @@ const onBack = () => {
|
|||||||
router.go(-1);
|
router.go(-1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
loadingPage.done(200);
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user