# API 拦截器使用说明

## 概述

本项目已集成完整的 API 请求拦截器系统，包括：

- 统一的请求/响应拦截
- Token 自动管理
- 错误处理
- 接口代理配置

## 文件结构

```
src/
├── utils/
│   ├── request.js    # axios 拦截器配置
│   └── auth.js       # Token 管理工具
├── api/
│   └── index.js      # API 接口封装
└── components/
    └── ApiExample.vue # API 使用示例
```

## 配置说明

### 1. 代理配置 (vite.config.js)

```javascript
server: {
  proxy: {
    '/api': {
      target: 'https://sit-kelamayi.4dage.com',
      changeOrigin: true,
      rewrite: (path) => path.replace(/^\/api/, '/api')
    }
  }
}
```

### 2. 需要 Token 的接口配置

在 `src/utils/request.js` 中的 `needsTokenApis` 数组中配置需要携带 token 的接口：

```javascript
const needsTokenApis = [
  '/api/user', // 用户相关接口
  '/api/booking', // 预约相关接口
  '/api/activity/register', // 活动报名
  '/api/collection', // 收藏相关接口
]
```

## API 使用方法

### 方式一：直接导入使用

```javascript
import { museumApi, userApi } from '@/api'

// 获取轮播图（不需要token）
const carouselData = await museumApi.getCarouselList({
  pageNum: 1,
  pageSize: 5,
  status: 1,
})

// 获取用户信息（需要token）
const userInfo = await userApi.getUserInfo()
```

### 方式二：使用全局 API

```javascript
// 在组件中
const { proxy } = getCurrentInstance()
const data = await proxy.$api.museumApi.getExhibitionList(params)
```

## Token 管理

### 设置 Token

```javascript
import { setToken, setUserInfo } from '@/utils/auth'

// 登录成功后
setToken(token, remember) // remember: true=localStorage, false=sessionStorage
setUserInfo(userInfo, remember)
```

### 检查登录状态

```javascript
import { isLoggedIn, getToken } from '@/utils/auth'

if (isLoggedIn()) {
  // 已登录
  const token = getToken()
}
```

### 清除认证信息

```javascript
import { clearAuth } from '@/utils/auth'

// 退出登录时
clearAuth()
```

## 接口列表

### 博物馆相关接口

- `getCarouselList(params)` - 获取轮播图列表
- `getExhibitionList(params)` - 获取展览列表
- `getExhibitionDetail(id)` - 获取展览详情
- `getActivityList(params)` - 获取活动列表
- `getActivityDetail(id)` - 获取活动详情
- `getNewsList(params)` - 获取新闻列表
- `getNewsDetail(id)` - 获取新闻详情

### 预约相关接口（需要 Token）

- `createBooking(data)` - 创建预约
- `getBookingList(params)` - 获取预约列表
- `getBookingDetail(id)` - 获取预约详情
- `cancelBooking(id)` - 取消预约

### 用户相关接口（需要 Token）

- `getUserInfo()` - 获取用户信息
- `updateUserInfo(data)` - 更新用户信息
- `changePassword(data)` - 修改密码

### 活动报名接口（需要 Token）

- `registerActivity(data)` - 报名活动
- `getRegistrationList(params)` - 获取报名列表
- `cancelRegistration(id)` - 取消报名

### 收藏相关接口（需要 Token）

- `addCollection(data)` - 添加收藏
- `removeCollection(id)` - 取消收藏
- `getCollectionList(params)` - 获取收藏列表

## 错误处理

拦截器会自动处理以下错误：

- **401/403**: 自动清除 token，提示重新登录
- **404**: 接口不存在
- **500**: 服务器错误
- **网络错误**: 网络连接失败

## 示例组件

查看 `src/components/ApiExample.vue` 了解完整的使用示例。

## 注意事项

1. **Token 自动管理**: 拦截器会自动在需要的接口中添加 Authorization 头
2. **错误统一处理**: 所有 API 错误都会被拦截器捕获并统一处理
3. **请求时间戳**: 自动为所有请求添加时间戳，防止缓存
4. **开发环境代理**: 开发时通过 Vite 代理转发到测试服务器
5. **生产环境**: 需要配置正确的 API 基础路径

## 扩展接口

如需添加新接口，请在 `src/api/index.js` 中添加：

```javascript
// 添加新的接口分类
export const newApi = {
  // 新接口方法
  getNewData: (params) => request.get('/api/new/data', { params }),
  createNewData: (data) => request.post('/api/new/data', data),
}

// 如果需要 token，在 request.js 的 needsTokenApis 中添加路径
```
