fix: 修改了退出登录的逻辑,在登录和刷新页面时会重载路由、修改了初始化项目加载动画的逻辑

This commit is contained in:
WANGFAN\wangf 2025-01-12 16:16:50 +08:00
parent 371b86a3dc
commit 9cf79cb079
12 changed files with 357 additions and 320 deletions

View File

@ -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
View 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%;
}
}

View File

@ -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>

View File

@ -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 {

View File

@ -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>

View File

@ -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({
* 1token * 1token
* 2token * 2token
* 3tokenhome页 * 3tokenhome页
* 4token * 4token
* *
* 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 {
// 处理外链跳转 // 处理外链跳转

View File

@ -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;

View File

@ -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>

View File

@ -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>

View File

@ -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>