Files

4.0 KiB
Raw Permalink Blame History

工程题 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)仓库状态为准