北京网站定制流程网页版微信登录入口官网

news/2025/9/23 19:27:36/文章来源:
北京网站定制流程,网页版微信登录入口官网,中国工程预算网,网站种类有哪些AI 对话【人工智能】 前言版权开源推荐AI 对话v0版本#xff1a;基础v1版本#xff1a;对话数据表tag.jsTagController v2版本#xff1a;回复中textarea.jsChatController v3版本#xff1a;流式输出chatLast.jsChatController v4版本#xff1a;多轮对话QianfanUtilChat… AI 对话【人工智能】 前言版权开源推荐AI 对话v0版本基础v1版本对话数据表tag.jsTagController v2版本回复中textarea.jsChatController v3版本流式输出chatLast.jsChatController v4版本多轮对话QianfanUtilChatController v5其他修改前端样式跳转到最后一个消息前端样式Message保留空白符前端样式最新回复保留空白符 最后 前言 2024-4-7 15:04:07 以下内容源自《【人工智能】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss-1.blog.csdn.net 禁止其他平台发布时删除以上此话 开源 日星月云 / AI对话完善版 jsss-1/aichat 推荐 百度智能云SpringBootAI对话【人工智能】 对话Chat-千帆大模型平台 AI 对话 以下版本除了最简单的AI对话还完善了一下功能。 以下是部分代码完整代码请移步GIT。 v0版本基础 聊天 v1版本对话 新建新对话 可以置顶取消置顶、删除、修改对应的对话 数据表 create table tag (id int auto_incrementprimary key,user_id int not null,tag_name varchar(16) not null,top int default 0 null );create table conversation (id int auto_incrementprimary key,tag_id int null,user_message text null,bot_message text null,create_time varchar(32) null,username varchar(16) null ); tag.js $(document).ready(function () {tagList();$(#editBlock).hide();$(.add-button).on(click, function() {addTag();});});function tagSearch(data) {var data$(#search-input).val();if(!data){//没有数据搜索全部tagList();return false;}$.ajax({type: GET,url: SERVER_PATH /tag/search,data: {data: data},xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}set_tags(result.data);}}); }function addTag() {$.ajax({type: POST,url: SERVER_PATH /tag/addTag,xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}tagList();}}); }function tagList() {$.ajax({type: GET,url: SERVER_PATH /tag/tagList,xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}set_tags(result.data);}}); }function set_tags(tags) {if (!tags) {return false;}$(.tag-list).empty();$.each(tags, function (i, tag) {var btnClass tag.top 0 ? top-btn : notop-btn;var topClass tag.top 0 ? ptTag : topTag;var tagDiv div classtagimg classtag-btn ${topClass}/imgspan classshow-btn data-id${tag.id}${tag.tagName}/spandiv classbutton-groupimg classicon-btn ${btnClass} data-id${tag.id}/imgimg classicon-btn modify-btn data-id${tag.id} data-name${tag.tagName}/imgimg classicon-btn delete-btn data-id${tag.id}/img/div/div;$(.tag-list).append(tagDiv);});$(.show-btn).on(click, function() {var tagId $(this).data(id);window.location.hrefaichat.html?tagIdtagId;});$(.notop-btn).on(click, function() {var tagId $(this).data(id);var newTop0;topTag(tagId,newTop);});$(.top-btn).on(click, function() {var tagId $(this).data(id);var newToptop1;topTag(tagId,newTop);});$(.modify-btn).on(click, function() {var tagId $(this).data(id);var tagName $(this).data(name); // 获取标签名称// 将标签名称填充到输入框中$(#newName).val(tagName);// 显示编辑界面块$(#editBlock).show();// 保存按钮点击事件$(#saveBtn).off(click).on(click, function() {var newName $(#newName).val();if(!newName){alertBox(请输入新名字);return false;}modify(tagId,newName);// 关闭编辑界面块$(#editBlock).hide();});$(#cancelBtn).on(click, function() {$(#editBlock).hide();});});$(.delete-btn).on(click, function() {var tagId $(this).data(id);// 弹出确认删除的提示框var confirmDelete confirm(确定要删除这个标签吗);// 如果用户点击确定删除则执行删除操作if (confirmDelete) {deleteTag(tagId);} });}function topTag(tagId,newTop){$.ajax({type: POST,url: SERVER_PATH /tag/top,data: {tagId: tagId,top: newTop},xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}tagList();}}); }function modify(tagId,newName){$.ajax({type: POST,url: SERVER_PATH /tag/modify,data: {tagId: tagId,tagName: newName},xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}tagList();}}); }function deleteTag(tagId){$.ajax({type: GET,url: SERVER_PATH /tag/delete,data: {tagId: tagId},xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}tagList();}}); } TagController package com.jsss.qianfan.controller;import com.jsss.common.BusinessException; import com.jsss.common.ErrorCode; import com.jsss.common.ResponseModel; import com.jsss.entity.User; import com.jsss.qianfan.entity.Tag; import com.jsss.qianfan.service.TagService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*;import java.util.List;RestController RequestMapping(tag) CrossOrigin(origins ${jsss.web.path}, allowedHeaders *, allowCredentials true) public class TagController implements ErrorCode {AutowiredRedisTemplate redisTemplate;AutowiredTagService tagService;GetMapping(/tagList)public ResponseModel getTags(String token) {User user null;if (StringUtils.isNotEmpty(token)) {user (User) redisTemplate.opsForValue().get(token);}if (user null) {throw new BusinessException(USER_NOT_LOGIN, 用户未登录);}ListTag tags tagService.searchByUserId(user.getUserId());return new ResponseModel(tags);}PostMapping(/addTag)public ResponseModel addTag(String token) {User user null;if (StringUtils.isNotEmpty(token)) {user (User) redisTemplate.opsForValue().get(token);}if (user null) {throw new BusinessException(USER_NOT_LOGIN, 用户未登录);}String tagName 新对话;Tag tag new Tag(null, user.getUserId(), tagName, 0);tagService.addTag(tag);return new ResponseModel(添加成功);}PostMapping(/modify)public ResponseModel modifyTag(Integer tagId, String tagName) {if (StringUtils.isEmpty(tagName)){throw new BusinessException(PARAMETER_ERROR, 缺失新的tag名);}tagService.updateTagName(tagId, tagName);return new ResponseModel(修改成功);}PostMapping(/top)public ResponseModel topTag(Integer tagId, Integer top) {tagService.updateTagTop(tagId, top);String res top 1 ? 置顶成功 : 取消置顶成功;return new ResponseModel(res);}GetMapping(/delete)public ResponseModel deleteTag(Integer tagId) {tagService.deleteTag(tagId);return new ResponseModel(删除成功);}GetMapping(/search)public ResponseModel searchTag(String token, String data) {User user null;if (StringUtils.isNotEmpty(token)) {user (User) redisTemplate.opsForValue().get(token);}if (user null) {throw new BusinessException(USER_NOT_LOGIN, 用户未登录);}ListTag tags tagService.searchTag(user.getUserId(),data);return new ResponseModel(tags);}} v2版本回复中 用户发送问题之后显示回复中得到回复后显示。 前端发送请求之后先会得到“回复中” 之后去轮询获取最新回复。 后端接受请求之后先存入到数据库中一个未回复请求。 然后异步得到回复之后再去更新数据库。 textarea.js var textarea document.getElementById(messageInput);var isSendingMessage false; // 添加一个变量用于标识是否正在发送消息textarea.addEventListener(keydown, function(event) {if (event.key Enter !event.shiftKey) {event.preventDefault();if (isSendingMessage) {// 如果正在发送消息则在文本框中添加换行符textarea.value \n;} else{var message textarea.value.trim();textarea.value ;if(!message){alertBox(输入内容不能为空);return false;}var tagId$.getUrlParam(tagId);;if(!tagId){alertBox(没有对应的参数);return false;}isSendingMessage true; // 设置为true表示正在发送消息$.ajax({type: POST,url: SERVER_PATH/chat/chat,data:{tagId: tagId,content:message},xhrFields: {withCredentials: true},success:function(result){isSendingMessage false; // 发送完成后设置为falseif (result.status) {alertBox(result.data.message);return false;}//请求成功之后list(tagId);getChat(result.data.id);}});}} });textarea.addEventListener(keydown, function(event) {if (event.key Enter event.shiftKey) {// 在 ShiftEnter 情况下允许换行textarea.value \n;event.preventDefault();} });function getChat(chatId){var tagId$.getUrlParam(tagId);;$.ajax({type: GET,url: SERVER_PATH/chat/getChat,data:{id: chatId,},xhrFields: {withCredentials: true},success:function(result){isSendingMessage false; // 发送完成后设置为falseif (result.status) {alertBox(result.data.message);return false;}if (result.data.botMessage 回复中...) {// 继续轮询100ms 一次setTimeout(function() {getChat(chatId);}, 100);} else {// 获取到最终回复// 处理回复逻辑list(tagId);}}}); } ChatController PostMapping(/chat)public ResponseModel chat(Integer tagId,String content){if (tagIdnull){throw new BusinessException(PARAMETER_ERROR,没有指定响应的tag);}if (StringUtils.isEmpty(content)){throw new BusinessException(PARAMETER_ERROR,输入内容不能为空);}Tag tag tagService.searchById(tagId);if (tagnull){throw new BusinessException(NOT_FIND,没有找到对应的对话);}String usernameuserService.selectUserById(tag.getUserId()).getUsername();Conversation conversation new Conversation(null, tagId,username, content, 回复中..., format(new Date()));chatService.addChat(conversation);// 异步处理AI回复CompletableFuture.runAsync(() - {Integer idconversation.getId();String res null;try {res qianfanUtil.addMessage(content);} catch (Exception e) {res 回复失败;}Conversation aiConversation new Conversation();aiConversation.setId(id);aiConversation.setBotMessage(res);chatService.updateChat(aiConversation);});return new ResponseModel(conversation);} v3版本流式输出 流式输出终止生成。 前端实现让消息一个字符一个字符显示 chatLast.js var lastId; var interval;$(document).ready(function () {$(#stopButton).on(click, function() {var latestReply $(.latest-reply);var latestReplyText latestReply.text();clearInterval(interval); // 停止字符流输出$(#stopButton).hide();updateStop(lastId,latestReplyText);});});function listLastReply(tagId) {$.ajax({type: GET,url: SERVER_PATH /chat/list,data: {tagId: tagId},xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}set_conversations_last(result.data);}}); }function set_conversations_last(conversations) {if (!conversations) {return false;}$(.conversation-list).empty();var lenconversations.length;$.each(conversations, function (i, conversation) {var questionDiv div classquestion-container table classquestion td span conversation.createTime /span div classuser-message conversation.userMessage /div /td td typetext conversation.username /td /table /div;var answerDiv div classanswer-container table classanswer td typetextAI/td td span conversation.createTime /span div classbot-message conversation.botMessage /div /td /table /div;if(i!len-1){$(.conversation-list).append(questionDiv);$(.conversation-list).append(answerDiv);}});// 获取最新对话的回复var lastConversation conversations[len - 1];lastIdlastConversation.id;var questionDiv div classquestion-container table classquestion td span lastConversation.createTime /span div classuser-message lastConversation.userMessage /div /td td typetext lastConversation.username /td /table /div;$(.conversation-list).append(questionDiv);var answerDiv div classanswer-container table classanswer td typetextAI/td td span lastConversation.createTime /span div classbot-message latest-reply lastConversation.botMessage /div /td /table /div;$(.conversation-list).append(answerDiv);// 逐字显示最新回复var latestReply $(.latest-reply);var latestReplyText latestReply.text();latestReply.empty();var index 0;interval setInterval(function() {if (index latestReplyText.length) {$(#stopButton).show();latestReply.append(latestReplyText.charAt(index));index;} else {clearInterval(interval);$(#stopButton).hide();}}, 10); // 逐字显示的速度您可以根据需要调整}function updateStop(tagId,message){$.ajax({type: POST,url: SERVER_PATH /chat/updateStop,data: {id: tagId,botMessage: message},xhrFields: {withCredentials: true},success: function (result) {if (result.status) {alertBox(result.data.message);return false;}}}); }ChatController PostMapping(/updateStop)public ResponseModel updateStop(Integer id,String botMessage){Conversation conversationnew Conversation();conversation.setId(id);conversation.setBotMessage(botMessage);chatService.updateChat(conversation);return new ResponseModel();}v4版本多轮对话 实现上下文有关的对话 多次调用qianfan.addMessage().addMessage() QianfanUtil public String addMessagePlus(ListMessage messages, String content) {ChatResponse response qianfan.chatCompletion().messages(messages).addMessage(user, content).temperature(0.7).execute();return response.getResult();}ChatController PostMapping(/chat)public ResponseModel chat(Integer tagId, String content) {if (tagId null) {throw new BusinessException(PARAMETER_ERROR, 没有指定响应的tag);}if (StringUtils.isEmpty(content)) {throw new BusinessException(PARAMETER_ERROR, 输入内容不能为空);}Tag tag tagService.searchById(tagId);if (tag null) {throw new BusinessException(NOT_FIND, 没有找到对应的对话);}String username userService.selectUserById(tag.getUserId()).getUsername();Conversation conversation new Conversation(null, tagId, username, content, 回复中..., format(new Date()));chatService.addChat(conversation);// 异步处理AI回复CompletableFuture.runAsync(() - {Integer id conversation.getId();String res null;try { // res qianfanUtil.addMessage(content);res qianfanUtil.addMessagePlus(getMessages(tagId), content);} catch (Exception e) {res 回复失败;}Conversation aiConversation new Conversation();aiConversation.setId(id);aiConversation.setBotMessage(res);chatService.updateChat(aiConversation);});return new ResponseModel(conversation);}public ListMessage getMessages(Integer tagId) {ListMessage messages new ArrayList();ListConversation conversations chatService.searchByTagId(tagId);int size conversations.size() - 1;//最新的不需要for (int i 0; i size; i) {Conversation conversation conversations.get(i);Message userMessage new Message();userMessage.setRole(user);userMessage.setContent(conversation.getUserMessage());messages.add(userMessage);Message botMessage new Message();botMessage.setRole(assistant);botMessage.setContent(conversation.getBotMessage());messages.add(botMessage);}return messages;} v5其他修改 前端样式跳转到最后一个消息 在aichat.html中 scriptfunction scrollToLastMessage() {// 找到消息容器var messageContainer document.querySelector(.message-container);// 找到消息容器中最后一个子元素var lastMessage messageContainer.lastElementChild;// 将最后一个消息元素滚动到可见区域lastMessage.scrollIntoView({ behavior: auto, block: end });}function onLoad() {setTimeout(scrollToLastMessage, 100); // 添加100毫秒的延迟}window.addEventListener(load, onLoad);/script前端样式Message保留空白符 savePre(conversation.userMessage) savePre(conversation.botMessage)function savePre(content){return content.replace(/\n/g, br).replace(/ /g, spannbsp;/span); }前端样式最新回复保留空白符 var botMessageWithBrAndSpace lastConversation.botMessage.replace(/\n/g, \\n);var answerDiv div classanswer-container table classanswer td typetextAI/td td span lastConversation.createTime /span div classbot-message latest-reply botMessageWithBrAndSpace /div /td /table /div;$(.conversation-list).append(answerDiv);// 逐字显示最新回复var latestReply $(.latest-reply);var latestReplyText botMessageWithBrAndSpace;latestReply.empty();var index 0;interval setInterval(function() {if (index latestReplyText.length) {$(#stopButton).show();if (latestReplyText.charAt(index) \\) {if (latestReplyText.charAt(index 1) n) {latestReply.append(br);index; // 跳过n} else {latestReply.append(latestReplyText.charAt(index));}} else if(latestReplyText.charAt(index) ){latestReply.append(nbsp;);}else {latestReply.append(latestReplyText.charAt(index));}index;} else {clearInterval(interval);$(#stopButton).hide();}}, 25); // 逐字显示的速度您可以根据需要调整} 最后 2024-4-10 17:02:49 迎着日光月光星光直面风霜雨霜雪霜。

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

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

