HyperStartup

知识 / CTO 与架构之道 / 构建之路

构建之路

构建之路 /搭建极简本地应用

第 01 篇

搭建极简本地应用

架构不是从技术名词开始的。它首先围绕一个业务目标展开,而这个业务目标最终要落在一个可以被用户使用的应用上。

从业务目标开始

第一步,我们先把一个最简单的员工管理应用真正做出来:用户能够看到员工列表,并修改员工的毕业学校。

这个目标足够小,但它已经包含了一个完整系统必须面对的问题:页面如何展示、请求如何传递、业务逻辑在哪里执行、数据如何持久化,以及开发者如何在自己的电脑上重复运行这一切。

第一阶段的完成标准

浏览器打开员工管理页面,能够从数据库加载员工信息,并成功保存一次编辑。

三层应用架构

我们把应用拆成三个职责清晰的层次。拆分的目的不是让结构看起来复杂,而是让每一层可以独立修改、测试和替换。

前端 · Frontend

Next.js 16是什么基于 React 的 Web 应用框架,负责组织页面、路由和应用运行。在本项目中用在哪里在 frontend 中提供员工管理页面 /employee-management,并启动本地前端服务。React 19是什么用组件搭建页面的 JavaScript 库。组件可以理解为页面上可复用的一块界面。在本项目中用在哪里显示员工列表,管理编辑输入框,以及加载中、保存中等界面状态。TypeScript是什么在 JavaScript 上增加类型检查的语言,帮助开发者在运行前发现一些数据使用错误。在本项目中用在哪里前后端都使用它。例如约定员工的年龄是数字、毕业学校是文字。Tailwind CSS 4是什么通过组合样式类设置页面外观的 CSS 工具。在本项目中用在哪里在前端控制员工表格、按钮的颜色、间距和不同屏幕下的布局。

展示员工列表,处理毕业学校编辑等页面交互。

HTTP是什么浏览器和服务器交换请求与响应时使用的通信协议。在本项目中用在哪里前端通过 HTTP 向后端请求员工列表,或提交毕业学校修改。 / JSON是什么用字段名和值表示数据的一种文本格式,程序之间容易读取和交换。在本项目中用在哪里后端用 JSON 返回员工资料,前端用 JSON 提交 graduatedSchool 字段。 · 调用后端 API是什么程序对外提供的调用入口,约定可以做什么、传什么数据、返回什么结果。在本项目中用在哪里本项目通过 /api/employees 查询员工,通过 /api/employees/:id 更新员工。

后端 · Backend

Node.js是什么让 JavaScript 可以在浏览器之外运行的环境。在本项目中用在哪里在本机运行 Express 后端服务,接收请求并执行数据库读写逻辑。Express 4是什么运行在 Node.js 上的 Web 框架,用来定义请求地址和处理规则。在本项目中用在哪里提供查询员工的 GET 接口,以及更新毕业学校的 PUT 接口,后端默认监听 5000 端口。TypeScript是什么在 JavaScript 上增加类型检查的语言,帮助开发者在运行前发现一些数据使用错误。在本项目中用在哪里前后端都使用它。例如约定员工的年龄是数字、毕业学校是文字。Prisma 5是什么连接应用代码与数据库的工具,用模型描述数据结构,并生成数据库访问代码。在本项目中用在哪里在 backend/prisma/schema.prisma 中定义 Employee 模型,生成后端使用的 Prisma Client。

提供员工查询和更新 API,通过 Prisma Client 访问数据库。

Prisma Client是什么由 Prisma 根据数据模型生成的数据库访问代码。在本项目中用在哪里后端调用 prisma.employee.findMany 查询员工,调用 update 保存毕业学校。 · 读写数据库

数据库 · Database

PostgreSQL 15是什么关系型数据库,把数据按表、行和字段保存下来。在本项目中用在哪里在 demo_db 数据库的 Employee 表中保存员工资料,刷新网页后数据仍然存在。Docker是什么运行容器的工具。容器把软件及其运行环境放在一个相对独立的空间里。在本项目中用在哪里本地用它运行 PostgreSQL;这一阶段的前端、后端仍在本机分别启动。postgres:15-alpine是什么PostgreSQL 官方 Docker 镜像的名称和标签;15 表示数据库主版本,alpine 表示使用精简的 Alpine Linux 环境。在本项目中用在哪里项目的 Compose 配置使用这个镜像启动本地数据库容器。

