图片生成器项目实践:面向论文配图与教学交付的效率工具
图片生成器项目实践:面向论文配图与教学交付的效率工具
线上地址:
这段时间我重新梳理了一下自己在做的这个图片生成器项目。和一般的“在线画图工具”相比,它更像一个面向论文配图、课程设计和教学交付场景的图表工作台。对我来说,这个项目值得记录的地方,不是它支持了多少图种,而是它在工程上逐渐形成了几条比较清晰的设计原则。
一、问题不是“生成一张图”,而是“如何减少交付链路里的重复劳动”
如果只从功能表面看,这个项目做的是:
- ER 属性图
- 学术三线表
- 系统架构图
- 流程图
- 数据流图
- 用例图
- 类图
- 时序图
但真正驱动我继续做下去的,不是“图种数量”,而是一个更具体的问题:
当用户已经有了 SQL、表结构、字段说明或系统设计信息时,能不能不要再重复拖拽、重复排版、重复导出。
所以这个项目从一开始就不是按自由绘图工具的逻辑去做的,而是按“结构化输入 -> 预览 -> 正式生成 -> 导出”的链路来组织。也正因为这样,它的很多实现选择都偏向工作流,而不是偏向画布交互。
二、前端不是多个孤立页面,而是统一工作台
前端基于 Vue 3 + Vite,顶层入口在 src/App.vue。这里一个很关键的决定是:没有把不同图种拆成完全独立的小应用,而是统一挂在同一个工作台壳层下。
这样做的直接收益有几个:
- 登录、账户、反馈、管理后台只需要维护一套
- 图种切换时可以复用相同的状态管理和交互模式
- 配额、会员、导出、弹窗这些横切能力不用重复实现
- 后续加新图种时,接入成本更可控
如果项目只是一个本地 demo,这种组织方式会显得偏重;但如果目标是持续迭代的线上工具,它反而能让演进路径更稳定。很多“越做越乱”的工具站,问题不在某个功能点,而在顶层没有把公共能力提前收拢。
三、结构化输入是这个项目最重要的前提
我比较认同的一点是,这类工具如果要求用户从空白画布开始操作,效率往往并不高。真正能拉开体验差异的,通常是能不能直接消费已有结构。
以 ER 工作区为例,系统不是让用户重新画表,而是优先接 CREATE TABLE 结构,然后走解析、预览和导出流程。这个思路本质上是在做一次“结构到图”的转换,而不是做一个通用画板。
这背后的取舍很明确:
- 放弃一部分“完全自由”的编辑能力
- 换取更稳定的生成结果
- 让已有资料可以直接复用
- 把时间花在交付结果上,而不是花在重复输入上
这个思路在三线表工作区也一样成立。三线表最难的部分通常不是“画出来”,而是“导出的结果能不能直接放进 Word 或论文里”。所以它更像是一个面向交付的结构化文档生成问题,而不是一个普通表格编辑问题。
四、预览和正式生成分离,是我最想保留的一个边界
这个项目里有一个我现在依然觉得很重要的设计:预览接口和正式生成接口分离。
原因不复杂。只要项目里开始出现配额、会员、导出、AI 调用这些生产级规则,预览和正式生成就不应该继续混在一起。
项目里的接口封装大致是这样:
export async function parseDiagramByServer(type, input) { const result = await requestJson('/api/preview/diagram/parse', { method: 'POST', body: JSON.stringify({ type, input }) });
return result?.data;}
export async function generateParsedDiagramByServer(type, input) { const result = await requestJson('/api/generate/parse', { method: 'POST', body: JSON.stringify({ type, input }) }); return result?.data;}
export async function generateSqlDiagramByServer(input) { const result = await requestJson('/api/generate/sql-parse', { method: 'POST', body: JSON.stringify({ input }) }); return result?.data;}这段代码表面上只是多了几个路径,但它实际解决的是接口语义和业务边界问题:
- 预览阶段允许低成本试错
- 正式生成阶段才进入额度消耗链路
- 前端调用时不会把“看看效果”和“真正产出”混成一个动作
- 后端更容易接入日志、计费、风控和异常补偿
很多工具项目后期难维护,原因往往不是算法复杂,而是链路边界一开始就没有分开。预览、生成、导出、计费混在一起以后,任何规则变更都会影响整条链路。
五、后端真正承担的是规则协调,而不是单纯转发请求
后端目录在 license-server/,入口是 proxy.js。虽然名字看起来像代理层,但它实际承担的是一层比较完整的业务协调逻辑。
从当前结构看,后端至少已经拆成了这些模块:
services/parseservices/buildservices/layoutservices/exportservices/authservices/redeemservices/shareservices/feedback
这类拆分说明一件事:项目的问题域已经不是“请求进来,生成一张图再返回”这么简单了。它还要处理:
- 身份状态
- 使用额度
- 正式生成与预览的边界
- 导出失败时的补偿
- 反馈和运营链路
- 兑换码和会员逻辑
也就是说,真正把项目复杂度拉上去的,不是图种本身,而是这些围绕线上工具运行而出现的规则系统。
六、AI 在这里更像结构化处理器,而不是聊天入口
这个项目也接了 AI,但它不是以对话为中心来设计的。我更愿意把它看成一个嵌入工作流的结构化处理器。
它更适合做的事是:
- 优化原始 SQL
- 收敛字段数量
- 补字段注释
- 把不规整的输入转换成更容易解析的结构
这类场景下,AI 的价值不在于“能聊”,而在于它能不能帮用户少做几轮机械调整。只要它能把脏输入整理到更适合后续解析和导出的状态,它就是有效的。
七、从工程形态看,它已经更接近一个垂直 SaaS
虽然我还习惯叫它“图片生成器”,但从系统形态看,它已经不只是一个单点工具。除了图表工作区本身,它还在持续吸收这些能力:
- 游客与注册用户的额度体系
- 会员无限制逻辑
- 登录、会话、账户中心
- 分享活动与奖励
- 兑换码系统
- 反馈管理
- 后台管理
这意味着它的核心问题已经从“功能能不能做出来”转成“这套工具如何长期在线运行”。这也是为什么我现在更愿意从工作流、权限边界和可维护性来审视它,而不是只看图表渲染效果。
八、现阶段最值得继续打磨的点
如果后面继续投入,我更关注的不会是机械地增加图种,而是下面这些更偏工程质量的方向:
- 生成结果的稳定性
- 导出结果的交付质量
- 预览与正式生成链路的一致性
- AI 辅助的可控性
- 用户在真实交付流程中的卡点
对这类项目来说,真正决定体验上限的,往往不是“会不会画”,而是“会不会在最后一步掉链子”。
结语
这次回头看这个项目,我比较确定的一点是:它要解决的并不是“如何在线画图”,而是“如何把已有结构更高效地变成可交付结果”。
从工程视角看,比较关键的几件事其实已经逐渐清晰了:
- 用结构化输入替代重复拖拽
- 用统一工作台承载多图种能力
- 用预览/正式生成分离守住业务边界
- 用后端规则系统托住额度、导出和运营逻辑
后面即使继续扩功能,我也更倾向于守住这些边界,而不是把它重新做回一个“大而杂的在线画板”。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!