Skip to content

全栈项目场景题

场景 1:设计一个登录系统,你会怎么做?

面试官可能这样问:

你负责从前端到后端实现登录注册系统,会怎么设计?

回答思路:

  • 前端表单校验和错误提示。
  • 后端校验账号密码。
  • 密码加盐哈希存储。
  • 使用 session 或 token 维护登录态。
  • 设计刷新 token 或过期策略。
  • 权限路由和接口鉴权。
  • 登录失败限流和日志审计。

项目化解释:

真实项目里,登录不是一个表单加接口这么简单。前端要处理 loading、错误提示、回车提交、重复点击。后端要防止密码明文存储,要限制连续失败次数。

如果用 JWT,我会让 access token 短期有效,refresh token 长期但可撤销。前端路由权限只做体验,后端每个敏感接口都必须校验权限。

追问点:

JWT 如何主动失效?

JWT 天然无状态,主动失效需要额外机制,例如维护 token 黑名单、使用短 access token + 可撤销 refresh token、用户密码变更后更新 token 版本号。

localStorage 使用方便但更怕 XSS;Cookie 配合 HttpOnly 更不容易被 JS 读取,但要处理 CSRF。具体选择要看前后端架构和安全要求。

如何防暴力破解?

对登录失败次数、IP、账号、设备做限流和冷却;必要时加验证码、风险识别和告警。密码要使用安全哈希存储。

如何做单点登录?

常见方案是统一认证中心。业务系统跳转认证中心登录,登录成功后拿授权码或 token,再换取用户身份。企业场景常见 OAuth2、OIDC、CAS。

场景 2:订单列表查询很慢,你怎么优化?

面试官可能这样问:

后台订单列表越来越慢,产品还要求支持多个筛选条件,你怎么排查和优化?

回答思路:

  • 先看接口耗时、SQL 慢查询和返回数据量。
  • 给高频筛选字段加索引。
  • 使用分页,避免一次返回大量数据。
  • 只返回页面需要字段。
  • 对复杂统计异步计算或缓存。
  • 前端筛选条件加防抖,避免频繁请求。

项目化解释:

我会先拿一条慢请求的 requestId 查后端日志,再看 SQL 执行计划。如果发现按 status + created_at 查询很频繁,就考虑联合索引。如果返回了很多详情字段但列表只展示 8 列,就精简返回。

前端也要配合:搜索框防抖,切换筛选时展示 loading,不要让用户以为页面卡死。

追问点:

联合索引顺序怎么考虑?

一般把等值查询字段放前面,范围查询和排序字段放后面,并结合最左前缀原则。最终要用 EXPLAIN 验证执行计划。

offset 分页有什么问题?

数据量大时,offset 越靠后扫描和丢弃的数据越多,性能会变差。数据频繁变化时还可能出现重复或遗漏。

cursor 分页适合什么场景?

适合按时间、ID 等稳定顺序连续翻页的场景,例如消息流、订单列表、动态列表。它性能更稳定,但不适合任意跳页。

如何避免导出大数据拖垮服务?

导出任务异步化,限制导出范围和频率,分批查询,生成文件后通知用户下载。大导出不要在同步接口里一次性完成。

场景 3:文件上传失败率很高怎么办?

面试官可能这样问:

用户上传大文件经常失败,你会怎么设计一个更稳定的上传方案?

回答思路:

  • 前端校验文件大小、类型。
  • 大文件分片上传。
  • 每个分片可重试。
  • 后端或对象存储合并分片。
  • 用文件 hash 支持秒传和断点续传。
  • 展示上传进度和失败重试。
  • 做权限、病毒扫描和访问控制。

项目化解释:

如果文件几百 MB,一次上传失败就要重来,体验很差。我会把文件切成多个 chunk,每个 chunk 上传成功后记录状态。网络断了之后,只需要继续传未完成的 chunk。

上传完成后由服务端校验 hash,确认文件完整,再保存 metadata。对于私有文件,不能直接给公开访问 URL。

