Files
wordcloud/docs/PROJECT_STANDARD.md

8.8 KiB
Raw Permalink Blame History

项目标准说明

本文档覆盖项目边界、目录结构、运行方式、输入输出和维护约定。核对代码时间:2026-07-25。

项目目标

本项目是一套中文词云生成+画布设计系统,核心能力:

  1. 词云生成:读取 Excel 名单,按掩膜轮廓填充人名,输出 PNG/SVG/DB/metrics。
  2. 画布设计:前端提供图层化画布、贴纸库、基础形状编辑、SVG 总图导出。
  3. 同底图换名单:画布中已有的词云底图,支持只换名单不换位置和字号(保留视觉结构)。
  4. 线距分析:对 SVG 路径进行线距采样,辅助激光加工参数设定。

目录结构

wordcloud/
├── docs/                          # 标准文档
│   ├── README.md
│   ├── PROJECT_STANDARD.md
│   ├── ALGORITHM.md
│   ├── CONFIG.md
│   ├── API.md
│   ├── CANVAS_STUDIO.md
│   ├── TESTING.md
│   └── DEPLOYMENT.md
├── backend/
│   ├── core/                      # 词云核心引擎
│   │   ├── config.py              # 配置默认值、别名、类型校验
│   │   ├── pipeline.py            # 主流程:数据→掩膜→权重→布局→渲染→导出
│   │   ├── layout.py              # Python 布局调度、SVG 路径导出
│   │   ├── weights.py             # 笔画权重、Excel 权重、面积字号模型
│   │   ├── mask.py                # 掩膜生成、归一化、自动画幅
│   │   ├── render.py              # 高清精修、填充率计算、重叠检测
│   │   ├── fonts.py               # 字体缓存
│   │   └── ewc.py                 # 兼容层(基类+Python 稀疏网格)
│   ├── EfficientWordCloud/        # C++ 扩展(integral grid + 精确字形碰撞)
│   │   ├── efficient_wordcloud/
│   │   │   ├── wordcloud.py       # Python 包装
│   │   │   └── src/ewc_core.cpp  # Cython 扩展
│   │   └── setup.py               # C++ 编译入口
│   ├── service/                   # FastAPI 服务
│   │   ├── app.py                 # HTTP 路由
│   │   ├── schemas.py             # Pydantic 模型
│   │   ├── runner.py              # 子进程任务执行
│   │   ├── job_manager.py         # 内存任务状态管理
│   │   ├── storage.py             # 任务文件目录管理
│   │   ├── line_spacing.py        # SVG 线距分析
│   │   └── log_config.py          # 服务日志配置
│   ├── tests/                     # 单元测试
│   │   └── test_layout_constraints.py
│   ├── tools/                     # 基准工具
│   │   └── benchmark_layout.py
│   ├── service_workspace/         # 运行时任务产物(.gitignore
│   ├── service_assets/            # 后端素材库(.gitignore
│   ├── service_projects/          # 后端工程项目(.gitignore
│   ├── service_design_templates/    # 设计模板(.gitignore
│   └── start-dev.sh               # 本地后端启动脚本
├── frontend/
│   ├── src/
│   │   ├── App.tsx                # 页面路由:home → canvas / wordcloud / orders / find / help
│   │   ├── main.tsx
│   │   ├── types.ts               # 全项目 TypeScript 类型
│   │   ├── styles.css
│   │   ├── pages/                 # 页面级组件
│   │   │   ├── TemplateHome.tsx   # 首页:模板选择
│   │   │   ├── CanvasStudio.tsx   # 画布设计页
│   │   │   ├── TestWorkbench.tsx  # 词云生成页
│   │   │   ├── OrdersPage.tsx     # 生产订单页(登录保护)
│   │   │   ├── FindPage.tsx       # 查找名字页(登录保护,跨任务单任务内查找)
│   │   │   └── HelpPage.tsx       # 帮助页
│   │   ├── components/            # 可复用组件
│   │   │   ├── AdvancedPanel.tsx
│   │   │   ├── CanvasArea.tsx
│   │   │   ├── DockTabBar.tsx
│   │   │   ├── EditPanel.tsx
│   │   │   ├── ExportPanel.tsx
│   │   │   ├── FindPanel.tsx
│   │   │   ├── FloatingPanel.tsx
│   │   │   ├── ImportPanel.tsx
│   │   │   ├── ProgressPanel.tsx
│   │   │   ├── ViewControls.tsx
│   │   │   └── AppSettingsWindow.tsx
│   │   ├── hooks/
│   │   ├── lib/
│   │   │   ├── api.ts             # API 工具函数
│   │   │   ├── canvasDocument.ts  # 画布模型操作
│   │   │   ├── stickerLibrary.ts  # 贴纸库存取
│   │   │   ├── svgExport.ts       # SVG/Zip 序列化
│   │   │   └── templateLibrary.ts # 模板库
│   │   └── vite-env.d.ts
│   ├── vite.config.ts
│   ├── package.json
│   └── tsconfig.json
├── start-all.sh                   # 一键前后端联调
├── install-ubuntu.sh              # Ubuntu Docker 一键部署
├── release/
│   └── install-ubuntu.sh
├── scripts/
│   └── pack-release.sh
└── README.md / README_zh.md       # 顶层面向用户说明(非标准)

