当前位置: 首页 > news >正文

【应用程序】基于 Spring Boot + Spring AI的虚拟宠物Web 应用(二)

前端技术细节

前端实现与后端大模型交互实现:

async interact(action, message = '') { if (this.loading) return; this.loading = true; try { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 30000); const res = await fetch('/api/interact', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action, message, conversationId: this.conversationId }), signal: controller.signal }); clearTimeout(timeout); if (!res.ok) { throw new Error(`HTTP error! status: ${res.status}`); } const data = await res.json(); this.hunger = data.hunger ?? this.hunger; this.happiness = data.happiness ?? this.happiness; this.addMessage(true, data.reply || '喵呜...我忘记要说什么了 😿'); } catch (e) { if (e.name === 'AbortError') { this.addMessage(true, '喵呜...等太久了,你是不是不要我了 😿'); } else { this.addMessage(true, '网络好像断了...等我一下下喵 😿'); } } finally { this.loading = false; this.inputText = ''; } },

如下图所示:

完整前端页面代码:

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0, user-scalable=yes"><title>小N · AI虚拟宠物 | 智能陪伴小猫</title><scriptsrc="https://unpkg.com/alpinejs@3.14.3/dist/cdn.min.js"defer></script><style>/* ========== 基础重置 & 自定义样式(不依赖Tailwind) ========== */*{margin:0;padding:0;box-sizing:border-box;}[x-cloak]{display:none!important;}body{font-family:system-ui,'Segoe UI','Inter','PingFang SC',Roboto,'Helvetica Neue',sans-serif;background:linear-gradient(135deg,#111827 0%,#1f2937 50%,#111827 100%);min-height:100vh;padding:1rem;display:flex;align-items:center;justify-content:center;}/* 主卡片 */.pet-card{width:100%;max-width:600px;background:rgba(31,41,55,0.7);backdrop-filter:blur(14px);border-radius:1.5rem;border:1px solidrgba(129,140,248,0.3);padding:1.5rem;box-shadow:0 25px 45px -12pxrgba(0,0,0,0.5);transition:all 0.2s ease;}@media(max-width:640px){.pet-card{padding:1rem;}}/* 头部区域 */.header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:0.75rem;margin-bottom:1.5rem;}.header-left{display:flex;align-items:center;gap:1rem;}.avatar{width:4rem;height:4rem;border-radius:9999px;box-shadow:0 4px 6px -1pxrgba(0,0,0,0.3);ring:2px solidrgba(129,140,248,0.5);object-fit:cover;animation:bounce-soft 3s ease-in-out infinite;}@media(min-width:768px){.avatar{width:4.5rem;height:4.5rem;}}@keyframesbounce-soft{0%, 100%{transform:translateY(0px)scale(1);}50%{transform:translateY(-6px)scale(1.02);}}.title{font-size:1.5rem;font-weight:800;background:linear-gradient(135deg,#a5b4fc,#c084fc);-webkit-background-clip:text;background-clip:text;color:transparent;}.subtitle{font-size:0.75rem;color:rgba(156,163,175,0.8);margin-top:0.125rem;}/* 重置按钮 */.reset-btn{padding:0.5rem 1rem;background:rgba(244,63,94,0.15);border:1px solidrgba(244,63,94,0.3);border-radius:0.75rem;color:#fecdd3;font-size:0.875rem;font-weight:500;cursor:pointer;transition:all 0.2s;}.reset-btn:hover{background:rgba(244,63,94,0.3);transform:translateY(-1px);}/* 状态卡片网格 */.stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-bottom:1.5rem;}.stat-card{background:rgba(0,0,0,0.2);border-radius:1rem;padding:0.875rem;border:1px solidrgba(255,255,255,0.05);}.stat-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:0.5rem;}.stat-label{font-size:0.875rem;font-weight:600;display:flex;align-items:center;gap:0.375rem;}.stat-value{font-size:0.875rem;font-weight:700;background:rgba(0,0,0,0.4);padding:0.125rem 0.5rem;border-radius:9999px;}.progress-bar{background:rgba(75,85,99,0.7);border-radius:9999px;height:0.75rem;overflow:hidden;}.progress-fill{height:100%;border-radius:9999px;transition:width 0.5s ease-out;}.progress-fill.hunger{background:linear-gradient(90deg,#fb923c,#ef4444);}.progress-fill.happiness{background:linear-gradient(90deg,#c084fc,#a855f7);}/* 情绪面板 */.mood-panel{display:flex;align-items:center;justify-content:space-between;background:rgba(0,0,0,0.2);border-radius:0.75rem;padding:0.75rem;margin-bottom:1.25rem;border:1px solidrgba(129,140,248,0.2);}.mood-left{display:flex;align-items:center;gap:0.75rem
http://www.jsqmd.com/news/895087/

相关文章:

  • Spark SQL 窗口函数完整技术文档
  • 传统喷绘还在跟“色差”较劲,会被替代吗
  • 智能体安全授权新范式:便携式作用域令牌设计与实现
  • 字节AI布局
  • wsl2+ubuntu22.04配置docker代理
  • 保姆级教程:用CUDA 12.x的异步流和事件,手把手优化你的PyTorch数据预处理流水线
  • Django 从 0 到 1 打造完整电商平台:商品缓存优化(Redis)
  • 智能体评估误区:为何Token消耗不是衡量AI工作价值的关键指标
  • 内网环境RPA自动化实践:自定义API与离线运行方案
  • 48小时基于Google Cloud构建多智能体AI系统:架构、实现与优化
  • 领域特定AI聊天机器人架构设计:从通用模型到专属专家的构建指南
  • 单片机+RA8889 | RUI Builder 可视化 UI 工具 + 自研多国语言显示方案
  • 保姆级教程:在AMD Ryzen电脑上用VMware 16.2.5搞定macOS Monterey (12.x) 虚拟机
  • 纯视觉GUI智能体Mano-P:OSWorld榜首开源项目解析与实践
  • 八年Java老兵,三个月投了上百份简历没找到下家——2026年的招聘市场到底怎么了?
  • Seatable 4.3 数据迁移翻车实录:从Ubuntu到CentOS,我踩了哪些坑?
  • 如何搭建第一个AI智能体?零代码Coze完整教程
  • 从74LS283到Verilog:手把手教你用硬件描述语言‘复刻’经典BCD加法器(附完整代码与Testbench)
  • springboot - jar包启动指定具体的jdk执行
  • 构建语音控制AI智能体:从LLM意图解析到安全文件操作的实战指南
  • AI代理循环成本优化:Lumin本地代理层实现请求瘦身与缓存压缩
  • STM32F103C8T6串口收发控制LED灯:一个标准库项目搞定硬件交互与调试
  • 面试官让我现场写代码,我却跟他聊了半小时哲学——一个非典型计算机研究生的自白
  • 面试题 - GIL全局解释器锁 :为什么Python多线程不能利用多核?GIL对I/O密集和CPU密集任务的影响?如何绕过GIL(多进程、C扩展)
  • 使用Taotoken后API调用延迟与稳定性有哪些可观测的改善
  • 修复误删系统文件导致电脑屏幕有时黑屏问题
  • ADHD幸存者偏差
  • 【从零开始学习Go语言 | 第六篇】Go语言基础之流程控制
  • 2024年十大技术趋势抢先看
  • HSM - 分层状态机