把单元跑起来:从自己的代码到完整作品
这份操作手册与每节的“动手路线”配套。所有命令都在你复制出的 my-bootcamp 根目录运行;只有明确写了 --prefix 的命令进入相应子项目。不要在源码里到处创建第二套 api/web/desktop 文件夹。提供的接线代码属于教材样例,阅读、修改它与完成规则函数都是练习的一部分。
Windows 第一次上手:先确认位置,再运行
以下是 PowerShell 路线,Windows 设备是否实际通过要另行记录;先按手册01从官方来源选择符合架构的 VS Code 和 Node 24.x。不要为了排错修改系统策略或 PATH。运行 node --version 和 npm.cmd --version,找不到命令就重开终端并求助,暂时停在这里。
Get-FileHash -LiteralPath (Join-Path $env:USERPROFILE 'Downloads\bootcamp-starter-v0.4.zip') -Algorithm SHA256
将输出 Hash 与清单中该文件的值逐字符比较(大小写不影响);不同、清单打不开或没有该项时停止,不解压也不继续。哈希用于核对下载是否与清单一致,不证明下载来源可信。
-
在文件管理器里新建尚不存在的个人目录,例如“文档”下
CyberSWAT 学习;用右键解压完整 ZIP 到其中。保留原 ZIP;不要覆盖旧练习。进入解压出的bootcamp文件夹,确认有package.json、u03和tools;在此文件夹打开 PowerShell。也可按手册02检查,Get-Location应指向该bootcamp根目录,中文或空格路径切换时用英文引号,例如Set-Location "路径按自己的实际位置填写",不要原样运行示意路径。 -
在该目录执行
npm.cmd ci,完成后执行npm.cmd run check。package-lock.json记录具体依赖,npm ci根据它重建node_modules;仅类型检查通过不代表 TODO 完成。安装需要网络,失败时保留错误并停下;无权限时联系设备支持者,不绕过策略。依赖与命令区别见手册11。 -
先观察参考核心:
node tools/try.mjs u03 --reference、node tools/check.mjs u03 --reference。参考通过不代表自己已完成;先做自己的u03/starter/model.ts,初始 TODO 失败正常。之后按 U03 的有效 JSON → 错误{→ 有效false顺序检查:原文保留、旧输出清空、恢复后旧错误消失。参考核心测试不代替实际页面检查。
卡住时记录系统和架构、node --version、当前目录、正在运行的命令、预期、实际错误及已经尝试的步骤;求助前遮去姓名、私有路径、凭据和真实数据。有关文件与终端的解释见手册01。
第一次进入
零基础先做 E01 和各单元标注的手册先修。先修按“能完成什么”判断:U01 前能定义函数、读数组和对象、识别异常;页面前能解释输入→事件→状态→显示;数据库前能解释请求、表、唯一约束及一次查询。跳过这些直接复制命令,不能记作学会。
- 下载本页的完整练习包,解压后将
bootcamp文件夹命名为my-bootcamp,用编辑器打开整个文件夹。复制时可以不带 node_modules、work、data、dist、.env,这些由自己生成。不要只复制某一个 model.ts。 - 打开编辑器终端,运行
node --version,本版技术验证用 Node 24.11.1;执行npm --version确认包管理器可用。安装方法见 手册01,先在这个步骤解决“找不到命令”。 - 运行
npm ci,再运行npm run check。后者必须以退出码 0 结束;它只检查类型,TODO 尚未完成时依然可能通过。 - 运行
node tools/try.mjs u03。初次的TODO: convertInput是预期的待完成提示,不是安装失败。打开u03/starter/model.ts能找到同名函数。
只有做 U01 的命令行阶段时,到这里就够了。U02–U12 的页面或服务阶段再继续以下准备;依赖安装只需首次或锁文件改变后执行。
npm ci --prefix runtime --ignore-scripts
node tools/lab.mjs init
npm run db:generate --prefix runtime
init 建立 runtime/.env;重复执行保留已有配置。db:generate 按课程锁定的 Prisma 6.19.3 生成客户端,本版本不要跟着最新版文档替换为其他大版本的 API。若下载失败,检查错误中具体域名,通过官方或学校可用渠道处理;不靠删代码/跳过检查伪装成功。依赖版本只是这次验证基线。
每节循环:写一段,验一段
- 在
uNN/starter/model.ts实现本节第一项规则,保留类型和导出名称。reference是参考答案,不是填写位置。 - 运行
node tools/try.mjs uNN,比较该节固定样例;再运行node tools/check.mjs uNN,根据测试名称找到尚未完成的行为。返回失败时先看实际值和预期值,不要改断言来“通过”。 - 完成本节全部规则后运行
npm run check。两项都过再接作品。 - 运行
node tools/build-app.mjs uNN。这个命令复制你的规则到构建区、做严格类型检查并生成浏览器能执行的 JavaScript,不改你的 starter 文件。 - 运行
node tools/lab.mjs start uNN,保持这个终端打开;在自己电脑的浏览器访问它输出的本机地址。另开一个终端做验收。若在远程主机学习,浏览器需访问学校提供的合规开发预览;127.0.0.1指运行程序的那台机器,本教程不包含绕过网络管理的方法。 - 修改 model 或服务 TS 后,用 Ctrl+C 停止、重新 build、重新 start。当前样例没有热更新;忘记重新构建会看到旧代码。只改 web 下的 JS/HTML 后刷新页面即可。
服务绑定本机,默认应用端口 3400。启动遇到 EADDRINUSE,关闭自己先前的练习进程,或修改 runtime/.env 中 PORT 后重新启动;不关闭不认识的服务。如果改变了应用端口,验收时设置 LAB_URL,或直接在 tools/probe.mjs 末尾的默认本机地址改成自己的端口。
哪些单元需要数据库
| 单元 | 本地依赖 | 成品所在位置 |
|---|---|---|
| U01 | Node | u01/cli.mjs;数据在 u01/data/ |
| U02、U03、U07 | 浏览器与本地应用服务 | runtime/web/uNN.js;U02 数据在该浏览器的本地存储 |
| U04、U05、U06、U09、U10、U12 | PostgreSQL + 本地应用服务 | runtime/src/uNN.ts 与 runtime/prisma/schema.prisma |
| U08、U10 | 额外开一个本地模拟目标 | tools/target.mjs,端口 3401 |
| U11 | 本地应用服务及文件目录 | runtime/data/file-notes/,更新备份在其 backups 中 |
| U13 | Electron 与桌面会话 | desktop/,单独走下文 |
数据库单元在首次运行前执行:
node tools/lab.mjs db up
需要本机已安装 Docker Engine 或 Docker Desktop,且 docker compose version 可用。命令启动本副本专用的 PostgreSQL 17 容器和数据卷,等待数据库健康,再应用仓库中的迁移。它不会连接组织业务库。首次拉取镜像需要网络;失败时保留报错,先完成核心规则阶段,数据库阶段仍记未完成。
runtime/.env 中 DB_PORT 与 DATABASE_URL 的端口必须相同,默认 55439。端口冲突时一起修改,再重试。配置仅放个人副本,不提交 .env。源码中的 runtime/compose.yaml 与迁移是需要提交的。
完成本节首次验收后,Ctrl+C 停止 API,再执行:
node tools/lab.mjs db restart
node tools/lab.mjs start uNN
在第二终端执行 node tools/probe.mjs uNN --resume。预期列出“重启后数据仍在”。该命令读自己上次验收生成的 work/uNN-probe.json,因此必须先运行过不带 --resume 的验收。不删除数据卷来求干净。暂停学习时 Ctrl+C 停 API,执行 node tools/lab.mjs db stop;下次 db up 会复用原数据。源码、配置、数据库数据卷是三个不同位置,复制源码不等于备份数据库。
两个实验身份怎样使用
U05/U09/U12 的页面有 Alice、Bob 两个虚构教学账号。点击“登录实验账号”后,本地服务验证固定实验密码并发临时令牌;服务从令牌取得身份,忽略正文中的 owner/actor。刷新或重启后重新登录。它只为观察资源所有权提供夹具,不是注册/密码管理作品;正式认证仍按手册21另做。
验收脚本会自动登录两个账号、发送并发或越权请求,并增加带随机前缀的合成数据。它不清空已有作品数据。通过后打印本次具体检查;失败时输出路径、预期状态与实际响应,先检查服务单元、数据库、令牌和规则函数四处。
U08/U10:不要寻找一个外站来“试一下”
先开第二终端运行 node tools/lab.mjs target,再启动本节服务。模拟目标只绑定本机端口 3401,并能返回成功、失败、超时;验收脚本会切换这些状态。若端口改变,同步修改 runtime/.env 的 TARGET_PORT 和 tools/probe.mjs 中目标默认端口,或为验收进程设置同名环境变量。目标程序没有业务数据,Ctrl+C 即可停止。
U13:从桌面开发启动到本机教学包
先完成 U03 和 U13 规则。仍在练习根目录依次运行:
npm ci --prefix desktop
npm run install:binary --prefix desktop
node tools/build-desktop.mjs
npm start --prefix desktop
应出现本地 JSON 窗口。需要图形桌面会话,纯远程终端不会凭空出现窗口。install:binary 明确下载 Electron 对应平台的二进制文件(45.0.0 的 npm 包不自动完成这一步);缺失时应解决安装问题,不通过关闭安全隔离来强行启动。
尝试合法 JSON→格式化预览→另存为→先取消,再另存为到自己的学习目录。检查中文、缩进、结尾换行;页面仍保留输入。再试非法 JSON 和非法建议文件名,必须显示错误。
开发版通过后关闭窗口,运行 npm run package --prefix desktop。产物在 desktop/out/,按自己的操作系统打开对应目录内的 BootcampJSON 可执行程序/应用包,再做一遍保存与取消。打包脚本只制作当前系统和架构的未签名教学包,不是安装器,也不代表跨平台发行验证。更改规则后重新编译和打包。
卡住时从哪个位置恢复
| 现象 | 先检查 | 继续方式 |
|---|---|---|
| TODO / HTTP 501 | 对应 starter 中的函数 | 完成规则,再类型检查、构建、启动 |
| 网页无响应 | 启动终端是否还开着、端口是否一致 | 先确认日志输出本机地址 |
| 改了代码没变化 | 是否仍运行旧 dist | 停止→build→start→刷新 |
| 数据库启动失败/P1001 | Docker 是否运行、端口、.env、容器健康 | 修复后 db up,不删数据卷 |
| HTTP 401/403/409 | 未登录、别人资源、资源冲突 | 根据本节约定分别处理,不全部当服务器坏了 |
| 类型通过但页面报 TODO | 类型与行为是两项检查 | 先让核心测试全部过 |
| API 500 | 服务终端日志、DB 是否可用 | 不返回假成功;恢复依赖后重新请求 |
| 参考实现通过、自己不通过 | 页面模式标记、starter 差异 | 逐个函数比较;不能拿参考结果填写自己的完成记录 |
一次独立验证应留下什么
每节建立自己的 LEARNING.md,按 工作台记录模板 保存:命令与工作目录、核心测试输出、页面实际操作、失败与恢复、自己的变式。每次先写预测再运行,解释为什么得到这个结果。教材参考、自动实测和学员真正掌握是三种事实;不需要等待教师放行,但不能把前两者当作第三者。