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 @@