相关文章

个人对软件工程的理解

我认为,软件工程的概念可以拆分为以下六个方面: 1. 系统化开发 系统化开发强调在软件开发过程中采用科学的方法和结构化流程,而不是随意编写代码。它要求开发团队按照从需求分析到设计、实现、测试、部署和维护的完…

9/23

今天进行了工程实训,学习了与机械臂,3D打印有关的计算机相关知识。

数组入门:从零基础到排序算法 - 教程

数组入门:从零基础到排序算法 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

国家摄影网站广州谷歌推广

欢迎来到MindGraph,这是一个概念验证、开源的、以API为先的基于图形的项目,旨在通过自然语言的交互(输入和输出)来构建和定制CRM解决方案。该原型旨在便于集成和扩展。以下是关于X的公告,提供更多背景信息。开始之前&a…

server2008 做网站最牛的科技网站建设

我们在使用电脑浏览网页的时候有可能会想截取整篇网页,由于页面在电脑上显示不全,阅读的时候都需要滚动条来看,直接截屏根本截不全整个网页,这时候就需要截取网页的长截图了,那么怎么使用浏览器截长图呢? 1、以Edge浏…

河南网站seo推广湖南网站建设方案优化

PHP版本的AI电话机器人系统具有以下优势: 提升客户体验:AI电话机器人能够为客户提供724小时的服务,无论何时客户有疑问或需要帮助,都可以得到及时响应1。 提高工作效率和客户满意度:AI电话机器人系统具有智能回答问题…

