前端工程师视角:从零到一掌握 HiCAD 开发
本教程面向接手 HiCAD 前端的工程师,不只讲“做什么”,更讲“按什么顺序读代码、怎么搭功能、如何验收”。你可以沿着本页完成一次从工程启动、页面编排、AI 流式生成、JSCAD 执行、Three.js 渲染到质量闭环的完整跟练。
1. 学习目标:先理解产品闭环
HiCAD 前端的核心不是普通表单页面,而是一个实时工程工作台。用户输入自然语言后,前端需要承接 AI 代码流、写入编辑器、触发 Worker 执行、更新 Three.js 场景,并展示质量评分。
输入层
AI 对话、模型选择、自定义 Key、是否基于当前代码续改。
编辑层
Monaco 代码编辑、参数解析、代码反写、脏状态与保存状态。
渲染层
JSCAD Worker 执行、几何序列化、Three.js 网格与材质更新。
用户 Prompt
-> aiStore 发起 /api/ai/generate SSE
-> code_delta 拼接为 JSCAD 代码
-> editorStore.updateCode(code)
-> useJscad 发送代码到 Worker
-> Worker 返回 GeometryGroup
-> useThreeScene.updateGeometry(groups)
-> QualityPanel 展示评分和优化建议本节验收:你能用一句话解释 EditorPage、aiStore、editorStore、useJscad、ThreeViewer 在闭环中的职责。
2. 环境准备与本地启动
项目使用 pnpm workspace 管理前端、后端和 shared 类型包。前端工程师通常先启动前端,再确认代理到后端接口是否正常。
| 位置 | 职责 | 常用命令 |
|---|---|---|
| 根目录 | 统一编排 workspace | pnpm dev / pnpm build |
| frontend | Vue 3 + Vite 前端应用 | pnpm --filter frontend dev |
| backend | NestJS API、AI、模型保存 | pnpm --filter backend start:dev |
| shared | 共享类型定义 | 随 workspace 被引用 |
# 首次安装
pnpm install
# 本地开发:优先使用根目录脚本同时启动
pnpm dev
# 或分别启动
pnpm --filter backend start:dev
pnpm --filter frontend dev
# 前端构建验证
pnpm --filter frontend build本节验收:浏览器能打开前端页面;访问编辑器页时,AI 面板、代码编辑器和 3D 视图均能正常展示。
3. 前端目录地图:按学习顺序读代码
不要从组件目录随机阅读。建议先读入口、路由、请求层和 Store,再进入 EditorPage,最后深入 Worker 与 Three.js。
frontend/src/
├── main.ts # Vue 应用入口,注册 Pinia、Router、全局样式
├── router/index.ts # 页面路由与登录守卫
├── api/http.ts # Axios 实例、Token 注入、401 处理
├── stores/
│ ├── userStore.ts # 登录态、会员、配额、管理员能力
│ ├── editorStore.ts # 当前代码、渲染状态、质量评分
│ └── aiStore.ts # AI 对话、SSE、模型选择、自动评测
├── pages/EditorPage.vue # CAD 工作台总编排
├── components/ai/AiChatBox.vue # Prompt 输入、模型选择、生成/停止
├── components/editor/CodeEditor.vue # Monaco 代码编辑器
├── components/editor/ParamPanel.vue # 参数识别与反写
├── components/viewer/ThreeViewer.vue # 3D 视图容器
├── composables/useJscad.ts # 主线程与 Worker 通信
├── composables/useThreeScene.ts # Three.js 场景和几何更新
└── utils/ # 参数解析、STL/OBJ/DXF/图纸导出4. 路由与请求层:让页面和 API 先稳定
HiCAD 的前端路由分为公开页面和需要登录的工作区/管理页。请求层统一使用 /api 作为 baseURL,便于开发代理和生产 Nginx 反代。
路由守卫
读取 localStorage 中的 hicad_token;没有 Token 且访问 requiresAuth 页面时跳转登录,并保留 redirect。
HTTP 拦截器
请求自动注入 Authorization;响应遇到 401 时清理本地用户信息并回到登录页。
// 新增需要登录的页面时,保持这种模式
{
path: '/workspace',
name: 'workspace',
component: () => import('@/pages/WorkspacePage.vue'),
meta: { requiresAuth: true },
}本节验收:退出登录后访问 Workspace 会跳转 Login;登录后刷新页面仍能保持用户态。
5. Pinia 状态设计:三个 Store 分工协作
HiCAD 前端状态不要全部塞进组件。核心状态被拆成 userStore、editorStore、aiStore,分别对应用户、编辑器和 AI 生成流程。
| Store | 核心状态 | 什么时候改它 |
|---|---|---|
| userStore | user、token、remainingQuota、canPublish、isAdmin | 登录、刷新用户信息、AI 消耗配额后 |
| editorStore | code、isDirty、renderError、renderStats、qualityResult | 代码变化、渲染结束、评测完成、保存模型 |
| aiStore | messages、selectedModel、isGenerating、thinkingText、currentCode | 发起生成、接收 SSE、停止生成、自动评测 |
// 前端工程师要记住的状态写入方向
AiChatBox submit
-> aiStore.generate(prompt)
-> editorStore.setAiGenerating(true)
-> editorStore.updateCode(generatedCode)
-> editorStore.setQualityResult(result, prompt)
-> userStore.fetchMe()本节验收:你能在 Vue Devtools 中观察一次 AI 生成时三个 Store 的状态变化。
6. EditorPage:把 AI、编辑器、渲染器编排成工作台
EditorPage 是前端最重要的页面。它不应该承载所有业务细节,而是负责布局、事件转发和模块协同:左侧 AI,中央代码/参数,右侧 3D 预览与质量面板。
aiStore 写入 editorStore.code,EditorPage 监听代码变化后触发重新渲染。
代码模式使用 Monaco;参数模式使用 ParamPanel 从代码提取变量并反写。
保存、发布、导出、质量评分、错误提示都围绕当前模型状态展开。
7. AI SSE:实现可中断、可评测的流式生成
AI 生成使用 fetch() 读取 ReadableStream,而不是普通 Axios 请求。这样前端可以逐段接收 thinking 和 code_delta,并使用 AbortController 停止生成。
const params = new URLSearchParams({ prompt, model: selectedModel })
const reader = response.body.getReader()
const decoder = new TextDecoder()
let buffer = ''
while (true) {
const { done, value } = await reader.read()
if (done) break
buffer += decoder.decode(value, { stream: true })
const lines = buffer.split('\n')
buffer = lines.pop() || ''
for (const line of lines) {
if (!line.startsWith('data: ')) continue
handleEvent(JSON.parse(line.slice(6)), editorStore)
}
}| 事件 | 前端动作 |
|---|---|
| thinking | 更新思考文本,让用户知道 AI 正在分析需求。 |
| code_delta | 持续拼接 currentCode,但不要每个 token 都触发渲染。 |
| done | 写入 editorStore.code,追加消息,触发质量评测,刷新配额。 |
| error | 展示错误消息,重置生成中状态,避免按钮卡死。 |
本节验收:生成过程中可以点击停止;生成完成后代码进入 Monaco,质量评分自动出现。
8. Monaco CodeEditor:让 JSCAD 代码可读、可写、可提示
CodeEditor 负责把 Monaco 封装成 Vue 组件。它需要懒加载 Monaco、注册 HiCAD 主题、提供常用 JSCAD API 补全,并用 debounce 把代码写回 editorStore。
性能策略
Monaco 体积较大,使用动态 import;输入变化延迟约 200ms 写回,避免每次按键都触发渲染。
工程体验
补全 cuboid、sphere、union、subtract、translate、rotate、degToRad 等常用建模 API。
// 开发新补全项时,优先覆盖项目真实使用的 JSCAD API
const suggestions = [
'cuboid', 'sphere', 'cylinder', 'torus',
'union', 'subtract', 'intersect',
'translate', 'rotate', 'scale', 'degToRad',
]本节验收:手动修改 width、height、depth 后,预览模型会自动重新渲染,且不会出现明显输入卡顿。
9. ParamPanel:从代码变量生成参数化表单
参数面板通过 utils/jscadParser.ts 解析 JSCAD 代码中的顶层变量和注释元信息,把代码编辑变成表单编辑。它是“AI 生成后可二次调整”的关键体验。
// 支持用注释增强参数 UI
// 车身长度 min:80 max:220 step:1 unit:mm
const bodyLength = 140
// 主颜色 options:#165DFF|#10B981|#FF8E53
const bodyColor = '#165DFF'识别 const/let 变量、数字、字符串、布尔和注释元信息。
数字生成滑块和输入框;颜色生成颜色选择;选项生成下拉。
参数变化后替换变量声明,再交给 editorStore.updateCode。
本节验收:为 AI 生成代码补充 min/max/unit 注释后,参数面板能显示更友好的控件。
10. useJscad 与 Worker:安全执行建模代码
JSCAD 代码来自用户或 AI,不能直接在主线程执行。HiCAD 使用 public/workers/jscad.worker.js 在 Worker 中执行,并把几何数据序列化成可传输的 TypedArray。
// 主线程消息协议
worker.postMessage({ requestId, code })
// Worker 返回结果
{
requestId,
success: true,
groups,
triangleCount,
hasColorize,
elapsed,
warning,
}| 关键点 | 实现原因 |
|---|---|
| requestId | 忽略过期渲染结果,避免慢请求覆盖新模型。 |
| debounce | 用户连续输入时延迟执行,降低 Worker 压力。 |
| Transferable Objects | 直接转移 ArrayBuffer,减少大模型数据拷贝成本。 |
| autoRepairTruncatedCode | 修复 AI 流式生成可能出现的截断括号或缺少 module.exports。 |
本节验收:故意输入语法错误时,页面显示渲染错误但不崩溃;修复代码后可以恢复渲染。
11. ThreeViewer 与 useThreeScene:把几何变成工程级预览
Worker 返回的 groups 只是 positions、normals、indices、color 等底层数据。useThreeScene 负责把它们转换成 BufferGeometry、Mesh、材质、边线、相机、灯光和尺寸标注。
几何更新
优先使用 indexed geometry;缺少索引时尝试 mergeVertices,再 computeVertexNormals。
渲染安全
检查 boundingBox 中的 NaN/Infinity,跳过异常 group,防止 WebGL 崩溃。
工程体验
支持透视/正交相机、视角切换、实体/线框/透视/平面显示、尺寸标注。
// 渲染数据转换心智模型
GeometryGroup
-> BufferGeometry(position, normal, index)
-> MeshPhysicalMaterial(color/material preset)
-> Mesh + Edges
-> fitCameraToObject()
-> render loop本节验收:切换不同视角和显示模式时,模型位置、比例、边线和材质表现稳定。
12. 质量闭环与导出:让生成结果可判断、可交付
生成完成后,aiStore 会调用 /api/ai/evaluation/code,QualityPanel 展示评分、等级、指标、低分建议,并支持把建议拼成续改 Prompt 进行一键优化。
质量闭环
关注可执行性、参数化、几何丰富度、装配连贯、材质语义、需求匹配和安全维护性。
交付导出
通过导出工具输出 STL、OBJ、DXF、STEP 占位能力,以及 A3 多视图工程参考图纸 PNG。
POST /api/ai/evaluation/code
{
"prompt": "生成一个带轮毂细节的低趴超跑",
"code": "const { cuboid } = require('@jscad/modeling').primitives...",
"model": "deepseek-chat"
}本节验收:低分模型能看到明确建议;点击优化后会基于当前代码续改,而不是重新生成完全无关模型。
13. 前端工程师实战任务与验收清单
完成下面任务后,基本就掌握了 HiCAD 前端的核心开发流程。
| 阶段 | 实战任务 | 验收标准 |
|---|---|---|
| 工程启动 | 本地启动前后端并打开 EditorPage | 页面无控制台致命错误,接口代理正常。 |
| 状态理解 | 跟踪一次 AI 生成的 Store 变化 | 能说清 aiStore 与 editorStore 的写入边界。 |
| 编辑体验 | 新增一个 JSCAD API 补全项 | Monaco 输入时能出现补全,构建通过。 |
| 参数化 | 为一段模型代码增加参数注释 | ParamPanel 能显示滑块、单位或选项。 |
| 渲染链路 | 制造错误代码再恢复 | 错误提示友好,修复后 Worker 和 Three.js 正常恢复。 |
| 质量闭环 | 生成低分模型并执行一键优化 | QualityPanel 出现建议,续改后评分或结构有改善。 |
| 导出交付 | 导出 STL/OBJ 或工程参考图 | 下载文件可被外部工具打开或预览。 |