淋浴房方案绘图项目总结
文档日期: 2026-06-02
项目类型: 前端单页应用;面向淋浴房方案的参数化绘图工具
构建验证: 已执行 npm run build,Vite 生产构建成功
一句话概括
本项目实现了一个在浏览器中运行的淋浴房方案绘图工具:用户可以基于预设或空白方案调整尺寸、添加构件和边框,实时生成等轴透视线稿,并导出 SVG/PNG 供沟通和交付使用。
一、项目概况
项目名称为 shower-plan-drawing-app,页面标题为“淋浴房方案绘图”。项目采用纯前端实现,不依赖后端服务,主要用于快速生成淋浴房方案示意图、调整尺寸参数、对构件进行可视化编辑,并输出可保存或进一步编辑的图纸文件。
从业务定位看,它更像一个轻量级方案草图与沟通工具:不是完整 CAD 系统,但已经具备参数驱动、构件编辑、等轴投影、材料估算和图片导出的核心闭环。
二、技术栈与工具
| 层次 | 技术或工具 | 在项目中的作用 |
|---|---|---|
| 前端框架 | React 19.1、React DOM | 使用组件和 Hooks 管理页面、方案状态、选中对象、缩放和拖拽交互。 |
| 构建工具 | Vite 7、@vitejs/plugin-react | 提供本地开发、生产构建和 React 编译能力;配置 base: ./ 便于静态部署。 |
| 语言与模块 | JavaScript / JSX / ES Modules | 核心业务逻辑写在 src/main.jsx;依赖中包含 TypeScript,但当前业务源码不是 TS/TSX。 |
| 图形渲染 | SVG | 使用 viewBox、path、line、polygon、rect 等 SVG 元素绘制等轴透视图和可交互对象。 |
| 导出能力 | XMLSerializer、Blob、URL、Canvas API | 将 SVG 序列化为文件;PNG 导出时先把 SVG 绘制到 Canvas,再生成图片下载。 |
| 界面样式 | CSS Grid、Flexbox、媒体查询 | 实现顶部工具栏、画布区域、右侧检查器面板和移动端适配。 |
| 图标库 | lucide-react | 用于工具栏、面板标题、导出和缩放等 UI 图标。 |
| 静态封装 | Node.js fs/path 脚本 | scripts/build-static.cjs 会把构建后的 CSS/JS 内联到单个 HTML 文件。 |
三、已实现的主要功能
| 功能模块 | 说明 |
|---|---|
| 方案管理 | 内置“基础方案”“备用方案”等预设;支持新建空白方案、复制当前方案、切换方案和重命名导航标签。 |
| 尺寸参数编辑 | 可调整方案名称、正面宽、侧面深、高度、墙边距等核心参数;输入组件带最小值、最大值和提交校验。 |
| 等轴透视绘图 | 通过 makeGeometry 中的 p(x, y, z) 投影函数,将毫米单位的三维坐标映射为二维 SVG 坐标。 |
| 自定义构件 | 支持玻璃、墙体、拉手、合页四类构件;可编辑类型、平面、坐标、尺寸、角度和显示状态。 |
| 自定义边框 | 支持直线边框和弧形边框;可配置所在平面、长度、角度、半径、位置,并选择是否显示长度标注。 |
| 拖拽交互 | 用户可直接在 SVG 图上选中并拖动构件或边框;拖拽位移会根据对象所在平面转换回三维坐标。 |
| 缩放和纸张背景 | 工具栏提供放大/缩小;画布支持白底和浅灰底两种纸张效果。 |
| 导出能力 | 支持导出 SVG 和 PNG;SVG 导出会嵌入当前页面样式,PNG 使用 2 倍画布尺寸生成。 |
| 材料估算 | 右侧面板显示正面玻璃、侧面玻璃、轨道估长、自定义边框长度和玻璃面积估算。 |
| 响应式界面 | 桌面端采用画布 + 右侧检查器布局;窄屏下检查器自动移动到下方,画布可横向滚动。 |
四、核心实现结构
1. 数据模型
应用以 schemes 数组作为最外层状态,每个方案包含 id、name、presetKey 和 drawing。drawing 内部保存项目名称、尺寸参数、玻璃厚度、边框颜色,以及 customFrames 和 customParts 两组可编辑对象。
customParts 表示玻璃、墙体、拉手、合页等构件,字段包括 type、plane、x/y/z、w/d/h、angle、show。
customFrames 表示线性或弧形边框,字段包括 type、plane、x/y/z、length、angle、radius、showLabel。
预设方案通过 buildCustomFrames 和 buildCustomParts 自动生成默认框架、玻璃、墙垛、拉手和合页。
2. 渲染与交互分层
| 模块 | 职责 |
|---|---|
| App | 页面状态、方案管理、表单面板、导出逻辑和拖拽入口。 |
| IsoScheme | 创建等轴投影上下文,并组合构件层与边框层。 |
| CustomPartLayer / CustomPart | 按构件类型分发渲染玻璃面、立体墙体、拉手和合页。 |
| CustomFrameLayer / CustomFrame | 渲染直线/弧线边框、选中态、命中区域和长度标注。 |
| NumberField / Toggle / Panel | 复用表单控件,负责数值输入、开关和右侧面板结构。 |
3. 几何与投影逻辑
makeGeometry 会先对输入尺寸进行范围限制,再计算 x、y、z 三个方向的缩放比例。核心投影函数 p(x, y, z) 将三维坐标转换为 SVG 平面坐标,从而实现类似工程示意图的等轴透视效果。
拖拽时,dragDeltaFor 会根据对象所在平面分别处理 front、side、floor、box、angled 等场景,把屏幕上的 dx/dy 位移转换为对应的 x/y/z 坐标变化。这样构件在不同平面中拖动时仍能保持合理的空间关系。
五、运行与交付方式
| 用途 | 命令 | 说明 |
|---|---|---|
| 安装依赖 | npm install | 根据 package-lock.json 安装 Vite、React、lucide-react 等依赖。 |
| 本地开发 | npm run dev | 启动 Vite 开发服务器,默认绑定 127.0.0.1。 |
| 生产构建 | npm run build | 输出 dist/index.html、CSS 和 JS 资源。已验证构建成功。 |
| 本地预览 | npm run preview | 使用 Vite preview 预览生产构建结果。 |
| 单文件输出 | npm run build:static | 先构建,再生成 dist-static/淋浴房方案绘图.html,便于单文件分发。 |
本次检查已执行 npm run build,构建结果显示 1578 个模块转换完成,CSS 约 9.00 kB,JS 约 225.91 kB(gzip 约 70.72 kB)。
六、项目亮点
业务场景明确:围绕淋浴房方案沟通,把尺寸、玻璃、墙体、拉手、合页和边框编辑集中到一个页面中。
纯前端闭环完整:无需后端即可完成方案编辑、实时绘图、材料估算和图片导出。
图形实现较轻量:没有引入大型 CAD 或 3D 引擎,而是用 SVG 和自定义投影函数完成工程线稿表达。
交互成本低:右侧表单适合精确输入,画布拖拽适合快速调整,二者能同步更新同一份状态。
具备交付意识:支持 SVG 可编辑导出,也支持 PNG 图片交付;另有单 HTML 打包脚本。
七、当前不足与后续优化建议
项目目前没有持久化存储,刷新页面后方案会丢失;可增加 localStorage、JSON 导入/导出或云端保存。
导出的 SVG/PNG 是图形成果,但项目参数本身没有独立文件格式;可设计 .json 项目文件,方便二次编辑。
材料估算偏轻量,当前主要统计玻璃面积和边框长度;可加入五金、轨道、损耗、单价和报价清单。
代码集中在单个 main.jsx 中,后续功能增加后可拆分为 geometry、drawing-model、components、export 等模块。
当前 package.json 没有测试脚本;建议补充几何计算、投影转换、导出逻辑和关键组件的自动化测试。
可增加撤销/重做、对象复制、吸附对齐、图层管理、尺寸标注系统等更接近绘图软件的能力。
八、关键文件说明
| 文件 | 作用 |
|---|---|
| src/main.jsx | 应用主体:状态管理、方案数据模型、等轴绘图、拖拽交互、导出逻辑和表单控件。 |
| src/styles.css | 全局样式、页面布局、画布视觉、面板样式、选中态和响应式适配。 |
| package.json | 项目名称、依赖和 npm 脚本定义。 |
| vite.config.js | Vite 配置;使用 React 插件,并设置相对路径 base。 |
| scripts/build-static.cjs | 读取 dist 中的 HTML/CSS/JS,并生成单个可分发 HTML 文件。 |
| dist-static/淋浴房方案绘图.html | build:static 脚本生成的静态交付文件。 |
| assets/concept-shower-planner.png | 项目中的概念设计图资产,当前源码未直接引用。 |
总结
整体来看,这个项目已经完成了一个可运行、可交互、可导出的淋浴房方案绘图原型。它的核心价值在于把尺寸参数、空间构件和方案图输出放在同一个浏览器应用中,适合用于方案初稿、客户沟通和内部确认。后续如果继续迭代,优先建议补齐方案持久化、项目文件导入/导出、报价清单和自动化测试,让它从“方案绘图工具”逐步增强为更完整的轻量设计交付工具。