织梦网站模板套用做铝板的网站

在做性能测试过程中有一件很重要的事情需要去完成,那就是分析性能指标数据,可以这样说做性能测试的整个过程都跟指标数据息息相关,下面来说一下常见的一些性能指标数据: 1.吞吐量 2.并发数 3.思考时间 4.响应时间 5.点击数 …

h5 响应式手机网站网络推广应该怎么做啊

全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦&#xff0c;欢迎大家点赞转发~ 全套教程部分目录&#xff1a; 部分文件图片&#xff1a; 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API vue <script> ex…

网站建设案例渠道微信推广营销

调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。…

汉源网站建设网站的经典推广方法

1、oracle导出dmp文件的时候&#xff0c;经常会出现一些空表&#xff0c;没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口&#xff0c;把查询结果的sql&#…

用C/C++重构PowerShell:全面绕过安全机制的技术解析

本文详细介绍了如何通过C/C++原生代码实例化完整的PowerShell控制台,并系统性地绕过AMSI、脚本日志记录、转录功能、执行策略和约束语言模式等安全机制。文章包含具体的技术实现代码和内存补丁方法,展示了从CLR初始化…

珠江网站建设学风网站建设

目录 盒子模型块级盒子内联级盒子内联块级盒子弹性盒子display 改变模型区域划分text 内容区padding 填充区border 边框区margin 外边距直接设置盒子大小 布局横向布局方法一 float 浮起来方法二 内联块级元素实现方法三 弹性盒子模型 盒子模型 块级盒子 独占一行&#xff0c…