在 demo_db 中持久化保存 Employee 员工数据。

前端不直接连接数据库。它通过 HTTP 请求调用后端 API;后端再通过 Prisma 访问 PostgreSQL。这样的边界让数据库凭证不会暴露给浏览器,也让业务规则集中在后端。

业务开发

明确了要做什么、每一层负责什么,接下来就可以开始写代码。把下面的提示词交给任意 Coding Agent(能帮助你编写和修改代码的 AI 编程工具),让它完成这个最小应用。作者使用的是 Codex + AGPT6 astra。

可以直接复制这段提示词:

请帮我搭建一个可以在本地运行的极简员工管理应用。

业务目标:
1. 页面展示员工列表,字段包括姓名、年龄、毕业学校。
2. 用户可以编辑毕业学校,保存后写入数据库;刷新页面后仍能看到修改。
3. 提供虚构的员工示例数据,方便第一次打开页面就能测试。

技术与分层:
- 前端:Next.js 16、React 19、TypeScript、Tailwind CSS 4。
- 后端:Node.js、Express 4、TypeScript、Prisma 5。
- 数据库:PostgreSQL 15,使用 postgres:15-alpine 镜像在本地运行。
- 前端和后端分别放在 frontend、backend 目录,分别用 npm run dev 启动。
- 前端只调用后端 API,不直接连接数据库。

具体要求:
- 员工页面放在 /employee-management。
- GET /api/employees 返回员工列表。
- PUT /api/employees/:id 更新员工的 graduatedSchool 字段。
- Employee 包含 id、name、age、graduatedSchool、createdAt、updatedAt。
- 后端检查输入,前端展示加载中、保存中和失败提示。
- 数据库连接通过后端环境变量 DATABASE_URL 配置。
- 提供数据库表初始化、示例数据写入和本地启动的具体步骤。
- 先完成本地应用,不加入云部署、CI/CD 或集群配置。

验收方式:
打开页面能看到示例员工,修改一位员工的毕业学校并保存,
刷新页面后确认修改仍然存在。请实际实现,并说明如何验证。

提示词里最重要的是把功能和验收方式说清楚。代码生成之后,还需要按下一节的步骤启动应用,并亲自完成一次“查看 → 编辑 → 保存 → 刷新”的操作,确认它真的能用。

在本地分别运行

完成分层后,先让每一层可以独立启动。数据库由 Docker 提供,后端和前端在本机分别运行开发服务器。

# 先启动本地 PostgreSQL
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d db

# 后端
cd backend
npm ci
npx prisma generate
npx prisma db push
npm run dev

# 另开终端启动前端
cd frontend
npm ci
npm run dev

这时后端运行在 localhost:5000,前端运行在 localhost:3000。打开 http://localhost:3000/employee-management,就可以完成第一次前后端联调。

Prisma 5是什么连接应用代码与数据库的工具,用模型描述数据结构,并生成数据库访问代码。在本项目中用在哪里在 backend/prisma/schema.prisma 中定义 Employee 模型,生成后端使用的 Prisma Client。 的 generate 会根据 schema 生成 Prisma Client;db push 会把 schema 同步到本地数据库。

本地运行效果

下面嵌入的就是员工管理页面。启动本地后端和数据库后,可以直接在这里查看员工、修改毕业学校并保存。

员工管理应用在新窗口打开 ↗

保存后,在新窗口打开页面确认修改仍然存在,就完成了从页面操作到数据库保存的验证。如果页面提示连接失败,请先检查后端和数据库是否已启动。

到这里,我们从一个简单的员工管理需求出发,完成了前端、后端和数据库的分层,并在本地跑通了查看、编辑和保存的完整过程。这就是后续架构演进的起点。

后面我们会在这个应用上继续演进:先让运行环境更容易复现,再把应用部署到云上,逐步实现自动构建和发布。每一步都围绕实际遇到的问题展开。

第 01 篇 · 搭建极简本地应用