我的猫终于打上冰球了——一个 Vue3 + Coze AI 项目的完整落地手记

我的猫终于打上冰球了------一个 Vue3 + Coze AI 项目的完整落地手记

"代码跑通那一刻,我家布偶猫正以国漫风格站在冰场中央,身穿10号红衣,左手持杆,眼神坚毅。"

------这不是幻想,这是我亲手写出来的现实。


从"想法"到"生成成功",中间隔着无数个 401 Unauthorized

上周我还在为一句报错抓狂:access token invalid

明明 .env 里写了 VITE_PAT_TOKEN,控制台也打印出来了,为什么 Coze 就是不认?

后来才发现:Token 被我误删了权限。在 Coze 后台重新生成时,忘了勾选「文件上传」和「工作流执行」------于是前端传什么都石沉大海。

修复后,第一张图成功返回的瞬间,我截图发到群里,朋友回:"你这狗穿护具的样子,比我还认真。"


这段代码,是我和 AI 的"协作协议"

现在的代码,已经能稳定完成三步走:

  1. 用户上传宠物照 → 前端用 FileReader 实时预览,体验丝滑;
  2. 调用 Coze 文件接口 → 把图片上传到云端,拿到 file_id
  3. 触发工作流 → 把 file_id + 队服颜色/位置/风格等参数打包,交给 AI 生成最终图像。

关键逻辑藏在这几行里:

yaml 复制代码
const parameters = {
  picture: file_id, // 不再 JSON.stringify!直接传 ID
  style: style.value,
  uniform_color: uniform_color.value,
  position: position.value,
  shooting_hand: shooting_hand.value,
}

早期我错误地把 picture 包成 JSON 字符串,结果 Coze 工作流收不到有效文件引用。AI 再聪明,也得喂对格式的数据。

还有那个经典的笔误:

csharp 复制代码
const ret = await ret.json(); // ❌

改成:

csharp 复制代码
const ret = await res.json(); // ✅

------少这一行,整个流程卡死在黑屏。


类型陷阱:字符串 vs 数字

Vue 的 <select> 默认把 value="0" 当作字符串,但我初始化的是 ref(0)(数字)。

虽然后端可能宽容处理,但为了严谨,我加上了 .number 修饰符:

ini 复制代码
<select v-model.number="position">
  <option :value="0">守门员</option>
  <option :value="1">前锋</option>
</select>

现在 position.value 确实是 012,而不是 "0""1"
类型一致,是前后端和平共处的第一条公约。


安全红线:PAT Token 不该出现在前端

我知道,把 VITE_PAT_TOKEN 放在前端是个"定时炸弹"。

只要有人打开 DevTools,就能看到我的 Token,进而滥用我的 Coze 配额。

所以这个版本只是 MVP(最小可行产品)

下一步,我会用 Vercel Edge Function 或 Cloudflare Worker 写一个轻量代理:

javascript 复制代码
// /api/generate/route.ts (Next.js App Router 示例)
export async function POST(req) {
  const { imageBase64, ...params } = await req.json();
  // 1. 用后端 PAT 上传文件
  // 2. 触发工作流
  // 3. 返回 CDN 图片 URL
  return new Response(JSON.stringify({ url }));
}

前端只和自己的 API 对话,Token 永远不出服务器。
好玩的项目,也要有安全的骨架。


最终效果:不只是技术,更是情绪价值

当用户上传一张慵懒的猫咪照片,选择"守门员 + 油画风 + 黑色队服",

十秒后,屏幕上出现一只披着厚重护甲、站在冰面裂缝前的猫------

那一刻,技术完成了它的使命:把日常变成童话。

而我,只是一个搭桥的人:

用 Vue3 收集愿望,用 Coze 实现魔法,

中间那几行代码,就是咒语。


结语

这个项目还没结束。

接下来要加分享海报、失败重试、加载动画......

但今天,它已经能让我家主子在朋友圈 C 位出道。

如果你也在做一个"看似无用但超有趣"的小应用,

别怕它简单,别嫌它幼稚。
世界需要更多会打冰球的猫,也需要更多敢写第一行代码的你。

相关推荐
军军君0115 分钟前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
xiaoqi9221 小时前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
qq_177767372 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
2603_949462102 小时前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
wuhen_n2 小时前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon2 小时前
理解vue中的ref
前端·javascript·vue.js
jin1233223 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_920931703 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
橙露4 小时前
React Hooks 深度解析:从基础使用到自定义 Hooks 的封装技巧
javascript·react.js·ecmascript
2501_920931704 小时前
React Native鸿蒙跨平台使用useState管理健康记录和过滤状态,支持多种健康数据类型(血压、体重等)并实现按类型过滤功能
javascript·react native·react.js·ecmascript·harmonyos