# Apifox 指南 —— 课程资源(管理) - baseURL: `http://localhost:8080` - 环境变量建议:`base`、`token_admin` - 通用请求头:`Authorization: Bearer {{token_admin}}` ## 推荐集合结构 - 管理端 / 课程资源 - 列表 GET /manage/courseResource/list(支持 status/keyword/majorId/courseId 等过滤) - 详情 GET /manage/courseResource/{id} - 新增/编辑/删除 POST|PUT|DELETE /manage/courseResource - 审核 通过/驳回 PUT /{id}/approve | /{id}/reject - 上线/下架 PUT /{id}/online | /{id}/offline - 最佳/取消最佳 PUT /{id}/best | /{id}/unbest - 下载(302)GET /{id}/download - 统计(上传趋势)GET /stats/uploadTrend?days=30(登录即可) - 统计(下载趋势)GET /stats/downloadTrend?days=30(登录即可) - 排行(资源下载Top)GET /stats/topResources?limit=5&days=30(登录即可) - 排行(用户积分Top)GET /stats/topScoreUsers?limit=5(登录即可) - 排行(用户下载Top)GET /stats/topDownloadUsers?limit=5(登录即可) - 占比(专业占比)GET /stats/majorShare?days=30(登录即可) - 占比(课程占比)GET /stats/courseShare?days=30(登录即可) - 榜单(参考门户)GET /portal/resource/top ## 前置:登录管理员/专业负责人 - POST /login - Body: `{ "username":"admin", "password":"123456" }` - 断言:`status == 200 && body.code == 200` - 提取:`data.token` → `token_admin` ## 用例 1:从待审到通过(审核) 1) 查询待审 - GET /manage/courseResource/list?status=0&pageNum=1&pageSize=10 - 断言:`code == 200`;提取任一 `rows[0].id` → `rid` 2) 审核通过 - PUT /manage/courseResource/{{rid}}/approve - 断言:`code == 200` ## 用例 2:驳回/下架/上线 - 驳回:PUT /manage/courseResource/{{rid}}/reject,Body:`{ "reason":"不符合要求" }` → `code == 200` - 下架:PUT /manage/courseResource/{{rid}}/offline,Body:`{ "reason":"侵权投诉" }` → `code == 200` - 上线(转待审):PUT /manage/courseResource/{{rid}}/online → `code == 200` ## 用例 3:最佳推荐 - 设为最佳:PUT /manage/courseResource/{{rid}}/best → `code == 200` - 取消最佳:PUT /manage/courseResource/{{rid}}/unbest → `code == 200` ## 用例 4:榜单与下载(302) - 榜单(参考门户):GET /portal/resource/top?scope=global&days=7&limit=10 → `code == 200` - 下载:GET /manage/courseResource/{{rid}}/download → HTTP 302 - 专业负责人越专业范围:期望 403 ## 用例 5:统计趋势(上传/下载) 1) 上传趋势(近 7 天) - GET /manage/courseResource/stats/uploadTrend?days=7 - 断言:`status == 200 && body.code == 200 && Array.isArray(body.data)` - 校验:`body.data[0]` 含 `day` 与 `count` 字段 2) 下载趋势(近 30 天) - GET /manage/courseResource/stats/downloadTrend?days=30 - 断言:`status == 200 && body.code == 200 && Array.isArray(body.data)` - 说明:若无数据,`data` 仍为长度=days 的数组,部分 `count=0` ## 统一断言脚本(示例) - 成功:`status == 200 && body && body.code == 200` - 列表:`Array.isArray(body.rows) && typeof body.total === 'number'` - 详情:`body.data && body.data.id` ## 常见失败与定位 - 403 权限不足:未分配 `manage:courseResource:*` - 409 状态冲突:仅待审可通过/驳回,仅已通过可下架 - 404 不存在:ID 无效或已删除 - 500 业务失败:唯一约束或参数校验失败(查看 `msg` 与后端日志) ## 用例 5:排行榜 - 资源下载Top:GET /manage/courseResource/stats/topResources?limit=5&days=30 → `status==200 && Array.isArray(body.data)` - 用户积分Top:GET /manage/courseResource/stats/topScoreUsers?limit=5 → `status==200 && Array.isArray(body.data)` - 用户下载Top:GET /manage/courseResource/stats/topDownloadUsers?limit=5 → `status==200 && Array.isArray(body.data)` - 专业占比:GET /manage/courseResource/stats/majorShare?days=30 → `status==200 && Array.isArray(body.data)` - 课程占比:GET /manage/courseResource/stats/courseShare?days=30 → `status==200 && Array.isArray(body.data)`