API接口文档.md 19 KB

灵越智报 - 前端接口接入文档

Base URL: http://47.108.80.98:8001
版本: v1
更新日期: 2026-02-13


通用说明

响应格式

所有接口统一返回格式:

{
  "code": 200,
  "message": "success",
  "data": { ... }
}
code 说明
200 成功
400 参数错误
401 未认证 / Token 过期
403 无权限
404 资源不存在
500 服务器内部错误

认证方式

除登录接口外,所有接口需在请求头中携带 Token:

Authorization: Bearer <accessToken>

分页参数(适用于列表接口)

参数 类型 默认值 说明
page int 1 页码
size int 20 每页条数

分页响应结构

{
  "code": 200,
  "data": {
    "records": [ ... ],
    "total": 100,
    "page": 1,
    "size": 20,
    "pages": 5
  }
}

1. 认证模块

1.1 用户登录

POST /api/v1/auth/login

请求体

{
  "username": "admin",
  "password": "admin123"
}

响应

{
  "code": 200,
  "data": {
    "accessToken": "eyJhbGciOiJIUzM4NCJ9...",
    "refreshToken": "xxx",
    "expiresIn": 86400,
    "user": {
      "id": 1,
      "username": "admin",
      "realName": "管理员",
      "avatar": null,
      "roles": ["admin"]
    }
  }
}

1.2 用户登出

POST /api/v1/auth/logout

请求头Authorization: Bearer <accessToken>

1.3 刷新 Token

POST /api/v1/auth/refresh

请求体

{
  "refreshToken": "xxx"
}

响应:同登录响应。

1.4 获取当前用户信息

GET /api/v1/auth/me

响应

{
  "code": 200,
  "data": {
    "id": 1,
    "username": "admin",
    "realName": "管理员",
    "avatar": null,
    "roles": ["admin"]
  }
}

1.5 修改密码

PUT /api/v1/auth/password

请求体

{
  "oldPassword": "admin123",
  "newPassword": "newpass456"
}

1.6 获取当前用户权限树

GET /api/v1/auth/permissions

响应

{
  "code": 200,
  "data": [
    {
      "id": 1,
      "permKey": "project:view",
      "permName": "查看项目",
      "children": [ ... ]
    }
  ]
}

2. 项目模块

2.1 项目列表(分页)

GET /api/v1/projects

查询参数

参数 类型 必填 说明
page int 页码,默认 1
size int 每页条数,默认 20
status string 状态筛选
templateType string 模板类型筛选
keyword string 关键词搜索

响应 data

{
  "records": [
    {
      "id": 10,
      "title": "成都院安全生产标准化复审",
      "projectCode": "PRJ-2024-001",
      "status": "active",
      "description": "",
      "templateType": "safety_review",
      "elementCount": 47,
      "attachmentCount": 9,
      "ruleCount": 0,
      "filledCount": 47,
      "createdByName": "管理员",
      "createdAt": "2026-02-13T00:38:50",
      "updatedAt": "2026-02-13T00:38:50"
    }
  ],
  "total": 1,
  "page": 1,
  "size": 20,
  "pages": 1
}

2.2 项目详情

GET /api/v1/projects/{id}

响应 data

{
  "project": {
    "id": 10,
    "title": "成都院安全生产标准化复审",
    "projectCode": "PRJ-2024-001",
    "status": "active",
    "description": "",
    "templateType": "safety_review",
    "elementCount": 47,
    "attachmentCount": 9,
    "ruleCount": 0,
    "filledCount": 47,
    "contentHtml": null,
    "contentMarkdown": null,
    "createdByName": "管理员",
    "createdAt": "2026-02-13T00:38:50",
    "updatedAt": "2026-02-13T00:38:50"
  },
  "elements": [ ... ],
  "values": [ ... ]
}

2.3 创建项目

POST /api/v1/projects

请求体

{
  "title": "新项目名称",
  "description": "项目描述",
  "templateType": "safety_review",
  "fromProjectId": null
}
字段 类型 必填 说明
title string 项目标题
description string 项目描述
templateType string 模板类型
fromProjectId long 从已有项目复制

响应 dataProjectVO 对象。

2.4 更新项目

PUT /api/v1/projects/{id}

请求体

{
  "title": "更新后的标题",
  "description": "更新后的描述",
  "templateType": "safety_review"
}

2.5 删除项目

DELETE /api/v1/projects/{id}

2.6 复制项目

POST /api/v1/projects/{id}/copy

响应 data:新创建的 ProjectVO 对象。

2.7 归档项目

PUT /api/v1/projects/{id}/archive

2.8 导出项目

POST /api/v1/projects/{id}/export?format=docx

