[{"data":1,"prerenderedAt":387},["ShallowReactive",2],{"project-xianyu-content-gen":3,"all-projects-nav":294,"project-posts-xianyu-content-gen":386},{"id":4,"title":5,"architecture":6,"body":7,"category":252,"client":253,"cover":254,"date":255,"demo":6,"demoMobile":6,"description":243,"extension":256,"featured":257,"features":258,"github":6,"manual":6,"meta":275,"modules":6,"navigation":276,"order":277,"path":278,"seo":279,"slug":280,"stem":281,"summary":282,"techStack":283,"visible":276,"year":292,"__hash__":293},"projects\u002Fprojects\u002Fxianyu-content-gen.md","闲鱼素材工坊",null,{"type":8,"value":9,"toc":242},"minimark",[10,14,18,21,24,27,30,33,101,104,196,222,225,232,235],[11,12,13],"h2",{"id":13},"缘起",[15,16,17],"p",{},"有一晚我在给一台旧笔记本拍照，前后拍了六张，传上去自己看着像赃物照。文案是从淘宝搬来的，「七天无理由」还留在里面。",[15,19,20],{},"那晚算了一下：卖一件东西花在做图和改文案上的时间，比挂出去等买家的时间还长。",[11,22,23],{"id":23},"背景",[15,25,26],{},"闲鱼的素材规格比想象中严：主图要 1:1，轮播和详情偏好竖版，图上还得同时放得下商品名、价格、成色、包邮这几层信息，而卖家的实拍图往往背景杂乱、光线不均。当时已有的 AI 生图方案是「凭空画一个商品」，在二手交易里这就叫货不对板，是要跟买家吵架的那种风险。所以工具形态是定死的：桌面客户端，素材落到本地文件，图片不能随记录膨胀，离线也要能重新导出——而不是又一个把图传上去等结果的网页生成器。",[11,28,29],{"id":29},"方案",[15,31,32],{},"Wails v2 单二进制桌面客户端，Go 侧管数据与文件、Vue3 侧管渲染与交互，产出链路如下：",[34,35,36,44,50,61,67,73,79,85,95],"ul",{},[37,38,39,43],"li",{},[40,41,42],"strong",{},"导入与落盘","：多张商品原图拖拽排序，图片按 sha1 命名存进用户配置目录，历史快照只存文件名——记录不会随 base64 膨胀，也不会因换机器路径变化而失效。用量有闸门：单张 ≤ 8MB、≤ 20 张、会话总计 ≤ 40MB，界面实时显示占用",[37,45,46,49],{},[40,47,48],{},"AI 文案改写","：把电商详情改写成闲鱼特化文案，产出标题候选 ×3、含 # 话题词与成色\u002F发货\u002F售后话术的描述正文、卖点标签 3~5 个。模型返回非法 JSON 时自动重试，仍失败则回落到可用兜底文案，不阻塞素材产出",[37,51,52,55,56,60],{},[40,53,54],{},"本地渲染","：素材卡由 DOM 渲染后用 ",[57,58,59],"code",{},"html-to-image"," 转 PNG，12 款模板 × 5 色系 × 3 尺寸（1:1 主图 \u002F 3:4 轮播 \u002F 9:16 竖长详情），另有 6 种背景装饰语言分层。改价格、勾包邮即时重渲，所见即所得",[37,62,63,66],{},[40,64,65],{},"刻意不接 AI 生图","：图像模型只作为配置项预留。智谱 GLM-Image 只支持文生图、没有图生图与编辑端点，无法基于用户上传的真实商品照片改图；凭空生图会产出「图物不符」的封面，在二手交易场景属高风险，所以封面图一律走本地模板渲染",[37,68,69,72],{},[40,70,71],{},"导出","：单张 PNG 或整包 zip 走 Go 原生保存对话框——桌面 WebView 下浏览器下载不可靠，这条路是必需的",[37,74,75,78],{},[40,76,77],{},"制作记录","：每次导出自动存档，支持「再次编辑」回填工作台、「重新下载」离线重渲染（不发 AI 请求）、软删除",[37,80,81,84],{},[40,82,83],{},"仪表盘","：默认落地页只回答「接下来做什么」——一键新建素材、续上未完成的草稿，把散落的待处理事项（草稿未导出 \u002F 未配 AI Key \u002F 素材库可清理）聚成一张清单，并给出最近作品直达入口。趋势图与累计统计明确不做：本应用的记录量级与模板集中度不支持任何「洞察」，那类元素只会挤占版面",[37,86,87,90,91,94],{},[40,88,89],{},"素材库卫生","：",[57,92,93],{},"goods\u002F"," 里的原图会因软删除和「导入了没保存」只增不减，应用统计占用、识别无记录引用的原图，并支持先确认后清理；工作台正在使用、尚未保存的原图不会被误删",[37,96,97,100],{},[40,98,99],{},"模型可配置","：API Key \u002F Base URL \u002F 文本模型 \u002F 图像模型在设置页可视化编辑，含连通性测试；界面只回传打码值，明文不下发前端",[11,102,103],{"id":103},"技术架构",[105,106,107,120],"table",{},[108,109,110],"thead",{},[111,112,113,117],"tr",{},[114,115,116],"th",{},"模块",[114,118,119],{},"技术选型",[121,122,123,132,144,152,160,168,180],"tbody",{},[111,124,125,129],{},[126,127,128],"td",{},"桌面运行时",[126,130,131],{},"Wails v2.15（单实例锁、系统托盘、日志轮转、原生对话框、崩溃落盘）",[111,133,134,137],{},[126,135,136],{},"后端",[126,138,139,140,143],{},"Go + GORM + SQLite（",[57,141,142],{},"glebarez\u002Fsqlite"," 纯 Go 驱动，交叉编译无 CGO）",[111,145,146,149],{},[126,147,148],{},"前端",[126,150,151],{},"Vue3 + Vite + TypeScript + Element Plus + Pinia",[111,153,154,157],{},[126,155,156],{},"渲染与导出",[126,158,159],{},"html-to-image（DOM → PNG）+ jszip 整包 + vuedraggable 排序",[111,161,162,165],{},[126,163,164],{},"AI",[126,166,167],{},"智谱 GLM 文本模型做文案改写；图像模型预留未接入",[111,169,170,173],{},[126,171,172],{},"设计系统",[126,174,175,176,179],{},"暗色优先专业工具风，单主色派生全色阶（",[57,177,178],{},"tokens.css","）",[111,181,182,185],{},[126,183,184],{},"工程",[126,186,187,188,191,192,195],{},"架构护栏（AST \u002F ESLint）+ ",[57,189,190],{},"deps.yaml"," 依赖登记制 + ",[57,193,194],{},"make gen"," + OpenSpec",[15,197,198,199,202,203,206,207,210,211,213,214,217,218,221],{},"护栏把「约定」编译成「会红的检查」：",[57,200,201],{},"app.go"," 的绑定方法不得直接 import gorm\u002Fdatabase（必须经 service）、带 ",[57,204,205],{},"BaseModel"," 的结构体必须登记进 ",[57,208,209],{},"AllModels()"," 且登记项必须真实存在（双向校验）、新增直接依赖必须登记 ",[57,212,190],{},"、渲染层禁 import node 能力、禁硬编码 hex 色值，以及护栏自己在 AST 解析到 0 个结果时报错而不是静默放行。需求与变更走 OpenSpec，",[57,215,216],{},"openspec\u002Fspecs\u002F"," 当前 25 份能力真相，",[57,219,220],{},"changes\u002Farchive\u002F"," 保留每个变更的完整推理链。",[11,223,224],{"id":224},"成果",[15,226,227,228,231],{},"把「一张裸图 + 一段电商详情」到「可直接发布的闲鱼主图 + 素材卡 + 卖货文案」压成一次点击，同时把风险最高的那一步（AI 生图）明确留在门外：封面与素材卡全部由本地模板渲染真实商品图，产出的图与手里的货是同一件东西。24 次提交、18 个归档变更把它从脚手架初始化推到带开工台与素材库清理的可用状态；离屏导出按 ",[57,229,230],{},"pixelRatio: 2"," 出图，1:1 与 3:4 卡片的导出画布最长边正好落在 2560px。作为自用桌面工具落地，数据与产物全在本地，不经过任何服务端。",[11,233,234],{"id":234},"体验",[15,236,237,238,241],{},"桌面客户端，没有在线演示。macOS 与 Windows 各有打包入口（",[57,239,240],{},"make package os=macos|windows","），依赖只有 Go 与 Node，SQLite 走纯 Go 驱动所以交叉编译不需要 CGO。",{"title":243,"searchDepth":244,"depth":244,"links":245},"",2,[246,247,248,249,250,251],{"id":13,"depth":244,"text":13},{"id":23,"depth":244,"text":23},{"id":29,"depth":244,"text":29},{"id":103,"depth":244,"text":103},{"id":224,"depth":244,"text":224},{"id":234,"depth":244,"text":234},"ai","个人项目","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fxianyu-content-gen\u002Fxianyu-hero.webp","2026-09-30","md",false,[259,263,267,271],{"title":260,"description":261,"image":262},"闲鱼工作台 · 一次点击出素材","导入原图（可拖拽排序）+ 填商品名\u002F价格\u002F包邮\u002F成色 + 粘贴电商详情，右侧即时渲染 1:1 主图，改价格勾包邮当场重渲","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fxianyu-content-gen\u002Fxianyu-workbench.webp",{"title":264,"description":265,"image":266},"素材样式 · 12 模板 × 5 色系","色系决定整体色调（文字色、描边色、背景渐变由一个强调色推出），模板决定每张卡的排版与背景效果，支持自建并保存为长期默认","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fxianyu-content-gen\u002Fxianyu-styles.webp",{"title":268,"description":269,"image":270},"制作记录 · 可回编辑可离线重下","每次导出自动存档；「再次编辑」回填工作台，「重新下载」离线重渲染不再发起 AI 请求，删除为软删除并交给素材库清理认领","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fxianyu-content-gen\u002Fxianyu-records.webp",{"title":272,"description":273,"image":274},"仪表盘 · 只回答「接下来做什么」","一键新建、续上未完成的草稿，把草稿未导出 \u002F 未配 AI Key \u002F 素材库可清理聚成一张清单；刻意不做趋势图与累计统计","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fxianyu-content-gen\u002Fxianyu-dashboard.webp",{},true,18,"\u002Fprojects\u002Fxianyu-content-gen",{"title":5,"description":243},"xianyu-content-gen","projects\u002Fxianyu-content-gen","Wails 桌面客户端——商品原图 + 电商详情一键变成可发布的闲鱼主图、素材卡与卖货文案，12 模板 × 5 色系 × 3 尺寸本地渲染，AI 只改文案不生图",[284,285,286,287,288,289,290,291],"Go","Wails","GORM","SQLite","Vue3","TypeScript","Element Plus","Pinia","2026","ArlhHfjOUsNOz-BJ-Zu9kWM_9XLMKBJnx1PIEb2Eel0",[295,301,306,311,312,317,323,328,333,336,341,347,353,357,362,366,370,374,378,382],{"title":296,"slug":297,"order":298,"year":292,"date":299,"category":300},"图片工坊 · 离线批量图片处理","image-workshop",20,"2026-10-24","desktop",{"title":302,"slug":303,"order":304,"year":292,"date":305,"category":300},"Morrow · 桌面健康提醒","morrow",19,"2026-10-23",{"title":307,"slug":308,"order":309,"year":292,"date":255,"category":310},"家教学情管理系统","tutor-analytics",17,"operations",{"title":5,"slug":280,"order":277,"year":292,"date":255,"category":252},{"title":313,"slug":314,"order":315,"year":292,"date":316,"category":252},"电商详情页 AI 生成客户端","ecom-detail-ai",16,"2026-09-29",{"title":318,"slug":319,"order":320,"year":292,"date":321,"category":322},"Wails 桌面端脚手架基座","wails-bailer-starter",15,"2026-09-15","toolkit",{"title":324,"slug":325,"order":326,"year":292,"date":327,"category":322},"多端管理脚手架基座","admin-scaffold",8,"2026-09-04",{"title":329,"slug":330,"order":331,"year":292,"date":332,"category":310},"公车车辆管理系统","bus-admin-system",1,"2026-09-02",{"title":334,"slug":335,"order":244,"year":292,"date":332,"category":310},"设备出租订单管理系统","rental-order-manager",{"title":337,"slug":338,"order":339,"year":292,"date":340,"category":252},"家庭绿植管家","family-plant-manager",3,"2026-08-19",{"title":342,"slug":343,"order":344,"year":345,"date":346,"category":252},"古诗词AI取名工具","chinese-poetry-give-name",7,"2025","2026-06-22",{"title":348,"slug":349,"order":350,"year":345,"date":351,"category":352},"企业固定资产管理系统","asset-admin",4,"2026-06-16","admin",{"title":354,"slug":355,"order":356,"year":345,"date":351,"category":252},"知祖AI","kingpt",5,{"title":358,"slug":359,"order":360,"year":345,"date":351,"category":361},"深圳房产智能分析平台","sz-realestate",6,"data",{"title":363,"slug":364,"order":365,"year":345,"date":351,"category":352},"工厂轻量化智能排班系统","staff-scheduling",9,{"title":367,"slug":368,"order":369,"year":345,"date":351,"category":310},"电商服装仓库物流管理系统","clothing-warehouse",10,{"title":371,"slug":372,"order":373,"year":345,"date":351,"category":252},"知识库问答系统","kb-qa",11,{"title":375,"slug":376,"order":377,"year":345,"date":351,"category":352},"企业微信邮箱运营管理系统","mail-manager",12,{"title":379,"slug":380,"order":381,"year":345,"date":351,"category":310},"Switch 电玩库存管理系统","switch-manager",13,{"title":383,"slug":384,"order":385,"year":345,"date":351,"category":352},"学生宿舍管理系统","dorm-manager",14,[],1792857942266]