一、vue智能Ai对话(高仿通义千问)普通版。

如需源码:请私信。

普通版视频地址:普通版视频

流式进阶版视频地址:流式进阶版视频

流式进阶版:流式进阶版源码

html结构和js方法:

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>研发工具</title><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css"><script src="https://unpkg.com/element-plus"></script><script src="https://unpkg.com/@element-plus/icons-vue"></script><link rel="stylesheet" href="common.css">
</head><body><div id="app"><div class="chat-container"><el-container style="height: 100%"><el-aside width="80px" class="nav-sidebar"><el-icon style="font-size: 30px"><chat-dot-square /></el-icon><div style="font-size: 12px">对话</div></el-aside><el-main class="main-wrapper"><el-card style="height: 100%"><el-container class="chat-wrapper"><el-aside class="chat-sidebar" width="250px"><div class="sidebar-header"><el-button style="width: 80%" :disabled="isDisabled" type="primary" round @click="createNewChat"><el-icon><plus /></el-icon><span>新建对话</span></el-button></div><div class="chat-list"><el-button :disabled="isDisabled" class="chat-item":class="{ 'chat-item-active': item.chatId == this.currentChatId }" v-for="item in chatHistory":key="item.value" @click="switchChat(item.chatId)"><span class="chat-title-text">{{ item.value }}</span></el-button></div></el-aside><el-container><el-main class="message-container"><el-scrollbar ref="messageScrollbar"><div v-for="item in messageList" :key="item.value"><div v-if="item.show" class="message-user"><pre class="message-content">{{ item.value }}</pre><el-icon class="user-avatar"><avatar /></el-icon></div><div v-if="!item.show" class="message-bot"><img src="./img/home.png" /><pre class="message-content">{{ item.value }}</pre></div></div></el-scrollbar></el-main><el-footer class="chat-footer"><el-input style="width: 50%" v-model="userInput" placeholder="请输入聊天内容" @keyup.enter="sendMessage"><template #suffix><el-icon @click="sendMessage" style="cursor: pointer"><promotion /></el-icon></template></el-input></el-footer></el-container></el-container></el-card></el-main></el-container></div></div><script>const App = {// 定义响应式数据data () {return {// 控制按钮禁用状态isDisabled: false,// 消息计数器messageCount: 1,// 当前聊天会话IDcurrentChatId: 1,// 用户输入内容userInput: '',// 聊天历史记录chatHistory: [],// 所有消息记录allMessages: [],// 当前会话消息列表messageList: [],};},// 监听消息列表变化watch: {messageList: {immediate: true,deep: true,// 消息列表变化时滚动到底部handler () {this.$nextTick(() => {this.scrollToBottom();});},},},// 组件挂载完成时加载历史记录mounted () {this.loadChatHistory();},methods: {// 切换聊天会话switchChat (chatId) {// 设置当前聊天会话IDthis.currentChatId = chatId;// 过滤出当前聊天会话的消息this.messageList = this.allMessages.filter(item => item.chatId == chatId);},// 创建新的聊天会话createNewChat () {// 重置消息计数器this.messageCount = 1;// 增加当前聊天会话IDthis.currentChatId = this.currentChatId + 1;// 清空当前会话消息列表this.messageList = [];},// 加载聊天历史记录loadChatHistory () {// 将当前会话消息列表添加到所有消息记录this.allMessages.push(...this.messageList);// 恢复按钮禁用状态this.isDisabled = false;},// 发送消息async sendMessage () {this.isDisabled = true;if (this.userInput.trim()) {// 创建用户消息对象let message = {type: 'user',value: this.userInput,show: true,chatId: this.currentChatId,messageId: this.messageCount,};// 添加用户消息到列表this.messageList.push(message);// 创建机器人响应消息const botResponse = {type: 'bot',value: '正在思考....',show: false,chatId: this.currentChatId};// 添加机器人响应到列表this.messageList.push(botResponse);// 如果是新会话的第一条消息,添加到历史记录if (message.messageId == 1) {this.chatHistory.push(message);// 倒序this.chatHistory.reverse();}// 更新消息计数器this.messageCount = this.messageCount + 1;// 清空输入框this.userInput = '';// 获取机器人响应消息的索引const responseIndex = this.messageList.length - 1;// 模拟响应延迟setTimeout(() => {// 如果机器人响应消息是“正在思考....”,则替换为“抱歉,我没有获取到正确的回复”if (this.messageList[responseIndex].value === '正在思考....') {this.messageList[responseIndex].value = '抱歉,我没有获取到正确的回复';}// 恢复按钮禁用状态this.isDisabled = false;}, 2000)} else {this.$message.warning('输入不能为空');}},// 滚动到消息列表底部scrollToBottom () {this.$nextTick(() => {// 获取消息列表的滚动条 const scrollbar = this.$refs.messageScrollbar;if (scrollbar) {// 获取滚动条的容器const wrapEl = scrollbar.wrapRef;// 滚动到容器底部wrapEl.scrollTop = wrapEl.scrollHeight;}});},},};// 创建Vue应用实例const app = Vue.createApp(App);// 使用Element Plusapp.use(ElementPlus);// 注册图标组件app.component('chat-dot-square', ElementPlusIconsVue.ChatDotSquare);app.component('plus', ElementPlusIconsVue.Plus);app.component('promotion', ElementPlusIconsVue.Promotion);app.component('avatar', ElementPlusIconsVue.Avatar);// 挂载应用app.mount("#app");</script>
</body></html>

