外观
查询与删除
本页用于接入下载列表、详情与删除按钮。先按快速开始完成数据库和认证装配。接口返回下载记录 JSON,实际文件由 filePath 对应的应用或存储服务提供。
选择接口与用户范围
| 入口 | 依赖 artifactId | URL 前缀 | 记录范围 |
|---|---|---|---|
| App | springboot-business-download-center-controller-app | /api/app/download/center | 当前会话用户所属记录 |
| 管理端 | springboot-business-download-center-controller-admin | /api/admin/download/center | 全部未删除记录,可按 userId 筛选 |
两项依赖的 groupId 均为 com.own.business,由 Business BOM 管理版本。若要增加管理端,在应用 dependencies 中追加:
xml
<dependency>
<groupId>com.own.business</groupId>
<artifactId>springboot-business-download-center-controller-admin</artifactId>
</dependency>两端均提供以下三个接口,路径加上表中的前缀与应用实际 context path:
| 方法 | 相对路径 | 请求 | 成功时 data |
|---|---|---|---|
POST | /page | JSON DownloadCenterQuery,无条件时传 {} | PageModel<DownloadCenterVo> |
GET | /id/{id} | 路径中的记录 ID,无请求体 | DownloadCenterVo |
DELETE | /id/{id} | 路径中的记录 ID,无请求体;可能先进入二次确认 | true |
App 分页强制把 query.userId 覆盖为当前登录用户;详情和删除使用 id + fk_user_id 条件。管理端保留传入筛选条件,不自动限制为当前用户。模块没有工作空间作用域,用户同一账号下的记录不会按工作空间自动分组。
管理端声明权限模块 download-center:分页要求 SEARCH;详情声明 VIEW 或 SEARCH;删除声明 SEARCH + DELETE 或 VIEW + DELETE 两组操作组合。应用需接好相应认证与权限处理,注解不会替应用创建账号、角色或授权数据。
分页查询
请求:POST /api/app/download/center/page,Content-Type: application/json。
json
{
"page": 1,
"rows": 10,
"fileName": "报表",
"fileType": "xlsx",
"status": 1
}| 条件 | 实际匹配方式 |
|---|---|
fileName | 非空白时模糊匹配 |
fileType、filePath | 非空白时等值匹配 |
fileSize | 非 null 时按字节数等值匹配 |
userId | 非 null 时按归属用户等值匹配;App 会覆盖为会话用户 |
status、progress | 非 null 时等值匹配,0 也是有效条件 |
page | 从 1 开始;缺省或不大于 0 时使用 1 |
rows | 缺省或不大于 0 时使用 10;最大 100 |
条件之间为 AND,按 createTime 倒序排列,没有额外的同时间 ID 排序。当前不支持时间范围、文件大小范围、进度范围或自定义排序。虽然 Query 继承了 keywords,服务没有配置通用关键字搜索列,按文件名搜索应使用 fileName。
分页响应的业务部分包含 page、rows、total、list、isLastPage;total 为记录总数,不是总页数。空结果时 list 为空列表。分页依赖 PageHelper,单独注册 Mapper 不能替代分页插件装配。公共模型与边界见 Base Business 分页。
接口约定与记录字段
普通响应包装为 ResultModel<T>,包含 code、message、data、t、success、traceId。成功业务码为 00000,客户端应以业务码判断结果;不要仅根据 HTTP 成功状态或 success=true 判断操作已完成,二次确认挑战也使用该响应包装。
公共响应与 JSON 转换规则集中见 Base 使用与配置,下文补充下载记录的业务字段。
| 字段 | 类型及含义 |
|---|---|
id | Java Long,下载记录 ID,数据库主键为 bigint、MyBatis-Plus ASSIGN_ID |
fileName、fileType、filePath | 展示名称、自定义类型、已保存的下载地址 |
fileSize | Java Long,文件大小,单位字节 |
userId | Java Long,文件归属用户;对外没有 fkUserId 字段 |
status、progress | 整数状态和进度,取值及维护规则见记录写入与状态维护 |
createTime、modifiedTime | 创建及更新时间,LocalDateTime,默认 JSON 格式 yyyy-MM-dd HH:mm:ss,不携带时区偏移 |
createUserId、createUserName | 创建操作人,可能未填充;不等同于归属用户 |
modifiedUserId、modifiedUserName | 最近修改操作人,可能未填充 |
version | 记录版本号;不是任务进度或状态版本协议 |
框架默认 MVC 将 Long 序列化为字符串,因此 id、userId、fileSize 及审计用户 ID 应按字符串接收;尤其不要用 JavaScript 数值保存大整数 ID。业务可空字段可能为 null,审计字段依注解及应用序列化策略可能省略,isDeleted 不对外输出。
时间字段的格式注解声明 GMT+8,其 Java 类型和数据库 datetime 都不携带时区。应用及数据库应统一时间口径;接口没有时间范围筛选参数。
获取详情与访问文件
请求:GET /api/app/download/center/id/{id}。把 {id} 替换成列表返回的记录 ID。
找不到记录、记录已逻辑删除,或 App 用户访问他人的记录时,默认抛出业务异常 business_not_found(未查询到指定的信息),不会返回成功的空 VO。HTTP 状态和完整错误包装由应用异常处理决定。
详情原样返回 filePath。它不是文件流接口,不会根据 status 阻止详情查询,也不会判断文件是否过期或存在。界面通常在 status=1 且地址可用时展示下载动作,文件服务仍需独立执行其访问控制。
删除与二次确认
请求:DELETE /api/app/download/center/id/{id},管理端使用对应管理前缀。两端都标记了 @AopRequestConfirm。
二次确认自动配置要求 Servlet/AOP 相关类以及 StoreClient、StoreLockManager Bean;满足装配条件且 own.confirm.enabled 为默认 true 时执行确认流程。缺少 Store 等前提时,不能假定注解一定会拦截删除。Store 接入示例见快速开始。
默认处理器下的调用流程:
- 首次发起 DELETE,返回业务码
C0001和确认提示,实际删除尚未执行。 - 从响应
data.key和data.token取得请求头名与令牌,向用户展示message。 - 用户确认后,在令牌有效期内,使用相同登录身份、请求方法、地址和参数重发请求,并添加
data.key: data.token请求头。 - 收到
code=00000、data=true后刷新列表。
默认请求头名为 X-RequestConfirm-token,注解默认有效期为 30 秒。客户端应使用响应实际返回的 key,不硬编码令牌,也不把 C0001 当成删除成功;应用若覆盖异常处理器,则按实际响应协议对接。
删除使用基础 PO 的逻辑删除规则,把 is_deleted 从 0 更新为 1,后续普通查询不可见。它不删除实际文件,不取消正在运行的生成任务,也不提供恢复、批量删除或过期清理接口。通用确认提示中的“所有资料会被删除”不是文件清理实现承诺。
服务不根据删除影响行数返回不同结果:在确认及认证流程通过、且数据库调用没有异常时,重复删除、不存在的 ID,以及 App 删除不属于自己的 ID,都可能返回 data=true。App 的用户过滤仍然有效,不能据此认为他人的记录已被删除。