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

微信小程序集成通义千问:打造悬浮窗智能对话助手

1. 为什么要在微信小程序里集成通义千问最近两年AI对话助手火得一塌糊涂但大部分应用都是独立APP或者网页版。其实对于很多轻量级场景来说直接在微信小程序里集成AI助手反而更实用。想象一下当你在小程序里购物遇到问题时不用跳转到其他应用直接点击悬浮窗就能获得智能客服帮助这种体验是不是很爽我去年帮学弟做毕业设计时就用了这个方案。他们团队要做校园服务小程序想在咨询模块加入智能问答。传统方案要么对接第三方客服系统贵且复杂要么自己训练模型门槛太高。最后我们选择了阿里云通义千问API从接入到上线只用了3天效果还特别好。悬浮窗设计最大的优势就是非侵入性。用户不需要离开当前页面随时可以唤出对话框。这种设计模式在电商、教育、工具类小程序中特别实用。比如电商场景悬浮窗解答商品咨询学习场景随时提问知识点工具场景快速查询天气/翻译2. 前期准备工作2.1 注册阿里云账号并开通服务首先需要到阿里云官网注册账号已有账号可跳过。在控制台搜索通义千问进入产品页面后点击立即开通。目前新用户有免费额度足够毕业设计或小型项目使用。开通后要做三件事获取AccessKey在控制台AccessKey管理页面创建记录API调用地址一般是https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation查看计费方式注意免费额度用完后会按量计费建议在本地先测试API调用是否正常。这里给出Python测试代码import dashscope from dashscope import Generation dashscope.api_key 你的API_KEY response Generation.call( modelqwen-turbo, prompt你好介绍一下你自己 ) print(response)2.2 微信开发者工具配置在微信公众平台注册小程序账号个人类型即可下载开发者工具。创建新项目时注意勾选不使用云服务除非你需要云开发AppID填写你的小程序ID项目目录不要包含中文路径建议安装以下插件方便开发WXML格式化工具CSS预处理器支持ESLint代码检查基础项目结构应该是这样的├── pages │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss ├── utils │ └── api.js └── app.js3. 实现悬浮窗对话功能3.1 悬浮窗拖拽实现悬浮窗的核心是CSS定位和触摸事件处理。在index.wxml中添加以下代码view classfloating-window styleleft: {{windowX}}px; top: {{windowY}}px; bindtouchstarthandleTouchStart bindtouchmovehandleTouchMove image src/images/icon-chat.png/image /view对应的JS逻辑Page({ data: { windowX: 300, windowY: 500, startX: 0, startY: 0 }, handleTouchStart(e) { this.setData({ startX: e.touches[0].clientX, startY: e.touches[0].clientY }); }, handleTouchMove(e) { const { startX, startY, windowX, windowY } this.data; const deltaX e.touches[0].clientX - startX; const deltaY e.touches[0].clientY - startY; this.setData({ windowX: windowX deltaX, windowY: windowY deltaY, startX: e.touches[0].clientX, startY: e.touches[0].clientY }); } })样式方面要注意几点使用position: fixed脱离文档流添加z-index: 9999确保在最上层给悬浮窗添加阴影和圆角提升视觉效果.floating-window { position: fixed; width: 60px; height: 60px; background: #07C160; border-radius: 50%; display: flex; justify-content: center; align-items: center; box-shadow: 0 2px 10px rgba(0,0,0,0.2); z-index: 9999; } .floating-window image { width: 30px; height: 30px; }3.2 对话界面开发点击悬浮窗后应该弹出对话框。先完善WXML结构!-- 对话框 -- view classdialog-container wx:if{{showDialog}} view classdialog-header text智能助手/text button bindtapcloseDialog×/button /view scroll-view classmessage-list scroll-y block wx:for{{messages}} wx:keyid view classmessage {{item.role}} image wx:if{{item.roleassistant}} src/images/bot-avatar.png/image view classcontent{{item.content}}/view /view /block /scroll-view view classinput-area input placeholder输入问题... bindinputhandleInput value{{inputText}} / button bindtapsendMessage发送/button /view /view关键交互逻辑包括点击悬浮窗切换对话框显示状态输入框内容双向绑定发送消息时滚动到底部Page({ data: { showDialog: false, messages: [], inputText: }, toggleDialog() { this.setData({ showDialog: !this.data.showDialog }); }, handleInput(e) { this.setData({ inputText: e.detail.value }); }, sendMessage() { if (!this.data.inputText.trim()) return; const newMsg { id: Date.now(), role: user, content: this.data.inputText }; this.setData({ messages: [...this.data.messages, newMsg], inputText: }); // 调用API获取回复 this.getAIResponse(this.data.inputText); }, closeDialog() { this.setData({ showDialog: false }); } })4. 对接通义千问API4.1 封装API请求在utils/api.js中封装请求方法const API_KEY 你的API_KEY; const API_URL https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation; function callQianwen(prompt) { return new Promise((resolve, reject) { wx.request({ url: API_URL, method: POST, header: { Content-Type: application/json, Authorization: Bearer ${API_KEY} }, data: { model: qwen-turbo, input: { messages: [ { role: user, content: prompt } ] } }, success(res) { if (res.data res.data.output) { resolve(res.data.output.text); } else { reject(new Error(API返回格式异常)); } }, fail(err) { reject(err); } }); }); } module.exports { callQianwen };4.2 处理API响应完善之前的getAIResponse方法const { callQianwen } require(../../utils/api); Page({ // ...其他代码 async getAIResponse(prompt) { // 添加loading状态 const loadingMsg { id: Date.now() 1, role: assistant, content: 思考中... }; this.setData({ messages: [...this.data.messages, loadingMsg] }); try { const response await callQianwen(prompt); // 移除loading消息 const newMessages this.data.messages.slice(0, -1); this.setData({ messages: [ ...newMessages, { id: Date.now(), role: assistant, content: response } ] }); // 滚动到底部 this.scrollToBottom(); } catch (error) { console.error(API调用失败:, error); const newMessages this.data.messages.slice(0, -1); this.setData({ messages: [ ...newMessages, { id: Date.now(), role: assistant, content: 抱歉我遇到了一些问题请稍后再试 } ] }); } }, scrollToBottom() { this.createSelectorQuery() .select(.message-list) .boundingClientRect() .exec(res { if (res[0]) { wx.pageScrollTo({ scrollTop: res[0].height, duration: 300 }); } }); } })5. 性能优化与体验提升5.1 消息本地存储为了防止页面刷新导致消息丢失可以使用微信的本地存储Page({ onLoad() { const history wx.getStorageSync(chatHistory) || []; this.setData({ messages: history }); }, saveMessages() { wx.setStorageSync(chatHistory, this.data.messages); }, // 在sendMessage和getAIResponse的最后调用saveMessages })5.2 加载状态优化添加更友好的加载动画修改WXMLblock wx:if{{item.content 思考中...}} view classloading view classdot/view view classdot/view view classdot/view /view /block对应的CSS.loading { display: flex; padding: 10px; } .dot { width: 8px; height: 8px; margin: 0 3px; background-color: #999; border-radius: 50%; animation: bounce 1.4s infinite ease-in-out; } .dot:nth-child(2) { animation-delay: 0.2s; } .dot:nth-child(3) { animation-delay: 0.4s; } keyframes bounce { 0%, 80%, 100% { transform: scale(0); } 40% { transform: scale(1); } }5.3 网络错误处理增强网络异常时的用户体验async getAIResponse(prompt) { // 检查网络状态 const { networkType } await wx.getNetworkType(); if (networkType none) { wx.showToast({ title: 网络不可用, icon: none }); return; } // 显示加载中提示 wx.showLoading({ title: 思考中, mask: true }); try { // ...原有逻辑 } catch (error) { // 错误处理 let errorMsg 服务异常请重试; if (error.errMsg.includes(timeout)) { errorMsg 请求超时; } else if (error.errMsg.includes(fail)) { errorMsg 网络错误; } wx.showToast({ title: errorMsg, icon: none }); } finally { wx.hideLoading(); } }6. 实际开发中的坑与解决方案6.1 悬浮窗被遮挡问题在部分安卓机型上悬浮窗可能会被原生组件如video遮挡。解决方案是使用cover-view替代普通view调整z-index值在必要时刻隐藏悬浮窗cover-view classfloating-window styleleft: {{windowX}}px; top: {{windowY}}px; !-- 内容 -- /cover-view6.2 API响应慢的优化通义千问API在高峰期可能会有延迟可以采取以下措施添加请求超时设置实现消息队列避免频繁发送本地缓存常见问题的回答修改API调用代码wx.request({ // ...其他参数 timeout: 10000, // 10秒超时 fail(err) { if (err.errMsg.includes(timeout)) { reject(new Error(请求超时)); } else { reject(err); } } });6.3 小程序审核注意事项如果计划上线小程序需要注意AI回复内容要有过滤机制避免敏感话题悬浮窗不能遮挡主要功能明确告知用户这是AI生成内容可以在发送到API前做内容检查function checkSensitiveWords(text) { const forbidden [敏感词1, 敏感词2]; // 实际应该更长 return !forbidden.some(word text.includes(word)); } // 在sendMessage中添加检查 if (!checkSensitiveWords(this.data.inputText)) { wx.showToast({ title: 包含不合适内容, icon: none }); return; }

相关文章:

微信小程序集成通义千问:打造悬浮窗智能对话助手

1. 为什么要在微信小程序里集成通义千问? 最近两年AI对话助手火得一塌糊涂,但大部分应用都是独立APP或者网页版。其实对于很多轻量级场景来说,直接在微信小程序里集成AI助手反而更实用。想象一下,当你在小程序里购物遇到问题时&am…...

终极指南:掌握Starlight文档导航自定义排序的7个高级技巧

终极指南:掌握Starlight文档导航自定义排序的7个高级技巧 【免费下载链接】starlight 🌟 Build beautiful, accessible, high-performance documentation websites with Astro 项目地址: https://gitcode.com/gh_mirrors/st/starlight Starlight是…...

Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37%

Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37% 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡RTX 4090环境深度优化。该工具通过一系列技术创新,显著提升…...

解锁Mac微信潜能:WeChatExtension全功能增强方案

解锁Mac微信潜能:WeChatExtension全功能增强方案 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 挖掘核心价值:突…...

MySQL误删数据别慌!手把手教你用binlog2sql从ROW格式日志恢复(附常见报错解决方案)

MySQL数据恢复实战:从误删到完美还原的完整指南 凌晨三点,当大多数人都沉浸在梦乡时,数据库管理员小李却被一阵急促的电话铃声惊醒。生产环境的核心用户表被误操作清空,数百万条用户数据瞬间消失。这种场景对于任何DBA来说都是噩梦…...

华为防火墙NAT(Easy-IP)实战:多区域安全访问控制与地址转换

1. 华为防火墙NAT(Easy-IP)技术解析 华为防火墙的NAT(Easy-IP)功能是企业网络架构中实现安全访问和地址转换的核心技术。简单来说,它就像是一个智能门卫,不仅负责检查进出人员的身份(安全策略),还能帮内部员工隐藏真实…...

如何用AI提升视频画质?Video2X全攻略:从技术原理到实践应用

如何用AI提升视频画质?Video2X全攻略:从技术原理到实践应用 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/…...

Open Interpreter连接LM Studio:双引擎部署实战教程

Open Interpreter连接LM Studio:双引擎部署实战教程 1. 开篇:为什么需要本地AI编程助手? 想象一下这样的场景:你手头有一个2GB的CSV数据文件需要分析处理,但云端AI工具有文件大小限制;或者你正在处理敏感…...

Vivado进阶指南:网表物理约束实战解析

1. 网表物理约束的核心价值 第一次接触Vivado的网表物理约束时,我和很多初学者一样困惑:明明RTL代码已经定义了所有功能,为什么还要多此一举?直到在某次高速ADC数据采集项目中,系统频繁出现时序违例,我才真…...

OptiScaler终极指南:打破DLSS垄断,让所有显卡都能享受AI超分辨率

OptiScaler终极指南:打破DLSS垄断,让所有显卡都能享受AI超分辨率 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler…...

Fish Speech 1.5在医疗健康领域的语音辅助应用

Fish Speech 1.5在医疗健康领域的语音辅助应用 1. 引言 在医疗健康领域,清晰准确的语音交流至关重要。医生需要向患者解释病情,护士要按时提醒用药,患者可能因为视力问题无法阅读病历资料。传统的文字信息在这些场景中往往显得不够直观和便…...

掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南

掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 为什么90%的小程序开发者都需要解包工具? 在小程序开发过程中,开发者…...

TradingView策略优化:基于机器学习的智能交易系统设计与实现

TradingView策略优化:基于机器学习的智能交易系统设计与实现 【免费下载链接】TradingView Start your trading journey with this projects advanced stop loss/take profit generator, enhancing your TradingView strategy. Utilize sklearns machine learning a…...

dry插件系统解析:如何扩展自定义Docker管理功能

dry插件系统解析:如何扩展自定义Docker管理功能 【免费下载链接】dry moncho/dry: dry(Docker Run Commands)是一款命令行工具,旨在简化对Docker容器的操作管理,提供了一种简洁的方式创建、启动、停止和删除Docker容器…...

实时数据处理实战:使用 Apache Flink 消费 Kafka 数据并进行窗口聚合

在大数据时代,实时处理流式数据已经成为企业级应用的标配。无论是用户行为分析、实时监控告警,还是金融风控系统,都离不开低延迟、高吞吐的流处理引擎。本文将带你从零开始,使用 Apache Flink 和 Kafka 构建一个完整的实时数据处理…...

告别模拟信号烦恼:手把手教你用51单片机驱动DAC0832输出正弦波(附Proteus仿真)

51单片机实战:用DAC0832打造完美正弦波发生器 在电子设计领域,能够精确生成模拟信号是一项基础却至关重要的技能。想象一下,当你亲手搭建的电路在示波器上显示出光滑的正弦波形时,那种成就感是无与伦比的。本文将带你从零开始&…...

Qwen3-TTS-VoiceDesign一文详解:speech_tokenizer作用机制与语音表征可视化

Qwen3-TTS-VoiceDesign一文详解:speech_tokenizer作用机制与语音表征可视化 1. 引言:从文字到声音的魔法转换 你有没有想过,为什么现在的AI语音合成听起来越来越像真人?为什么只需要用文字描述"温柔的成年女性声音"&a…...

Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略

Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略 1. 引言:语音识别服务的稳定性挑战 语音识别技术正在改变我们处理音频内容的方式,但在实际部署中,服务稳定性和格式兼容性常常成为绊脚石。Qwen3-ASR-1.7B作为阿里云通义千…...

Network Connection Class深度优化:10个提升网络检测精度的技巧

Network Connection Class深度优化:10个提升网络检测精度的技巧 【免费下载链接】network-connection-class Listen to current network traffic in the app and categorize the quality of the network. 项目地址: https://gitcode.com/gh_mirrors/ne/network-co…...

HiveSQL实战:巧用前后函数(lag/lead)解析用户行为序列

1. 窗口函数与用户行为分析的完美结合 做数据分析的朋友们应该都遇到过这样的场景:老板让你分析用户从浏览商品到最终下单的平均时间间隔,或者找出那些在关键页面停留时间过长的流失用户。这类问题本质上都是在分析用户行为序列,而HiveSQL中的…...

UniApp图片上传性能优化:从选图到上传的全流程提速方案

UniApp图片上传性能优化:从选图到上传的全流程提速方案 在移动应用开发中,图片上传功能几乎是社交、电商、内容创作类应用的标配功能。然而随着用户对体验要求的提高,简单的"选择-上传"模式已经难以满足性能敏感型场景的需求。特别…...

GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战

GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战 1. 认识MAI-UI-8B:你的GUI自动化助手 MAI-UI-8B是一款专为图形用户界面(GUI)操作设计的智能体,它能像人类一样"看"屏幕、"理解"界面元素并执行操作。想象一下&…...

dry容器管理实战:从创建、启动到停止删除的全流程操作

dry容器管理实战:从创建、启动到停止删除的全流程操作 【免费下载链接】dry moncho/dry: dry(Docker Run Commands)是一款命令行工具,旨在简化对Docker容器的操作管理,提供了一种简洁的方式创建、启动、停止和删除Dock…...

Photoshop AI绘画革命:3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南

Photoshop AI绘画革命:3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南 【免费下载链接】Auto-Photoshop-StableDiffusion-Plugin A user-friendly plug-in that makes it easy to generate stable diffusion images inside Photoshop using either Automa…...

VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点

VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点 每次上完CAD软件课,你是不是都有这样的感觉?老师演示了两个小时,鼠标点得飞快,步骤一个接一个。你录了屏,打算课后复习&#xff…...

Z-Image-GGUF实战:为Android应用集成AI头像生成功能

Z-Image-GGUF实战:为Android应用集成AI头像生成功能 最近在做一个社交类的Android应用,产品经理提了个需求,想加入一个“AI生成个性头像”的功能。用户上传一张自己的照片,选择喜欢的风格(比如动漫风、油画感、像素艺…...

OpenClaw配置备份指南:Qwen3-32B镜像环境迁移无忧方案

OpenClaw配置备份指南:Qwen3-32B镜像环境迁移无忧方案 1. 为什么需要备份OpenClaw环境 上周我的主力开发机RTX4090D突然显卡故障送修,导致所有OpenClaw自动化流程中断。最痛苦的不是硬件问题,而是重新配置Qwen3-32B镜像环境时,发…...

C# 工业级温度监控软件:支持多PLC通信与实时曲线绘制

前言工业自动化领域,温度监控是保障生产安全与产品质量的核心环节。面对多台设备分散、数据孤岛严重的现状,开发一套高效、可视化的上位机系统显得尤为重要。本文将详细介绍一款基于 WinForms 与 S7.Net 开发的温度监控系统。该系统不仅实现了对多台西门…...

深入解析FOC控制中的Clark/Park变换及其Matplotlib动态仿真实现

1. 从三相交流电到FOC控制的基础认知 第一次接触电机控制时,看到那些复杂的坐标变换公式确实让人头疼。但后来我发现,理解FOC(磁场定向控制)的核心,关键在于抓住两个关键点:为什么要做坐标变换和变换后能解…...

3个核心维度解析iOS数据取证:iLEAPP从入门到精通

3个核心维度解析iOS数据取证:iLEAPP从入门到精通 【免费下载链接】iLEAPP iOS Logs, Events, And Plist Parser 项目地址: https://gitcode.com/gh_mirrors/il/iLEAPP 一、核心价值:iOS数据解析的全能工具 iLEAPP(iOS Logs, Events, …...