项目的第一件事不是 CREATE DATABASE,而是把「要做什么」写清楚。这一阶段不写一行业务代码,却决定后面六个阶段的返工量:需求不清,表白建;接口没定,前端只能干等;表结构改了,后端跟着塌。学完这一阶段,你要交出一份《需求与设计说明书》——里面有角色、功能清单、原型草图、ER 图、接口约定和项目计划。
## 二、用户角色与权限
| 角色 | 可以做什么 | 不可以做什么 |
|---|---|---|
| 游客 | 浏览首页 / 作品列表 / 作品详情 / 书评列表;按分类、朝代筛选;按标题搜索 | 发表书评、点赞、收藏、修改资料 |
| 注册用户 | 游客的全部能力,另加:发表并删除自己的书评、点赞作品与书评、收藏与取消收藏、修改资料与上传头像 | 维护分类与轮播图;删除他人的书评 |
| 管理员 | 全部能力,另加:分类与轮播图维护、违规书评下架、用户禁用 | —— |
角色摊开之后,再列功能清单。每一条都要写清三件事:模块、功能点、优先级。优先级用 P0 / P1 / P2 标——P0 是不做就没法验收,P1 是本周期要做,P2 是有空再说。
| 模块 | 功能点 | 优先级 | 对应接口 |
|---|---|---|---|
| 用户 | 注册(用户名唯一、密码 6–20 位) | P0 | POST /api/user/register |
| 用户 | 登录(签发 token) | P0 | POST /api/user/login |
| 用户 | 查看个人信息(含书评数、收藏数) | P0 | GET /api/user/profile |
| 用户 | 修改个人信息(昵称 / 简介 / 性别) | P1 | PUT /api/user/profile |
| 用户 | 上传头像(jpg / png / gif,≤ 2 MB) | P1 | POST /api/user/avatar |
| 用户 | 退出登录(前端清 token,后端记日志) | P2 | POST /api/user/logout |
| 首页 | 轮播图列表(按 sort 排) | P0 | GET /api/banner/list |
| 首页 | 分类列表(筛选下拉框的数据源) | P0 | GET /api/category/list |
| 首页 | 文学推荐(推荐位,按浏览量倒序) | P0 | GET /api/article/recommend |
| 作品 | 作品列表(分页 / 分类 / 朝代 / 搜索 / 排序) | P0 | GET /api/article/list |
| 作品 | 作品详情(浏览量 +1,带收藏 / 点赞状态) | P0 | GET /api/article/detail/<id> |
| 作品 | 点赞作品(重复点赞 = 取消) | P1 | POST /api/article/like |
| 书评 | 书评列表(楼中楼:回复挂在父书评下) | P0 | GET /api/comment/list |
| 书评 | 发表书评(支持回复某条书评) | P0 | POST /api/comment/add |
| 书评 | 点赞书评 | P1 | POST /api/comment/like |
| 书评 | 删除自己的书评(软删除,越权返回 403) | P1 | DELETE /api/comment/<id> |
| 收藏 | 收藏 / 取消收藏(同一个接口来回切) | P1 | POST /api/favorite/toggle |
| 收藏 | 我的收藏(分页) | P1 | GET /api/favorite/list |
| 类别 | 指标 | 本项目目标 | 怎么验证 |
|---|---|---|---|
| 性能 | 接口响应时间 | 单表查询接口 P95 < 500 ms(本地开发环境) | Postman 看响应耗时 |
| 性能 | 分页保护 | page_size 上限 50,传 99999 会被夹取 | ?page_size=99999 看返回条数 |
| 性能 | 并发 | 支持 50 人同时浏览不报错 | 阶段 5 压测一遍 |
| 安全 | 密码 | 只存哈希(Werkzeug scrypt),响应里永不出现 password | 查响应字段 + 查库表 |
| 安全 | 鉴权 | 需登录接口必须带 Bearer token;越权删除他人书评返回 403 | 不带 token / 换个账号试 |
| 安全 | 注入 | 全部走 ORM 或参数化查询,不拼 SQL 字符串 | 代码评审,搜字符串拼接 |
| 安全 | 上传 | 只允许 jpg / png / gif,单文件 ≤ 2 MB,文件名用 uuid 重命名 | 传一个 .php 试试 |
| 兼容 | 浏览器 | Chrome / Edge / Firefox 最新两个大版本 | 阶段 5 跨浏览器测试 |
| 兼容 | 分辨率 | 1280 px 以上完整显示,375 px 可用不溢出 | 拖动窗口宽度观察 |
| 兼容 | 运行环境 | Python 3.10+ / Flask 3.x / MySQL 8.x / Node 18 LTS | 下方这条命令的输出 |
python --version
mysql --version
node -v
npm -v
// 请求:POST /api/user/register Content-Type: application/json
{
"username": "zhangsan",
"password": "123456",
"nickname": "张三",
"email": "zhangsan@example.com"
}
// 响应:无论成功还是失败,永远是这三个字段
{
"code": 200,
"msg": "注册成功",
"data": {
"user_id": 3
}
}
## 七、接口设计(BaseURL:http://127.0.0.1:5000/api)
| 模块 | 方法 | 路径 | 说明 | 需登录 |
|---|---|---|---|---|
| 用户 | POST | /api/user/register | 注册 | 否 |
| 用户 | POST | /api/user/login | 登录 | 否 |
| 用户 | GET | /api/user/profile | 获取个人信息 | 是 |
| 用户 | PUT | /api/user/profile | 修改个人信息 | 是 |
| 用户 | POST | /api/user/avatar | 上传头像 | 是 |
| 用户 | POST | /api/user/logout | 退出登录 | 是 |
| 首页 | GET | /api/banner/list | 轮播图列表 | 否 |
| 首页 | GET | /api/category/list | 分类列表 | 否 |
| 首页 | GET | /api/article/recommend | 文学推荐 | 否 |
| 作品 | GET | /api/article/list | 作品列表(分页 / 筛选 / 搜索) | 否 |
| 作品 | GET | /api/article/detail/<id> | 作品详情 | 否 |
| 作品 | POST | /api/article/like | 点赞作品 | 是 |
| 书评 | GET | /api/comment/list | 书评列表 | 否 |
| 书评 | POST | /api/comment/add | 发表书评 | 是 |
| 书评 | POST | /api/comment/like | 点赞书评 | 是 |
| 书评 | DELETE | /api/comment/<id> | 删除自己的书评 | 是 |
| 收藏 | POST | /api/favorite/toggle | 收藏 / 取消收藏 | 是 |
| 收藏 | GET | /api/favorite/list | 我的收藏 | 是 |
| 阶段 | 主要工作任务 | 交付物 | 里程碑(怎么算做完) |
|---|---|---|---|
| 阶段 1 · 需求与设计 | 角色与权限、功能清单、非功能需求、原型草图、ER 图、接口设计、项目计划 | 《需求与设计说明书》 | M1 设计评审通过,八个小节无「待补充」 |
| 阶段 2 · 数据库实施 | 建库建表、外键与索引、视图、种子数据、常用查询 | 可重复执行的 hiwen.sql | M2 SHOW TABLES 能看到 7 表 1 视图,种子数据齐全 |
| 阶段 3 · 后端开发 | 应用工厂与蓝图、ORM 模型、统一响应、全局异常、JWT 鉴权、18 个接口 | 可运行的后端服务 | M3 Postman 跑通「注册 → 登录 → 拿 token → 查个人信息」 |
| 阶段 4 · 前端开发 | 页面与路由、状态管理、请求封装、与后端联调 | 可点击的前端 SPA | M4 三端联调通过,页面上数据都是真的 |
| 阶段 5 · 测试 | 功能用例、异常用例、跨浏览器测试、缺陷修复 | 测试用例与测试报告 | M5 P0 用例全部通过 |
| 阶段 6 · 部署上线 | 服务器环境、MySQL 安装、Gunicorn 守护、Nginx 配置、HTTPS(可选) | 公网可访问地址 | M6 在别人电脑上能打开这个网址 |
| 阶段 7 · 答辩与复盘 | 演示、讲设计取舍、答问、项目总结 | 答辩 PPT + 项目总结 | M7 答辩通过,能讲清「为什么这么设计」 |
# 在 pyweb/ 目录下执行
mkdir -p docs assets/postman
tree -L 1
# 古典文学网 · 需求与设计说明书
## 一、项目背景与目标 —— 一句话说清「做什么、给谁用」
## 二、用户角色与权限 —— 游客 / 注册用户 / 管理员,各自能做什么、不能做什么
## 三、功能清单 —— 模块 | 功能点 | 优先级(P0 / P1 / P2),共 18 条
## 四、非功能需求 —— 性能 / 安全 / 兼容性,每条都要可量化、可验证
## 五、原型草图 —— 首页 / 作品列表 / 作品详情三张线框图
## 六、数据库设计 —— 7 张表与关系(ER 图),字段级 DDL 留到阶段 2
## 七、接口设计 —— 统一响应结构 + 18 个接口总览表
## 八、项目计划 —— 7 个阶段的任务、交付物与里程碑
附:术语表(作品 / 书评 / 收藏 / 点赞 / 轮播图 / 楼中楼)
## 三、功能清单
| 模块 | 功能点 | 优先级 | 对应接口 |
|---|---|---|---|
| 电影 | 电影列表(分页 + 类型筛选 + 评分排序) | P0 | GET /api/movie/list |
| 电影 | 电影详情(含影评数) | P0 | GET /api/movie/detail/<id> |
| 影评 | 发表影评(需登录) | P0 | POST /api/review/add |
## 六、数据库设计
movie :id / title / director / genre / rating / created_at
review :id / movie_id(外键 → movie.id)/ user_id / content / created_at
关系:一部电影对多条影评(1:N),删电影要不要删影评 → ON DELETE CASCADE
## 七、接口设计
| 模块 | 方法 | 路径 | 说明 | 需登录 |
|---|---|---|---|---|
| 电影 | GET | /api/movie/list | 电影列表(page / genre / order_by) | 否 |
| 电影 | GET | /api/movie/detail/<id> | 电影详情 | 否 |
| 影评 | GET | /api/review/list | 影评列表(movie_id 必填) | 否 |
| 影评 | POST | /api/review/add | 发表影评 | 是 |
第 3 题的关键:换的是「实体名」(作品 → 电影、书评 → 影评、分类 → 类型),不变的是整套骨架——角色权限、功能清单、ER 图、接口表、P0 优先。这份骨架你能迁移过去,说明你掌握的是方法,不是某个网站的细节。