跳转至

评论(CommentController)

提供文档评论/意见的能力:获取评论统计与列表、查看回复、新增评论、点赞/踩、删除评论等。本控制器所有端点均返回 JSON 资源。

  • 接口类型:REST 资源(@RestController,基类 AbstractRuntimeController
  • 基址${myapps.context-path.runtime:}/api/runtime/{applicationId}
  • Tag:评论模块

公共说明

  • 鉴权(据源码 RuntimeMvcConfig + RestSecurityHandlerInterceptor:拦截器注册到 /api/runtime/**/api/rest/bpm/**,本控制器路径位于 /api/runtime/{applicationId}/...不在豁免名单(豁免名单仅覆盖 /api/runtime/login.*/api/runtime/dingding/authlogin/api/runtime/synchronization.*/runtime/sync/.* 等,详见 login.md「公共说明 · 鉴权」)。拦截器对非 /rest/ 路径走 Security.getUserIdFromToken(request),未取到再尝试 Security.getDebugUserIdFromToken(request),两者皆无则拒绝访问。因此所有端点均需 accessToken(或 debugToken),可通过 Cookie / 请求头 / query 参数任一方式传递。
  • 路径变量 {applicationId}:必填,经 DES 加密(按当前执行用户密钥),服务端在方法入口处 DesUtil.decryptTextByUserId(applicationId, getUser().getId()) 解密。
  • 明文 id:与 document.md 不同,本控制器下 {flag}{commentId} 路径变量以及 formIddocId query 参数均为**明文**,不参与 DES 解密。
  • Comment 请求体POST /flags/{flag}/comments@RequestBodyCommentVO JSON 对象,主要字段:
    {
      "comment": "<评论内容>",
      "parentId": "<父评论Id,回复时传入;顶层评论可空>"
    }
    
    服务端会自动补齐 applicationidflagdomainiduserIduserNameavatarcreateDate,调用方无需传这些字段。
  • 响应结构:统一 Resource(见 ../index.md「统一响应结构」),字段为 errcode/errmsg/data/errorserrmsg 成功统一为 "ok"
  • HTTP 状态码:所有端点均标注 @ResponseStatus(HttpStatus.OK),成功返回 HTTP 200;业务结果由响应体 errcode 体现(错误码表见 ../index.md)。

1. 获取评论统计

根据评论标识(flag)获取评论数与点赞数。若该 flag 的统计记录不存在,会先创建一条空白统计记录。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/flags/{flag}/comments/count(完整:{runtime-context}/api/runtime/{applicationId}/flags/{flag}/comments/count
  • 鉴权:是(需 accessToken,据源码)
  • Tag:评论模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
flag path string 评论标识(业务自定义,明文)

请求示例

GET /api/runtime/__APPID__/flags/doc-001/comments/count HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resource(见 ../index.md「统一响应结构」)。 dataJSONObject,字段: - commentNum(int):评论总数(按 flag + parentId="" 统计的顶层评论数)。 - likeNum(int):点赞数。 - id(string):统计记录(CommentVO)的主键。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "commentNum": 12, "likeNum": 3, "id": "__COMMENT_STAT_ID__" },
  "errors": null
}


2. 获取评论列表

根据评论标识(flag)查询该主题下的全部评论,并补齐评论者的头像。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/flags/{flag}/comments(完整:{runtime-context}/api/runtime/{applicationId}/flags/{flag}/comments
  • 鉴权:是(需 accessToken,据源码)
  • Tag:评论模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
flag path string 评论标识(明文)

请求示例

GET /api/runtime/__APPID__/flags/doc-001/comments HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 ResourcedataCollection<CommentVO>(JSON 数组),元素含:idcomment(评论内容)、userIduserNameavatar(头像 URI)、likeNumunlikeNumparentIdflagcreateDate 等。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [
    {
      "id": "__CID1__",
      "comment": "内容很赞",
      "userId": "__UID1__",
      "userName": "李伟",
      "avatar": "/uploads/avatar/u001.png",
      "likeNum": 3,
      "unlikeNum": 0,
      "parentId": "doc-001",
      "flag": "doc-001",
      "createDate": "2026-08-01 10:23:45"
    }
  ],
  "errors": null
}


