Files

70 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 工程题 A:文章管理系统(数据层)
> **本题为扩展题内容,二选一完成即可。** 选做一道,不强制。
> 请在功能分支上开发,完成后通过 Pull Request 合并回 main。
## 项目背景
实现一个文章管理系统的**数据层**:文章模型、附件管理、操作审计、并发安全。核心挑战:合理的模型设计、Django 信号驱动的审计日志、文件附件管理、并发安全的计数器。
## 功能需求
### 必须实现
1. **数据模型**
- `Article`:标题、正文、作者(外键 → 用户,`CASCADE`)、状态(`draft` / `published` / `archived`)、浏览量(默认 0)、`created_at` / `updated_at`(自动记录)
- `Attachment`:文件名、文件(`FileField`)、关联文章(外键 → `Article`,`CASCADE`,`related_name="attachments"`)、上传时间
- `AuditLog`:操作类型(`create` / `update` / `publish` / `archive` / `delete`)、关联文章(外键 → `Article`,`SET_NULL`,`null=True`)、操作人(外键 → 用户,`SET_NULL`,`null=True`)、时间戳、变更摘要(`JSONField`)
- 合理设置 `__str__`、`Meta` 排序、`verbose_name`
2. **附件管理**
- 登录用户可为自己的文章上传附件(`FileField`,存到 `MEDIA_ROOT/attachments/`)
- 文章详情页展示附件列表
- 作者可删除自己的附件
- `settings.py` 配置 `MEDIA_URL` / `MEDIA_ROOT`,开发服务器能访问静态文件
3. **操作审计(信号驱动)**
- 每次文章创建、状态变更、删除,自动写入 `AuditLog`
- **必须用 Django 信号**(`post_save` / `pre_delete`)实现,禁止在视图里手动 `AuditLog.objects.create`
- 变更摘要用 `JSONField` 记录变更前后字段差异,如 `{"status": {"old": "draft", "new": "published"}}`
- 文章详情页底部展示该文章的审计日志(按时间倒序)
4. **并发安全浏览量**
- 文章详情页每次访问浏览量 +1
- **必须用 `F("views") + 1` 原子更新**
- 写注释说明:为什么 `article.views += 1; article.save()` 在并发下会丢更新
### 加分项
1. **封面图缩略图**:上传时自动生成 200px 宽缩略图(用 `Pillow`,存到 `MEDIA_ROOT/thumbnails/`)
2. **文章统计视图**:`/stats/` 展示总文章数、总浏览量、各状态文章数、最近 10 条审计日志
3. **软删除**:文章删除时不真删,设 `is_deleted=True`,审计日志保留;列表页过滤已删除文章
4. **附件下载计数**:每次下载附件 +1(`F("downloads") + 1`),展示在附件列表
## 技术要求
- Python 3 + Django
- 必须包含:
- `README.md`:项目说明、功能列表、依赖安装、运行方式
- `requirements.txt`(含 `Pillow`)
- 可运行的 `manage.py`
- 密码存储必须用 Django 内置哈希(`set_password`),禁止明文
- 审计日志必须用信号实现,禁止在视图里手动 `create`
- 代码遵循 PEP 8
## 评分标准
| 维度 | 权重 | 说明 |
| --- | --- | --- |
| 必须功能完成度 | 40% | 模型 + 附件 + 信号审计 + 并发浏览量 |
| 代码质量 | 25% | 模型设计、信号设计、无冗余、有注释 |
| 加分项 | 20% | 实现了多少可选功能 |
| 工程规范 | 15% | git 提交历史、分支管理、PR 流程、README 完整性 |
## 提交要求
- 项目代码放在本目录 `project-a/` 下
- 在功能分支上开发,完成后通过 Pull Request 合并回 main
- 保持过程性提交,提交信息应说明改动内容
- 截止前(10月7日 23:59)仓库状态为准