Optuna v4.5新特性深度解析:GPSampler实现约束多目标优化

Optuna在8月18日发布了最近的 v4.5版,加入了GPSampler的约束多目标优化功能,我们来看看这个新的功能。 基于高斯过程的贝叶斯优化(GPBO)最近几年在材料科学、机器学习等领域应用很广。GPSampler最初设计时就想做一…

题解:P4769 [NOI2018] 冒泡排序

题意:定义一个排列是好的,当且仅当可以通过 \(\frac 1 2\sum_{i=1}^n|i-p_i|\) 次对相邻两个数的交换使得整个排列变成 \(1,2,\cdots n\)。给出一个排列 \(q\),求有多少个排列 \(p\) 满足他是好的且字典序大于 \(q\…

电商网站零售客户丰县建设局规划局网站

目录 安装Pyecharts 安装对应的地图拓展&#xff1a; 准备数据 使用 pyecharts 模块中的 Geo 函数&#xff1a; 使用 pyecharts 模块中的 map 函数&#xff1a; 把一些地域性比较明显的数据显示在一张地图上&#xff0c;远比给别人一个 Excel 文件好得多。 Matplotlib 中…

做宣传图片用什么网站阿里巴巴网站建设的背景

1. 简介 介绍 Kafka 的概述、优势和劣势&#xff0c;以及应用场景。 2. 基本概念 2.1 架构 一个典型的 Kafka 体系架构包括若干 Producer、若干Broker、若干 Consumer&#xff0c;以及一个ZooKeeper集群。 ZooKeeper是Kafka用来负责集群元数据的管理、控制器的选举等操作的…

懒人学做网站箱包网站建设策划报告

本文播放器家园网给大家整理了如何禁止爱奇艺视频方面的内容。爱奇艺pc端和手机端都支持通过频道推荐、观看历史、加入看单、搜索功能快速找到想看的视频。 WFilter有自带的常用协议特征库&#xff0c;可以通过禁止“爱奇艺视频”的协议来禁止爱奇艺视频。步骤如下 1、1.打开…

网站域名有了_网站如何建设建设淘宝网站的意义

利用共享缓存和操作系统缓存利用 RAM Postgres 是一个基于磁盘的数据库&#xff0c;即使您的整个架构是围绕磁盘访问设计的&#xff0c;利用 RAM 也很重要。如果按照人类规模的延迟来判断&#xff0c;这可以将延迟从几天缩短到几分钟&#xff08;图 1&#xff09;。只需看一下…

长沙网站建设接单WordPress广告防屏蔽

打开apache-tomcat-6.0.32/bing/catalina.bat在首行添加&#xff1a; set JAVA_HOMEC:\Program Files\Java\jdk1.6.0_07 就可以了。