响应:二进制文件流(Content-Type: application/octet-stream)。

2.9 获取项目文档内容

GET /api/v1/projects/{id}/doc-content

返回模板文档的结构化 JSON,用于前端渲染文档视图和要素高亮。

响应 data

{
  "page": {
    "widthMm": 210.0,
    "heightMm": 297.0,
    "marginTopMm": 25.4,
    "marginBottomMm": 20.0,
    "marginLeftMm": 28.0,
    "marginRightMm": 28.0
  },
  "blocks": [
    {
      "id": "b0",
      "type": "paragraph",
      "runs": [
        {
          "text": "正文内容",
          "bold": true,
          "fontSize": 14.0,
          "fontFamily": "宋体"
        }
      ],
      "style": {
        "alignment": "center",
        "lineSpacing": 1.5
      },
      "images": [
        {
          "rId": "rId8",
          "src": "data:image/png;base64,iVBOR...",
          "widthInch": 6.3,
          "heightInch": 1.2
        }
      ]
    },
    {
      "id": "b5",
      "type": "table",
      "table": {
        "rows": 10,
        "cols": 4,
        "data": [
          [
            { "text": "序号", "colspan": 1 },
            { "text": "项目名称", "colspan": 1 }
          ]
        ]
      }
    }
  ],
  "totalBlocks": 311
}

Block 类型说明

type 说明
paragraph 普通段落
heading1 ~ heading3 标题
table 表格
toc1 ~ toc3 目录项
list_item 列表项

Run 格式字段

字段 类型 说明
text string 文本内容
bold boolean 粗体
italic boolean 斜体
underline string 下划线类型
fontSize number 字号(pt)
fontFamily string 字体名称
color string 文字颜色(RGB)

3. 要素模块

3.1 获取项目要素列表

GET /api/v1/projects/{projectId}/elements

响应 data

[
  {
    "id": 701,
    "elementKey": "basicInfo.projectCode",
    "elementName": "项目编号",
    "elementType": "text",
    "namespace": "basicInfo",
    "fieldName": "projectCode",
    "tableColumns": null,
    "required": true,
    "defaultValue": null,
    "description": "安全生产标准化项目编号",
    "projectId": 10,
    "sortOrder": 0,
    "createdAt": "2026-02-13T00:38:50"
  }
]

elementType 取值

说明 高亮方式
text 短文本 行内子串匹配,背景色高亮
paragraph 长文本/段落 整段匹配,左边框 + 背景色
table 表格 表格外框高亮

3.2 添加要素定义

POST /api/v1/projects/{projectId}/elements

请求体

{
  "elementKey": "basicInfo.newField",
  "elementName": "新字段",
  "elementType": "text",
  "namespace": "basicInfo",
  "fieldName": "newField",
  "required": false,
  "defaultValue": "",
  "description": "字段描述",
  "sortOrder": 50
}

3.3 更新要素定义

PUT /api/v1/projects/{projectId}/elements/{elementId}

请求体:同添加。

3.4 删除要素定义

DELETE /api/v1/projects/{projectId}/elements/{elementId}

4. 要素值模块

4.1 获取所有要素值

GET /api/v1/projects/{projectId}/values

响应 data

[
  {
    "valueId": 801,
    "elementKey": "PRJ-2024-001:basicInfo.projectCode",
    "valueText": "BZ-0092-2024",
    "valueJson": null,
    "isFilled": true,
    "fillSource": "manual",
    "projectId": 10,
    "createdAt": "2026-02-13T00:38:50",
    "updatedAt": "2026-02-13T00:38:50"
  }
]

注意elementKey 带有项目前缀(如 PRJ-2024-001:),前端匹配要素时需去除前缀。

4.2 获取单个要素值

GET /api/v1/projects/{projectId}/values/{elementKey}

elementKey 需要 URL 编码(如 basicInfo.projectCode)。

4.3 更新要素值

PUT /api/v1/projects/{projectId}/values/{elementKey}

请求体

{
  "valueText": "新的值文本",
  "valueJson": null,
  "fillSource": "manual"
}
字段 类型 说明
valueText string 文本值
valueJson string JSON 格式值(表格类型使用)
fillSource string 填充来源:manual / ai / rule

4.4 批量更新要素值

POST /api/v1/projects/{projectId}/values/batch

请求体

{
  "values": [
    {
      "elementKey": "basicInfo.projectCode",
      "valueText": "BZ-0092-2024",
      "fillSource": "manual"
    },
    {
      "elementKey": "basicInfo.companyName",
      "valueText": "成都院",
      "fillSource": "ai"
    }
  ]
}

5. 附件模块

