add exam questions: written (10 MC + 3 short), q1 JSON log pipeline, q2 user manager, project-a data layer, project-b interface layer
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
# 工程题 B:内容管理系统(接口层)
|
||||
|
||||
> **本题为扩展题内容,二选一完成即可。** 选做一道,不强制。
|
||||
> 请在功能分支上开发,完成后通过 Pull Request 合并回 main。
|
||||
|
||||
## 项目背景
|
||||
|
||||
实现一个内容管理系统的**接口层**:文章状态工作流、REST API、Django Admin 定制、认证与权限。核心挑战:多状态状态机、API 设计与认证、Admin 深度定制、权限校验。
|
||||
|
||||
## 功能需求
|
||||
|
||||
### 必须实现
|
||||
|
||||
1. **数据模型**
|
||||
- `Article`:标题、正文、作者(外键 → 用户,`CASCADE`)、状态(`draft` / `in_review` / `published` / `archived`)、浏览量(默认 0)、`created_at` / `updated_at`(自动记录)
|
||||
- 合理设置 `__str__`、`Meta` 排序、`verbose_name`
|
||||
|
||||
2. **文章工作流(状态机)**
|
||||
- 状态转换:`draft` → `in_review` → `published` → `archived`
|
||||
- 只有作者本人能执行状态转换(非作者返回 403)
|
||||
- 非法转换(如 `draft` → `published` 跳过审核、`archived` → `draft` 回退)返回 400
|
||||
- 文章列表页:支持按状态筛选 + 按作者筛选 + 按标题搜索(`icontains`)+ 分页(每页 10 条)
|
||||
|
||||
3. **REST API**
|
||||
- `GET /api/articles/`:返回文章列表(JSON),支持 `?status=` 和 `?page=` 参数
|
||||
- `GET /api/articles/<id>/`:返回单篇文章详情
|
||||
- `POST /api/articles/<id>/transition/`:执行状态转换,body 含 `{"to": "in_review"}`
|
||||
- API 返回标准 JSON 格式:成功 `{"data": ..., "message": "..."}`,失败 `{"error": "..."}` + 对应 HTTP 状态码
|
||||
- API 端点需登录认证(session 或 token 均可),未认证返回 401
|
||||
- 权限:只有作者能调用 `transition`,非作者返回 403
|
||||
|
||||
4. **Django Admin 定制**
|
||||
- `Article` 在 Admin 中可增删改查
|
||||
- 自定义 `list_display`(标题、作者、状态、浏览量、创建时间)
|
||||
- 自定义 `list_filter`(状态、作者)
|
||||
- 自定义 `search_fields`(标题)
|
||||
- 自定义 `actions`:批量发布(`draft`/`in_review` → `published`)、批量归档
|
||||
- 只读权限:非作者用户访问 Admin 时只能看,不能改(用 `has_change_permission` 控制)
|
||||
|
||||
5. **认证与权限**
|
||||
- 用户注册(用户名 + 密码,`set_password` 哈希存储)
|
||||
- 登录 / 登出(session)
|
||||
- 未登录用户只能浏览已发布文章的 API
|
||||
- 所有写操作(状态转换)必须校验登录 + 作者权限
|
||||
|
||||
### 加分项
|
||||
|
||||
1. **API 版本化**:`/api/v1/articles/` 和 `/api/v2/articles/`,v2 返回额外字段(如 `word_count`、`reading_time`)
|
||||
2. **全文搜索**:`GET /api/articles/?q=keyword` 支持标题 + 正文搜索
|
||||
3. **操作限制**:同一用户每分钟最多 5 次状态转换(用内存计数或数据库计数均可,写清实现思路)
|
||||
4. **WebSocket 实时通知**:文章状态变更时,通过 WebSocket 通知该作者的其他在线会话(用 `channels` 或轮询模拟均可,写清思路)
|
||||
5. **API 文档**:用 `drf-spectacular` 或手写 OpenAPI spec,生成 `/api/docs/` 页面
|
||||
|
||||
## 技术要求
|
||||
|
||||
- Python 3 + Django(可用 DRF,也可纯 Django 视图 + JSON 响应)
|
||||
- 必须包含:
|
||||
- `README.md`:项目说明、功能列表、依赖安装、运行方式、API 端点文档
|
||||
- `requirements.txt`
|
||||
- 可运行的 `manage.py`
|
||||
- 密码存储必须用 Django 内置哈希,禁止明文
|
||||
- 所有写操作必须校验登录 + 权限
|
||||
- 代码遵循 PEP 8
|
||||
|
||||
## 评分标准
|
||||
|
||||
| 维度 | 权重 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 必须功能完成度 | 40% | 模型 + 工作流 + API + Admin + 认证 |
|
||||
| 代码质量 | 25% | 状态机设计、API 结构、权限逻辑、无冗余、有注释 |
|
||||
| 加分项 | 20% | 实现了多少可选功能 |
|
||||
| 工程规范 | 15% | git 提交历史、分支管理、PR 流程、README 完整性 |
|
||||
|
||||
## 提交要求
|
||||
|
||||
- 项目代码放在本目录 `project-b/` 下
|
||||
- 在功能分支上开发,完成后通过 Pull Request 合并回 main
|
||||
- 保持过程性提交,提交信息应说明改动内容
|
||||
- 截止前(10月7日 23:59)仓库状态为准
|
||||
Reference in New Issue
Block a user