追问点:

分片大小怎么选?

要在并发效率和失败重传成本之间取平衡。分片太小请求太多,太大失败重传成本高。可以按网络和文件大小动态选择。

秒传怎么实现?

前端计算文件 hash,上传前问后端是否已存在相同文件。如果存在且用户有权限复用,就直接创建文件记录,不再上传内容。

如何处理重复文件?

用文件 hash 做内容去重,用业务记录区分不同用户或目录下的引用。注意同 hash 文件的权限不能混用。

如何防止上传恶意文件?

限制类型和大小,校验 MIME 和文件签名,重命名存储,隔离访问域名,高风险文件做病毒扫描,禁止上传文件被当作代码执行。

场景 4:上线后接口突然 500,你怎么处理?

面试官可能这样问:

新版本上线后部分用户接口报 500,你作为全栈工程师怎么排查?

回答思路:

  • 先确认影响范围和是否需要回滚。
  • 查看最近发布内容。
  • 根据 requestId 查后端日志。
  • 看错误栈、数据库、缓存、第三方服务。
  • 如果影响大,先回滚或关闭 feature flag。
  • 修复后补测试和监控。

项目化解释:

线上问题先止血,不是先慢慢研究。比如发现 500 来自新字段为空导致后端异常,我会先回滚或加兼容逻辑,然后再补数据迁移和空值测试。

复盘时要问:为什么测试没发现?为什么监控没提前告警?后续要补哪些自动化检查?

追问点:

什么情况下回滚?

核心链路不可用、错误率明显升高、数据写入错误、性能严重下降且无法快速修复时应优先回滚或关闭功能开关。

如何设计 requestId?

每个请求进入网关或服务时生成唯一 requestId,贯穿前端、网关、后端、数据库日志和第三方调用。用户反馈问题时可以快速串起整条链路。

如何做灰度发布?

按用户、租户、地区、机器或流量比例逐步放量,并监控错误率、延迟、业务指标。异常时快速停止灰度或回滚。

如何避免数据库变更导致回滚困难?

数据库变更要向前兼容,先加字段再切代码,避免上线时直接删除字段或修改语义。大变更用双写、灰度读和延迟清理。

场景 5:如何从 0 到 1 做一个博客系统?

面试官可能这样问:

如果让你设计一个博客系统,你会怎么做?

回答思路:

  • 前端:首页、文章列表、详情、分类、搜索、后台编辑。
  • 后端:文章 CRUD、登录、权限、评论、上传。
  • 数据库:用户表、文章表、分类表、标签表、评论表。
  • SEO:静态生成或服务端渲染。
  • 性能:缓存热门文章、图片优化、分页。
  • 安全:后台鉴权、XSS 防护、评论审核。
  • 部署:CI/CD、静态资源 CDN、日志监控。

项目化解释:

我会先做 MVP:文章列表、详情、后台发布。不要一开始就做复杂权限和推荐系统。等核心链路稳定后,再加搜索、标签、评论和统计。

如果博客主要是内容展示,可以优先 SSG,比如 VitePress 或 Next.js 静态生成,速度快、部署简单、成本低。

追问点:

Markdown 如何渲染和防 XSS?

Markdown 渲染后要对 HTML 做白名单过滤,禁止危险标签和属性,例如 script、事件属性和不可信链接。也可以限制只允许安全 Markdown 语法。

如何设计标签和分类?

分类通常是层级或单选归属,标签是多对多。可以设计文章表、分类表、标签表和文章标签关联表。

如何做全文搜索?

小规模可以用数据库模糊查询或前端索引,大规模可以接 Elasticsearch、Meilisearch 或 Typesense。搜索要考虑分词、权重、高亮和权限过滤。

如何统计文章访问量?

可以记录访问事件,再异步聚合 PV、UV。高访问量场景可用 Redis 计数,定期落库,避免每次访问都直接写数据库。

Built with VitePress and GitHub Pages.