diff --git a/frontend/.env.development b/frontend/.env.development index 87074712..132807b2 100644 --- a/frontend/.env.development +++ b/frontend/.env.development @@ -5,8 +5,8 @@ VITE_APP_ENV=development VITE_APP_TITLE=fastapi_vue3_admin # 网络请求公用地址 -VITE_API_BASE_URL=http://localhost:8001 -# VITE_API_BASE_URL=http://service.fastapiadmin.com +# VITE_API_BASE_URL=http://localhost:8001 +VITE_API_BASE_URL=http://service.fastapiadmin.com # 代理前缀 VITE_APP_BASE_API=/api/v1 diff --git a/frontend/src/components/Notification/index.vue b/frontend/src/components/Notification/index.vue index ec4e10d4..64a6e6b6 100644 --- a/frontend/src/components/Notification/index.vue +++ b/frontend/src/components/Notification/index.vue @@ -112,9 +112,7 @@ onMounted(() => { featchMyNotice(); }); -onBeforeUnmount(() => { - featchMyNotice(); -}); + diff --git a/frontend/src/enums/api/result.enum.ts b/frontend/src/enums/api/result.enum.ts index 97c50cc8..cded8df8 100644 --- a/frontend/src/enums/api/result.enum.ts +++ b/frontend/src/enums/api/result.enum.ts @@ -20,8 +20,4 @@ export const enum ResultEnum { */ ACCESS_TOKEN_INVALID = 401, - /** - * 拒绝访问 - */ - ACCESS_DENIED = 403, } diff --git a/frontend/src/plugins/permission.ts b/frontend/src/plugins/permission.ts index 3bf0722f..966d01dd 100644 --- a/frontend/src/plugins/permission.ts +++ b/frontend/src/plugins/permission.ts @@ -26,8 +26,6 @@ export function setupPermission() { // 处理已登录用户的路由访问 await handleAuthenticatedUser(to, from, next); } else { - console.log("❌ User not logged in"); - // 未登录用户的处理 if (whiteList.includes(to.path)) { next(); diff --git a/frontend/src/store/modules/permission.store.ts b/frontend/src/store/modules/permission.store.ts index dd8967bb..7b943fa2 100644 --- a/frontend/src/store/modules/permission.store.ts +++ b/frontend/src/store/modules/permission.store.ts @@ -127,11 +127,8 @@ export const usePermissionStore = defineStore("permission", () => { routesLoaded.value = true; - console.log("✅ 动态路由:", (dynamicRoutes)); return dynamicRoutes; - } catch (error) { - console.error("❌ 生成路由失败:", error); - + } catch (error: any) { // 即使失败也要设置状态,避免无限重试 routesLoaded.value = false; diff --git a/frontend/src/store/modules/user.store.ts b/frontend/src/store/modules/user.store.ts index ce803de2..2897b0f5 100644 --- a/frontend/src/store/modules/user.store.ts +++ b/frontend/src/store/modules/user.store.ts @@ -46,34 +46,16 @@ export const useUserStore = defineStore("user", { }, // 登录 - login(LoginFormData: LoginFormData) { - return new Promise((resolve, reject) => { - AuthAPI.login(LoginFormData) - .then((response) => { - // 保存记住我状态和token - this.rememberMe = LoginFormData.remember; - Auth.setTokens(response.data.data.access_token, response.data.data.refresh_token, this.rememberMe); - resolve(); - }) - .catch((error) => { - reject(error); - }); - }); + async login(LoginFormData: LoginFormData) { + const response = await AuthAPI.login(LoginFormData) + this.rememberMe = LoginFormData.remember; + Auth.setTokens(response.data.data.access_token, response.data.data.refresh_token, this.rememberMe); }, // 登出 - logout() { - return new Promise((resolve, reject) => { - AuthAPI.logout({token: Auth.getAccessToken()}) - .then(() => { - // 重置所有系统状态 - this.resetAllState(); - resolve(); - }) - .catch((error) => { - reject(error); - }); - }); + async logout() { + await AuthAPI.logout({token: Auth.getAccessToken()}); + this.resetAllState(); }, // 重置所有状态 @@ -106,7 +88,6 @@ export const useUserStore = defineStore("user", { resolve(); }) .catch((error) => { - console.log(" refreshToken 刷新失败", error); reject(error); }); }); diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index c8a2b34e..717d08a8 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -18,8 +18,7 @@ const httpRequest: AxiosInstance = axios.create({ /** * 请求拦截器 - 添加 Authorization 头 */ -httpRequest.interceptors.request.use( - (config: InternalAxiosRequestConfig) => { +httpRequest.interceptors.request.use((config: InternalAxiosRequestConfig) => { const accessToken = Auth.getAccessToken(); // 如果 Authorization 设置为 no-auth,则不携带 Token @@ -32,7 +31,6 @@ httpRequest.interceptors.request.use( return config; }, (error) => { - console.error("请求异常:", error); ElMessage.error(error); return Promise.reject(error); } @@ -41,57 +39,38 @@ httpRequest.interceptors.request.use( /** * 响应拦截器 - 统一处理响应和错误 */ -httpRequest.interceptors.response.use( - (response: AxiosResponse) => { +httpRequest.interceptors.response.use((response: AxiosResponse) => { // 如果响应是二进制流,则直接返回(用于文件下载、Excel 导出等) - if (response?.config?.responseType === "blob") { + if (response.config.responseType === "blob") { return response; } const data = response.data; // 请求成功 - if (data.code === ResultEnum.SUCCESS) { - // 只有不是 get 请求时才显示成功消息 - if (response?.config?.method?.toLowerCase() !== 'get') { - ElMessage.success(data.msg); - } - return response; - } else if (data.code === ResultEnum.ERROR) { + if (data.code != ResultEnum.SUCCESS) { + ElMessage.error(data.msg); + return Promise.reject(response); + } + return response; + }, async (error: AxiosError) => { + const data = error.response?.data; + + if (data?.status_code === ResultEnum.ACCESS_TOKEN_INVALID) { + await redirectToLogin("登录已过期,请重新登录"); + return Promise.reject(new Error(data.msg)); + } else if (data?.code === ResultEnum.ERROR) { ElMessage.error(data.msg || "请求错误"); return Promise.reject(new Error(data.msg || "请求错误")); - } else if (data.code === ResultEnum.EXCEPTION) { + } else if (data?.code === ResultEnum.EXCEPTION) { ElMessage.error(data.msg || "服务异常"); return Promise.reject(new Error(data.msg || "服务异常")); - } else { - ElMessage.error(data.msg || "请求异常"); - return Promise.reject(new Error(data.msg || "请求异常")); - } - }, - async (error: AxiosError) => { - console.error("响应异常 " + error); - - const { response } = error; - - // 网络错误或服务器无响应 - if (!response) { - ElMessage.error("网络连接失败,请检查网络设置"); - return Promise.reject(error); - } - - const { status_code, msg } = response.data as ApiResponse; - - switch (status_code) { - case ResultEnum.ACCESS_TOKEN_INVALID: - // Access Token 过期 - await redirectToLogin("登录已过期,请重新登录"); - return Promise.reject(new Error(msg || "Refresh Token Invalid")); - - default: - return Promise.reject(new Error(msg || "响应错误")); + } else { + ElMessage.error(error.message || "请求异常"); + return Promise.reject(new Error(error.message || "请求异常")); } } -); +); /** * 重定向到登录页面 @@ -110,8 +89,8 @@ async function redirectToLogin(message: string = "请重新登录"): Promise
- +
- +
- +
- -
-
- - - - 文档 -
-
- -
- - - -
- - - -
- -
-
- - -
-
- - - - 视频 -
-
- -
- -
-
@@ -86,31 +49,16 @@
- +
- +
- +
- - -
- - -
- - -
- - - - -
-
@@ -287,7 +235,7 @@ @@ -318,6 +323,7 @@ import RoleAPI from "@/api/system/role"; import DeptTree from "./components/DeptTree.vue"; import UserImport from "./components/UserImport.vue"; +import UserExport from "./components/UserExport.vue"; const appStore = useAppStore(); @@ -340,6 +346,8 @@ const roleOptions = ref(); const positionOptions = ref(); // 导入弹窗显示状态 const importDialogVisible = ref(false); +// 导出弹窗显示状态 +const exportsDialogVisible = ref(false); // 分页表单 const pageTableData = ref([]); // 详情表单 @@ -744,6 +752,13 @@ function handleExport() { }); } +// 打开导出弹窗 +function handleOpenExportsDialog() { + exportsDialogVisible.value = true; +} + + + onMounted(() => { handleQuery(); });