You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
435 lines
10 KiB
435 lines
10 KiB
|
2 weeks ago
|
# ✨ API 集成完成!完整总结
|
||
|
|
|
||
|
|
## 🎉 已为你完成的工作
|
||
|
|
|
||
|
|
### 1. ✅ Axios 配置文件 (`src/api/index.ts`)
|
||
|
|
|
||
|
|
完整的 HTTP 客户端配置,包括:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
✓ axios 实例创建
|
||
|
|
✓ 请求拦截器 - 自动添加 Authorization header
|
||
|
|
✓ 响应拦截器 - 自动解析响应、处理错误
|
||
|
|
✓ Token 过期处理 - 自动清除并跳转登录
|
||
|
|
✓ 环境变量支持 - 开发/生产不同 API 地址
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. ✅ API 服务层 (`src/api/auth.ts`)
|
||
|
|
|
||
|
|
完整的登录 API 接口定义,包括:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
✓ 类型定义 (TypeScript)
|
||
|
|
✓ loginApi() - 登录接口
|
||
|
|
✓ logoutApi() - 登出接口
|
||
|
|
✓ getUserInfoApi() - 获取用户信息
|
||
|
|
✓ refreshTokenApi() - 刷新 token
|
||
|
|
✓ 详细的 JSDoc 注释
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. ✅ 认证 Store 更新 (`src/stores/auth.ts`)
|
||
|
|
|
||
|
|
集成后端 API 的状态管理:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
✓ async login() - 调用真实 API
|
||
|
|
✓ async logout() - 调用登出 API
|
||
|
|
✓ setUser() - 更新用户信息
|
||
|
|
✓ localStorage 持久化
|
||
|
|
✓ 错误处理
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. ✅ 登录页面更新 (`src/views/LoginView.vue`)
|
||
|
|
|
||
|
|
支持异步 API 调用的登录页面:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
✓ async handleLogin()
|
||
|
|
✓ 加载状态管理
|
||
|
|
✓ 错误处理和提示
|
||
|
|
✓ 回车键提交
|
||
|
|
✓ 完整的错误消息
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. ✅ 环境配置文件
|
||
|
|
|
||
|
|
```
|
||
|
|
✓ .env.development - 开发环境 API 地址
|
||
|
|
✓ .env.production - 生产环境 API 地址
|
||
|
|
✓ .env.local - 本地覆盖配置
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6. ✅ 完整的文档
|
||
|
|
|
||
|
|
```
|
||
|
|
✓ API_INTEGRATION_GUIDE.md - 详细集成指南
|
||
|
|
✓ BACKEND_API_EXAMPLE.md - 后端实现参考 (Node.js/Python)
|
||
|
|
✓ API_INTEGRATION_COMPLETE.md - 完整工作流程说明
|
||
|
|
✓ API_QUICK_REFERENCE.md - 快速参考卡片
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📂 项目结构
|
||
|
|
|
||
|
|
```
|
||
|
|
src/
|
||
|
|
├── api/
|
||
|
|
│ ├── index.ts ← axios 实例 + 拦截器
|
||
|
|
│ └── auth.ts ← 登录 API 接口定义 ← 可在这里添加更多 API
|
||
|
|
├── stores/
|
||
|
|
│ ├── auth.ts ← 认证状态管理(已与 API 集成)
|
||
|
|
│ └── counter.ts
|
||
|
|
├── views/
|
||
|
|
│ ├── LoginView.vue ← 登录页面(已支持异步 API)
|
||
|
|
│ ├── AdminLayout.vue
|
||
|
|
│ └── admin/
|
||
|
|
│ ├── DashboardView.vue
|
||
|
|
│ ├── UsersView.vue
|
||
|
|
│ ├── ProductsView.vue
|
||
|
|
│ ├── OrdersView.vue
|
||
|
|
│ └── SettingsView.vue
|
||
|
|
├── components/
|
||
|
|
│ ├── Header.vue
|
||
|
|
│ ├── Sidebar.vue
|
||
|
|
│ └── ...
|
||
|
|
├── router/
|
||
|
|
│ └── index.ts
|
||
|
|
├── main.ts
|
||
|
|
└── App.vue
|
||
|
|
|
||
|
|
root/
|
||
|
|
├── .env.development ← 开发环境配置
|
||
|
|
├── .env.production ← 生产环境配置
|
||
|
|
├── .env.local ← 本地覆盖
|
||
|
|
├── API_INTEGRATION_GUIDE.md ← 详细教程
|
||
|
|
├── BACKEND_API_EXAMPLE.md ← 后端代码示例
|
||
|
|
├── API_INTEGRATION_COMPLETE.md ← 完整说明
|
||
|
|
└── API_QUICK_REFERENCE.md ← 快速参考
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🔄 完整工作流
|
||
|
|
|
||
|
|
### 前端流程
|
||
|
|
|
||
|
|
```
|
||
|
|
1️⃣ 用户在登录页输入用户名和密码
|
||
|
|
└─> username.value = 'admin'
|
||
|
|
└─> password.value = '123456'
|
||
|
|
|
||
|
|
2️⃣ 点击"登录"按钮
|
||
|
|
└─> handleLogin() 被调用
|
||
|
|
|
||
|
|
3️⃣ 登录方法开始
|
||
|
|
└─> loading.value = true
|
||
|
|
└─> authStore.login(username, password) 被调用
|
||
|
|
|
||
|
|
4️⃣ Store 中的登录方法
|
||
|
|
└─> loginApi({ username, password }) 被调用
|
||
|
|
└─> 返回 Promise
|
||
|
|
|
||
|
|
5️⃣ API 函数
|
||
|
|
└─> http.post('/auth/login', { username, password })
|
||
|
|
└─> 返回 Promise
|
||
|
|
|
||
|
|
6️⃣ Axios 请求拦截器
|
||
|
|
└─> 检查 localStorage 中是否有 auth_token
|
||
|
|
└─> 如果有,添加 Authorization: Bearer <token>
|
||
|
|
└─> 发送 HTTP 请求
|
||
|
|
|
||
|
|
7️⃣ HTTP 请求发送到后端
|
||
|
|
└─> POST http://localhost:3000/api/auth/login
|
||
|
|
└─> Content-Type: application/json
|
||
|
|
└─> Body: { "username": "admin", "password": "123456" }
|
||
|
|
|
||
|
|
8️⃣ 后端处理请求
|
||
|
|
└─> 验证用户名和密码
|
||
|
|
└─> 生成 JWT token
|
||
|
|
└─> 返回 JSON 响应
|
||
|
|
|
||
|
|
9️⃣ Axios 响应拦截器
|
||
|
|
└─> 检查响应状态码
|
||
|
|
└─> 如果 401,清除 token 并跳转登录
|
||
|
|
└─> 提取 response.data 并返回
|
||
|
|
|
||
|
|
🔟 Store 接收响应
|
||
|
|
└─> 检查 response.code === 200
|
||
|
|
└─> 保存 token 和 user 到 localStorage
|
||
|
|
└─> 返回 true
|
||
|
|
|
||
|
|
1️⃣1️⃣ 组件接收结果
|
||
|
|
└─> 显示"登录成功"提示
|
||
|
|
└─> 路由跳转到 /admin/dashboard
|
||
|
|
|
||
|
|
✨ 完成!用户已登录
|
||
|
|
```
|
||
|
|
|
||
|
|
## 💻 后端需要做什么
|
||
|
|
|
||
|
|
### 最小实现示例 (Node.js Express)
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
app.post('/api/auth/login', (req, res) => {
|
||
|
|
const { username, password } = req.body
|
||
|
|
|
||
|
|
// 验证用户
|
||
|
|
if (username === 'admin' && password === '123456') {
|
||
|
|
// 生成 token (使用 JWT)
|
||
|
|
const token = jwt.sign({ id: 1, username }, 'secret')
|
||
|
|
|
||
|
|
// 返回正确格式的响应
|
||
|
|
res.json({
|
||
|
|
code: 200,
|
||
|
|
message: '登录成功',
|
||
|
|
data: {
|
||
|
|
token,
|
||
|
|
user: {
|
||
|
|
id: '1',
|
||
|
|
username: 'admin',
|
||
|
|
email: 'admin@example.com',
|
||
|
|
role: 'admin'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
} else {
|
||
|
|
res.status(401).json({
|
||
|
|
code: 401,
|
||
|
|
message: '用户名或密码错误'
|
||
|
|
})
|
||
|
|
}
|
||
|
|
})
|
||
|
|
```
|
||
|
|
|
||
|
|
### 响应格式必须严格遵守
|
||
|
|
|
||
|
|
✅ **必须返回**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"code": 200,
|
||
|
|
"message": "登录成功",
|
||
|
|
"data": {
|
||
|
|
"token": "jwt_token_here",
|
||
|
|
"user": {
|
||
|
|
"id": "1",
|
||
|
|
"username": "admin",
|
||
|
|
"email": "admin@example.com",
|
||
|
|
"role": "admin"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
❌ **不要这样返回**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"token": "...", // ❌ 缺少 code 和 message
|
||
|
|
"user": {...}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🚀 立即开始
|
||
|
|
|
||
|
|
### 第 1 步:准备后端服务
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 方案 A: 使用提供的 Node.js 示例
|
||
|
|
# 参考 BACKEND_API_EXAMPLE.md 创建 server.js
|
||
|
|
node server.js
|
||
|
|
|
||
|
|
# 方案 B: 使用你自己的后端
|
||
|
|
# 确保实现了 POST /api/auth/login 接口
|
||
|
|
# 返回上述格式的 JSON
|
||
|
|
```
|
||
|
|
|
||
|
|
### 第 2 步:配置前端 API 地址
|
||
|
|
|
||
|
|
编辑 `.env.development`(可选,因为已配置默认值):
|
||
|
|
|
||
|
|
```
|
||
|
|
VITE_API_URL=http://localhost:3000/api
|
||
|
|
```
|
||
|
|
|
||
|
|
### 第 3 步:启动前端开发服务器
|
||
|
|
|
||
|
|
```bash
|
||
|
|
npm run dev
|
||
|
|
```
|
||
|
|
|
||
|
|
### 第 4 步:测试登录
|
||
|
|
|
||
|
|
1. 访问 http://localhost:5173
|
||
|
|
2. 输入用户名和密码
|
||
|
|
3. 点击登录
|
||
|
|
4. 应该看到"登录成功"提示并跳转到仪表板
|
||
|
|
|
||
|
|
### 第 5 步:验证请求
|
||
|
|
|
||
|
|
1. 打开浏览器开发者工具 (F12)
|
||
|
|
2. 点击 Network 标签
|
||
|
|
3. 再次登录
|
||
|
|
4. 看到 POST /api/auth/login 请求
|
||
|
|
5. 点击查看请求和响应的详细信息
|
||
|
|
|
||
|
|
## 📝 代码使用示例
|
||
|
|
|
||
|
|
### 在登录页使用
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// LoginView.vue
|
||
|
|
import { useAuthStore } from '@/stores/auth'
|
||
|
|
|
||
|
|
const authStore = useAuthStore()
|
||
|
|
const success = await authStore.login('admin', '123456')
|
||
|
|
```
|
||
|
|
|
||
|
|
### 在其他组件中获取用户信息
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { useAuthStore } from '@/stores/auth'
|
||
|
|
|
||
|
|
const authStore = useAuthStore()
|
||
|
|
console.log(authStore.user) // 用户信息
|
||
|
|
console.log(authStore.token) // JWT token
|
||
|
|
console.log(authStore.isAuthenticated) // 是否已登录
|
||
|
|
```
|
||
|
|
|
||
|
|
### 创建新的 API 接口
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// src/api/users.ts
|
||
|
|
import http from './index'
|
||
|
|
|
||
|
|
export const getUsersApi = () => http.get('/users')
|
||
|
|
export const createUserApi = (data) => http.post('/users', data)
|
||
|
|
export const updateUserApi = (id, data) => http.put(`/users/${id}`, data)
|
||
|
|
export const deleteUserApi = (id) => http.delete(`/users/${id}`)
|
||
|
|
|
||
|
|
// 在组件中使用
|
||
|
|
import { getUsersApi } from '@/api/users'
|
||
|
|
const response = await getUsersApi()
|
||
|
|
```
|
||
|
|
|
||
|
|
## ✅ 完成清单
|
||
|
|
|
||
|
|
### 前端完成
|
||
|
|
- [x] Axios 配置
|
||
|
|
- [x] 请求/响应拦截器
|
||
|
|
- [x] API 服务层
|
||
|
|
- [x] 认证 Store
|
||
|
|
- [x] 登录页面
|
||
|
|
- [x] 类型定义
|
||
|
|
- [x] 环境配置
|
||
|
|
- [x] 完整文档
|
||
|
|
|
||
|
|
### 等待后端完成
|
||
|
|
- [ ] 实现 POST /api/auth/login 接口
|
||
|
|
- [ ] 返回正确的 JSON 格式
|
||
|
|
- [ ] 配置 CORS 允许前端请求
|
||
|
|
- [ ] 其他业务接口 (可选)
|
||
|
|
|
||
|
|
## 🎓 后续学习
|
||
|
|
|
||
|
|
### 添加其他 API
|
||
|
|
|
||
|
|
参考登录 API,在 `src/api/` 中创建新文件:
|
||
|
|
|
||
|
|
```
|
||
|
|
src/api/
|
||
|
|
├── index.ts # axios 实例
|
||
|
|
├── auth.ts # ✓ 已完成
|
||
|
|
├── users.ts # 待添加
|
||
|
|
├── products.ts # 待添加
|
||
|
|
├── orders.ts # 待添加
|
||
|
|
└── ...
|
||
|
|
```
|
||
|
|
|
||
|
|
### 完整的 CRUD 示例 (用户管理)
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// src/api/users.ts
|
||
|
|
import http from './index'
|
||
|
|
|
||
|
|
export interface User {
|
||
|
|
id: number
|
||
|
|
username: string
|
||
|
|
email: string
|
||
|
|
}
|
||
|
|
|
||
|
|
// 查 - Read
|
||
|
|
export const getUsersApi = (page = 1, limit = 10) =>
|
||
|
|
http.get('/users', { params: { page, limit } })
|
||
|
|
|
||
|
|
// 增 - Create
|
||
|
|
export const createUserApi = (data: User) =>
|
||
|
|
http.post('/users', data)
|
||
|
|
|
||
|
|
// 改 - Update
|
||
|
|
export const updateUserApi = (id: number, data: Partial<User>) =>
|
||
|
|
http.put(`/users/${id}`, data)
|
||
|
|
|
||
|
|
// 删 - Delete
|
||
|
|
export const deleteUserApi = (id: number) =>
|
||
|
|
http.delete(`/users/${id}`)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🔍 调试技巧
|
||
|
|
|
||
|
|
### 查看请求和响应
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// 在 api/index.ts 中添加日志
|
||
|
|
instance.interceptors.request.use((config) => {
|
||
|
|
console.log('📤 发送请求:', config.method?.toUpperCase(), config.url)
|
||
|
|
console.log('数据:', config.data)
|
||
|
|
return config
|
||
|
|
})
|
||
|
|
|
||
|
|
instance.interceptors.response.use((response) => {
|
||
|
|
console.log('📥 收到响应:', response)
|
||
|
|
return response
|
||
|
|
})
|
||
|
|
```
|
||
|
|
|
||
|
|
### 检查 localStorage
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// 在浏览器控制台执行
|
||
|
|
localStorage.getItem('auth_token') // 查看 token
|
||
|
|
localStorage.getItem('user') // 查看用户信息
|
||
|
|
```
|
||
|
|
|
||
|
|
### 测试 API 接口
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 使用 curl
|
||
|
|
curl -X POST http://localhost:3000/api/auth/login \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{"username":"admin","password":"123456"}'
|
||
|
|
|
||
|
|
# 或使用 Postman/Insomnia GUI 工具
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🎉 总结
|
||
|
|
|
||
|
|
你现在拥有:
|
||
|
|
|
||
|
|
✅ **完整的前端 API 架构** - 随时可以调用后端接口
|
||
|
|
✅ **登录示例** - 展示了完整的请求/响应流程
|
||
|
|
✅ **可扩展的 API 服务层** - 轻松添加更多接口
|
||
|
|
✅ **完整的文档** - 学习和参考资料
|
||
|
|
✅ **后端代码示例** - Node.js 和 Python 实现
|
||
|
|
|
||
|
|
现在你需要做的只是:
|
||
|
|
1. 实现后端登录接口
|
||
|
|
2. 启动后端和前端
|
||
|
|
3. 测试登录功能
|
||
|
|
|
||
|
|
其他所有的 CRUD 操作都可以按照登录示例的方式进行!
|
||
|
|
|
||
|
|
祝你开发愉快!🚀
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
📚 **相关文档**
|
||
|
|
- [详细 API 集成指南](./API_INTEGRATION_GUIDE.md)
|
||
|
|
- [后端实现参考](./BACKEND_API_EXAMPLE.md)
|
||
|
|
- [快速参考卡片](./API_QUICK_REFERENCE.md)
|