css文件:

* {margin: 0;padding: 0;box-sizing: border-box;
}body {background: #f5f5f5;font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
}.chat-container {box-sizing: border-box;width: 100%;height: 100vh;background-image: url(./img/bag.jpg), linear-gradient(105deg, rgb(97, 92, 237) 7%, rgb(213, 220, 255) 66%);background-position: left center;background-size: cover;background-repeat: no-repeat;
}.chat-container .chat-footer .el-input__wrapper {box-sizing: border-box;height: 80px;border-radius: 20px;
}.chat-container .main-wrapper .el-card__body {height: 100%;padding: 0 !important;
}.chat-container .el-card {border-radius: 12px;position: relative;
}.chat-container .el-footer {min-height: 100px !important;
}.chat-container .el-button+.el-button {margin: 10px 0 0 0 !important;
}.nav-sidebar {box-sizing: border-box;padding: 20px;color: #fff;font-size: 18px;text-align: center;height: 100%;
}.chat-footer {box-sizing: border-box;display: flex;align-items: flex-start;justify-content: center;background-color: rgba(97, 92, 237, 0.1);
}.main-wrapper {box-sizing: border-box;height: 100%;padding: 15px !important;
}.chat-wrapper {height: 100%;
}.chat-sidebar {height: 100%;
}.message-container {background-color: rgba(97, 92, 237, 0.1);height: 100%;display: flex;justify-content: center;
}.message-container .el-scrollbar {width: 70%;
}.message-content {margin: 0 !important;box-sizing: border-box;display: inline-block;background: #fff;padding: 15px;border-radius: 10px;
}.user-avatar {width: 40px !important;height: 40px !important;margin-left: 10px;display: block;font-size: 30px;border-radius: 30px;background: rgba(97, 92, 237, 0.5);padding: 5px;color: #fff;
}.message-user {padding: 15px;display: flex;justify-content: end;
}.message-bot {display: flex;padding: 15px;justify-content: start;
}.message-bot img {width: 40px;height: 40px;margin-right: 10px;
}.sidebar-header {box-sizing: border-box;background: #fff;position: absolute;top: 0;left: 0;width: 250px;padding: 15px;text-align: center;z-index: 100;
}.chat-list {padding: 0 15px 15px 15px;margin-top: 70px;
}.chat-item {box-sizing: border-box;position: relative;width: 100%;height: 36px;justify-content: flex-start;border-radius: 12px;border: 1px solid #fff;font-weight: 400;
}.chat-item:hover {background-color: #f3f2ff;color: #615ced;
}.chat-item-active {border-radius: 30px;background-color: #f3f2ff;color: #615ced;
}.chat-title-text {display: inline-block;max-width: 180px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;
}

图片1:

图片2:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5186.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…

【winRAR】windows11右键直接打开winRAR

总览 目前能够完成的操作不能像 win10 那样全面&#xff0c;需要做一些取舍&#xff0c;这两种解决后的样子任选其一&#xff1a; 1.右键之后&#xff0c;直接显示 “解压到当前文件夹” 2.右键之后&#xff0c;直接出现 winRAR 的母菜单&#xff0c;在鼠标 hover 到上面的时…

云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?

引言 在近日举办的一场「云和恩墨大讲堂」直播栏目中&#xff0c;云和恩墨联合创始人李轶楠、副总经理熊军和欧冶云商数据库首席薛晓刚共同探讨了DBA的现状与未来发展。三位专家从云计算、人工智能、国产化替代等多个角度进行了深入的分析和探讨&#xff0c;为从业者提供了宝贵…

STM32 FreeRTOS 任务挂起和恢复---实验

实验目标 学会vTaskSuspend( )、vTaskResume( ) 任务挂起与恢复相关API函数使用&#xff1a; start_task:用来创建其他的三个任务。 task1&#xff1a;实现LED1每500ms闪烁一次。 task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键按下逻辑&#xff0c;KE…

2025年PHP面试宝典,技术总结。

