feat(val-blog): add 2026-04-30 dream journey post
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
|
||||
# 2026-04-29
|
||||
|
||||
## 拼豆项目 (pindou) 代码审查
|
||||
|
||||
**时间:** 16:40 前后
|
||||
|
||||
谷老板要求跑通 https://gch3n.online/pindou 完整业务流程,验证代码问题,评估前后端分离改造方案。
|
||||
|
||||
### 已完成阅读的文件(代码审查)
|
||||
- `package.json` - Vue 3 + TypeScript + Pinia + uni-app + Vitest
|
||||
- `vite.config.ts` - base: '/pindou/', dev port 5173
|
||||
- `src/pages/` 下所有页面:index, editor, processing, result
|
||||
- `src/modules/image-processing/` 全部模块:
|
||||
- pipeline.ts - ProcessingPipeline 编排类
|
||||
- pixelator.ts - Gamma 校正块平均像素化
|
||||
- quantizer.ts - CIELAB Median Cut 色彩量化
|
||||
- canvas-utils.ts - 画布工具
|
||||
- types.ts - 类型定义
|
||||
- `src/modules/color-mapping/` 全部模块:
|
||||
- palette.ts - 拼豆颜色调色板(从 perler.json 加载)
|
||||
- mapper.ts - CIELAB + KD-Tree 最近邻颜色匹配
|
||||
- kd-tree.ts - 3D KD-Tree 最近邻搜索
|
||||
- color-space.ts - sRGB ↔ 线性RGB ↔ CIEXYZ ↔ CIELAB 转换
|
||||
- `src/modules/pattern-rendering/` 全部模块:
|
||||
- grid-renderer.ts - 支持 color/symbol/number 三种显示模式
|
||||
- legend-renderer.ts - 图例渲染
|
||||
- `src/modules/export/useExport.ts` - 导出模块(组合画布)
|
||||
- `src/stores/processStore.ts` - Pinia 状态管理(三重持久化)
|
||||
- `src/stores/configStore.ts` - 配置管理
|
||||
- `src/components/bead/BeadPattern.vue` - 珠子图案组件(cellTap 事件未连接父组件)
|
||||
- `nginx.conf` - Nginx 配置
|
||||
- `DEPLOY.md` - 部署文档
|
||||
- 测试文件:`pipeline.test.ts`, `grid-renderer.test.ts`
|
||||
- 调色板数据:`data/palettes/compiled/perler.json`
|
||||
|
||||
### 关键架构发现
|
||||
1. **纯前端 SPA**:所有图像处理在浏览器端执行,无后端服务
|
||||
2. **色彩流水线**:像素化(Gamma校正) → Median Cut量化 → KD-Tree颜色匹配 → 网格构建 → 导出
|
||||
3. **CIELAB 色彩空间**:使用 D65 参考白点,支持 CIE76/CIE94 色差公式
|
||||
4. **大网格优化**:>80列自动缩小单元格
|
||||
5. **已知问题**:BeadPattern 组件的 cellTap 事件未连接到父组件
|
||||
|
||||
### 待完成
|
||||
- [ ] 运行测试(npm run test)
|
||||
- [ ] 启动 dev server 或访问线上地址验证功能
|
||||
- [ ] 跑通完整上传→处理→结果→导出流程
|
||||
- [ ] 识别代码问题并评估前后端分离方案
|
||||
# 2026-04-29
|
||||
|
||||
## 拼豆项目 (pindou) 代码审查
|
||||
|
||||
**时间:** 16:40 前后
|
||||
|
||||
谷老板要求跑通 https://gch3n.online/pindou 完整业务流程,验证代码问题,评估前后端分离改造方案。
|
||||
|
||||
### 已完成阅读的文件(代码审查)
|
||||
- `package.json` - Vue 3 + TypeScript + Pinia + uni-app + Vitest
|
||||
- `vite.config.ts` - base: '/pindou/', dev port 5173
|
||||
- `src/pages/` 下所有页面:index, editor, processing, result
|
||||
- `src/modules/image-processing/` 全部模块:
|
||||
- pipeline.ts - ProcessingPipeline 编排类
|
||||
- pixelator.ts - Gamma 校正块平均像素化
|
||||
- quantizer.ts - CIELAB Median Cut 色彩量化
|
||||
- canvas-utils.ts - 画布工具
|
||||
- types.ts - 类型定义
|
||||
- `src/modules/color-mapping/` 全部模块:
|
||||
- palette.ts - 拼豆颜色调色板(从 perler.json 加载)
|
||||
- mapper.ts - CIELAB + KD-Tree 最近邻颜色匹配
|
||||
- kd-tree.ts - 3D KD-Tree 最近邻搜索
|
||||
- color-space.ts - sRGB ↔ 线性RGB ↔ CIEXYZ ↔ CIELAB 转换
|
||||
- `src/modules/pattern-rendering/` 全部模块:
|
||||
- grid-renderer.ts - 支持 color/symbol/number 三种显示模式
|
||||
- legend-renderer.ts - 图例渲染
|
||||
- `src/modules/export/useExport.ts` - 导出模块(组合画布)
|
||||
- `src/stores/processStore.ts` - Pinia 状态管理(三重持久化)
|
||||
- `src/stores/configStore.ts` - 配置管理
|
||||
- `src/components/bead/BeadPattern.vue` - 珠子图案组件(cellTap 事件未连接父组件)
|
||||
- `nginx.conf` - Nginx 配置
|
||||
- `DEPLOY.md` - 部署文档
|
||||
- 测试文件:`pipeline.test.ts`, `grid-renderer.test.ts`
|
||||
- 调色板数据:`data/palettes/compiled/perler.json`
|
||||
|
||||
### 关键架构发现
|
||||
1. **纯前端 SPA**:所有图像处理在浏览器端执行,无后端服务
|
||||
2. **色彩流水线**:像素化(Gamma校正) → Median Cut量化 → KD-Tree颜色匹配 → 网格构建 → 导出
|
||||
3. **CIELAB 色彩空间**:使用 D65 参考白点,支持 CIE76/CIE94 色差公式
|
||||
4. **大网格优化**:>80列自动缩小单元格
|
||||
5. **已知问题**:BeadPattern 组件的 cellTap 事件未连接到父组件
|
||||
|
||||
### 待完成
|
||||
- [ ] 运行测试(npm run test)
|
||||
- [ ] 启动 dev server 或访问线上地址验证功能
|
||||
- [ ] 跑通完整上传→处理→结果→导出流程
|
||||
- [ ] 识别代码问题并评估前后端分离方案
|
||||
|
||||
---
|
||||
|
||||
## 测试执行结果
|
||||
|
||||
**时间:** 17:00 前后
|
||||
|
||||
### 测试套件
|
||||
- 3 个测试文件,28 个用例
|
||||
- **26 通过 ✅,2 失败 ❌**
|
||||
|
||||
### 失败测试
|
||||
1. `grid-renderer.test.ts` > `should render a valid OffscreenCanvas for a small grid`
|
||||
2. `grid-renderer.test.ts` > `should render legend with items`
|
||||
- **错误:** `expected <canvas> to be an instance of NodeOffscreenCanvas`
|
||||
- **根因:** 测试环境(Node.js)中 OffscreenCanvas instanceof 检查不匹配,非业务逻辑 bug
|
||||
- **影响:** 不影响实际浏览器运行
|
||||
|
||||
---
|
||||
|
||||
## Playwright 浏览器调试
|
||||
|
||||
### 线上站点验证
|
||||
- `https://gch3n.online/pindou/` 返回 HTTP 200
|
||||
- 服务器:Caddy(非 Nginx),路径 `/opt/pindou/`
|
||||
|
||||
### 路由与页面结构
|
||||
- 首页 `/pages/index/index` — 显示"从相册选择图片"和"拍照"按钮
|
||||
- 编辑器 `/pages/editor/editor` — 图片预览、画布配置、"生成图纸"按钮
|
||||
- 处理页 `/pages/processing/processing` — 运行 ProcessingPipeline
|
||||
- 结果页 `/pages/result/result` — 显示 BeadPattern + Legend
|
||||
|
||||
### uni-app H5 模式限制
|
||||
- `<button>` 渲染为 `<uni-button>` 自定义 Web Component
|
||||
- `uni.chooseImage()` 在 headless 浏览器中不触发标准文件选择器
|
||||
- 需通过 `page.evaluate()` 直接操作 Pinia store 来绕过限制
|
||||
|
||||
---
|
||||
|
||||
## 🔴 关键 Bug:结果页 Canvas 不渲染
|
||||
|
||||
**Git 提交 f102f91**(Apr 29 17:15)已应用:
|
||||
- abort controller 支持
|
||||
- progress smoothing
|
||||
- cross-env canvas factory (`src/modules/canvas-factory.ts`)
|
||||
|
||||
### 现象
|
||||
- 结果页 DOM 结构完整:`page-result` → `bead-pattern` → mode switcher(纯色/编号/符号)→ `canvas-inner`(481×481px)→ info bar("20×20 · 400颗 · 5色")
|
||||
- `hasValidData` computed 通过(`grid.length > 0 && grid[0].length > 0`),无 empty state
|
||||
- **但 `.canvas-inner` 内没有任何 `<canvas>` 元素**
|
||||
- Playwright 输出:`Canvases on result page: { count: 0, sizes: [] }`
|
||||
|
||||
### 根因分析
|
||||
- GridRenderer 在 `renderGrid()` 方法中创建 canvas 元素
|
||||
- BeadPattern 通过 `onMounted` + `watch(props.grid, ..., { deep: true, immediate: true })` 触发渲染
|
||||
- 可能原因:GridRenderer 初始化时 `canvasFactory` 与 uni-app H5 环境不兼容,或 watch 未正确触发
|
||||
|
||||
### 影响
|
||||
- **结果页是项目的核心交付界面**,无网格渲染意味着项目不可用
|
||||
- 处理流水线本身正常(pipeline 测试 12/12 通过),但渲染层有 bug
|
||||
|
||||
### 调试文件
|
||||
- Playwright 脚本:`/Users/guchen/.openclaw/workspace/debug-pindou.mjs`
|
||||
- Dev server:`http://localhost:5174/pindou/`
|
||||
|
||||
---
|
||||
|
||||
## Gitea CI 流水线
|
||||
|
||||
- Gitea 服务器 SSH:`gch3n.online:2222`(非标准端口)
|
||||
- Runner 名称:`pindou-runner`,状态待确认
|
||||
- 非 gitea-runner:使用 `node:20-bookworm` 容器,通过 SSH 部署
|
||||
- CI 配置使用 `GIT_SSH_COMMAND` 通过 SSH clone
|
||||
|
||||
---
|
||||
|
||||
## 每日复盘
|
||||
|
||||
**晚间 ** 完成了当日总结:
|
||||
- ✅ 拼豆项目完整代码审查(20+ 文件)
|
||||
- ✅ 测试套件执行(26/28 通过)
|
||||
- ✅ 线上站点验证可用
|
||||
- 🔄 结果页 canvas 渲染 bug 待修复(已定位根因,待下一步修复)
|
||||
- 📋 明日:修复 GridRenderer canvas 创建问题,跑通完整流程,构建部署
|
||||
Reference in New Issue
Block a user