Frontend Engineer Handbook

前端工程师视角:从零到一掌握 HiCAD 开发

本教程面向接手 HiCAD 前端的工程师,不只讲“做什么”,更讲“按什么顺序读代码、怎么搭功能、如何验收”。你可以沿着本页完成一次从工程启动、页面编排、AI 流式生成、JSCAD 执行、Three.js 渲染到质量闭环的完整跟练。

推荐学习方式:先跑通项目,再按章节打开对应文件阅读;每学完一节都完成“本节验收”,最终能够独立修改编辑器、AI 生成链路和 3D 渲染链路。

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 类型包。前端工程师通常先启动前端,再确认代理到后端接口是否正常。

位置职责常用命令
根目录统一编排 workspacepnpm dev / pnpm build
frontendVue 3 + Vite 前端应用pnpm --filter frontend dev
backendNestJS 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/图纸导出
阅读顺序:router/index.ts → api/http.ts → stores/editorStore.ts → stores/aiStore.ts → pages/EditorPage.vue → useJscad.ts → public/workers/jscad.worker.js → useThreeScene.ts。

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核心状态什么时候改它
userStoreuser、token、remainingQuota、canPublish、isAdmin登录、刷新用户信息、AI 消耗配额后
editorStorecode、isDirty、renderError、renderStats、qualityResult代码变化、渲染结束、评测完成、保存模型
aiStoremessages、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 预览与质量面板。

1
接收 AI 生成结果

aiStore 写入 editorStore.code,EditorPage 监听代码变化后触发重新渲染。

2
切换编辑模式

代码模式使用 Monaco;参数模式使用 ParamPanel 从代码提取变量并反写。

3
管理浮动能力

保存、发布、导出、质量评分、错误提示都围绕当前模型状态展开。

开发建议:新增编辑器功能时,优先判断它属于“状态能力”“交互组件”还是“渲染能力”,分别放到 Store、components/editor 或 composables 中。

7. AI SSE:实现可中断、可评测的流式生成

AI 生成使用 fetch() 读取 ReadableStream,而不是普通 Axios 请求。这样前端可以逐段接收 thinkingcode_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'
1
extractParams(code)

识别 const/let 变量、数字、字符串、布尔和注释元信息。

2
生成控件

数字生成滑块和输入框;颜色生成颜色选择;选项生成下拉。

3
反写代码

参数变化后替换变量声明,再交给 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 或工程参考图下载文件可被外部工具打开或预览。
最终能力标准:你可以独立定位“一句话生成后没有渲染”的问题:先查 SSE 是否 done,再查 editorStore.code,接着查 Worker 返回,最后查 Three.js geometry 更新与控制台错误。