Vue3 + Coze 工作流:打造“AI冰球宠物”趣味应用
项目背景
本项目是一个面向冰球协会用户的趣味型前端活动应用,用户上传自家宠物照片后,通过 AI 能力生成其化身冰球运动员的形象图片。生成结果支持自定义队服颜色、号码、位置、持杆手及艺术风格,最终可分享至朋友圈,兼具娱乐性与社交传播力。
整个 AI 能力由 Coze 平台的工作流(Workflow) 提供,前端使用 Vue3 + Composition API 实现交互逻辑和状态管理。
核心功能模块
1. 图片上传与本地预览
为提升用户体验,在图片正式上传前提供本地预览图:
- 使用
<input type="file">获取用户选择的图片文件; - 利用
FileReader.readAsDataURL()将图片转为 Base64 字符串; - 绑定到响应式变量
imgPreview,实现即时预览。
const updateImageData = () => {
const file = uploadImage.value.files[0];
const reader = new FileReader();
reader.onload = (e) => imgPreview.value = e.target.result;
reader.readAsDataURL(file);
}
✅ 优势:避免用户在等待上传完成期间感到“无反馈”,提升操作流畅感。
2. 表单参数收集
用户可通过表单设置以下个性化选项:
| 参数项 | 类型 | 可选值 |
|---|---|---|
| 队服编号 | Number | 任意数字(默认 24) |
| 队服颜色 | String | 红、蓝、绿、黄、橙 |
| 位置 | Number | 守门员(0)、前锋(1)、后卫(2) |
| 持杆手 | String | 左手(0)、右手(1) |
| 风格 | String | 写实、乐高、国漫、日漫、油画、涂鸦、素描 |
所有参数通过 ref() 声明为响应式数据,便于后续传递给 AI 工作流。
3. 文件上传至 Coze
由于 Coze 工作流无法直接处理前端传来的原始文件,需先将图片上传至 Coze 的文件服务:
- 使用
FormData构造请求体; - 设置
Authorization: Bearer <PAT_TOKEN>; - 调用
POST /v1/files/upload接口; - 成功后返回
file_id,用于后续工作流调用。
const uploadFile = async () => {
const formData = new FormData();
formData.append('file', input.files[0]);
const res = await fetch(uploadUrl, {
method: 'POST',
headers: { Authorization: `Bearer ${patToken}` },
body: formData
});
const ret = await res.json();
return ret.code === 0 ? ret.data.id : null;
}
🔒 安全提示:
PAT_TOKEN(Personal Access Token)应通过环境变量VITE_PAT_TOKEN注入,避免硬编码泄露。
4. 调用 Coze 工作流生成图片
获取 file_id 后,构造参数对象并调用工作流:
const parameters = {
petPhoto: JSON.stringify({ file_id }),
style: style.value,
uniform_color: uniform_color.value,
uniform_number: uniform_number.value,
position: position.value,
shooting_hand: shooting_hand.value,
}
const res = await fetch(workflowUrl, {
method: 'POST',
headers: {
Authorization: `Bearer ${patToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ workflow_id, parameters })
});
- 工作流 ID 固定为
7584046463786287155; - 返回结果中包含生成图片的 URL(
data.data); - 前端将其赋值给
imgUrl,自动渲染输出区域。
⚠️ 注意:根据你提供的错误日志,
GET /v1/workflow/run不存在,说明必须使用POST方法调用该接口——当前代码已正确实现。
状态管理与用户反馈
为增强交互体验,引入 status 响应式变量显示操作进度:
- 初始:空
- 上传中:“图片上传中...”
- 生成中:“图片上传成功, 正在生成...”
- 出错:显示
ret.msg - 成功:清空状态,显示图片
这种细粒度的状态提示能显著降低用户焦虑,提升产品专业感。
总结与优化方向
✅ 当前实现亮点
- 完整的用户操作闭环:从选图 → 预览 → 配置 → 上传 → 生成 → 展示;
- 良好的错误处理:对上传和工作流调用均做
code !== 0判断; - 安全实践:敏感 token 通过环境变量管理;
- 响应式 UI:Vue3 Composition API 代码结构清晰、逻辑内聚。
🔧 可优化点
- 加载动画:在“生成中”阶段可加入 spinner 动画;
- 文件校验:限制图片格式(如仅允许 JPG/PNG)、大小(如 ≤5MB);
- 重试机制:网络失败时提供“重新生成”按钮;
- 分享功能:集成微信/朋友圈分享 SDK,一键传播;
- 错误日志上报:将
logid(如202509162051147FCC2ED6A641DFDD4F01)上报监控系统,便于排查。
结语
这个“AI冰球宠物”应用虽小,却完整涵盖了前端交互、文件处理、AI API 调用、状态管理等现代 Web 开发核心技能。借助 Coze 强大的工作流能力,开发者无需深入模型细节,即可快速构建富有创意的 AI 应用。未来可扩展至更多体育主题(如篮球、足球),形成系列化趣味产品矩阵。