01 · PRODUCT & BUSINESS
用户要怎样使用这个相册?
一个用户可以创建多少个相册?
删除相册时,里面的照片怎么办?
公开相册是否允许未登录用户访问?
上传到一半失败,用户看到的应该是什么状态?
OPENING QUESTION · ALBUM SYSTEM
Chapter 1
这是一套以“相册系统”为贯穿项目的全栈工程课程。
我们不会把知识点拆成孤立章节,而是沿着一个系统从本地开发到正式上线的过程,逐步讨论数据库、后端、前端、文件存储、部署和故障排查。
问题地图
一次只看一组。先判断问题,再讨论技术。
01 · PRODUCT & BUSINESS
一个用户可以创建多少个相册?
删除相册时,里面的照片怎么办?
公开相册是否允许未登录用户访问?
上传到一半失败,用户看到的应该是什么状态?
02 · DATA DESIGN
照片属于用户,还是属于相册?
图片文件本身要不要存进数据库?
文件被删除但数据库记录仍在,会发生什么?
哪些字段需要建立索引,是否应该逻辑删除?
03 · FILE UPLOAD
扩展名是 .jpg,就一定是图片吗?
两个用户上传同名文件,会不会互相覆盖?
文件保存成功但数据库写入失败,算成功还是失败?
上传失败产生的临时文件如何清理?
04 · IDENTITY
密码应该如何保存?
JWT 和 Session 应该选哪个?
前端传来的用户 ID 能不能直接相信?
用户退出后,旧 Token 是否还能使用?
05 · PERMISSION
知道私有相册 ID,能不能直接访问?
隐藏“删除”按钮,就能防止删除别人的照片吗?
私有页面不能访问,但图片直链还能访问,算私有吗?
如何证明系统不存在越权漏洞?
06 · API DESIGN
删除照片应该如何设计接口地址?
未登录和无权限有什么区别?
数据库错误能不能直接返回给前端?
连续点击两次删除,会发生什么?
07 · PERFORMANCE
照片列表是否应该一次返回全部数据?
SELECT * 会有什么问题?
每个相册单独查询一次照片数量会怎样?
一张 20 MB 图片被 100 人同时访问会怎样?
08 · CONSISTENCY
两个请求同时设置相册封面,会发生什么?
重复点击上传,会不会产生两条记录?
删除相册时中间某一步失败怎么办?
数据库事务能同时回滚图片文件吗?
09 · CONFIGURATION & SECURITY
数据库密码和 JWT 密钥应该写在哪里?
.env 文件是否应该提交到 Git?
上传目录写死在开发者电脑上会怎样?
文件名是否可能包含危险路径?
10 · DELIVERY
前端、后端和数据库该如何一起启动?
容器中的 localhost 指向哪里?
重建容器后,数据库和图片还在吗?
depends_on 是否意味着数据库已经可连接?
11 · ACCESS GATEWAY
前端、后端、图片各在不同端口,用户访问哪个?
为什么会出现跨域?
公开和私有图片都能由 Nginx 直接返回吗?
后端真实地址是否应该暴露给用户?
12 · OPERATIONS
前端能打开但登录失败,先看哪里?
图片目录不可写,健康检查能发现吗?
日志只写“发生错误”有用吗?
照片访问突然变慢,应该从哪里排查?
到这里,我们才开始课程
接下来,每一章都会从一个真实故障或不完整实现开始,比较方案,再改造这套相册系统。
进入 Chapter 2:审查表设计 →