5.1 获取附件列表

GET /api/v1/projects/{projectId}/attachments

响应 data

[
  {
    "id": 400,
    "displayName": "01-附件1  成都院核心要素评审情况记录表.docx",
    "fileKey": "ATT-001",
    "fileName": "01-附件1  成都院核心要素评审情况记录表.docx",
    "filePath": null,
    "fileType": "docx",
    "fileSize": 376919,
    "parseStatus": null,
    "parsedText": null,
    "parsedAt": null,
    "entityCount": 0,
    "projectId": 10,
    "sortOrder": 0,
    "createdAt": "2026-02-13T17:11:28",
    "updatedAt": "2026-02-13T17:11:28"
  }
]

当前附件数据(9 个):

sortOrder displayName fileType fileSize
0 01-附件1 成都院核心要素评审情况记录表.docx docx 376,919
1 02-附件2 成都院现场评审分工表.zip zip 2,171,136
2 03-附件3 关于深入开展电力安全生产标准化建设暨安全环保提升专项行动的通知.pdf pdf 360,940
3 04-附件4 成都院材料真实性说明.png png 514,264
4 05-附件5 成都院在建项目一览表.docx docx 16,056
5 06-附件6 成都院安全管理制度清单.docx docx 16,942
6 07-附件7 成都院现场评审末次会签到表.png png 564,269
7 08-中国电建集团成都勘测设计工作方案.zip zip 299,279
8 09-附件8 复审问题建议表.docx docx 29,034

5.2 上传附件

POST /api/v1/projects/{projectId}/attachments/upload
Content-Type: multipart/form-data

表单参数

参数 类型 必填 说明
file File 文件
displayName string 显示名称(默认取文件名)

响应 data

{
  "id": 409,
  "displayName": "新附件.docx",
  "fileName": "新附件.docx",
  "fileType": "docx",
  "fileSize": 12345,
  "parseStatus": "pending",
  "taskId": null
}

5.3 获取附件详情

GET /api/v1/attachments/{id}

响应 dataAttachmentVO 对象。

5.4 删除附件

DELETE /api/v1/attachments/{id}

5.5 触发附件解析

POST /api/v1/attachments/{id}/parse

5.6 调整附件排序

PUT /api/v1/attachments/{id}/sort

请求体

{
  "sortOrder": 3
}

5.7 获取附件文档内容

GET /api/v1/attachments/{id}/doc-content

返回附件解析后的结构化 JSON(格式同 2.9 项目文档内容)。


6. 规则模块

6.1 获取项目规则列表

GET /api/v1/projects/{projectId}/rules

响应 data

[
  {
    "id": 1,
    "ruleName": "提取项目编号",
    "elementKey": "basicInfo.projectCode",
    "ruleType": "direct_entity",
    "actionType": "extract",
    "actionConfig": null,
    "dslContent": null,
    "description": "从附件中提取项目编号",
    "status": "active",
    "lastOutputText": null,
    "lastOutputJson": null,
    "lastRunStatus": null,
    "lastRunTime": null,
    "lastRunError": null,
    "projectId": 10,
    "inputs": [
      {
        "inputId": 1,
        "ruleId": 1,
        "sourceNodeId": 400,
        "inputKey": "attachment",
        "inputName": "附件来源",
        "inputType": "attachment",
        "fixedValue": null,
        "sourceType": "ATTACHMENT",
        "sourceName": "01-附件1",
        "sortOrder": 0
      }
    ],
    "createdAt": "2026-02-13T00:38:50",
    "updatedAt": "2026-02-13T00:38:50"
  }
]

6.2 获取规则详情

GET /api/v1/rules/{id}

6.3 创建规则

POST /api/v1/projects/{projectId}/rules

请求体

{
  "elementKey": "basicInfo.projectCode",
  "ruleName": "提取项目编号",
  "ruleType": "direct_entity",
  "actionType": "extract",
  "actionConfig": null,
  "dslContent": null,
  "description": "从附件中提取项目编号",
  "inputs": [
    {
      "inputKey": "attachment",
      "inputType": "attachment",
      "inputName": "附件来源",
      "sourceNodeId": 400,
      "fixedValue": null
    }
  ]
}
字段 类型 必填 说明
elementKey string 目标要素键
ruleName string 规则名称
ruleType string 规则类型
actionType string 动作类型
description string 描述
inputs array 规则输入列表

6.4 更新规则

PUT /api/v1/rules/{id}

请求体:同创建。

6.5 删除规则

DELETE /api/v1/rules/{id}

6.6 执行单个规则

POST /api/v1/rules/{id}/execute

响应 data

