Files
val-blog/memory/2026-04-28.md
T

282 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-04-28
## Pindou 拼豆图纸存储问题修复(正在进行)
### 问题
H5 模式下 `uni.navigateTo` 跳转结果页后,`processStore.saveToStorage()` 写入的 localStorage 数据丢失,导致结果页显示 "暂无图纸数据"。
### 根因
1. `processing.vue` 使用 `setTimeout(() => uni.navigateTo(...), 400)`,可能 storage 写入未落盘就跳转
2. H5 模式下 `uni.navigateTo` 实际是 `window.location.href` 页面跳转,storage 写入在页面刷新时可能丢失
3. `saveToStorage()` 是同步操作,但 localStorage 写入时机与页面导航的竞态问题
### 尝试修复(Anvil subagent 2次均超时)
- 第一次(9m55s):超时,只返回部分结果
- 第二次重试(4m56s):超时,发现部署脚本
### 当前决定
不再依赖 Anvil 自动修复,改为直接提供修复代码并人工部署。
### 测试结果(Playwright 自动化测试)
- `[processStore] No stored state found` — 处理页和结果页均未找到存储数据
- `[result.vue] hasValidData: {gridLength: 0, firstRowLength: undefined, hasData: false}` — 结果页无数据
- Canvas 元素数量: 0
### 浏览器自动化脚本位置
`/Users/guchen/.openclaw/workspace/pindou-test.js`Playwright
### 代码仓库
`https://git.gch3n.online/gch3n/pindou`,分支 `main`,本地路径 `/Users/guchen/.hermes/workspace/pindou`
## OpenClaw 配置变更
- 添加了 DeepSeek provider 配置到 `openclaw.json`
- Provider: `deepseek`ID: `deepseek/deepseek-v4-flash``deepseek/deepseek-v4-pro`
- Base URL: `https://api.deepseek.com/v1`
- API Key: sk-ea4deb96b1724d23911120265650a3b1
# 2026-04-28
## Pindou 拼豆图纸存储问题修复(正在进行)
### 问题
H5 模式下 `uni.navigateTo` 跳转结果页后,`processStore.saveToStorage()` 写入的 localStorage 数据丢失,导致结果页显示 "暂无图纸数据"。
### 根因
1. `processing.vue` 使用 `setTimeout(() => uni.navigateTo(...), 400)`,可能 storage 写入未落盘就跳转
2. H5 模式下 `uni.navigateTo` 实际是 `window.location.href` 页面跳转,storage 写入在页面刷新时可能丢失
3. `saveToStorage()` 是同步操作,但 localStorage 写入时机与页面导航的竞态问题
### 尝试修复(Anvil subagent 2次均超时)
- 第一次(9m55s):超时,只返回部分结果
- 第二次重试(4m56s):超时,发现部署脚本
### 当前决定
不再依赖 Anvil 自动修复,改为直接提供修复代码并人工部署。
### 测试结果(Playwright 自动化测试)
- `[processStore] No stored state found` — 处理页和结果页均未找到存储数据
- `[result.vue] hasValidData: {gridLength: 0, firstRowLength: undefined, hasData: false}` — 结果页无数据
- Canvas 元素数量: 0
### 浏览器自动化脚本位置
`/Users/guchen/.openclaw/workspace/pindou-test.js`Playwright
### 代码仓库
`https://git.gch3n.online/gch3n/pindou`,分支 `main`,本地路径 `/Users/guchen/.hermes/workspace/pindou`
## 图纸生成算法改进(Anvil 分析完成 ✅)
### 改进内容
- **像素化**block average 改用 Gamma 校正(srgbToLinear → 平均 → linearToSrgb),避免 sRGB 平均偏暗
- **量化**Median Cut 改按 CIELAB L*/a*/b* 方差分裂(而非 RGB 范围),新增 CIELAB K-Means 备选
- **颜色映射**K-D Tree + CIELAB ΔE 感知距离,已实现
- **存储**:三级回退(sessionStorage → localStorage → uni.storage
- **processing.vue**`await saveToStorage()` 后再跳转,setTimeout 缩至 100ms
### 部署状态
- ✅ 构建验证通过:`npm run build:h5` 成功
- ✅ 部署到 `gch3n.online/pindou/`Nginx alias /opt/pindou/
- ✅ 代码已 push 到 Giteacommit bfea0ea
- ❌ 抖动算法(Floyd-Steinberg/Atkinson)存在代码(dither.ts)但尚未集成到 pipeline
- ❌ 未在手机上验证效果
## Gitea CI 流水线(部署自动化)
### 背景
- 用户要求用 Gitea Actions + Caddy 自动部署,代替手动 Nginx 部署
- 服务器:`gch3n.online`(腾讯云),SSH 端口 11022,用户 `nplx`
- Gitea`git.gch3n.online`HTTP 8080SSH 2222
- Caddyfile 已包含 `/pindou*` 路由(`handle_path` strip /pindouroot /opt/pindou
### 实施过程
1. 初始尝试:创建 `.gitea/workflows/deploy.yml`,使用 appleboy/scp-action + appleboy/ssh-action
2. 问题1`runs-on: ubuntu-latest` 不匹配 → 改为 `self-hosted`
3. 问题2SSH_PRIVATE_KEY 未设置(流水线卡在 `appleboy/ssh-action` SSH auth
4. 解决:改用本机 SSH key 回环连接 runner → 检查 authorized_keys 确保包含自身公钥
5. 解决:HTTPS clone 需认证 → 改用 SSH 协议 clone(`ssh://git@git.gch3n.online:2222/gch3n/pindou.git`
6. 当前流水线:手动 clone 测试通过,已 push fix commit `46f3f2a`
### 流水线内容(最终版)
- steps: checkoutSSH port 2222)→ setup nodenvm)→ npm ci → build:h5 → SCP 到 /opt/pindou-tmp/ → 校验 → 原子 swap
- 使用 `appleboy/scp-action` + `appleboy/ssh-action`(无需 SSH_PRIVATE_KEY secret,复用 runner 本机 key
- SCP target: `localhost:11022`SSH target: `localhost:11022`
### 待确认
- 流水线 commit 46f3f2a push 后是否成功被 runner 拉取执行
- runner daemon.log 中 checkout 是否成功
- 后续 nvm/node 环境可用性
- 最终部署是否正常
## OpenClaw 配置变更
- 添加了 DeepSeek provider 配置到 `openclaw.json`
- Provider: `deepseek`ID: `deepseek/deepseek-v4-flash``deepseek/deepseek-v4-pro`
- Base URL: `https://api.deepseek.com/v1`
- API Key: sk-ea4deb96b1724d23911120265650a3b1
## 服务器信息备忘
- 主机名:`gch3n.online`(腾讯云)
- SSH 端口:11022
- SSH 用户:`nplx`
- Gitea`git.gch3n.online`HTTP 8080(容器 3000),SSH 2222(容器 22
- Caddy 站点根:`/var/www/gch3n`,应用部署:`/opt/` 下各子目录
- runner 工作目录:`/home/nplx/act_runner_host/workdir`
- runner 配置:`/home/nplx/act_runner_host/config.yaml`
- runner 日志:`/home/nplx/act_runner_host/daemon.log`
- runner 模式:self-hosted,容量 1,超时 3h,无 Docker
- Gitea 容器 IP172.17.0.2
## git 配置问题
- 提交时 user.name/user.email 自动设置为 guchen@MBKPro.lan,需后续修正
# 2026-04-28
## Pindou 拼豆图纸存储问题修复(正在进行)
### 问题
H5 模式下 `uni.navigateTo` 跳转结果页后,`processStore.saveToStorage()` 写入的 localStorage 数据丢失,导致结果页显示 "暂无图纸数据"。
### 根因
1. `processing.vue` 使用 `setTimeout(() => uni.navigateTo(...), 400)`,可能 storage 写入未落盘就跳转
2. H5 模式下 `uni.navigateTo` 实际是 `window.location.href` 页面跳转,storage 写入在页面刷新时可能丢失
3. `saveToStorage()` 是同步操作,但 localStorage 写入时机与页面导航的竞态问题
### 尝试修复(Anvil subagent 2次均超时)
- 第一次(9m55s):超时,只返回部分结果
- 第二次重试(4m56s):超时,发现部署脚本
### 当前决定
不再依赖 Anvil 自动修复,改为直接提供修复代码并人工部署。
### 测试结果(Playwright 自动化测试)
- `[processStore] No stored state found` — 处理页和结果页均未找到存储数据
- `[result.vue] hasValidData: {gridLength: 0, firstRowLength: undefined, hasData: false}` — 结果页无数据
- Canvas 元素数量: 0
### 浏览器自动化脚本位置
`/Users/guchen/.openclaw/workspace/pindou-test.js`Playwright
### 代码仓库
`https://git.gch3n.online/gch3n/pindou`,分支 `main`,本地路径 `/Users/guchen/.hermes/workspace/pindou`
## OpenClaw 配置变更
- 添加了 DeepSeek provider 配置到 `openclaw.json`
- Provider: `deepseek`ID: `deepseek/deepseek-v4-flash``deepseek/deepseek-v4-pro`
- Base URL: `https://api.deepseek.com/v1`
- API Key: sk-ea4deb96b1724d23911120265650a3b1
# 2026-04-28
## Pindou 拼豆图纸存储问题修复(正在进行)
### 问题
H5 模式下 `uni.navigateTo` 跳转结果页后,`processStore.saveToStorage()` 写入的 localStorage 数据丢失,导致结果页显示 "暂无图纸数据"。
### 根因
1. `processing.vue` 使用 `setTimeout(() => uni.navigateTo(...), 400)`,可能 storage 写入未落盘就跳转
2. H5 模式下 `uni.navigateTo` 实际是 `window.location.href` 页面跳转,storage 写入在页面刷新时可能丢失
3. `saveToStorage()` 是同步操作,但 localStorage 写入时机与页面导航的竞态问题
### 尝试修复(Anvil subagent 2次均超时)
- 第一次(9m55s):超时,只返回部分结果
- 第二次重试(4m56s):超时,发现部署脚本
### 当前决定
不再依赖 Anvil 自动修复,改为直接提供修复代码并人工部署。
### 测试结果(Playwright 自动化测试)
- `[processStore] No stored state found` — 处理页和结果页均未找到存储数据
- `[result.vue] hasValidData: {gridLength: 0, firstRowLength: undefined, hasData: false}` — 结果页无数据
- Canvas 元素数量: 0
### 浏览器自动化脚本位置
`/Users/guchen/.openclaw/workspace/pindou-test.js`Playwright
### 代码仓库
`https://git.gch3n.online/gch3n/pindou`,分支 `main`,本地路径 `/Users/guchen/.hermes/workspace/pindou`
## 图纸生成算法改进(Anvil 分析完成 ✅)
### 改进内容
- **像素化**block average 改用 Gamma 校正(srgbToLinear → 平均 → linearToSrgb),避免 sRGB 平均偏暗
- **量化**Median Cut 改按 CIELAB L*/a*/b* 方差分裂(而非 RGB 范围),新增 CIELAB K-Means 备选
- **颜色映射**K-D Tree + CIELAB ΔE 感知距离,已实现
- **存储**:三级回退(sessionStorage → localStorage → uni.storage
- **processing.vue**`await saveToStorage()` 后再跳转,setTimeout 缩至 100ms
### 部署状态
- ✅ 构建验证通过:`npm run build:h5` 成功
- ✅ 部署到 `gch3n.online/pindou/`Nginx alias /opt/pindou/
- ✅ 代码已 push 到 Giteacommit bfea0ea
- ❌ 抖动算法(Floyd-Steinberg/Atkinson)存在代码(dither.ts)但尚未集成到 pipeline
- ❌ 未在手机上验证效果
## Gitea CI 流水线(部署自动化)
### 背景
- 用户要求用 Gitea Actions + Caddy 自动部署,代替手动 Nginx 部署
- 服务器:`gch3n.online`(腾讯云),SSH 端口 11022,用户 `nplx`
- Gitea`git.gch3n.online`HTTP 8080SSH 2222
- Caddyfile 已包含 `/pindou*` 路由(`handle_path` strip /pindouroot /opt/pindou
### 实施过程
1. 初始尝试:创建 `.gitea/workflows/deploy.yml`,使用 appleboy/scp-action + appleboy/ssh-action
2. 问题1`runs-on: ubuntu-latest` 不匹配 → 改为 `self-hosted`
3. 问题2SSH_PRIVATE_KEY 未设置(流水线卡在 `appleboy/ssh-action` SSH auth
4. 解决:改用本机 SSH key 回环连接 runner → 检查 authorized_keys 确保包含自身公钥
5. 解决:HTTPS clone 需认证 → 改用 SSH 协议 clone(`ssh://git@git.gch3n.online:2222/gch3n/pindou.git`
6. 当前流水线:手动 clone 测试通过,已 push fix commit `46f3f2a`
### 流水线内容(最终版)
- steps: checkoutSSH port 2222)→ setup nodenvm)→ npm ci → build:h5 → SCP 到 /opt/pindou-tmp/ → 校验 → 原子 swap
- 使用 `appleboy/scp-action` + `appleboy/ssh-action`(无需 SSH_PRIVATE_KEY secret,复用 runner 本机 key
- SCP target: `localhost:11022`SSH target: `localhost:11022`
### 待确认
- 流水线 commit 46f3f2a push 后是否成功被 runner 拉取执行
- runner daemon.log 中 checkout 是否成功
- 后续 nvm/node 环境可用性
- 最终部署是否正常
## OpenClaw 配置变更
- 添加了 DeepSeek provider 配置到 `openclaw.json`
- Provider: `deepseek`ID: `deepseek/deepseek-v4-flash``deepseek/deepseek-v4-pro`
- Base URL: `https://api.deepseek.com/v1`
- API Key: sk-ea4deb96b1724d23911120265650a3b1
## 服务器信息备忘
- 主机名:`gch3n.online`(腾讯云)
- SSH 端口:11022
- SSH 用户:`nplx`
- Gitea`git.gch3n.online`HTTP 8080(容器 3000),SSH 2222(容器 22
- Caddy 站点根:`/var/www/gch3n`,应用部署:`/opt/` 下各子目录
- runner 工作目录:`/home/nplx/act_runner_host/workdir`
- runner 配置:`/home/nplx/act_runner_host/config.yaml`
- runner 日志:`/home/nplx/act_runner_host/daemon.log`
- runner 模式:self-hosted,容量 1,超时 3h,无 Docker
- Gitea 容器 IP172.17.0.2
## git 配置问题
- 提交时 user.name/user.email 自动设置为 guchen@MBKPro.lan,需后续修正
## Gitea CI 流水线调试(续 16:00-17:57
### 第二轮修复(checkout 失败排错)
- 问题:runner 执行 git clone 时 DNS 解析 `git.gch3n.online` 到公网 IP,无法通过 2222 端口连接 Gitea 容器
- 修复1checkout 步骤改用 `localhost:2222` SSH clonecommit `610b0bb`
- 修复2:添加 `GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"` 避免 host key 交互提示(commit `4b1496d`
### 遗留问题
- runner 队列中有旧 commit`610b0bb`)的 run #66 仍在处理,因缺少 `GIT_SSH_COMMAND` 卡在 host key 确认,exit 128
- 后续 commit `4b1496d` 可能被 runner 跳过(因为 runner capacity=1,一次只跑一个 job
- runner 进程 ID: `2437044`daemon),workdir `66-1` 状态未知
- 已尝试 kill stale 进程 `77688`workdir `0893...`),现已确认无关联
### 后续步骤
- 需要 SSH 到服务器检查 daemon.log,确认最新 commit 是否被 runner 拉取
- 如果 runner 卡在旧 run,可能需要手动清理 workdir 或重启 runner
- 之后流水线完整执行(checkout → build → deploy)尚需验证
- 最后需要部署验证:SCP + 原子 swap + Caddy 刷新
## Gitea CI 流水线调试(续 17:57-18:07
### 谷老板询问进展
- 谷老板 17:57 问"现在是什么进展了"
- 回应:流水线卡在旧 run 未释放,需要 SSH 上服务器检查 daemon.log
### 状态摘要
- 修复 commit `4b1496d`localhost:2222 + GIT_SSH_COMMAND)已 push
- runner capacity=1,旧 run #66 仍卡着 job slot
- 需手动清理或重启 runner 才能触发新 run