Skip to content

Commit 89dcf52

Browse files
committed
refactor: Separate store
1 parent cf0ec05 commit 89dcf52

File tree

40 files changed

+338
-345
lines changed

40 files changed

+338
-345
lines changed

apps/web-antd/src/api/request.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import type { HttpResponse } from '@vben/request';
66
import { useAppConfig } from '@vben/hooks';
77
import { preferences } from '@vben/preferences';
88
import { RequestClient } from '@vben/request';
9+
import { useAccessStore } from '@vben/stores';
910

1011
import { message } from 'ant-design-vue';
1112

12-
import { useAccessStore } from '#/store';
13+
import { useAuthStore } from '#/store';
1314

1415
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
1516

@@ -30,13 +31,14 @@ function createRequestClient(baseURL: string) {
3031
},
3132
unAuthorizedHandler: async () => {
3233
const accessStore = useAccessStore();
34+
const authStore = useAuthStore();
3335
accessStore.setAccessToken(null);
3436

3537
if (preferences.app.loginExpiredMode === 'modal') {
36-
accessStore.openLoginExpiredModal = true;
38+
accessStore.setLoginExpired(true);
3739
} else {
3840
// 退出登录
39-
await accessStore.logout();
41+
await authStore.logout();
4042
}
4143
},
4244
};

apps/web-antd/src/bootstrap.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { createApp } from 'vue';
22

3-
import { useAccessDirective } from '@vben/access';
3+
import { registerAccessDirective } from '@vben/access';
4+
import { initStores } from '@vben/stores';
45
import '@vben/styles';
56
import '@vben/styles/antd';
67

78
import { setupI18n } from '#/locales';
8-
import { setupStore } from '#/store';
99