{
  "ruleId": 1,
  "status": "success",
  "outputText": "BZ-0092-2024",
  "elementKey": "basicInfo.projectCode",
  "valueUpdated": true,
  "duration": 1200
}

6.7 批量执行规则

POST /api/v1/projects/{projectId}/rules/execute-all

响应 dataRuleExecuteResultVO[] 数组。


接口总览

# 方法 路径 说明
认证
1 POST /api/v1/auth/login 用户登录
2 POST /api/v1/auth/logout 用户登出
3 POST /api/v1/auth/refresh 刷新 Token
4 GET /api/v1/auth/me 获取当前用户信息
5 PUT /api/v1/auth/password 修改密码
6 GET /api/v1/auth/permissions 获取权限树
项目
7 GET /api/v1/projects 项目列表(分页)
8 GET /api/v1/projects/{id} 项目详情
9 POST /api/v1/projects 创建项目
10 PUT /api/v1/projects/{id} 更新项目
11 DELETE /api/v1/projects/{id} 删除项目
12 POST /api/v1/projects/{id}/copy 复制项目
13 PUT /api/v1/projects/{id}/archive 归档项目
14 POST /api/v1/projects/{id}/export 导出项目
15 GET /api/v1/projects/{id}/doc-content 获取项目文档内容
要素
16 GET /api/v1/projects/{projectId}/elements 要素列表
17 POST /api/v1/projects/{projectId}/elements 添加要素
18 PUT /api/v1/projects/{projectId}/elements/{elementId} 更新要素
19 DELETE /api/v1/projects/{projectId}/elements/{elementId} 删除要素
要素值
20 GET /api/v1/projects/{projectId}/values 获取所有要素值
21 GET /api/v1/projects/{projectId}/values/{elementKey} 获取单个要素值
22 PUT /api/v1/projects/{projectId}/values/{elementKey} 更新要素值
23 POST /api/v1/projects/{projectId}/values/batch 批量更新要素值
附件
24 GET /api/v1/projects/{projectId}/attachments 附件列表
25 POST /api/v1/projects/{projectId}/attachments/upload 上传附件
26 GET /api/v1/attachments/{id} 附件详情
27 DELETE /api/v1/attachments/{id} 删除附件
28 POST /api/v1/attachments/{id}/parse 触发附件解析
29 PUT /api/v1/attachments/{id}/sort 调整附件排序
30 GET /api/v1/attachments/{id}/doc-content 获取附件文档内容
规则
31 GET /api/v1/projects/{projectId}/rules 规则列表
32 GET /api/v1/rules/{id} 规则详情
33 POST /api/v1/projects/{projectId}/rules 创建规则
34 PUT /api/v1/rules/{id} 更新规则
35 DELETE /api/v1/rules/{id} 删除规则
36 POST /api/v1/rules/{id}/execute 执行单个规则
37 POST /api/v1/projects/{projectId}/rules/execute-all 批量执行规则

快速接入示例

Axios 配置

import axios from 'axios'

const api = axios.create({
  baseURL: 'http://47.108.80.98:8001/api/v1',
  timeout: 30000,
  headers: { 'Content-Type': 'application/json' }
})

// 请求拦截器:自动携带 Token
api.interceptors.request.use(config => {
  const token = localStorage.getItem('accessToken')
  if (token) config.headers.Authorization = `Bearer ${token}`
  return config
})

// 响应拦截器:统一处理
api.interceptors.response.use(
  res => {
    if (res.data.code === 200) return res.data.data
    return Promise.reject(new Error(res.data.message))
  },
  err => {
    if (err.response?.status === 401) {
      // Token 过期,跳转登录
      localStorage.removeItem('accessToken')
      window.location.href = '/login'
    }
    return Promise.reject(err)
  }
)

export default api

典型调用流程

// 1. 登录
const { accessToken } = await api.post('/auth/login', {
  username: 'admin',
  password: 'admin123'
})
localStorage.setItem('accessToken', accessToken)

// 2. 获取项目列表
const projects = await api.get('/projects')

// 3. 加载项目数据(并行请求)
const projectId = 10
const [elements, values, attachments, rules] = await Promise.all([
  api.get(`/projects/${projectId}/elements`),
  api.get(`/projects/${projectId}/values`),
  api.get(`/projects/${projectId}/attachments`),
  api.get(`/projects/${projectId}/rules`)
])

// 4. 加载文档内容
const docContent = await api.get(`/projects/${projectId}/doc-content`)

// 5. 更新要素值
await api.put(`/projects/${projectId}/values/${encodeURIComponent('basicInfo.projectCode')}`, {
  valueText: '新编号'
})

测试账号

用户名 密码 角色
admin admin123 管理员