运行方式

一键前后端联调(推荐开发用)

./start-all.sh

单独启动后端

cd backend
./start-dev.sh

脚本会自动:

  • 探测 Python 3.9+(优先系统 Python,否则创建 .venv
  • 检查并安装 fastapi uvicorn python-multipart pydantic pandas openpyxl pillow numpy matplotlib
  • 在外部 Python 中复用 scipyABI 匹配时),避免网络安装
  • C++ 扩展 ewc_core 源码有更新时自动重新编译

单独启动前端

cd frontend
npm run dev

CLI 生成

cd backend
python wordcloud_generate_hybrid.py --config /path/to/config.json

CLI 配置优先级见 CONFIG.md

输入要求

Excel 名单

  • 服务接口仅接受 .xlsx
  • DATA_COL_INDEX 默认 1(第2列,0-based
  • REMOVE_DUPLICATES 默认 False,前端也默认保留重复
  • 权重列:优先 WEIGHT_COL_NAME,次选 WEIGHT_COL_INDEX
  • 有效权重必须为正数

权重来源

场景 行为
有 Excel 权重,笔画权重开启 Excel 值作为基础 × 笔画复杂度归一化乘数
有 Excel 权重,笔画权重关闭 仅 Excel 权重
无 Excel 权重,笔画权重开启 仅笔画复杂度权重
两者均无 全部默认权重 10

掩膜

  • MODE=IMAGE 时必须上传 PNG/JPG/JPEG 掩膜文件
  • 后端转灰度后按阈值 200 二值化
  • FILL_ON=BLACK:黑色区域可填充;FILL_ON=WHITE:白色区域可填充
  • MODE=TEXT:用指定文字生成文本掩膜

输出产物

服务任务产物位置:

backend/service_workspace/{job_id}/
  input/
    mask.png
    names.xlsx
  output/
    Efficient_Result_HD_AutoResize.png          # 最终位图
    Efficient_Result_HD_AutoResize.svg           # 填充 SVG
    Efficient_Result_HD_AutoResize_stroke.svg  # 描边 SVG(激光雕刻适用)
    wordcloud_hd.db                              # SQLiteword_locations 表
    metrics.json                                 # 运行指标
    debug/                                       # 调试图(受 SAVE_DEBUG_IMAGES 控制)
  config.json

当前限制

  • 名单完整性是不可关闭的硬约束。 放不下的情况下只会整批缩放字号或扩大画布,不会漏词。
  • 不存在逐词缩字号、gap filling 或大字号自动压缩路径。
  • USER_MIN_FONT_SIZEUSER_MAX_FONT_SIZE 是不可越过的边界;冲突时直接报错。
  • SIZE_RATIO=1 时所有同权重词语保持完全相同字号,面积估算和重试阶段都维持单一字号。
  • C++ 中保留旧矩形查询 API 供底层兼容性,正式流水线使用 place_glyph_exact() 真实字形主路径。
  • 前端贴纸库和画布文档只保存在当前浏览器 localStorage,不跨设备同步。
  • Jobs 状态存在内存中,服务重启后历史任务状态丢失;文件仍保留在 service_workspace
  • 当前 Projects、Assets、Templates 接口主要服务当前工作台原型和素材管理,不代表完整生产级工程系统。

维护约定

变更范围 同步更新
算法行为 ALGORITHM.md
配置项增删 CONFIG.md
HTTP 接口/响应模型 API.md
前端画布功能 CANVAS_STUDIO.md
测试/基准 TESTING.md
部署方式 DEPLOYMENT.md

不再新增单次变更记录文档;短期变更合并进标准文档。