1010
import App from './app.vue';
1111
import { router } from './router';
@@ -17,10 +17,10 @@ async function bootstrap(namespace: string) {
1717
await setupI18n(app);
1818

1919
// 配置 pinia-tore
20-
await setupStore(app, { namespace });
20+
await initStores(app, { namespace });
2121

2222
// 安装权限指令
23-
useAccessDirective(app);
23+
registerAccessDirective(app);
2424

2525
// 配置路由及路由守卫
2626
app.use(router);

apps/web-antd/src/layouts/basic.vue

+15-12
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,17 @@ import {
1313
UserDropdown,
1414
} from '@vben/layouts';
1515
import { preferences } from '@vben/preferences';
16+
import {
17+
resetAllStores,
18+
storeToRefs,
19+
useAccessStore,
20+
useUserStore,
21+
} from '@vben/stores';
1622
import { openWindow } from '@vben/utils';
1723
1824
import { $t } from '#/locales';
1925
import { resetRoutes } from '#/router';
20-
import { resetAllStores, storeToRefs, useAccessStore } from '#/store';
26+
import { useAuthStore } from '#/store';
2127
2228
const notifications = ref<NotificationItem[]>([
2329
{
@@ -50,6 +56,9 @@ const notifications = ref<NotificationItem[]>([
5056
},
5157
]);
5258
59+
const userStore = useUserStore();
60+
const authStore = useAuthStore();
61+
const accessStore = useAccessStore();
5362
const showDot = computed(() =>
5463
notifications.value.some((item) => !item.isRead),
5564
);
@@ -84,16 +93,10 @@ const menus = computed(() => [
8493
},
8594
]);
8695
87-
const accessStore = useAccessStore();
88-
89-
const {
90-
loading: loginLoading,
91-
openLoginExpiredModal,
92-
userInfo,
93-
} = storeToRefs(accessStore);
96+
const { loginLoading } = storeToRefs(authStore);
9497
9598
const avatar = computed(() => {
96-
return userInfo.value?.avatar ?? preferences.app.defaultAvatar;
99+
return userStore.userInfo?.avatar ?? preferences.app.defaultAvatar;
97100
});
98101
99102
const router = useRouter();
@@ -119,7 +122,7 @@ function handleMakeAll() {
119122
<UserDropdown
120123
:avatar
121124
:menus
122-
:text="userInfo?.realName"
125+
:text="userStore.userInfo?.realName"
123126
description="[email protected]"
124127
tag-text="Pro"
125128
@logout="handleLogout"
@@ -135,12 +138,12 @@ function handleMakeAll() {
135138
</template>
136139
<template #extra>
137140
<AuthenticationLoginExpiredModal
138-
v-model:open="openLoginExpiredModal"
141+
v-model:open="accessStore.loginExpired"
139142
:avatar
140143
:loading="loginLoading"
141144
password-placeholder="123456"
142145
username-placeholder="vben"
143-
@submit="accessStore.authLogin"
146+
@submit="authStore.authLogin"
144147
/>
145148
</template>
146149
<template #lock-screen>

apps/web-antd/src/router/guard.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import type { Router } from 'vue-router';
22

33
import { LOGIN_PATH } from '@vben/constants';
44
import { preferences } from '@vben/preferences';
5+
import { useAccessStore, useUserStore } from '@vben/stores';
56
import { startProgress, stopProgress } from '@vben/utils';
67

78
import { useTitle } from '@vueuse/core';
89

910
import { $t } from '#/locales';
1011
import { coreRouteNames, dynamicRoutes } from '#/router/routes';
11-
import { useAccessStore } from '#/store';
12+
import { useAuthStore } from '#/store';
1213

1314
import { generateAccess } from './access';
1415

@@ -58,10 +59,11 @@ function setupCommonGuard(router: Router) {
5859
function setupAccessGuard(router: Router) {
5960
router.beforeEach(async (to, from) => {
6061
const accessStore = useAccessStore();
61-
const accessToken = accessStore.accessToken;
62+
const userStore = useUserStore();
63+
const authStore = useAuthStore();
6264

6365
// accessToken 检查
64-
if (!accessToken) {
66+
if (!accessStore.accessToken) {
6567
if (
6668
// 基本路由,这些路由不需要进入权限拦截
6769
coreRouteNames.includes(to.name as string) ||
@@ -93,8 +95,7 @@ function setupAccessGuard(router: Router) {
9395

9496
// 生成路由表
9597
// 当前登录用户拥有的角色标识列表
96-
const userInfo =
97-
accessStore.userInfo || (await accessStore.fetchUserInfo());
98+
const userInfo = userStore.userInfo || (await authStore.fetchUserInfo());
9899
const userRoles = userInfo.roles ?? [];
99100

100101
// 生成菜单和路由

apps/web-antd/src/router/index.ts

+2-29
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import type { RouteRecordName, RouteRecordRaw } from 'vue-router';
2-
31
import {
42
createRouter,
53
createWebHashHistory,
64
createWebHistory,
75
} from 'vue-router';
86

9-
import { traverseTreeValues } from '@vben/utils';
7+
import { resetStaticRoutes } from '@vben/utils';
108

119
import { createRouterGuard } from './guard';
1210
import { routes } from './routes';
@@ -26,33 +24,8 @@ const router = createRouter({
2624
// strict: true,
2725
});
2826

29-
/**
30-
* @zh_CN 重置所有路由,如有指定白名单除外
31-
*/
32-
function resetRoutes() {
33-
// 获取静态路由所有节点包含子节点的 name,并排除不存在 name 字段的路由
34-
const staticRouteNames = traverseTreeValues<
35-
RouteRecordRaw,
36-
RouteRecordName | undefined
37-
>(routes, (route) => {
38-
// 这些路由需要指定 name,防止在路由重置时,不能删除没有指定 name 的路由
39-
if (import.meta.env.DEV && !route.name) {
40-
console.warn(
41-
`The route with the path ${route.path} needs to have the field name specified.`,
42-
);
43-
}
44-
return route.name;
45-
});
27+
const resetRoutes = () => resetStaticRoutes(router, routes);
4628

47-
const { getRoutes, hasRoute, removeRoute } = router;
48-
const allRoutes = getRoutes();
49-
allRoutes.forEach(({ name }) => {
50-
// 存在于路由表且非白名单才需要删除
51-
if (name && !staticRouteNames.includes(name) && hasRoute(name)) {
52-
removeRoute(name);
53-
}
54-
});
55-
}
5629
// 创建路由守卫
5730
createRouterGuard(router);
5831

Original file line numberDiff line numberDiff line change
@@ -1,44 +1,24 @@
11
import type { LoginAndRegisterParams } from '@vben/common-ui';
2-
import type { MenuRecordRaw, UserInfo } from '@vben/types';
3-
import type { RouteRecordRaw } from 'vue-router';
2+
import type { UserInfo } from '@vben/types';
43

5-
import { computed, ref } from 'vue';
4+
import { ref } from 'vue';
65
import { useRouter } from 'vue-router';
76

87
import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants';
9-
import { resetAllStores, useCoreAccessStore } from '@vben/stores';
8+
import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores';
109

1110
import { notification } from 'ant-design-vue';
1211
import { defineStore } from 'pinia';
1312

1413
import { getAccessCodes, getUserInfo, login } from '#/api';
1514
import { $t } from '#/locales';
1615

17-
export const useAccessStore = defineStore('access', () => {
18-
const coreStoreAccess = useCoreAccessStore();
16+
export const useAuthStore = defineStore('auth', () => {
17+
const accessStore = useAccessStore();
18+
const userStore = useUserStore();
1919
const router = useRouter();
2020

21-
const loading = ref(false);
22-
23-
const openLoginExpiredModal = ref(false);
24-
25-
const accessToken = computed(() => coreStoreAccess.accessToken);
26-
const refreshToken = computed(() => coreStoreAccess.refreshToken);
27-
const userRoles = computed(() => coreStoreAccess.userRoles);
28-
const userInfo = computed(() => coreStoreAccess.userInfo);
29-
const accessRoutes = computed(() => coreStoreAccess.accessRoutes);
30-
31-
function setAccessMenus(menus: MenuRecordRaw[]) {
32-
coreStoreAccess.setAccessMenus(menus);
33-
}
34-
35-
function setAccessToken(token: null | string) {
36-
coreStoreAccess.setAccessToken(token);
37-
}
38-
39-
function setAccessRoutes(routes: RouteRecordRaw[]) {
40-
coreStoreAccess.setAccessRoutes(routes);
41-
}
21+
const loginLoading = ref(false);
4222

4323
/**
4424
* 异步处理登录操作
@@ -52,31 +32,28 @@ export const useAccessStore = defineStore('access', () => {
5232
// 异步处理用户登录操作并获取 accessToken
5333
let userInfo: null | UserInfo = null;
5434
try {
55-
loading.value = true;
35+
loginLoading.value = true;
5636
const { accessToken, refreshToken } = await login(params);
5737

5838
// 如果成功获取到 accessToken
59-
// If accessToken is successfully obtained
6039
if (accessToken) {
6140
// 将 accessToken 存储到 accessStore 中
62-
// Store the accessToken in accessStore
63-
coreStoreAccess.setAccessToken(accessToken);
64-
coreStoreAccess.setRefreshToken(refreshToken);
41+
accessStore.setAccessToken(accessToken);
42+
accessStore.setRefreshToken(refreshToken);
6543

6644
// 获取用户信息并存储到 accessStore 中
67-
// Get user information and store it in accessStore
6845
const [fetchUserInfoResult, accessCodes] = await Promise.all([
6946
fetchUserInfo(),
7047
getAccessCodes(),
7148
]);
7249

7350
userInfo = fetchUserInfoResult;
7451

75-
coreStoreAccess.setUserInfo(userInfo);
76-
coreStoreAccess.setAccessCodes(accessCodes);
52+
userStore.setUserInfo(userInfo);
53+
accessStore.setAccessCodes(accessCodes);
7754

78-
if (openLoginExpiredModal.value) {
79-
openLoginExpiredModal.value = false;
55+
if (accessStore.loginExpired) {
56+
accessStore.setLoginExpired(false);
8057
} else {
8158
onSuccess
8259
? await onSuccess?.()
@@ -92,18 +69,17 @@ export const useAccessStore = defineStore('access', () => {
9269
}
9370
}
9471
} finally {
95-
loading.value = false;
72+
loginLoading.value = false;
9673
}
9774

9875
return {
99-
accessToken,
10076
userInfo,
10177
};
10278
}
10379

10480
async function logout() {
10581
resetAllStores();
106-
openLoginExpiredModal.value = false;
82+
accessStore.setLoginExpired(false);
10783

10884
// 回登陆页带上当前路由地址
10985
await router.replace({
@@ -117,29 +93,19 @@ export const useAccessStore = defineStore('access', () => {
11793
async function fetchUserInfo() {
11894
let userInfo: null | UserInfo = null;
11995
userInfo = await getUserInfo();
120-
coreStoreAccess.setUserInfo(userInfo);
96+
userStore.setUserInfo(userInfo);
12197
return userInfo;
12298
}
12399

124100
function $reset() {
125-
loading.value = false;
126-
openLoginExpiredModal.value = false;
101+
loginLoading.value = false;
127102
}
128103

129104
return {
130105
$reset,
131-
accessRoutes,
132-
accessToken,
133106
authLogin,
134107
fetchUserInfo,
135-
loading,
108+
loginLoading,
136109
logout,
137-
openLoginExpiredModal,
138-
refreshToken,
139-
setAccessMenus,
140-
setAccessRoutes,
141-
setAccessToken,
142-
userInfo,
143-
userRoles,
144110
};
145111
});

apps/web-antd/src/store/index.ts

+1-18
Original file line numberDiff line numberDiff line change
@@ -1,18 +1 @@
1-
import type { InitStoreOptions } from '@vben/stores';
2-
3-
import type { App } from 'vue';
4-
5-
import { initStore, resetAllStores, storeToRefs } from '@vben/stores';
6-
7-
/**
8-
* @zh_CN 初始化pinia
9-
* @param app vue app 实例
10-
*/
11-
async function setupStore(app: App, options: InitStoreOptions) {
12-
const pinia = await initStore(options);
13-
app.use(pinia);
14-
}
15-
16-
export { resetAllStores, setupStore, storeToRefs };
17-
18-
export { useAccessStore } from './modules/access';
1+
export * from './auth';

0 commit comments

Comments
 (0)