作品 / 闲鱼素材工坊
AI 应用 · AI2026NO.18个人项目

闲鱼素材工坊

Wails 桌面客户端——商品原图 + 电商详情一键变成可发布的闲鱼主图、素材卡与卖货文案,12 模板 × 5 色系 × 3 尺寸本地渲染,AI 只改文案不生图

GoWailsGORMSQLiteVue3TypeScriptElement PlusPinia
闲鱼素材工坊 界面截图
1 / 4
闲鱼工作台 · 一次点击出素材

缘起

有一晚我在给一台旧笔记本拍照,前后拍了六张,传上去自己看着像赃物照。文案是从淘宝搬来的,「七天无理由」还留在里面。

那晚算了一下:卖一件东西花在做图和改文案上的时间,比挂出去等买家的时间还长。

背景

闲鱼的素材规格比想象中严:主图要 1:1,轮播和详情偏好竖版,图上还得同时放得下商品名、价格、成色、包邮这几层信息,而卖家的实拍图往往背景杂乱、光线不均。当时已有的 AI 生图方案是「凭空画一个商品」,在二手交易里这就叫货不对板,是要跟买家吵架的那种风险。所以工具形态是定死的:桌面客户端,素材落到本地文件,图片不能随记录膨胀,离线也要能重新导出——而不是又一个把图传上去等结果的网页生成器。

方案

Wails v2 单二进制桌面客户端,Go 侧管数据与文件、Vue3 侧管渲染与交互,产出链路如下:

  • 导入与落盘:多张商品原图拖拽排序,图片按 sha1 命名存进用户配置目录,历史快照只存文件名——记录不会随 base64 膨胀,也不会因换机器路径变化而失效。用量有闸门:单张 ≤ 8MB、≤ 20 张、会话总计 ≤ 40MB,界面实时显示占用
  • AI 文案改写:把电商详情改写成闲鱼特化文案,产出标题候选 ×3、含 # 话题词与成色/发货/售后话术的描述正文、卖点标签 3~5 个。模型返回非法 JSON 时自动重试,仍失败则回落到可用兜底文案,不阻塞素材产出
  • 本地渲染:素材卡由 DOM 渲染后用 html-to-image 转 PNG,12 款模板 × 5 色系 × 3 尺寸(1:1 主图 / 3:4 轮播 / 9:16 竖长详情),另有 6 种背景装饰语言分层。改价格、勾包邮即时重渲,所见即所得
  • 刻意不接 AI 生图:图像模型只作为配置项预留。智谱 GLM-Image 只支持文生图、没有图生图与编辑端点,无法基于用户上传的真实商品照片改图;凭空生图会产出「图物不符」的封面,在二手交易场景属高风险,所以封面图一律走本地模板渲染
  • 导出:单张 PNG 或整包 zip 走 Go 原生保存对话框——桌面 WebView 下浏览器下载不可靠,这条路是必需的
  • 制作记录:每次导出自动存档,支持「再次编辑」回填工作台、「重新下载」离线重渲染(不发 AI 请求)、软删除
  • 仪表盘:默认落地页只回答「接下来做什么」——一键新建素材、续上未完成的草稿,把散落的待处理事项(草稿未导出 / 未配 AI Key / 素材库可清理)聚成一张清单,并给出最近作品直达入口。趋势图与累计统计明确不做:本应用的记录量级与模板集中度不支持任何「洞察」,那类元素只会挤占版面
  • 素材库卫生:goods/ 里的原图会因软删除和「导入了没保存」只增不减,应用统计占用、识别无记录引用的原图,并支持先确认后清理;工作台正在使用、尚未保存的原图不会被误删
  • 模型可配置:API Key / Base URL / 文本模型 / 图像模型在设置页可视化编辑,含连通性测试;界面只回传打码值,明文不下发前端

技术架构

模块技术选型
桌面运行时Wails v2.15(单实例锁、系统托盘、日志轮转、原生对话框、崩溃落盘)
后端Go + GORM + SQLite(glebarez/sqlite 纯 Go 驱动,交叉编译无 CGO)
前端Vue3 + Vite + TypeScript + Element Plus + Pinia
渲染与导出html-to-image(DOM → PNG)+ jszip 整包 + vuedraggable 排序
AI智谱 GLM 文本模型做文案改写;图像模型预留未接入
设计系统暗色优先专业工具风,单主色派生全色阶(tokens.css)
工程架构护栏(AST / ESLint)+ deps.yaml 依赖登记制 + make gen + OpenSpec

护栏把「约定」编译成「会红的检查」:app.go 的绑定方法不得直接 import gorm/database(必须经 service)、带 BaseModel 的结构体必须登记进 AllModels() 且登记项必须真实存在(双向校验)、新增直接依赖必须登记 deps.yaml、渲染层禁 import node 能力、禁硬编码 hex 色值,以及护栏自己在 AST 解析到 0 个结果时报错而不是静默放行。需求与变更走 OpenSpec,openspec/specs/ 当前 25 份能力真相,changes/archive/ 保留每个变更的完整推理链。

成果

把「一张裸图 + 一段电商详情」到「可直接发布的闲鱼主图 + 素材卡 + 卖货文案」压成一次点击,同时把风险最高的那一步(AI 生图)明确留在门外:封面与素材卡全部由本地模板渲染真实商品图,产出的图与手里的货是同一件东西。24 次提交、18 个归档变更把它从脚手架初始化推到带开工台与素材库清理的可用状态;离屏导出按 pixelRatio: 2 出图,1:1 与 3:4 卡片的导出画布最长边正好落在 2560px。作为自用桌面工具落地,数据与产物全在本地,不经过任何服务端。

体验

桌面客户端,没有在线演示。macOS 与 Windows 各有打包入口(make package os=macos|windows),依赖只有 Go 与 Node,SQLite 走纯 Go 驱动所以交叉编译不需要 CGO。

有类似的事要管?

说说现在是怎么做的——Excel、微信群、纸质单子都行。我判断能不能做、大概怎么做。

聊聊你的需求