feat: ✨ 新增路由守卫

This commit is contained in:
何嘉悦
2025-05-25 18:06:09 +08:00
parent 16b59d6ab2
commit f4d078ca07
52 changed files with 928 additions and 282 deletions
+12
View File
@@ -0,0 +1,12 @@
import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
const store = createPinia();
store.use(piniaPluginPersistedstate);
export default store;
// export * from './modules/chat';
export * from './modules/design';
export * from './modules/user';
+18
View File
@@ -0,0 +1,18 @@
import { defineStore } from 'pinia';
// 权限状态管理
export const useAuthStore = defineStore('auth', () => {
// 权限菜单列表
const authMenuList = ref<any[]>([]);
// 请求权限菜单列表
const requestAuthMenuList = async () => {
// const res = await initDynamicRouter();
authMenuList.value = [];
};
return {
authMenuList,
requestAuthMenuList,
};
});
+43
View File
@@ -0,0 +1,43 @@
import type { ChatMessageVo } from '@/api/chat/types';
import { defineStore } from 'pinia';
import { getChatList } from '@/api/chat';
import { useUserStore } from './user';
export const useChatStore = defineStore('chat', () => {
const userStore = useUserStore();
const chatMap = ref<Record<number, ChatMessageVo[]>>({});
const setChatMap = (id: number, data: ChatMessageVo[]) => {
chatMap.value[id] = data;
};
const requestChatList = async (sessionId: number) => {
try {
const res = await getChatList({
sessionId,
userId: userStore.userInfo?.userId as number,
});
if (res.rows) {
setChatMap(sessionId, res.rows);
}
}
catch (error) {
console.error('getChatList:', error);
}
};
// 是否开启深度思考
const isDeepThinking = ref<boolean>(false);
const setDeepThinking = (value: boolean) => {
isDeepThinking.value = value;
};
return {
chatMap,
requestChatList,
isDeepThinking,
setDeepThinking,
};
});
+102
View File
@@ -0,0 +1,102 @@
import type { CollapseType, LayoutType } from '@/config/design';
import { defineStore } from 'pinia';
import designSetting from '@/config/design';
const {
darkMode: reDarkMode,
themeColor,
themeColorList,
isPageAnimate,
pageAnimateType: rePageAnimateType,
layout: reLayout,
collapseType: reCollapseType,
isCollapse: reisCollapse,
isSafeAreaHover: reisSafeAreaHover,
hasActivatedHover: rehasActivatedHover,
} = designSetting;
export const useDesignStore = defineStore(
'design',
() => {
const darkMode = ref(reDarkMode);
const setDarkMode = (modeType: 'light' | 'dark' | 'inverted') => {
darkMode.value = modeType;
};
const pageAnimateType = ref(rePageAnimateType);
const setPageAnimateType = (type: string) => {
pageAnimateType.value = type;
};
const layout = ref<LayoutType>(reLayout);
// 当前只有一个布局,暂时不将这个方法暴露出去
// const _setLayout = (layoutType: 'vertical') => {
// layout.value = layoutType;
// };
// 折叠状态
const collapseType = ref<CollapseType>(reCollapseType);
const setCollapseType = (type: CollapseType) => {
collapseType.value = type;
};
// 最终是否展开左侧菜单
const isCollapse = ref<boolean>(reisCollapse);
const setCollapse = (collapseFinal: boolean) => {
isCollapse.value = collapseFinal;
};
// 折叠按钮是否被悬停
const isSafeAreaHover = ref<boolean>(reisSafeAreaHover);
const setSafeAreaHover = (hover: boolean) => {
isSafeAreaHover.value = hover;
};
// 跟踪是否首次激活悬停
const hasActivatedHover = ref<boolean>(rehasActivatedHover);
// 两个监听不要合并
watch(
() => isCollapse.value,
(newValue) => {
if (newValue) {
hasActivatedHover.value = false;
}
},
{ deep: true },
);
watch(
() => isSafeAreaHover.value,
() => {
hasActivatedHover.value = true;
},
{ deep: true },
);
return {
darkMode,
setDarkMode,
themeColor: ref(themeColor),
themeColorList: ref(themeColorList),
isPageAnimate: ref(isPageAnimate),
pageAnimateType,
setPageAnimateType,
layout,
collapseType,
setCollapseType,
isCollapse,
setCollapse,
isSafeAreaHover,
setSafeAreaHover,
hasActivatedHover,
};
},
{
persist: true,
},
);
+32
View File
@@ -0,0 +1,32 @@
import { defineStore } from 'pinia';
export const useKeepAliveStore = defineStore(
'keep-alive',
() => {
const keepAliveName = ref<string[]>([]);
const addKeepAliveName = (name: string) => {
if (!keepAliveName.value.includes(name)) {
keepAliveName.value.push(name);
}
};
const removeKeepAliveName = (name: string) => {
keepAliveName.value = keepAliveName.value.filter(item => item !== name);
};
const setKeepAliveName = (name: string[]) => {
keepAliveName.value = name;
};
return {
keepAliveName,
addKeepAliveName,
removeKeepAliveName,
setKeepAliveName,
};
},
{
persist: true,
},
);
+69
View File
@@ -0,0 +1,69 @@
import type { CreateSessionDTO } from '@/api/session/types';
import { defineStore } from 'pinia';
import { useRouter } from 'vue-router';
import { createSession, getSessionList } from '@/api/session';
import { useUserStore } from './user';
export const useSessionStore = defineStore('session', () => {
const router = useRouter();
const userStore = useUserStore();
const sessionList = ref<CreateSessionDTO[]>([]);
// 单独点击创建新对话按钮
const createSessionBtn = async () => {
try {
// 直接回到首页
router.replace({ name: 'chat' });
}
catch (error) {
console.error('createSessionBtn:', error);
}
};
// 发送消息后,创建对话
const createSessionList = async (data: CreateSessionDTO) => {
try {
const res = await createSession(data);
localStorage.setItem('chatContent', data.sessionContent);
router.replace({
name: 'chatWithId',
params: {
id: `${res.data}`,
},
});
}
catch (error) {
console.error('createSession:', error);
}
};
// 获取会话列表
const requestSessionList = async () => {
try {
const res = await getSessionList({
userId: userStore.userInfo?.userId as number,
});
if (res.rows) {
sessionList.value = (res.rows || []).map(item => ({
...item,
// 提供默认值
remark: item.remark || '',
sessionContent: item.sessionContent || '',
sessionTitle: item.sessionTitle || '',
userId: item.userId || -1,
}));
}
}
catch (error) {
console.error('getSessionList:', error);
}
};
return {
sessionList,
createSessionBtn,
createSessionList,
requestSessionList,
};
});
+62
View File
@@ -0,0 +1,62 @@
import type { LoginUser } from '@/api/auth/types';
import { defineStore } from 'pinia';
import { useRouter } from 'vue-router';
export const useUserStore = defineStore(
'user',
() => {
const token = ref<string>();
const router = useRouter();
const setToken = (value: string) => {
token.value = value;
};
const clearToken = () => {
token.value = void 0;
};
const userInfo = ref<LoginUser>();
const setUserInfo = (value: LoginUser) => {
userInfo.value = value;
};
const clearUserInfo = () => {
userInfo.value = void 0;
};
const logout = async () => {
// 如果需要调用接口,可以在这里调用
clearToken();
clearUserInfo();
router.replace({ name: 'chat' });
};
// 新增:登录弹框状态
const isLoginDialogVisible = ref(false);
// 新增:打开弹框方法
const openLoginDialog = () => {
isLoginDialogVisible.value = true;
};
// 新增:关闭弹框方法(可根据需求扩展)
const closeLoginDialog = () => {
isLoginDialogVisible.value = false;
};
return {
token,
setToken,
clearToken,
userInfo,
setUserInfo,
clearUserInfo,
logout,
// 新增:暴露弹框状态和方法
isLoginDialogVisible,
openLoginDialog,
closeLoginDialog,
};
},
{
persist: true,
},
);