3. 获取回复列表

根据评论 Id 查询其下所有回复(子评论),并补齐回复者头像。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/comments/{commentId}/answers(完整:{runtime-context}/api/runtime/{applicationId}/comments/{commentId}/answers
  • 鉴权:是(需 accessToken,据源码)
  • Tag:评论模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
commentId path string 父评论Id(明文)

请求示例

GET /api/runtime/__APPID__/comments/__CID1__/answers HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 ResourcedataCollection<CommentVO>(JSON 数组),元素结构同「获取评论列表」。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [
    {
      "id": "__CID2__",
      "comment": "同意",
      "userId": "__UID2__",
      "userName": "张敏",
      "avatar": "",
      "likeNum": 0,
      "unlikeNum": 0,
      "parentId": "__CID1__",
      "flag": "doc-001",
      "createDate": "2026-08-01 11:00:02"
    }
  ],
  "errors": null
}


4. 新增评论

在指定 flag 下创建评论或回复。评论落库后,若所在表单配置了「评论执行脚本」(commentExecuteScript),会以当前文档为上下文执行该脚本(脚本异常被吞,不影响评论创建结果)。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/flags/{flag}/comments(完整:{runtime-context}/api/runtime/{applicationId}/flags/{flag}/comments
  • 鉴权:是(需 accessToken,据源码)
  • Tag:评论模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
flag path string 评论标识(明文)
formId query string 关联表单Id(明文,用于加载表单与执行评论脚本)
docId query string 关联文档Id(明文,作为脚本执行上下文)
comment body object(CommentVO) 评论对象(字段见下)

请求体

字段 类型 必填 说明
comment string 评论内容
parentId string 父评论Id;回复场景传入,顶层评论可空(缺省时服务端以 flag 作为 parentId)
{
  "comment": "回复:内容很赞",
  "parentId": "__CID1__"
}

请求示例

POST /api/runtime/__APPID__/flags/doc-001/comments?formId=__FORMID__&docId=__DOCID__ HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{
  "comment": "回复:内容很赞",
  "parentId": "__CID1__"
}

响应

结构:统一 ResourcedataCommentVO,创建后的评论对象(含服务端补齐的 iduserIduserNameavatarcreateDate 等)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": {
    "id": "__NEWCID__",
    "comment": "回复:内容很赞",
    "userId": "__UID2__",
    "userName": "张敏",
    "avatar": "",
    "parentId": "__CID1__",
    "flag": "doc-001",
    "applicationid": "app-001",
    "createDate": "2026-08-04 09:12:30"
  },
  "errors": null
}


5. 点赞

对指定评论点赞(likeNum +1)。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/comments/{commentId}/like(完整:{runtime-context}/api/runtime/{applicationId}/comments/{commentId}/like
  • 鉴权:是(需 accessToken,据源码)
  • Tag:评论模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
commentId path string 评论Id(明文)

请求示例

PUT /api/runtime/__APPID__/comments/__CID1__/like HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resourcedataint,点赞后的最新点赞数。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": 4, "errors": null }


6. 觉得不行(踩)

对指定评论点踩(unlikeNum +1)。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/comments/{commentId}/unlike(完整:{runtime-context}/api/runtime/{applicationId}/comments/{commentId}/unlike
  • 鉴权:是(需 accessToken,据源码)
  • Tag:评论模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
commentId path string 评论Id(明文)

请求示例

PUT /api/runtime/__APPID__/comments/__CID1__/unlike HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 Resourcedataint,点踩后的最新踩数。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": 1, "errors": null }


7. 删除评论

按评论 Id 数组批量删除评论。

  • 接口类型:REST 资源
  • 请求方式DELETE
  • 请求路径/comments(完整:{runtime-context}/api/runtime/{applicationId}/comments
  • 鉴权:是(需 accessToken,据源码)
  • Tag:评论模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 应用Id(DES 加密密文)
content body string 评论 Id 的 JSON 数组字符串

请求体

["__CID1__", "__CID2__"]

请求示例

DELETE /api/runtime/__APPID__/comments HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

["__CID1__", "__CID2__"]

响应

结构:统一 Resourcedatanull

成功示例

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }