# pindou-web
**Repository Path**: wangdandan810012/pindou-web
## Basic Information
- **Project Name**: pindou-web
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-06-26
- **Last Updated**: 2026-08-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Pindou Web
Pindou 拼豆工具 — **Web 端**(Vue 3 + Vite),独立仓库版本。
在线演示:
## 快速开始
```bash
npm install
npm run dev
```
开发地址默认:
## 脚本
| 命令 | 说明 |
|------|------|
| `npm run dev` | 开发服务器 |
| `npm run dev:ai` | 本地 AI 预处理 API(端口 8787) |
| `npm run dev:xhs` | 本地小红书解析 API(端口 8788) |
| `npm run build` | 生产构建(含共享包编译、SEO / 预渲染) |
| `npm run build:packages` | 仅编译 `packages/app-shared` |
| `npm run preview` | 预览 `dist` |
| `npm run type-check` | `vue-tsc` 类型检查 |
| `npm run test` | 运行 `bead-core` 与根目录单元测试 |
| `npm run test:ai` | 运行 AI 预处理服务单元测试 |
| `npm run test:xhs` | 运行小红书解析单元测试 |
| `npm run generate:palette` | 生成色板数据 |
| `npm run generate:landing-compare` | 生成落地页原图/拼豆对比图 |
| `npm run generate:gallery-projects` | 生成画廊完整案例 JSON |
## 环境变量
复制 `.env.example` 为 `.env.local`(勿提交):
```env
# 构建与 SEO(Netlify 环境变量中同样配置)
VITE_SITE_URL=https://dandanhub.vip/pindou
# 开发:Canvas 本地模拟 AI(无需后端与凭证)
# VITE_AI_MOCK=true
# 开发:联调本地 AI 服务(npm run dev:ai)
# VITE_AI_PREPROCESS_URL=http://127.0.0.1:8787/api/ai-preprocess
# 开发:联调本地小红书解析(npm run dev:xhs)
# VITE_XHS_PARSE_URL=http://127.0.0.1:8788/api/xhs-parse
# 可选:UStat 访问统计(生产构建默认已内置;本地调试可取消注释)
# VITE_USTAT_SCRIPT_URL=https://019fabc0-e34a-7ca9-a362-6aa1b6d0b625.spst2.com/ustat.js
```
生产环境前端默认同域 `/pindou/api/ai-preprocess`(Cloudflare Pages Functions),一般无需配置 `VITE_AI_PREPROCESS_URL`。
### AI 预处理(二期,BYOK)
默认拼豆流程在浏览器本地完成。启用 **AI 预处理** 时:
1. 在火山引擎开通 [图像生成大模型](https://www.volcengine.com/docs/86081/1804465?lang=zh),创建 IAM AccessKey(绑定 `CVFullAccess`)
2. 在工作台「AI 预处理」面板粘贴 `AccessKey.txt` 全文(仅存本机 `localStorage`)
3. 图片经 Netlify Function 转发至火山 SeedEdit 图生图 API 处理
| 风格 | 说明 | 适用场景 |
|------|------|----------|
| `enhance` | 清晰增强,最贴近原图 | 真人照片(推荐首选) |
| `sketch` | 线稿强化,轮廓清晰 | 需要明显填色边界 |
| `cartoon` | 卡通扁平,大色块 | 插画、可爱图案 |
| `flat` | 色块简化,颜色更少 | 海报风、极简图案 |
| `matting` | AI 去背景,透明底 | 人物/主体抠图后拼豆 |
详见 [server/ai-preprocess/README.md](server/ai-preprocess/README.md)。
## 第三期功能(Wave 1~3)
| 模块 | 能力 |
|------|------|
| **上传体验** | 拖拽 / 粘贴 / WebP;素材库与示例图一键试 |
| **生成参数** | 亮度·对比度·饱和度;最大颜色数;照片降噪/锐化 |
| **导出** | 29×29 拼板线;PDF 分板多页导出;采购清单包数估算 |
| **AI** | 去背景(matting)风格 |
| **编辑** | 自动裁边;编辑器水平/垂直翻转 |
| **项目流转** | 分享码导入导出 |
| **小红书** | 粘贴分享文案解析图集(Netlify Function) |
| **工具** | 像素文字生成 `/text`;落地页原图对比滑块 |
小红书解析详见 [server/xhs-parse/README.md](server/xhs-parse/README.md)。
## 第四期功能(体验补全)
| 模块 | 能力 |
|------|------|
| **AI 体验** | 处理进度条;504 超时自动缩小重试;手动「缩小重试」 |
| **画廊** | 完整可编辑案例(含 grid),一键进工作台 |
| **参数预设** | `pindou-params-v1:` 分享码导入导出 |
| **教程** | `/guide` 拼豆入门、分板打印、熨烫技巧(SEO 索引) |
| **统计** | 可选 Plausible(`VITE_ANALYTICS_DOMAIN`) |
生成画廊完整案例:`npm run generate:gallery-projects`(需 Playwright + 已编译 `bead-core`)。
## 第五期功能(清晰度升级)
| 模块 | 能力 |
|------|------|
| **转换引擎** | 独立 `convertImageToPattern` 管线:预处理 → 保边降采样 → CIEDE2000 感知配色 |
| **配色算法** | 色板匹配由 Oklab 升级为 CIEDE2000(ΔE),与主流拼豆工具一致 |
| **采样策略** | 最近邻格心采样 + Canvas 关闭平滑,避免边缘被区域平均抹糊 |
| **智能参数** | 上传后自动识别照片/卡通:照片尽量 1 像素 → 1 格、合并阈值 0、轻锐化;卡通适度降格 |
| **上限提升** | 最大格宽 256、源图边长 4096;默认格数 100、合并阈值 0 |
| **预览交互** | 图纸预览支持 Ctrl+滚轮 / 双指捏合缩放与复位 |
| **渲染** | 拼豆 Canvas 像素化显示;上传换图时自动清除上一张的排除色号 |
`bead-core` 已拆为独立 npm 包 [@wangdandan810012/bead-core](https://www.npmjs.com/package/@wangdandan810012/bead-core)(源码:[GitHub](https://github.com/whr810012/bead-core)),含 `conversion/` 模块及单元测试。详见 [docs/BEAD_CORE_SPLIT.md](docs/BEAD_CORE_SPLIT.md)。
## Cloudflare Pages 部署
1. 在 [Cloudflare Pages](https://dash.cloudflare.com/) 导入仓库,根目录为 `pindou-web`(若独立仓库则根目录)
2. 构建配置:
- **Build command**: `npm run build:cf`(跳过 Playwright,适用于 Cloudflare)
- **Build output directory**: `dist`
- **Node version**: `20`
3. Hub 侧设置 `PINDOU_ORIGIN=https://<本项目>.pages.dev`
4. **环境变量**(Settings → Environment variables):
| 变量 | 说明 |
|------|------|
| `VITE_SITE_URL` | 正式站点 URL,如 `https://dandanhub.vip/pindou`(构建时注入) |
| `ALLOWED_ORIGIN` | CORS 来源(可选,默认 `*`) |
| `XHS_MOCK` | `true` 时小红书解析走 mock |
**不要**在生产环境配置 `JIMENG_ACCESS_KEY_ID` / `JIMENG_API_KEY`(BYOK 由用户提供凭证)。
API 由 Pages Functions 提供:`/pindou/api/ai-preprocess`、`/pindou/api/xhs-parse`(见 `functions/`)。`wrangler.toml` 已开 `nodejs_compat`。
> Cloudflare Functions CPU 时限偏紧,AI 图生图若超时可考虑 Workers 付费档或缩短轮询。
### 历史:Netlify
[`netlify.toml`](netlify.toml) 仍可用:
- **Build**: `npx playwright install chromium && npm run build`
- **Functions**: `netlify/functions`
AI 超时:`timeout = 26` 需 Netlify Pro。
## SEO
站点 SEO 由 `seo.config.json` + `scripts/generate-seo.mjs` + Playwright 预渲染共同完成。
**构建时生成:**
- `public/sitemap.xml`、`public/robots.txt`
- `dist/index.html` 注入 meta / JSON-LD
- 预渲染 `/`、`/gallery`、`/workspace` 静态 HTML(`SKIP_PLAYWRIGHT=1` 时跳过)
**关键配置:**
- `seo.config.json` → `defaultSiteUrl`、标题、描述、关键词、FAQ
- `VITE_SITE_URL` → 构建时覆盖 `defaultSiteUrl`(sitemap、canonical、OG 图)
**上线后提交收录(新站通常需 1~4 周):**
1. [Google Search Console](https://search.google.com/search-console) → 添加资源 → 提交 `https://你的域名/sitemap.xml`
2. [Bing Webmaster](https://www.bing.com/webmasters) → 同样提交 sitemap
应用构建基址固定为 `/pindou/`。绑定根域代理后,同步更新 `VITE_SITE_URL` 与 `seo.config.json` 中的 `defaultSiteUrl`,当前生产地址为 `https://dandanhub.vip/pindou`。
## 主要路由
| 路径 | 页面 | SEO |
|------|------|-----|
| `/` | 落地页 | 索引 |
| `/gallery` | 探索画廊 | 索引 |
| `/workspace` | 工作台 | 索引 |
| `/home` | 功能主页 | noindex |
| `/editor` | 精修编辑器 | noindex |
| `/focus` | 专心拼豆 | noindex |
| `/preview3d` | 3D 预览 | noindex |
| `/projects` | 我的项目 | noindex |
| `/palette` | 自定义色板 | noindex |
| `/text` | 像素文字生成 | noindex |
| `/guide` | 拼豆新手教程 | 索引 |
| `/bead-core` | 开源算法库 npm 介绍 | 索引 |
画廊案例另有静态落地页:`/gallery/demo-cat/` 等。
## 目录结构
```
pindou-web/
├── netlify/
│ ├── functions/ # Netlify Functions(AI 预处理)
│ └── netlify.toml
├── server/
│ ├── ai-preprocess/ # AI 服务端逻辑、提示词、本地 dev-server
│ └── xhs-parse/ # 小红书分享解析、本地 dev-server
├── packages/
│ ├── app-shared/ # 共享 store、工具、平台抽象
│ └── bead-core/ # 已拆至 github.com/whr810012/bead-core
├── public/
├── scripts/ # SEO、预渲染、画廊页、OG 图
├── src/
│ ├── adapters/ # H5 图片加载与 Canvas 渲染
│ ├── components/
│ ├── pages/
│ ├── platform/ # Web 平台 Port 实现
│ ├── router/
│ ├── stores/
│ ├── styles/
│ └── utils/
├── seo.config.json
├── vite.config.ts
└── package.json
```
## 技术要点
- **平台注入**:`src/platform/web.ts` → `initPlatform()`
- **转换管线**:[@wangdandan810012/bead-core](https://www.npmjs.com/package/@wangdandan810012/bead-core) → `convertImageToPattern` → `runPipeline`
- **感知配色**:`@wangdandan810012/bead-core` — CIEDE2000(ΔE2000 色板匹配)
- **智能参数**:`packages/app-shared/src/utils/suggestParams.ts`(照片/卡通识别与一键建议)
- **Canvas 渲染**:`src/adapters/image-web.ts`、`src/components/BeadCanvas.vue`(`imageSmoothingEnabled: false`、像素化 CSS)
- **设计令牌**:`src/styles/tokens.scss`(SCSS 全局注入,`pindou-lighten` / `pindou-darken`)
- **Vite 别名**:`@pindou/app-shared` → `packages/app-shared/src`
- **页面 SEO**:`src/utils/seo.ts` 运行时更新 title / meta / canonical
## 构建产物
```bash
npm run build
# → dist/
```
构建流程:编译共享包 → Playwright 生成 OG 图 → 画廊静态页 → sitemap/robots → Vite 打包 → 注入 SEO meta → Playwright 预渲染关键路由。
## 联系方式
- 邮箱:[1028943406@qq.com](mailto:1028943406@qq.com)
- 微信:www133595
## 致谢
本项目的拼豆算法思路受以下开源项目启发,在此表示感谢:
- [Zippland/perler-beads](https://github.com/Zippland/perler-beads) — 主导色像素化、BFS 区域合并、边界洪水填充背景移除、颜色排除与重映射等核心算法思路
- [liangdabiao/perler-beads-ai](https://github.com/liangdabiao/perler-beads-ai) — AI 图像预处理方案