进阶手册
技术架构与选型
这是手册,不是第 3 章的替代品;读完十章并做过一个项目后再回来查。 当 AI 说出 Vue、FastAPI、PostgreSQL、Docker,或你遇到「该不该买服务器」「为什么本机能跑、服务器报错」时,按小节查即可。
你能查到什么
- 某一层的常见方案、最大代价,以及什么时候才该选它。
- 从四个约束出发,定位到四套组合套餐中的一套。
- 按症状定位到 16 步链路的某一步、某一层,再把问题说准交给 AI。
全文只围绕一个前提:技术方案没有绝对优劣,只有在具体约束下的合适与否。 使用人数、数据规模、生命周期、出错代价——这四个约束变了,正确答案可能完全相反。
为什么要分层
分层只有一个目的:换掉一层时,其他层不用跟着重写。 三格地图、五层定义和餐厅比喻见 第 3 章,本页不再重复。
对 vibe coding 的意义:当 AI 改错地方时,你能说出「这是接口层的问题,不是界面层」,它就少猜三轮。你不需要会写每一层,但需要知道每层负责什么、什么时候该换。
五层结构:三格地图之外还有两格
五层的标准定义、每层在对话里的常见说法,见 第 3 章 · 三格 → 五层 + 横切。 下面这张图留作查选型和排障时的定位地图。
查选型时按「数据 → 逻辑 → 接口 → 界面」从后往前看;查排障时按「症状 → 层 → 步」从上往下找。方向反了,就会先改界面、再改后端,最后发现是数据库。
一次请求的 16 步:从点击到画面更新
这条链路不用背。它的用处是:出问题时能判断现在坏在第几步、属于哪一层。
| 步 | 层 | 这一步做什么 | 出错时的表现 |
|---|---|---|---|
| 1 | 界面层 | 渲染界面:把数据套进模板和样式 | 页面空白、布局错乱、显示 undefined |
| 2 | 捕获操作:监听点击、输入、选择 | 点了没反应;输入了但提交无效 | |
| 3 | 更新状态:记住筛选条件、选中项 | 显示和实际数据对不上;切换条件不刷新 | |
| 4 | 组装请求:打包成一次接口调用 | 请求发不出去、参数缺失、地址写错 | |
| 5 | 接口层 | 路由匹配:决定交给哪段逻辑 | 404;或调到了错误的处理逻辑 |
| 6 | 参数校验:拦住格式非法的数据 | 空值、错类型的数据直接进库 | |
| 7 | 权限校验:判断能不能做、能看多少 | 越权看到别人的数据 | |
| 8 | 封装响应:按约定结构和状态码返回 | 字段名对不上;成功失败分不清 | |
| 9 | 逻辑层 | 读取规则:口径、状态条件、限额 | 同一指标在不同报表里数值不同 |
| 10 | 计算判断:汇总、比较、决策 | 算错账,而且通常不报错 | |
| 11 | 请求数据:经统一入口向数据层取数 | 取数逻辑散落各处,改一处漏一处 | |
| 12 | 组装结果:整理成接口约定的结构 | 把数据库原始字段直接暴露给前端 | |
| 13 | 数据层 | 获取连接:从连接池取一个通道 | 并发一高就卡住,连接没释放 |
| 14 | 执行查询:走索引定位数据 | 数据量涨到某个点后突然变慢 | |
| 15 | 事务提交:全成功或全回滚 | 扣了款没加库存 | |
| 16 | 返回数据集:结果交回逻辑层 | 提示保存成功但重启后丢失 |
一个 HTML 文件的小工具没有第 5–16 步:逻辑和数据都写在页面里,双击就能用。这不是「不完整」,而是在正确的约束下省掉了不必要的层。
不要一上来就让 AI「看看哪里错了」。先说清症状,再对照这张表判断大概在哪一层,最后把那一层的代码和完整报错一起给它。
页面上的数字不对,但没有任何报错。你会先查第 1–4 步、第 9–12 步,还是第 13–16 步?为什么?
界面层(前端)
负责呈现和采集:把后端数据渲染成画面,把点击、输入、拖拽翻译成动作。 它不做业务判断——判断错了会算错账,界面不该承担这个风险。基础定义见 第 3 章 · 一个软件是由什么组成的。
| 部件 | 作用 | 常见内容 |
|---|---|---|
| 结构 | 页面上有哪些元素、按什么层级排列 | HTML 标签 |
| 样式 | 颜色、间距、字体、响应式布局 | CSS、Tailwind、组件库主题 |
| 交互 | 点击、输入、切换时发生什么,如何取数据 | JavaScript |
| 组件化 | 把重复出现的界面块封装起来复用 | Vue 组件、React 组件 |
| 状态管理 | 记录「页面当前是什么情况」 | Vue 响应式、React Hooks / 状态库 |
主流方案怎么选
| 方案 | 最适合 | 最大优点 | 最大代价 | 什么时候选 |
|---|---|---|---|---|
| 原生 HTML / CSS / JavaScript | 单页工具、报告页、演示页、原型验证 | 零依赖、双击即开,AI 出错率最低 | 页面一多就难维护,没有组件复用 | 页面不超过五六个、一个人维护 |
| Vue | 中文团队、要做一个真正的多人用产品 | 模板接近 HTML,中文资料最全,上手平缓 | 超大项目与海外生态不如 React | 要在可控学习成本内做出组件化界面 |
| React | 长期产品、需要招人或接大量现成库 | 生态最大,AI 训练语料最多 | 环境配置和概念最多,新手最容易卡住 | 准备长期维护,并且可能找人接手 |
Tailwind CSS 用短类名直接写样式;组件库(Element Plus / Ant Design)直接提供表格、表单、弹窗。代价是类名初看像乱码、产品容易长得像——确认值得再引入。
顺序上从原生开始:先做出能看的东西,撞到「改不动了」这堵墙,再迁到框架。只有一个页面、一次交付 → 原生三件套;要做成能长大的产品、团队以中文为主 → Vue;要长期维护并可能招人接手 → React。
浏览器里的代码任何人都能查看。把大模型 API Key、数据库密码写进前端,等同于把钥匙挂在门上。 前端校验只是体验,不是安全——真正的权限和校验必须在接口层和逻辑层。
对应 16 步第 1–4 步:渲染界面、捕获操作、更新状态、组装请求。
接口层(API)
规定界面层和逻辑层之间「怎么问、怎么答」。它的价值不在传输本身,而在解耦: 只要接口约定不变,前端换成手机 App、后端换成另一种语言,两边都不必改动。
- 地址与方法
- 每个操作对应一个地址(如
/api/sales-orders/123)和一个动作(取、建、改、删)。 - 请求与返回格式
- 前端送上去、后端答回来的数据结构,通常是 JSON。返回格式一旦定下就是契约。
- 状态码
- 200 成功、400 参数不对、401 没登录、403 没权限、404 找不到、500 服务器出错。
- 接口文档
- 把上述约定写下来,供两边对照。FastAPI 这类框架能自动生成。
主流方案怎么选
| 方案 | 通信方式 | 实时性 | 实现成本 | 排查难度 | 典型场景 |
|---|---|---|---|---|---|
| REST API | 一问一答 | 需轮询 | 低 | 低 | 绝大多数功能,默认答案 |
| GraphQL | 一次问一批 | 需轮询 | 高 | 高 | 数据关系复杂、页面变化频繁 |
| WebSocket | 长期双向 | 实时推送 | 中 | 中 | 聊天、进度条、看板自动刷新 |
| 云函数 / Serverless | 触发执行 | 视触发而定 | 低 | 中 | 轻接口、定时任务、事件处理 |
REST 的写法最直白:资源地址 + 动作 + 返回 JSON。
取销售订单列表是「对 /api/sales-orders 做取动作」,新建订单是「对同一地址做建动作」。
浏览器地址栏、命令行工具、调试软件都能直接测试。
GET /api/sales-orders?status=paid 200 OK { "items": [ { "id": 123, "customer": "张三", "amount": 99.0, "status": "paid" }, { "id": 124, "customer": "李四", "amount": 45.5, "status": "paid" } ], "total": 2 } POST /api/sales-orders { "customer": "王五", "amount": 128.0 } 201 Created { "id": 125, "customer": "王五", "amount": 128.0, "status": "pending" }
接口是前后端之间唯一的合同。合同模糊,AI 就会自己发明字段名——
前端等 total,后端返回 count;前端传 userId,后端读 user_id。
这类问题不会报语法错误,只会让页面空着。在第 7 章写规格时,
把地址、字段、错误格式一并写清楚,能省掉大量来回。
先默认 REST。只有出现明确痛点——页面太慢(考虑 GraphQL)、 必须实时(考虑 WebSocket)、调用极少又要省钱(考虑云函数)——才引入其他方案。 接口层的替换成本较高,前期多花十分钟想清楚是划算的。
对应 16 步第 5–8 步:路由匹配、参数校验、权限校验、封装响应。
逻辑层(后端)
所有判断和计算发生的地方:这条数据能不能改、这个用户有没有权限、这个指标该怎么算。 它同时是唯一能安全保管密钥的地方——任何放在前端的密码或密钥,等同于公开。
- 路由:把接口层的每个地址分派给对应的处理逻辑。业务逻辑:真正的规则与计算,指标口径只在这里写一遍。
- 数据访问:读写数据层的统一入口,避免查询散落各处。权限与参数校验:判断能不能做,并拦住格式非法的数据。
- 定时任务:每日汇总、自动同步、定期清理。第三方调用:访问大模型、短信、支付,并在服务端保管密钥。
主流方案怎么选
| 方案 | 最适合 | 最大优点 | 最大代价 | 一句结论 |
|---|---|---|---|---|
| Node.js(Express / NestJS) | 前后端由同一批人负责、以界面交互为主 | 前后端同一门语言,学习成本几乎减半 | 单线程不适合密集计算;类型系统松散 | 会 JS 就能顺手写后端 |
| Python(FastAPI / Django) | 以数据和 AI 为核心的项目 | 代码量最少、可读性最好,数据与 AI 生态最强 | 执行速度不如 Java、Go;环境管理是新手第一道坎 | 数据与 AI 的首选 |
| Java(Spring Boot) | 公司已有 Java 团队、需要多方长期维护的核心系统 | 极度稳定,长期可交接性最强 | 代码量大、启动慢、学习门槛最高 | 企业核心系统 |
AI 很容易把同一个计算写在三个地方:接口里算一次、页面里算一次、导出时再算一次。 三处一旦不一致,就会出现「同一个数在不同报表里不一样」。 写规格时明确一句:这个指标只在一个函数里计算,其他地方调用它。 在第 8 章的审查阶段也要专门检查这件事。
判断标准只有一条:项目核心是「界面交互」还是「数据处理」。 偏界面交互、想少学一门语言 → Node.js;核心是计算、统计、调用大模型 → Python; 已是企业既有体系的一部分、要交接给 IT 团队 → 沿用 Java。
对应 16 步第 9–12 步:读取规则、计算判断、请求数据、组装结果。
数据层
把数据存下来、按需找出来,并保证三件事: 不丢(有备份)、不乱(多人同时写不出冲突)、 不假(写入时有校验,脏数据进不来)。
| 部件 | 作用 | 要点 |
|---|---|---|
| 表结构 | 规定存哪些字段、每个字段什么类型 | 字段类型写错,后期清洗成本极高 |
| 索引 | 加速查找,避免数据一多就变慢 | 加在经常筛选和关联的字段上 |
| 关联关系 | 记录数据之间的关系(一个客户多张订单) | 关系型数据库靠外键和连接查询 |
| 缓存 | 把常用结果放在内存里,避免反复计算 | 通常是数据库之外的加速层 |
| 文件存储 | 存图片、PDF、附件等非结构化内容 | 与数据库分开,用对象存储 |
| 备份与恢复 | 定期留副本,出事后能回到某个时间点 | 没验证过能恢复,等于没备份 |
主流方案怎么选
| 方案 | 一句话 | 适合 | 不适合 | 代价 |
|---|---|---|---|---|
| Excel / CSV | 最朴素的数据载体,成本为零 | 数据量小、单人维护、一次性分析 | 多人协作、长期累积且不允许出错 | 无并发、无事务、无类型约束 |
| SQLite | 一个文件就是一个完整数据库 | 单机工具、桌面应用、原型、个人知识库 | 多人同时写入、需要远程连接 | 并发有限,无网络访问 |
| MySQL | 应用最广的关系型数据库 | 常规业务系统的默认选择 | 复杂分析型查询为主 | 需基本运维(备份、账号、容量) |
| PostgreSQL | 功能最完整的开源关系型数据库 | 关系复杂、要做较重统计与分析 | 只需最简单增删改查的小项目 | 配置项更多,调优知识更多 |
| MongoDB | 不要求预先定义表结构的文档型数据库 | 结构多变、以整体读写为主 | 严谨报表和财务核算 | 关联查询弱,长期容易越存越乱 |
| Redis | 放在内存里的高速存储 | 作为已有数据库的缓存、计数、会话 | 作为唯一的数据存储 | 内存贵,持久化不等于可靠存储 |
| Supabase / Firebase | 数据库、登录、文件存储、接口打包提供 | 想快速做出产品、不愿碰运维 | 数据敏感度极高、需要完全自主可控 | 平台绑定,用量增长后费用上升 |
| 对象存储(OSS / COS / S3) | 专门存图片、PDF、附件 | 有文件上传与分发需求 | 存结构化业务数据 | 只能存不能算;权限配错会泄露 |
第一,把文件塞进数据库。图片、PDF、附件会让数据库迅速膨胀、备份变慢。文件放对象存储,数据库里只存「文件地址」。
第二,只加索引不验证。索引不是越多越好——它会拖慢写入、占用空间。先找出真正慢的那条查询,再加索引,并用真实数据量测一次。
只备份、没验证过能恢复,等于没备份。 至少做一次完整恢复演练:把备份拿到另一台机器上真的恢复出来,确认数据能用。
按「数据量 + 协作人数」两步判断:一个人用、十万行以内 → 先用 Excel,需要更稳就用 SQLite; 多人同时用 → 必须上真正的数据库,常规选 MySQL,分析偏重选 PostgreSQL; 要做产品且不想碰运维 → Supabase 一类一体化平台。 Redis 和对象存储是补充,不是替代。
对应 16 步第 13–16 步:获取连接、执行查询、事务提交、返回数据集。
运行层
让程序真的「跑起来」并「被访问到」:代码放在哪台机器上执行、别人用什么地址打开、 这份环境能撑多久、一个月要花多少钱。部署的基础定义见 第 3 章 · 运行层:从本机到别人能打开。
- 运行环境:系统与软件版本。版本不一致是「本机能跑、服务器报错」的头号原因。服务器 / 托管平台:决定性能上限、成本与可访问范围。
- 域名:把 IP 换成好记的网址;中国大陆服务器需要备案。HTTPS 证书:加密传输,主流平台可自动申请和续期。
- 容器:把程序与依赖打包成可移植单元,解决「环境不一样」。自动化部署:提交后自动检查、构建、上线,省掉手动传文件。
主流方案怎么选
| 方案 | 能跑后端 | 运维负担 | 费用 | 内网可达 | 典型场景 |
|---|---|---|---|---|---|
| 静态托管(Vercel / Netlify / GitHub Pages) | 不能 | 无 | 几乎免费 | 否 | 报告页、纯前端工具 |
| 云服务器(阿里云 ECS / 腾讯云 CVM) | 能 | 高 | 按期计费 | 是 | 内网数据源、自主可控 |
| Docker 容器 | 包装形式 | 中 | 随宿主机 | 随宿主机 | 环境一致性、易迁移 |
| 托管应用平台(Railway / Render / 函数计算) | 能 | 低 | 免费额度 + 按量 | 否 | 要后端但不碰运维 |
它只能分发静态文件,不能运行后端逻辑,也不能安全保存密钥。 纯前端页面要调用大模型,中间必须加一个服务端中转。这是结构上的硬要求。
从最轻的开始:纯前端 → 静态托管(零成本);需要能藏密钥的后端 → 托管应用平台; 必须访问公司内网数据 → 才上云服务器。不要一开始就买服务器——它是唯一「即使没人用也持续花钱」的选项。
运行层不在 16 步链路里;它承载第 1–16 步所在的机器与平台。
横切关注点:七件比技术选型更重要的事
以下七项不属于任何单独一层,但若缺失,程序会在某个时刻整体失效。 对非技术使用者而言,这一节的优先级高于前面五层的技术选择—— 这里的疏忽往往不是「做得不好」,而是「造成实际损失」。
| 关注点 | 最小可用做法 | 最容易出的错 |
|---|---|---|
| 登录与鉴权 | 用现成方案(Supabase Auth、企业微信 / 微信登录、Auth0、Clerk) | 自己写密码存储;只在前端隐藏按钮,后端不校验 |
| 密钥与配置 | 只放服务端环境变量,按最小权限发放 | 写进前端代码;提交到 Git;日志里打印出来 |
| 日志与监控 | 关键动作和完整报错都打印;需要时接 Sentry 类服务 | 只打印「出错了」;日志里带密码和个人敏感信息 |
| 测试与调试 | 至少覆盖「算得对不对」和「进不进得去」 | 追求覆盖率却没测核心计算;改完只点一下页面 |
| 版本控制(Git) | 每次较大改动前提交一次,写一句改动说明 | 用「最终版」手动备份;改坏了回不去 |
| 自动化部署 | 提交 → 自动检查 → 自动构建 → 自动上线 | 手动传文件漏了一步;部署和代码版本对不上 |
| 成本控制 | 设置费用与流量告警;项目结束即释放资源 | 服务器闲置仍计费;对象存储被刷流量;大模型调用无上限 |
第一,绝不写入前端代码。前端代码任何人都能在浏览器里查看。
第二,绝不提交到代码仓库。即使之后删除,历史记录里仍然存在。
第三,只放服务端的环境变量。程序从运行环境中读取,不写在文件里。
如果程序目前是纯前端却需要调用大模型,中间必须加一个服务端中转。
- 云服务器持续计费:项目已停用但服务器未释放,费用长期累积。应对:项目结束即释放,并设费用告警。
- 对象存储流量:文件被大量下载,流量费超出预期。应对:设流量上限与告警,控制访问权限。
- 大模型调用无上限:循环调用或被人刷接口,Token 消耗失控。应对:单次调用设长度上限,按用户设每日额度。
- 密钥泄露后被他人使用:账单由你承担且难以追溯。应对:给密钥设置可用范围与额度限制。
怎么选型:从约束出发,不是从技术主流出发
常见错误顺序是「先看哪个技术主流,再想办法用上」。正确顺序是从约束出发—— 先明确四个约束,再让约束决定方案。同一件事在不同约束下,正确答案可能完全相反。
| 约束 | 它决定什么 | 一端 | 另一端 |
|---|---|---|---|
| 谁来用、多少人用 | 要不要后端 | 只有你 → 单文件即可 | 小团队 → 必须有后端,否则数据无法共享 |
| 数据有多少、谁会改 | 要不要数据库 | 一份文件、自己改 → Excel / CSV | 多人同时改、数据量大 → 上真正的数据库 |
| 它要用多久 | 能不能用简单办法 | 一次性或临时 → 怎么快怎么来 | 长期迭代 → 必须选主流方案 |
| 出错要赔多少 | 要不要日志与备份 | 能重跑一遍 → 不必过度设计 | 会丢数据或造成损失 → 必须备份、日志和验证 |
决策表:三个问题定位到套餐
先问「谁在用」,多数情况再问一个是/否,就能落到后面的组合套餐。
| 第一个问题 | 再问一句 | 落到 |
|---|---|---|
| 只有我一个人 | 不需要反复查询、算指标或接大模型 | 套餐一 · 单文件工具 |
| 需要反复查询、算指标或接大模型 | 套餐二 · 数据分析与 AI 辅助 | |
| 小团队(几人到二十人) | 不需要登录、多人同时录入修改 | 套餐二 · 数据分析与 AI 辅助 |
| 需要登录、多人同时录入修改 | 套餐三 · 内部协作工具 | |
| 对外或跨部门使用 | —— | 套餐四 · 正式产品 |
三条通用原则
主流优先于优雅
选择使用者最多、AI 生成最多、搜索引擎有现成答案的方案。技术上的「更先进」换不来实际收益,但「搜不到答案」会让人彻底卡住。
少即是多
每多引入一层技术,就多一个会出问题的环节。朴素但已跑通的方案,永远优于先进但半途而废的方案。升级的时机是「撞到墙」,不是「预感会撞到墙」。
从后往前选
先定数据存哪儿 → 再定后端用什么 → 最后定前端长什么样。反过来(先画界面再想数据)几乎一定会推倒重来。
先跑通最窄的一条完整链路(一个页面 → 一个接口 → 一条数据),再横向扩展。这就是第 6 章说的「曳光弹」在架构上的版本。
最常见的三个错误
错误一:一上来就搭全套
同时引入前端框架、后端、数据库、服务器,结果卡在环境配置上,业务代码一行未写。正确做法是从最简单的一层开始,撞到墙再升级那一层。
错误二:把密钥写进前端
前端代码对任何人可见,等同于把钥匙挂在门上。密钥只能存在于服务端的运行环境中。
改动前先提交一次代码、先复制一份数据。这条与技术选择无关,但造成的损失通常最大。见 第 3 章的 Git 小节。
什么时候该升级
| 你撞到的墙 | 升级方向 | 不必提前做的事 |
|---|---|---|
| 页面超过五六个,改一处要翻好几处 | 原生 → Vue / React,开始组件化 | 不需要先上微服务 |
| 多个人要同时改同一份数据 | Excel / SQLite → MySQL / PostgreSQL | 不需要先做分布式 |
| 需要登录、权限、审计 | 加接口层和后端;用一体化平台或现成鉴权 | 不需要自己写密码系统 |
| 数据涨到几十万行,查询明显变慢 | 加索引、优化查询;必要时换更强的数据库 | 不需要一上来就分库分表 |
| 要 24 小时可访问、要连内网 | 托管应用平台 → 云服务器 | 不需要一开始就买服务器 |
| 部署老出错、版本对不上 | Git + 自动化部署 | 不需要自建 CI 平台 |
四套组合套餐
把前面五层的选择组合起来,就是一套完整方案。以下四套覆盖绝大多数实际需求,可按场景直接对号入座。
单文件工具
适用:一人使用 · 数据量小 · 一次交付
- 界面层:原生 HTML / CSS / JS
- 接口层:不需要
- 逻辑层:不需要(逻辑写在页面里)
- 数据层:数据直接写在文件内
- 运行层:静态托管,或直接发文件
数据分析与 AI 辅助
适用:一人或小团队 · 数据中等 · 需要判断与生成
- 界面层:原生 HTML 或 Vue
- 接口层:REST
- 逻辑层:Python(FastAPI)+ pandas
- 数据层:Excel / CSV,或 SQLite
- 运行层:本地运行,或托管应用平台
- 附加:大模型经服务端中转调用
内部协作工具
适用:小团队 · 多人读写 · 长期使用
- 界面层:Vue + 组件库
- 接口层:REST
- 逻辑层:Python 或 Node.js
- 数据层:PostgreSQL 或 MySQL
- 运行层:托管应用平台;有内网需求则用云服务器
- 附加:一体化平台提供登录与权限
正式产品
适用:多部门或对外使用 · 数据敏感 · 需长期维护
- 界面层:Vue 或 React
- 接口层:REST(确有实时需求再加 WebSocket)
- 逻辑层:Python 或 Java
- 数据层:PostgreSQL + Redis + 对象存储
- 运行层:云服务器 + Docker
- 附加:版本控制、自动化部署、日志监控、定期恢复演练
先从套餐一开始,做到真的不够用了,再按升级信号往套餐二走。 绝大多数个人项目停在套餐一或套餐二就结束了——这不是「没做成」,而是在正确的约束下没有过度设计。 套餐四通常需要专业人员参与,不要一个人硬扛。
把四个约束各写一句:谁用、数据多大、用多久、出错赔多少。 四句答完,套餐基本只剩一个;答不出来,说明还没到选型的时候,先回去做最小闭环。
一个最小闭环:从页面到数据
完整的「页面 → 接口 → 逻辑 → 数据」闭环,在 实验:午饭登记 里动手做; 三格与五层的定义在 第 3 章。本页不再重复同一份实现。
排障速查:症状 → 最可能的层
这张表把 16 步链路压缩成「看到什么 → 先去哪一层找」。 它的用法不是自己修,而是把问题说准,再交给 AI。
| 你看到的症状 | 最可能的层 | 先看什么 |
|---|---|---|
| 页面空白、布局乱、显示 undefined | 界面层 | 渲染用的数据是否存在;模板字段名是否对上 |
| 点按钮没反应 | 界面层 → 接口层 | 浏览器控制台有没有报错;请求有没有发出去 |
| 请求返回 404 | 接口层 | 请求地址、方法(GET/POST)、路由是否注册 |
| 请求返回 400 | 接口层 | 参数名、类型、必填项是否与约定一致 |
| 请求返回 401 / 403 | 接口层 / 逻辑层 | 有没有登录;后端有没有做权限判断 |
| 页面数据不对,但不报错 | 逻辑层 | 指标口径;计算函数是否被重复实现 |
| 某个页面或查询越来越慢 | 数据层 | 有没有走索引;是不是全表扫描 |
| 扣款成功但库存没减 | 数据层 | 多个写操作是否在同一个事务里 |
| 提示保存成功,重启后没了 | 数据层 | 是否真的提交;是不是只存在内存里 |
| 本机能跑,服务器报错 | 运行层 | 运行时版本、依赖版本、环境变量 |
| 别人打不开你的地址 | 运行层 | 服务是否监听对外地址;端口、防火墙、域名 |
| 账单突然变高 | 横切关注点 | 服务器是否闲置;流量;大模型调用量;密钥是否泄露 |
「我做的是 ___,现在看到 ___,我判断最可能是 ___ 层。这是完整报错和相关代码,请先确认我的判断,再给最小改动。」 这比「帮我看看哪里错了」多给了三个信息:场景、症状、你的判断。
AI 时代的补充:写代码便宜了,选错没有
生成代码的成本在下降,但选错架构的代价没有下降。 AI 能把任何方案写出来,包括不适合你的那一个。
一、AI 默认选「语料最多」的方案
训练语料里 React、Next.js、PostgreSQL 的出现频率远高于原生 HTML 和 SQLite。 所以 AI 很容易对一个「只有一页的个人工具」推荐一整套现代前端工具链。 这不是它坏,而是它在选最像标准答案的答案,不是在选最适合你的答案。
「先不要写代码。这个工具只有我一个人用,只有一个页面,数据不超过一千行。 请按最少依赖的原则给方案:能用一个 HTML 文件解决就不要引入框架; 能省掉的层就明确说省掉。然后告诉我,什么情况下才需要升级。」
二、AI 会发明不存在的字段和接口
AI 很擅长让代码「看起来对」:调用一个从未定义过的接口、返回前端不认识的字段、引用不存在的库函数。 这类错误往往不在语法层面报出来,只在运行时变成空白或 undefined。 对策是先写契约,再让它实现:接口地址、请求字段、返回字段、错误格式,写进规格。 然后让 AI 按契约实现,最后用一条真实请求验证。这正好是 第 7 章和 第 8 章在做的事。
三、AI 可能把密钥写进代码
当你把 API Key 粘进对话,AI 很可能直接把它写进前端文件、示例代码或配置文件, 然后告诉你「已经接好了」。上线前必须专门检查: 前端代码里有没有出现任何 Key、密码、内部地址。
你不需要读懂所有代码,但需要能回答三个问题: 数据存在哪儿?谁可以访问?密钥放在哪儿?答不上来的项目,先不要上线。
这一页讲「系统由什么组成、怎么选」,不讲「怎么把 AI 用好」。 后者在 第 4 章(上下文与变笨区)、 第 5 章(五个核心习惯)、 第 6 章(完整实战流程)。 架构决策最好发生在写规格之前,因为选型会反过来约束需求。
术语表
本页出现的术语统一收在 第 10 章 · 一页术语表, 按「网络 / 软件结构 / 数据 / AI / 工程」分组,并标注首次出现的章节。这里不再维护第二份。
来源与边界
本页整合自同事分享的 《程序由什么组成 — 模块详解与选型手册》(WorkBuddy 页面,抓取于 2026-10-19)。
原文提供了五层结构、16 步请求链路、各层方案对比、四套组合套餐;本页按本教程读者和版式重写,并补充了 REST 请求示例、症状 → 层的排障速查表、升级信号、 AI 协作场景下的三条补充,以及与第 3、6、7、8、10 章的交叉链接。
原文全文与页面快照保存在 05_HTML教程/辅助材料/,用于溯源,不作为教程正文。
第一,这不是 aihero.dev 的方法论。这一页讲通用的软件架构与技术选型常识,用来补第 3 章的地图;它和本教程主线的 AI 协作方法来自不同来源,不要混为一谈。
第二,具体的产品和价格会变。文章里的平台、版本、免费额度、计费方式都只代表抓取时的状态;真正选型前,以官方文档和实时价格为准。
第三,原文版权归原作者。本页是面向本教程读者的整合与重写,不是逐段转载;需要精确表述时请回到原文链接。