bfe39e45a9
5. 修改统一认证登录和管理员登录是通过接口形式进行,存储返回的accessToken。 6. 修改交叉评查的部分样式
8.3 KiB
8.3 KiB
API接口速查表
版本: v1.0
日期: 2025-11-17
后端地址: http://172.16.0.55:8073
📌 认证接口
1. 统一登录接口
端点: POST /auth/login
支持两种方式:
OAuth登录
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": "梅州" // 可选,仅首次创建时保存
}
密码登录
POST /auth/login
Content-Type: application/json
{
"username": "000", // 实际是sub字段
"password": "admin06111"
}
成功响应:
{
"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"
}
}
}
失败响应:
{
"success": false,
"error": "用户名或密码错误"
}
📌 RBAC路由接口
2. 获取用户路由
端点: GET /user/routes 或 GET /rbac/user/routes
请求头:
Authorization: Bearer {JWT_TOKEN}
响应:
{
"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}
响应:
{
"code": 200,
"msg": "操作成功",
"data": {
"route_path": "/system/users",
"has_access": true
}
}
4. 清除路由缓存
端点: POST /rbac/clear-routes-cache
请求头:
Authorization: Bearer {JWT_TOKEN}
响应:
{
"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(文档表)
查询文档列表:
GET /documents?user_id=eq.5&status=eq.0&select=id,title,created_at&order=created_at.desc&limit=20&offset=0
创建文档:
POST /documents
Content-Type: application/json
{
"title": "测试文档",
"user_id": 5,
"status": 0
}
更新文档:
PATCH /documents?id=eq.123
Content-Type: application/json
{
"title": "新标题",
"status": 1
}
删除文档:
DELETE /documents?id=eq.123
sso_users(用户表)
查询用户:
GET /sso_users?sub=eq.000&select=id,username,nick_name,email
注意: 普通用户无法直接访问 sso_users 表,需要通过特殊接口。
roles(角色表)
查询所有角色:
GET /roles?is_system_role=eq.true&select=id,role_key,role_name,priority&order=priority.desc
user_role(用户-角色关联表)
查询用户角色:
GET /user_role?user_id=eq.5&select=role_id
sys_routes(路由表)
查询所有路由:
GET /sys_routes?status=eq.0&deleted_at=is.null&select=id,route_path,route_title&order=sort_order
role_route(角色-路由关联表)
查询角色路由:
GET /role_route?role_id=eq.1&select=route_id
📌 完整示例
登录 + 获取路由 + 查询数据
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