feat: ✨ 新增路由守卫
This commit is contained in:
@@ -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';
|
||||
@@ -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,
|
||||
};
|
||||
});
|
||||
@@ -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,
|
||||
};
|
||||
});
|
||||
@@ -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,
|
||||
},
|
||||
);
|
||||
@@ -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,
|
||||
},
|
||||
);
|
||||
@@ -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,
|
||||
};
|
||||
});
|
||||
@@ -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,
|
||||
},
|
||||
);
|
||||
Reference in New Issue
Block a user