forked from ITStudio_OUC/ProgrammeHomework
工程题 A:文章管理系统(数据层)
本题为扩展题内容,二选一完成即可。 选做一道,不强制。 请在功能分支上开发,完成后通过 Pull Request 合并回 main。
项目背景
实现一个文章管理系统的数据层:文章模型、附件管理、操作审计、并发安全。核心挑战:合理的模型设计、Django 信号驱动的审计日志、文件附件管理、并发安全的计数器。
功能需求
必须实现
-
数据模型
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
-
附件管理
- 登录用户可为自己的文章上传附件(
FileField,存到MEDIA_ROOT/attachments/) - 文章详情页展示附件列表
- 作者可删除自己的附件
settings.py配置MEDIA_URL/MEDIA_ROOT,开发服务器能访问静态文件
- 登录用户可为自己的文章上传附件(
-
操作审计(信号驱动)
- 每次文章创建、状态变更、删除,自动写入
AuditLog - 必须用 Django 信号(
post_save/pre_delete)实现,禁止在视图里手动AuditLog.objects.create - 变更摘要用
JSONField记录变更前后字段差异,如{"status": {"old": "draft", "new": "published"}} - 文章详情页底部展示该文章的审计日志(按时间倒序)
- 每次文章创建、状态变更、删除,自动写入
-
并发安全浏览量
- 文章详情页每次访问浏览量 +1
- 必须用
F("views") + 1原子更新 - 写注释说明:为什么
article.views += 1; article.save()在并发下会丢更新
加分项
- 封面图缩略图:上传时自动生成 200px 宽缩略图(用
Pillow,存到MEDIA_ROOT/thumbnails/) - 文章统计视图:
/stats/展示总文章数、总浏览量、各状态文章数、最近 10 条审计日志 - 软删除:文章删除时不真删,设
is_deleted=True,审计日志保留;列表页过滤已删除文章 - 附件下载计数:每次下载附件 +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)仓库状态为准