diff --git a/src/router/index.js b/src/router/index.js index 4f575d8..3bfcc6f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -29,10 +29,15 @@ const router = createRouter({ routes }) -// 路由守卫 +// 路由守卫:检查 token router.beforeEach((to, from, next) => { - // 暂时禁用登录验证 - next() + if (to.meta.requiresAuth && !localStorage.getItem('token')) { + next('/login') + } else if (to.path === '/login' && localStorage.getItem('token')) { + next('/') + } else { + next() + } }) export default router diff --git a/src/utils/api.js b/src/utils/api.js new file mode 100644 index 0000000..82a2f10 --- /dev/null +++ b/src/utils/api.js @@ -0,0 +1,37 @@ +/** + * 封装 axios,自动附加 Authorization header + * 所有需要鉴权的 API 请求统一走这里 + */ +import axios from 'axios' + +const api = axios.create({ + baseURL: '/api', + timeout: 15000 +}) + +// 请求拦截器:自动附加 token +api.interceptors.request.use( + (config) => { + const token = localStorage.getItem('token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config + }, + (error) => Promise.reject(error) +) + +// 响应拦截器:token 过期则跳转登录 +api.interceptors.response.use( + (response) => response, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('token') + localStorage.removeItem('riderInfo') + window.location.href = '/login' + } + return Promise.reject(error) + } +) + +export default api diff --git a/src/views/Applications.vue b/src/views/Applications.vue index b713d09..4be5042 100644 --- a/src/views/Applications.vue +++ b/src/views/Applications.vue @@ -80,7 +80,7 @@ diff --git a/src/views/Orders.vue b/src/views/Orders.vue index 586c89f..b00ec3c 100644 --- a/src/views/Orders.vue +++ b/src/views/Orders.vue @@ -126,7 +126,7 @@