# Apifox 指南 —— 课程资源(门户) - baseURL: `http://localhost:8080` - 环境变量建议:`base`、`token_user` - 通用请求头:`Authorization: Bearer {{token_user}}` ## 推荐集合结构 - 门户 / 课程资源 - 浏览 - 列表 GET /portal/resource/list - 详情 GET /portal/resource/{id} - 下载 GET /portal/resource/{id}/download - 榜单 GET /portal/resource/top - 我的 - 我的列表 GET /portal/resource/my/list - 新增 POST /portal/resource - 编辑 PUT /portal/resource - 提交上架 PUT /portal/resource/{id}/online - 下架 PUT /portal/resource/{id}/offline - 删除 DELETE /portal/resource/{id} - 上传 - 上传压缩包 POST /portal/upload/oss(scene=resource.archive) ## 前置:登录 - POST /login - Body: `{ "username":"user", "password":"123456" }` - 断言:`status == 200 && body.code == 200` - 提取:`data.token` → `token_user` ## 用例 1:浏览列表/详情/下载/榜单 1) 列表:GET /portal/resource/list?pageNum=1&pageSize=10&keyword=算法 → `code == 200` 2) 详情:GET /portal/resource/{id} → `code == 200` 3) 下载:GET /portal/resource/{id}/download → 断言 HTTP 302(可断言 `response.headers.Location` 存在) 4) 榜单:GET /portal/resource/top?scope=global&days=7&limit=10 → `code == 200` ## 用例 2:新增(文件型)→ 提交上架 → 门户可见(端到端) 1) 获取基础数据(可选) - GET /portal/major/list → 取 `id` → 变量 `majorId` - GET /portal/course/list → 取 `id` → 变量 `courseId` 2) 上传 - POST /portal/upload/oss(Form-Data) - 字段:`scene=resource.archive`, `dir=resource`, `publicUrl=true`, `file=@/path/demo.zip` - 断言:`code == 200`;提取 `data.url` → `fileUrl` 3) 新增 - POST /portal/resource - Body: ```json { "majorId": {{majorId}}, "courseId": {{courseId}}, "resourceName":"算法作业参考", "resourceType":0, "fileUrl":"{{fileUrl}}", "fileHash":"demo-sha256", "fileSize":1024, "description":"仅供学习参考" } ``` - 断言:`code == 200`;提取 `data.id` → `rid` 4) 提交上架 - PUT /portal/resource/{{rid}}/online → `code == 200` 5) 列表/详情可见 - GET /portal/resource/list?keyword=算法 → `rows.some(x => x.id == {{rid}})` - GET /portal/resource/{{rid}} → `code == 200` ## 用例 3:编辑/下架/删除(失败与越权断言) - 编辑:PUT /portal/resource(Body:`{ "id": {{rid}}, "description":"补充说明" }`)→ `code == 200` - 下架:PUT /portal/resource/{{rid}}/offline(Body:`{ "reason":"内容更新" }`)→ `code == 200` - 删除(需非通过状态):DELETE /portal/resource/{{rid}} → `code == 200` - 越权:使用他人账号编辑/下架/删除 → `code != 200` 且 `msg` 包含“无权限/仅本人” - 冲突:已通过未下架直接编辑/删除 → `code != 200` 且 `msg` 包含“已上架/请先下架” ## 统一断言脚本(示例) - 成功:`status == 200 && body && body.code == 200` - 列表:`Array.isArray(body.rows) && typeof body.total === 'number'` - 详情:`body.data && body.data.id` ## 常见失败与定位 - 401:未登录/令牌过期 - 409:状态冲突(编辑/删除/下架不满足前置状态) - 500:唯一约束(课程+hash/link 重复)或参数校验失败;查看 `msg`