Files
one-pipe-system/docs/API对接说明.md
sexygoat 222e5bb11a Initial commit: One Pipe System
完整的管理系统,包含账户管理、卡片管理、套餐管理、财务管理等功能模块。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-22 16:35:33 +08:00

344 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API 对接说明
> 更新时间: 2026-01-09
---
## ✅ 已完成的修改
### 1. 创建了认证 API 服务
**文件**: `src/api/authApi.ts`
```typescript
import { AuthService } from '@/api/authApi'
// 登录
AuthService.login({ username, password, remember })
// 获取用户信息
AuthService.getUserInfo()
// 登出
AuthService.logout()
// 刷新Token
AuthService.refreshToken(refreshToken)
```
### 2. 修改了登录逻辑
**文件**: `src/composables/useLogin.ts`
**关键修改**:
- ✅ 添加了 `USE_MOCK` 开关(第 29 行)
- ✅ 创建了 `handleRealLogin()` 真实API登录函数
- ✅ 保留了 `handleMockLogin()` Mock登录函数方便开发测试
**切换方式**:
```typescript
// 文件: src/composables/useLogin.ts 第 29 行
// 使用 Mock 数据(开发测试)
const USE_MOCK = true
// 使用真实 API生产环境
const USE_MOCK = false // ← 当前设置
```
---
## 🔌 API 接口规范
### 登录接口
**请求地址**: `POST /api/auth/login`
**请求参数**:
```typescript
{
username: string // 用户名
password: string // 密码
remember?: boolean // 是否记住密码
captcha?: string // 验证码(可选)
}
```
**响应格式**:
```typescript
{
code: number // 状态码200 成功
message: string // 消息
data: {
token: string // 访问令牌 (必需)
refreshToken?: string // 刷新令牌 (可选)
expiresIn?: number // 过期时间(秒) (可选)
userInfo: { // 用户信息 (推荐返回,避免二次请求)
id: string | number
username: string
realName: string
roles: string[] // 角色列表 ['R_SUPER', 'R_ADMIN', ...]
permissions: string[] // 权限列表 ['*:*:*', 'user:edit', ...]
avatar?: string
email?: string
phone?: string
// ... 其他用户信息
}
}
}
```
### 获取用户信息接口
**请求地址**: `GET /api/auth/userInfo`
**请求头**:
```
Authorization: Bearer {token}
```
**响应格式**:
```typescript
{
code: 200,
message: 'success',
data: {
id: string | number
username: string
realName: string
roles: string[]
permissions: string[]
avatar?: string
email?: string
phone?: string
}
}
```
---
## 🔐 权限控制说明
### 角色定义
系统预定义了以下角色(可根据需求调整):
```typescript
enum UserRole {
SUPER_ADMIN = 'R_SUPER', // 超级管理员
ADMIN = 'R_ADMIN', // 管理员
AGENT = 'R_AGENT', // 代理商
ENTERPRISE = 'R_ENTERPRISE' // 企业客户
}
```
### 权限格式
权限使用通配符格式:`模块:操作:范围`
**示例**:
- `*:*:*` - 所有权限
- `user:*:*` - 用户模块所有权限
- `user:edit:*` - 用户编辑权限
- `card:view:own` - 查看自己的卡
### 前端权限验证
**路由级权限**(在 `asyncRoutes.ts` 中配置):
```typescript
{
path: '/system/user',
meta: {
roles: ['R_SUPER', 'R_ADMIN'] // 只有超管和管理员可访问
}
}
```
**按钮级权限**(使用 `v-auth` 指令):
```vue
<el-button v-auth="'user:edit'">编辑</el-button>
```
---
## 📦 状态码规范
**推荐使用的状态码** (已在 `src/utils/http/status.ts` 定义):
```typescript
export enum ApiStatus {
success = 200, // 成功
unauthorized = 401, // 未授权
forbidden = 403, // 禁止访问
notFound = 404, // 未找到
serverError = 500 // 服务器错误
}
```
---
## 🚀 快速上手
### 1. 配置API地址
**文件**: `.env.development`
```env
# API 地址前缀
VITE_API_URL = http://your-backend-api.com
# 或者使用代理(推荐)
VITE_API_URL = /api
```
**文件**: `vite.config.ts` (如果使用代理)
```typescript
server: {
proxy: {
'/api': {
target: 'http://your-backend-api.com', // 后端地址
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}
```
### 2. 切换到真实API
**文件**: `src/composables/useLogin.ts` 第 29 行
```typescript
const USE_MOCK = false // 改为 false
```
### 3. 测试登录
1. 启动开发服务器:`npm run dev`
2. 访问登录页面:`http://localhost:3006/#/auth/login`
3. 输入后端提供的测试账号密码
4. 点击登录
---
## 🔧 调试技巧
### 1. 查看请求/响应
打开浏览器开发者工具F12→ Network 标签,查看:
- 请求URL
- 请求参数
- 响应数据
- 状态码
### 2. Mock 和真实API切换
```typescript
// src/composables/useLogin.ts
const USE_MOCK = true // 开发时使用 Mock
const USE_MOCK = false // 对接时使用真实 API
```
### 3. Token 检查
打开浏览器控制台F12→ Application → Local Storage → 查看 `user` 键:
```json
{
"isLogin": true,
"accessToken": "your-token-here",
"info": { ... }
}
```
### 4. 请求拦截器日志
**文件**: `src/utils/http/interceptors.ts`
已自动添加请求/响应日志,在控制台可以看到:
- 🚀 发送请求
- ✅ 请求成功
- ❌ 请求失败
---
## ⚠️ 常见问题
### Q1: 登录后提示"获取用户角色失败"
**原因**: 后端返回的用户信息中没有 `roles` 字段
**解决**:
1. 确保后端返回的 `userInfo.roles` 是数组
2. 至少包含一个角色,如:`["R_ADMIN"]`
### Q2: 登录成功但页面一直转圈
**原因**: 路由守卫中没有通过权限验证
**解决**:
1. 检查用户信息中是否有 `roles` 字段
2. 临时开启开发模式跳过权限验证(见下文)
### Q3: 如何临时跳过权限验证?
**文件**: `src/router/guards/beforeEach.ts` 第 28 行
```typescript
const DEV_MODE_SKIP_AUTH = true // 改为 true跳过所有权限验证
```
### Q4: Token 过期如何处理?
系统已自动处理 Token 过期:
1. 检测到 401 状态码自动跳转登录页
2. 可实现自动刷新 Token需要后端支持
---
## 📝 后端接口开发建议
### 1. 登录接口返回完整用户信息
避免前端登录后再次调用获取用户信息接口,减少请求次数。
### 2. 用户信息必须包含 roles
```json
{
"roles": ["R_ADMIN", "R_USER"] // 必须
}
```
### 3. 支持 Token 刷新机制
```typescript
// 刷新Token接口
POST /api/auth/refresh
{
"refreshToken": "refresh-token-here"
}
```
### 4. 统一响应格式
```typescript
{
code: 200,
message: "success",
data: { ... }
}
```
---
## ✨ 下一步
1. ✅ 后端提供测试环境API地址
2. ✅ 配置 `VITE_API_URL` 或代理
3. ✅ 切换 `USE_MOCK = false`
4. ✅ 测试登录功能
5. ✅ 根据实际API调整请求/响应格式
6. ✅ 完善其他业务接口
---
**联系支持**:
- 前端问题:查看本文档或项目 README
- 后端对接:与后端开发人员沟通接口格式
祝对接顺利!🚀