面试是进入职场的第一道坎&#xff0c;因为我本身学校太一般的问题在面试中遇到了各种不爽&#xff0c;和那些高学历的相比自己真是信心大跌。我面试的方向是php开发工程师&#xff0c;主要做网站后台、APP接口等。下面是我这段时间总结的面试方面的常考常问的知识点&#xff0…

Python运算符

1、算术运算符 加 减— 乘* 除/ 整除// 取余% 幂运算** 优先级&#xff1a; 第1级&#xff1a;** 第2级&#xff1a;* &#xff0c; / &#xff0c; % &#xff0c;// 第3级&#xff1b; &#xff0c; - print("加", 1 4) print("减",8 - 19) p…

RTMP|RTSP播放器只解码视频关键帧功能探讨

技术背景 我们在做RTMP|RTSP直播播放器的时候&#xff0c;遇到过这样的技术诉求&#xff0c;在一些特定的应用场景中&#xff0c;可能只需要关键帧的信息&#xff0c;例如视频内容分析系统&#xff0c;可能只对关键帧进行分析&#xff0c;以提取特征、检测对象或场景变化。鉴于…

2024年度总结-CSDN

2024年CSDN年度总结 Author&#xff1a;OnceDay Date&#xff1a;2025年1月21日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 文章目录 2024年CSDN年度总结1. 整体回顾2…

【Node.js]

一、概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 &#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c; 让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。 官网地…

【基于无线电的数据通信链】Link 11 仿真测试

〇、废话 Link 11 仿真测试 涉及多个方面&#xff0c;包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF&#xff08;高频&#xff09; 或 UHF&#xff08;超高频&#xff09; 波段的无线通信协议&#xff0c;主要用于军事通信系统中。为了…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中&#xff0c;网络请求是常见且致其重要的功能之一。从获取资料到上传数据&#xff0c;出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架&#xff0c;提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

分布式多卡训练(DDP)踩坑

多卡训练最近在跑yolov10版本的RT-DETR&#xff0c;用来进行目标检测。 单卡训练语句&#xff08;正常运行&#xff09;&#xff1a; python main.py多卡训练语句&#xff1a; 需要通过torch.distributed.launch来启动&#xff0c;一般是单节点&#xff0c;其中CUDA_VISIBLE…

RV1126+FFMPEG推流项目(8)AENC音频编码模块

本节分享的是AENC音频编码模块&#xff0c;是负责在AI模块通道里面取出收集到的音频数据&#xff0c;进行编码。了解AENC模块之前&#xff0c;先来看一个数据结构“RV1126_AENC_CONFIG”&#xff0c;这个数据结构是自己封装的&#xff0c;里面有AENC通道号&#xff0c;和内部描…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技宣布推出新一代基础模型Amazon Nova&#xff0c;其隶属于Amazon Bedrock&#xff0c;这些模型精准切入不同领域&#xff0c;解锁多元业务可能&#xff0c;为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

【Prometheus】PromQL进阶用法

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

C++《AVL树》

在之前的学习当中我们已经了解了二叉搜索树&#xff0c;并且我们知道二叉搜索树的查找效率是无法满足我们的要求&#xff0c;当二叉树为左或者右斜树查找的效率就很低下了&#xff0c;那么这本篇当中我们就要来学习对二叉搜索树进行优化的二叉树——AVL树。在此会先来了解AVL树…

微信小程序:实现单选,多选,通过变量控制单选/多选

一、实现单选功能 微信小程序提供了 radio 组件来实现单选功能。radio 组件需要配合 radio-group 使用。 1. WXML 代码 <radio-group bindchange"onRadioChange"><label wx:for"{{items}}" wx:key"id"><radio value"{{it…

《Effective Java》学习笔记——第1部分 创建对象和销毁对象的最佳实践

文章目录 第1部分 创建和销毁对象一、前言二、创建和销毁对象最佳实践内容1. 优先使用工厂方法而非直接使用构造器2. 避免创建不必要的对象3. 避免使用过多的构造器4. 避免使用原始类型&#xff08;Raw Types&#xff09;5. 避免创建对象的过度依赖6. 清理资源和关闭对象&#…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境&#xff0c;但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢&#xff0c;因为容器和宿主机共享网络了&#xff0c;宿主机…

【知识分享】PCIe5.0 TxRx 电气设计参数汇总

目录 0 引言 1 参考时钟--Refclk 2 发射端通道设计 3 发送均衡技术 4 接收端通道设计 5 接收均衡技术 6 结语 7 参考文献 8 扩展阅读 0 引言 PCI Express Base Specification 5.0的电气规范中&#xff0c;关键技术要点如下&#xff1a; 1. 支持2.5、5.0、8.0、16.0和3…