Files
leaudit-platform-frontend/auth_doc/ENTRY_MODULE_API.md
T
2025-12-05 00:09:32 +08:00

497 lines
10 KiB
Markdown
Raw 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 文档
## 文档信息
- **版本**: v1.0
- **更新日期**: 2025-11-26
- **基础路径**: `/api/v3/entry-modules`
- **认证方式**: JWT Bearer Token
---
## 接口总览
| 方法 | 路径 | 说明 | 权限要求 |
|------|------|------|---------|
| GET | `/entry-modules` | 获取入口模块列表 | 登录用户 |
| GET | `/entry-modules/{module_id}` | 获取入口模块详情 | 登录用户 |
| POST | `/entry-modules` | 创建入口模块 | 管理员/领导 |
| PUT | `/entry-modules/{module_id}` | 更新入口模块 | 管理员/领导 |
| DELETE | `/entry-modules/{module_id}` | 删除入口模块 | 管理员/领导 |
---
## 数据结构
### AreaConfig(地区配置)
```typescript
interface AreaConfig {
area: string; // 地区名称(如:梅州、云浮、揭阳、潮州)
enabled: boolean; // 是否启用(默认 true
sort_order: number; // 排序号(默认 0
}
```
### EntryModule(入口模块)
```typescript
interface EntryModule {
id: number; // 模块ID
name: string; // 模块名称
description: string | null; // 模块描述
path: string | null; // 图片存储路径
areas: AreaConfig[] | null; // 地区配置列表
created_at: string; // 创建时间(ISO 8601格式)
updated_at: string; // 更新时间(ISO 8601格式)
}
```
---
## 接口详情
### 1. 获取入口模块列表
**接口**: `GET /api/v3/entry-modules`
**Query参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| page | int | 否 | 页码(默认1,最小1) |
| page_size | int | 否 | 每页数量(默认20,最小1,最大100) |
| name | string | 否 | 模块名称(模糊搜索) |
| area | string | 否 | 地区筛选(如:梅州、云浮) |
**请求示例**:
```javascript
// 获取第1页,每页20条
GET /api/v3/entry-modules?page=1&page_size=20
// 按名称搜索
GET /api/v3/entry-modules?name=合同
// 按地区筛选
GET /api/v3/entry-modules?area=梅州
```
**响应示例**:
```json
{
"code": 200,
"message": "success",
"data": {
"total": 10,
"page": 1,
"page_size": 20,
"items": [
{
"id": 1,
"name": "合同审查",
"description": "合同文档审查入口",
"path": "/images/contract-review.png",
"areas": [
{"area": "梅州", "enabled": true, "sort_order": 1},
{"area": "云浮", "enabled": true, "sort_order": 2},
{"area": "揭阳", "enabled": false, "sort_order": 3}
],
"created_at": "2025-01-01T00:00:00",
"updated_at": "2025-01-01T00:00:00"
}
]
}
}
```
---
### 2. 获取入口模块详情
**接口**: `GET /api/v3/entry-modules/{module_id}`
**路径参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| module_id | int | 是 | 模块ID |
**请求示例**:
```javascript
GET /api/v3/entry-modules/1
```
**响应示例**:
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"name": "合同审查",
"description": "合同文档审查入口",
"path": "/images/contract-review.png",
"areas": [
{"area": "梅州", "enabled": true, "sort_order": 1},
{"area": "云浮", "enabled": true, "sort_order": 2}
],
"created_at": "2025-01-01T00:00:00",
"updated_at": "2025-01-01T00:00:00"
}
}
```
**错误响应**:
```json
{
"code": 404,
"message": "入口模块不存在: id=999"
}
```
---
### 3. 创建入口模块
**接口**: `POST /api/v3/entry-modules`
**权限要求**: 管理员(admin)或领导(is_leader
**请求体**:
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | 是 | 模块名称(最大255字符) |
| description | string | 否 | 模块描述 |
| path | string | 否 | 图片存储路径(最大255字符) |
| areas | AreaConfig[] | 否 | 地区配置列表 |
**请求示例**:
```json
{
"name": "合同审查",
"description": "合同文档审查入口",
"path": "/images/contract-review.png",
"areas": [
{"area": "梅州", "enabled": true, "sort_order": 1},
{"area": "云浮", "enabled": true, "sort_order": 2},
{"area": "揭阳", "enabled": false, "sort_order": 3},
{"area": "潮州", "enabled": true, "sort_order": 4}
]
}
```
**响应示例**:
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"name": "合同审查",
"description": "合同文档审查入口",
"path": "/images/contract-review.png",
"areas": [
{"area": "梅州", "enabled": true, "sort_order": 1},
{"area": "云浮", "enabled": true, "sort_order": 2},
{"area": "揭阳", "enabled": false, "sort_order": 3},
{"area": "潮州", "enabled": true, "sort_order": 4}
],
"created_at": "2025-01-01T00:00:00",
"updated_at": "2025-01-01T00:00:00"
}
}
```
**错误响应**:
```json
// 权限不足
{
"detail": "权限不足:仅管理员可以创建入口模块"
}
// 名称重复
{
"code": 400,
"message": "入口模块名称已存在: 合同审查"
}
```
---
### 4. 更新入口模块
**接口**: `PUT /api/v3/entry-modules/{module_id}`
**权限要求**: 管理员(admin)或领导(is_leader
**路径参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| module_id | int | 是 | 模块ID |
**请求体**(所有字段可选,只传需要更新的字段):
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | 否 | 模块名称(最大255字符) |
| description | string | 否 | 模块描述 |
| path | string | 否 | 图片存储路径(最大255字符) |
| areas | AreaConfig[] | 否 | 地区配置列表(会完全替换原有配置) |
**请求示例**:
```json
// 只更新名称
{
"name": "新的模块名称"
}
// 更新地区配置
{
"areas": [
{"area": "梅州", "enabled": true, "sort_order": 1},
{"area": "云浮", "enabled": false, "sort_order": 2}
]
}
// 更新多个字段
{
"name": "合同审查v2",
"description": "更新后的描述",
"path": "/images/new-icon.png"
}
```
**响应示例**:
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"name": "合同审查v2",
"description": "更新后的描述",
"path": "/images/new-icon.png",
"areas": [
{"area": "梅州", "enabled": true, "sort_order": 1},
{"area": "云浮", "enabled": false, "sort_order": 2}
],
"created_at": "2025-01-01T00:00:00",
"updated_at": "2025-01-02T10:30:00"
}
}
```
**错误响应**:
```json
// 模块不存在
{
"code": 404,
"message": "入口模块不存在: id=999"
}
// 权限不足
{
"detail": "权限不足:仅管理员可以更新入口模块"
}
```
---
### 5. 删除入口模块
**接口**: `DELETE /api/v3/entry-modules/{module_id}`
**权限要求**: 管理员(admin)或领导(is_leader
**路径参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| module_id | int | 是 | 模块ID |
**请求示例**:
```javascript
DELETE /api/v3/entry-modules/1
```
**响应示例**:
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"deleted": true
}
}
```
**错误响应**:
```json
// 模块不存在
{
"code": 404,
"message": "入口模块不存在: id=999"
}
// 权限不足
{
"detail": "权限不足:仅管理员可以删除入口模块"
}
```
---
## 前端调用示例
### TypeScript 类型定义
```typescript
// 地区配置
interface AreaConfig {
area: string;
enabled: boolean;
sort_order: number;
}
// 入口模块
interface EntryModule {
id: number;
name: string;
description: string | null;
path: string | null;
areas: AreaConfig[] | null;
created_at: string;
updated_at: string;
}
// 列表响应
interface EntryModuleListResponse {
total: number;
page: number;
page_size: number;
items: EntryModule[];
}
// 创建请求
interface EntryModuleCreate {
name: string;
description?: string;
path?: string;
areas?: AreaConfig[];
}
// 更新请求
interface EntryModuleUpdate {
name?: string;
description?: string;
path?: string;
areas?: AreaConfig[];
}
```
### API 封装示例
```typescript
import axios from 'axios';
const api = axios.create({
baseURL: '/api/v3',
headers: {
'Content-Type': 'application/json'
}
});
// 请求拦截器 - 添加 Token
api.interceptors.request.use((config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 入口模块 API
export const entryModuleApi = {
// 获取列表
list: (params?: {
page?: number;
page_size?: number;
name?: string;
area?: string;
}) => api.get<EntryModuleListResponse>('/entry-modules', { params }),
// 获取详情
get: (id: number) => api.get<EntryModule>(`/entry-modules/${id}`),
// 创建
create: (data: EntryModuleCreate) => api.post<EntryModule>('/entry-modules', data),
// 更新
update: (id: number, data: EntryModuleUpdate) =>
api.put<EntryModule>(`/entry-modules/${id}`, data),
// 删除
delete: (id: number) => api.delete(`/entry-modules/${id}`)
};
```
### 使用示例
```typescript
// 获取列表
const { data } = await entryModuleApi.list({ page: 1, page_size: 20 });
console.log(data.data.items);
// 创建模块
const newModule = await entryModuleApi.create({
name: '合同审查',
description: '合同文档审查入口',
areas: [
{ area: '梅州', enabled: true, sort_order: 1 },
{ area: '云浮', enabled: true, sort_order: 2 }
]
});
// 更新模块
await entryModuleApi.update(1, {
name: '新名称',
areas: [
{ area: '梅州', enabled: false, sort_order: 1 }
]
});
// 删除模块
await entryModuleApi.delete(1);
```
---
## 错误码说明
| HTTP状态码 | 说明 | 处理建议 |
|-----------|------|---------|
| 200 | 成功 | - |
| 400 | 请求参数错误 | 检查请求体格式 |
| 401 | 未认证 | Token过期,需重新登录 |
| 403 | 无权限 | 当前用户不是管理员/领导 |
| 404 | 资源不存在 | 检查模块ID是否正确 |
| 500 | 服务器错误 | 联系后端排查 |
---
## 注意事项
1. **地区配置**:更新 `areas` 字段时会**完全替换**原有配置,不是增量更新
2. **权限要求**:创建、更新、删除操作需要管理员(admin)或领导(is_leader)权限
3. **图片路径**`path` 字段存储的是相对路径,前端需要拼接完整的图片URL
4. **分页**:默认每页20条,最大100条
---
**文档版本**: v1.0
**最后更新**: 2025-11-26
**维护者**: Backend Team