占位符方案
完全可以实现。你截图中展示的文案段落,比如“618美发狂欢”、“夏日焕新美出新高度”、“01【剪发秒杀仅需6.18元】…”等,后台可以按段落选取,然后标记为占位符。没有被标记的段落前端直接不显示。
下面我根据你的截图场景,给出一个可直接落地的实现方案(含前端交互、数据结构、后端存储、前端渲染)。
一、核心需求回顾
- 后台有一篇生成好的AI海报文案(多段落)。
- 运营人员可以选择任意段落,为该段落设置一个“占位符标识”(比如
title、subTitle、promo1)。 - 设置过占位符的段落 → 前端可见,并且允许用户修改。
- 未设置占位符的段落 → 前端完全不显示(就像被隐藏了)。
- 前端修改文案后,可以把新内容提交给后台,用于生成最终海报图片。
二、后台实现方案(以你的截图界面为例)
1. 文案分段展示 + 可勾选
在后台编辑页,把AI生成的文案按自然段落拆分成多个块(可以按换行符自动拆分,也支持手动拆分)。
每个段落旁边提供一个复选框 + 占位符Key输入框:
[✓] 段落1: 618美发狂欢 占位符key: [main_title ]
[✓] 段落2: CARNIVAL夏日焕新美出新高度 占位符key: [sub_title ]
[ ] 段落3: 01【剪发秒杀仅需6.18元】每日限5名... (未勾选,前端不显示)
[✓] 段落4: 02【疯狂R潮色焕新焕新低至6.8折】... 占位符key: [promo_color ]
[ ] 段落5: 03【老带新礼...】 (未勾选)
[✓] 段落6: 活动最终解释权归门店所有 占位符key: [disclaimer ]
- 勾选 = 作为占位符暴露给前端。
- 填入的
key是唯一标识(英文+下划线),前端用这个key来提交修改值。 - 不勾选的段落 → 在保存模板时,后台直接丢弃(不存入模板配置中)。
你截图里的“设置成占位符”按钮,可以这样用:先选中一段文字,点击按钮,自动为该段落生成一个key(或弹窗输入key)。
2. 保存的数据结构(JSON)
{
"templateId": "poster_001",
"segments": [
{
"placeholderKey": "main_title",
"originalText": "618美发狂欢",
"style": { "fontSize": 48, "bold": true, "color": "#FF3366" }
},
{
"placeholderKey": "sub_title",
"originalText": "CARNIVAL夏日焕新美出新高度",
"style": { "fontSize": 28, "color": "#333333" }
},
{
"placeholderKey": "promo_color",
"originalText": "02【疯狂R潮色焕新焕新低至6.8折】PERMING&DIYINGCARNIVAL03",
"style": { "fontSize": 20 }
},
{
"placeholderKey": "disclaimer",
"originalText": "活动最终解释权归门店所有",
"style": { "fontSize": 12, "color": "#999999" }
}
]
}
- 没有占位符key的段落根本不存入这个数组 → 前端永远拿不到 → 实现“不显示”。
originalText作为默认展示文案,前端首次渲染就用它。- 还可以保存每个段落的坐标(x,y)和样式,方便canvas直接绘制。
3. 接口设计
-
GET /api/template/:id
返回上述segments数组(只包含有 placeholderKey 的段落)。 -
POST /api/template/:id/content
前端提交修改后的文案:{ "main_title": "618狂欢节", "sub_title": "夏日限定 焕新特惠", "promo_color": "潮色焕新6折起", "disclaimer": "最终解释权归本店" }后台根据这些新文案重新生成海报图片(或更新模板的默认文案)。
三、前端实现(用户端展示与修改)
1. 拉取并渲染可编辑区域
前端拿到 segments 数组后,只渲染有 placeholderKey 的段落。每个段落渲染为一个可编辑组件(输入框/富文本)。
示例(Vue 3):
<template>
<div class="poster-editor">
<div v-for="seg in segments" :key="seg.placeholderKey" class="editable-line">
<label>{{ seg.placeholderKey }}</label>
<input
v-model="userInputs[seg.placeholderKey]"
:placeholder="seg.originalText"
/>
</div>
<button @click="updatePoster">更新海报</button>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const segments = ref([])
const userInputs = ref({})
onMounted(async () => {
const res = await fetch('/api/template/123')
const data = await res.json()
segments.value = data.segments
// 用原始文案初始化用户输入
segments.value.forEach(seg => {
userInputs.value[seg.placeholderKey] = seg.originalText
})
})
const updatePoster = async () => {
await fetch('/api/template/123/content', {
method: 'POST',
body: JSON.stringify(userInputs.value)
})
alert('海报已更新')
}
</script>
2. 最终海报生成(两种方案)
-
方案A:后端生成图片
前端提交修改文案后,后端根据模板配置(坐标、样式)和用户新文案,用Canvas或图像库生成新海报图片,返回图片URL给前端展示。
优点:对前端性能无要求,保证不同设备显示一致。 -
方案B:前端Canvas绘制
后端下发每个段落的坐标、字体样式,前端直接在Canvas上绘制用户修改后的文案。
优点:实时预览,无需反复请求后端。
如果你的用户端主要是修改文案后“保存并下载海报”,推荐后端生成,更可控。
四、总结:是否可实现?
✅ 完全可以实现。核心步骤:
- 后台编辑页:将AI文案按段落拆分,提供“勾选+设置占位符key”的交互,未勾选的段落不保存。
- 数据存储:只存储带
placeholderKey的段落及其默认文案、样式、坐标。 - 前端(用户端):只渲染后台设置的占位符段落,每个提供输入框让用户修改。
- 更新逻辑:用户修改后提交新文案,后端重新生成海报图片或前端实时重绘。
你截图中的“保存提示词”“选择提示词”等功能,可以作为扩展:将某个占位符及其文案保存为“提示词模板”,方便下次快速复用。
如果你需要更具体的代码示例(比如React版本、Canvas绘制部分、后端图像生成示例),我可以继续补充。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)