feat: 1. 添加axios全局路由拦截进行自动添加请求jwt。 2.重新整理路由表。 3. 文档列表新增版本差异对比。 4.菜单路由可访问列表通过对接接口返回,添加全局路由检测。
5. 修改统一认证登录和管理员登录是通过接口形式进行,存储返回的accessToken。 6. 修改交叉评查的部分样式
This commit is contained in:
@@ -0,0 +1,435 @@
|
||||
# API接口速查表
|
||||
|
||||
**版本**: v1.0
|
||||
**日期**: 2025-11-17
|
||||
**后端地址**: `http://172.16.0.55:8073`
|
||||
|
||||
---
|
||||
|
||||
## 📌 认证接口
|
||||
|
||||
### 1. 统一登录接口
|
||||
|
||||
**端点**: `POST /auth/login`
|
||||
|
||||
**支持两种方式**:
|
||||
|
||||
#### OAuth登录
|
||||
|
||||
```typescript
|
||||
POST /auth/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"userInfo": {
|
||||
"sub": "user123", // 必填
|
||||
"username": "zhangsan", // 可选
|
||||
"nickname": "张三", // 可选
|
||||
"email": "...", // 可选
|
||||
"phone_number": "...", // 可选
|
||||
"ou_id": "dept001", // 可选
|
||||
"ou_name": "技术部", // 可选
|
||||
"is_leader": false // 可选
|
||||
},
|
||||
"expiresIn": 3600, // 必填
|
||||
"area": "梅州" // 可选,仅首次创建时保存
|
||||
}
|
||||
```
|
||||
|
||||
#### 密码登录
|
||||
|
||||
```typescript
|
||||
POST /auth/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"username": "000", // 实际是sub字段
|
||||
"password": "admin06111"
|
||||
}
|
||||
```
|
||||
|
||||
**成功响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"access_token": "eyJhbGciOiJIUzI1NiIs...",
|
||||
"token_type": "Bearer",
|
||||
"expires_in": 3600,
|
||||
"user_info": {
|
||||
"user_id": "5",
|
||||
"username": "admin",
|
||||
"nick_name": "管理员",
|
||||
"email": null,
|
||||
"phone_number": null,
|
||||
"ou_id": "default",
|
||||
"ou_name": "未分配部门",
|
||||
"is_leader": true,
|
||||
"user_role": "admin",
|
||||
"sub": "000"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**失败响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"error": "用户名或密码错误"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 RBAC路由接口
|
||||
|
||||
### 2. 获取用户路由
|
||||
|
||||
**端点**: `GET /user/routes` 或 `GET /rbac/user/routes`
|
||||
|
||||
**请求头**:
|
||||
|
||||
```
|
||||
Authorization: Bearer {JWT_TOKEN}
|
||||
```
|
||||
|
||||
**响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "操作成功",
|
||||
"data": {
|
||||
"user_id": 6,
|
||||
"username": "001",
|
||||
"routes": [
|
||||
{
|
||||
"id": 1,
|
||||
"route_path": "/",
|
||||
"route_name": "Layout",
|
||||
"component": "layout/index",
|
||||
"route_title": "入口页",
|
||||
"icon": "el-icon-s-home",
|
||||
"sort_order": 1,
|
||||
"is_hidden": false,
|
||||
"is_cache": true,
|
||||
"children": [...]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 检查路由权限
|
||||
|
||||
**端点**: `GET /rbac/check-route`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```
|
||||
route_path: /system/users
|
||||
```
|
||||
|
||||
**请求头**:
|
||||
|
||||
```
|
||||
Authorization: Bearer {JWT_TOKEN}
|
||||
```
|
||||
|
||||
**响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "操作成功",
|
||||
"data": {
|
||||
"route_path": "/system/users",
|
||||
"has_access": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 清除路由缓存
|
||||
|
||||
**端点**: `POST /rbac/clear-routes-cache`
|
||||
|
||||
**请求头**:
|
||||
|
||||
```
|
||||
Authorization: Bearer {JWT_TOKEN}
|
||||
```
|
||||
|
||||
**响应**:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "操作成功",
|
||||
"data": {
|
||||
"message": "路由缓存已清除"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 PostgREST数据接口
|
||||
|
||||
### 通用规则
|
||||
|
||||
**所有数据表访问格式**:
|
||||
|
||||
```
|
||||
GET /{table_name} # 查询
|
||||
POST /{table_name} # 创建
|
||||
PATCH /{table_name}?{filter} # 更新
|
||||
DELETE /{table_name}?{filter} # 删除
|
||||
```
|
||||
|
||||
**请求头**:
|
||||
|
||||
```
|
||||
Authorization: Bearer {JWT_TOKEN}
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
### PostgREST过滤操作符
|
||||
|
||||
| 操作符 | 说明 | 示例 |
|
||||
|-------|------|------|
|
||||
| `eq` | 等于 | `id=eq.5` |
|
||||
| `neq` | 不等于 | `status=neq.1` |
|
||||
| `gt` | 大于 | `id=gt.10` |
|
||||
| `gte` | 大于等于 | `id=gte.10` |
|
||||
| `lt` | 小于 | `id=lt.100` |
|
||||
| `lte` | 小于等于 | `id=lte.100` |
|
||||
| `like` | 模糊匹配 | `title=like.*合同*` |
|
||||
| `ilike` | 不区分大小写模糊匹配 | `title=ilike.*word*` |
|
||||
| `in` | 在列表中 | `id=in.(1,2,3)` |
|
||||
| `is` | 是NULL | `deleted_at=is.null` |
|
||||
| `not.is` | 不是NULL | `deleted_at=not.is.null` |
|
||||
|
||||
### 查询参数
|
||||
|
||||
| 参数 | 说明 | 示例 |
|
||||
|-----|------|------|
|
||||
| `select` | 选择字段 | `select=id,title,created_at` |
|
||||
| `order` | 排序 | `order=created_at.desc` |
|
||||
| `limit` | 限制数量 | `limit=20` |
|
||||
| `offset` | 偏移量 | `offset=40` |
|
||||
|
||||
---
|
||||
|
||||
## 📌 常用数据表
|
||||
|
||||
### documents(文档表)
|
||||
|
||||
**查询文档列表**:
|
||||
|
||||
```typescript
|
||||
GET /documents?user_id=eq.5&status=eq.0&select=id,title,created_at&order=created_at.desc&limit=20&offset=0
|
||||
```
|
||||
|
||||
**创建文档**:
|
||||
|
||||
```typescript
|
||||
POST /documents
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"title": "测试文档",
|
||||
"user_id": 5,
|
||||
"status": 0
|
||||
}
|
||||
```
|
||||
|
||||
**更新文档**:
|
||||
|
||||
```typescript
|
||||
PATCH /documents?id=eq.123
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"title": "新标题",
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
|
||||
**删除文档**:
|
||||
|
||||
```typescript
|
||||
DELETE /documents?id=eq.123
|
||||
```
|
||||
|
||||
### sso_users(用户表)
|
||||
|
||||
**查询用户**:
|
||||
|
||||
```typescript
|
||||
GET /sso_users?sub=eq.000&select=id,username,nick_name,email
|
||||
```
|
||||
|
||||
**注意**: 普通用户无法直接访问 `sso_users` 表,需要通过特殊接口。
|
||||
|
||||
### roles(角色表)
|
||||
|
||||
**查询所有角色**:
|
||||
|
||||
```typescript
|
||||
GET /roles?is_system_role=eq.true&select=id,role_key,role_name,priority&order=priority.desc
|
||||
```
|
||||
|
||||
### user_role(用户-角色关联表)
|
||||
|
||||
**查询用户角色**:
|
||||
|
||||
```typescript
|
||||
GET /user_role?user_id=eq.5&select=role_id
|
||||
```
|
||||
|
||||
### sys_routes(路由表)
|
||||
|
||||
**查询所有路由**:
|
||||
|
||||
```typescript
|
||||
GET /sys_routes?status=eq.0&deleted_at=is.null&select=id,route_path,route_title&order=sort_order
|
||||
```
|
||||
|
||||
### role_route(角色-路由关联表)
|
||||
|
||||
**查询角色路由**:
|
||||
|
||||
```typescript
|
||||
GET /role_route?role_id=eq.1&select=route_id
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 完整示例
|
||||
|
||||
### 登录 + 获取路由 + 查询数据
|
||||
|
||||
```typescript
|
||||
import axios from 'axios';
|
||||
|
||||
const API_BASE = 'http://172.16.0.55:8073';
|
||||
|
||||
// 1. 登录
|
||||
const login = async () => {
|
||||
const response = await axios.post(`${API_BASE}/auth/login`, {
|
||||
username: '001',
|
||||
password: 'gdyc06111'
|
||||
});
|
||||
|
||||
const { access_token, user_info } = response.data.data;
|
||||
localStorage.setItem('token', access_token);
|
||||
|
||||
return { token: access_token, userInfo: user_info };
|
||||
};
|
||||
|
||||
// 2. 获取路由
|
||||
const fetchRoutes = async (token: string) => {
|
||||
const response = await axios.get(`${API_BASE}/user/routes`, {
|
||||
headers: { 'Authorization': `Bearer ${token}` }
|
||||
});
|
||||
|
||||
return response.data.data.routes;
|
||||
};
|
||||
|
||||
// 3. 查询文档(普通用户)
|
||||
const fetchDocuments = async (token: string, userId: string) => {
|
||||
const response = await axios.get(`${API_BASE}/documents`, {
|
||||
params: {
|
||||
user_id: `eq.${userId}`, // 只查自己的数据
|
||||
status: `eq.0`,
|
||||
select: 'id,title,created_at',
|
||||
order: 'created_at.desc',
|
||||
limit: 20,
|
||||
offset: 0
|
||||
},
|
||||
headers: { 'Authorization': `Bearer ${token}` }
|
||||
});
|
||||
|
||||
return response.data;
|
||||
};
|
||||
|
||||
// 4. 创建文档
|
||||
const createDocument = async (token: string, userId: string) => {
|
||||
const response = await axios.post(`${API_BASE}/documents`, {
|
||||
title: '测试文档',
|
||||
user_id: parseInt(userId),
|
||||
status: 0
|
||||
}, {
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
return response.data;
|
||||
};
|
||||
|
||||
// 使用示例
|
||||
const main = async () => {
|
||||
// 登录
|
||||
const { token, userInfo } = await login();
|
||||
console.log('登录成功:', userInfo);
|
||||
|
||||
// 获取路由
|
||||
const routes = await fetchRoutes(token);
|
||||
console.log('用户路由:', routes);
|
||||
|
||||
// 查询文档
|
||||
const docs = await fetchDocuments(token, userInfo.user_id);
|
||||
console.log('文档列表:', docs);
|
||||
|
||||
// 创建文档
|
||||
const newDoc = await createDocument(token, userInfo.user_id);
|
||||
console.log('新建文档:', newDoc);
|
||||
};
|
||||
|
||||
main();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 错误码对照表
|
||||
|
||||
| HTTP状态码 | 说明 | 处理方式 |
|
||||
|-----------|------|---------|
|
||||
| 200 | 成功 | 正常处理 |
|
||||
| 400 | 请求参数错误 | 检查请求参数 |
|
||||
| 401 | 未授权/Token过期 | 重新登录 |
|
||||
| 403 | 无权限访问 | 提示用户无权限 |
|
||||
| 404 | 资源不存在 | 检查路径是否正确 |
|
||||
| 500 | 服务器错误 | 联系后端开发人员 |
|
||||
|
||||
---
|
||||
|
||||
## 📌 测试账号
|
||||
|
||||
| 用户名 | 密码 | 角色 | 路由数 | 说明 |
|
||||
|--------|------|------|-------|------|
|
||||
| 000 | admin06111 | 超级管理员 | 29 | 所有权限 |
|
||||
| 001 | gdyc06111 | 普通用户 | 19 | 有限权限 |
|
||||
| jy001 | jyyc0814 | 系统管理员 | 29 | 管理员权限 |
|
||||
| mz001 | mzyc06111 | 系统管理员 | 29 | 管理员权限 |
|
||||
| yf001 | yfyc06111 | 系统管理员 | 29 | 管理员权限 |
|
||||
| cz001 | czyc06111 | 系统管理员 | 29 | 管理员权限 |
|
||||
|
||||
---
|
||||
|
||||
## 📌 快速链接
|
||||
|
||||
- **完整对接文档**: `docs/RBAC/前端完整对接文档_RBAC与PostgREST.md`
|
||||
- **快速开始**: `docs/RBAC/前端快速开始_5分钟集成.md`
|
||||
- **用户管理**: `docs/RBAC/用户管理完整指南.md`
|
||||
- **RBAC总结**: `docs/RBAC/RBAC系统使用总结.md`
|
||||
|
||||
---
|
||||
|
||||
**创建时间**: 2025-11-17
|
||||
**维护者**: Claude Code
|
||||
Reference in New Issue
Block a user