Spring boot +React集成ChatGPT 智能AI

在这里插入代码片import {Button, Input, Radio,Alert,Modal  } from 'antd';
import Marquee from 'react-fast-marquee';
import {ChromeOutlined,WifiOutlined,AimOutlined } from '@ant-design/icons';
import React, {useEffect, useState, useRef} from 'react';
import chatgptPng from '../../static/icon/chatgpt.png'
import meJpg from '../../static/icon/me.jpg'
import './openai.css'
import {sendMsgApi} from "../../services/openai/openaiService";export default function OpenAi() {const [isButtonDisabled, setIsButtonDisabled] = useState(false);const [countdown, setCountdown] = useState(20);const containerRef = useRef(null);const [inputValue, setInputValue] = useState('');const [value, setValue] = useState(1);const [imgUrl, setImgUrl] = useState("");// 聊天数据const [chatList, setChatList] = useState([{headImg: require('../../static/icon/chatgpt.png'),name: 'ChatGPT',time: new Date().toLocaleTimeString(),msg: ' 您好,诗绣智能AI助手为您服务。',chatType: 0,uid: '1002',type: 1}])const [isModalOpen, setIsModalOpen] = useState(false);const showModal = (url) => {setImgUrl("")setImgUrl(url)setIsModalOpen(true);};const handleOk = () => {setIsModalOpen(false);};const handleCancel = () => {setIsModalOpen(false);};const onChange = (e) => {setValue(e.target.value);};useEffect(() => {if (isButtonDisabled) {const timer = setInterval(() => {setCountdown(prevCountdown => prevCountdown - 1);}, 1000);setTimeout(() => {setIsButtonDisabled(false);setCountdown(20);clearInterval(timer);}, 20000);return () => {clearInterval(timer);};}}, [isButtonDisabled]);const handleInputChange = (event) => {setInputValue(event.target.value);};const send = () => {if (inputValue.trim() === '') {alert('输入框不能为空');return;}setIsButtonDisabled(true);const obj = {headImg: require('../../static/icon/chatgpt.png'),name: '初出茅庐',time: new Date().toLocaleTimeString(),msg: inputValue,chatType: 0,uid: '1001'}let news = chatList.concat(obj)setChatList(news)setInputValue('')sendMsgApi({type: value, question: inputValue}).then((res) => {if (res.status_code === 200) {const item = {headImg: require('../../static/icon/chatgpt.png'),name: 'ChatGPT',time: new Date().toLocaleTimeString(),msg: res.data,chatType: 0,uid: '1002',type: value === 1 ? 1 : 2}let concat = news.concat(item);setChatList(concat)setTimeout(() => {containerRef.current.scrollTop = containerRef.current.scrollHeight;}, 0);}})setTimeout(() => {containerRef.current.scrollTop = containerRef.current.scrollHeight;}, 0);}return (<div className="chatHome"><div className="chatLeft"><p className="chat-title"><ChromeOutlined   spin /> 诗绣智能AI助手</p><div className="openai-type-class"><p className="tool-a-title"><AimOutlined spin /> AI助手模式切换</p><Radio.Group onChange={onChange} value={value} style={{ display: 'grid', gridTemplateColumns: 'auto auto' }}><Radio value={1} style={{ color: 'cornflowerblue' }}>聊天模式</Radio><Radio value={2} style={{ color: 'cornflowerblue' }}>图片模式</Radio></Radio.Group></div><p className="tool-a-title"><AimOutlined spin /> 诗绣工具推荐</p><div className="div-tools"><Button className="tools-button" type="primary" onClick={()=>showModal("https://file.tlzcf.vip/img.png")}>诗绣IMG库</Button><Button className="tools-button" type="primary" onClick={()=>showModal("https://file.tlzcf.vip/gjx.png")}>诗绣工具箱</Button><Button className="tools-button" type="primary" onClick={()=>showModal("https://file.tlzcf.vip/zl.png")}>王者战力助手</Button><Button className="tools-button" type="primary" onClick={()=>showModal("https://file.tlzcf.vip/wk.png")}>网课答案助手</Button><Button className="tools-button" type="primary" onClick={()=>showModal("https://file.tlzcf.vip/ssssss.png")}>诗绣壁纸公众号</Button><a className="tools-a" target="_blank" href="https://www.tlzcf.vip/app/#/"> 诗绣壁纸网入口 </a></div><div className="chat-auth"><p>今日访问次数为:无限</p><p>当前有效时间为:长期</p><div className="chat-kami"><Input className="chat-kami-left" placeholder="请输入授权卡密"/><Button className="chat-kami-right">验证</Button></div></div></div><div className="chatRight"><p className="chatgpt-title"><img className="chatgpt-png" src={chatgptPng}/> <spanclassName="chatgpt-title-span">Welcome ChatGPT</span></p><div className="chatRight-conent"><div className="chat-conent-text" ref={containerRef}>{chatList && chatList.map(item => (<div className="chat-conent-item">{item.uid === '1001' &&<div className="chat-item-right"><div className="chat-title-item-conent-right"><div className="chat-title-name-right"><span>{item.name}</span>&nbsp;<span className="chat-title-time">{item.time}</span></div><img className="chat-title-item-img-right" src={meJpg}/></div><div className="chat-item-conent-txt-right">{item.msg}</div></div>}{item.uid === '1002' &&<div className="chat-item-left"><div className="chat-title-item-conent-left"><img className="chat-title-item-img-left" src={chatgptPng}/><div className="chat-title-name-left"><span>{item.name}</span>&nbsp;<span className="chat-title-time">{item.time}</span></div></div><div className="chat-item-conent-txt-left">{item.type === 1 && <span dangerouslySetInnerHTML={{__html:item.msg}}></span>}{item.type === 2 && <img className="item-chatImg" src={item.msg}/>}</div></div>}</div>))}</div><div className="chat-div-button"><Input className="chat-input" value={inputValue} onChange={handleInputChange}/><Button onClick={() => send()} disabled={isButtonDisabled}className="chat-button">{isButtonDisabled ? `请等待${countdown}秒` : '点击按钮'}</Button></div><AlertclassName="item-alert"bannertype="info"icon={<WifiOutlined/>}message={<Marquee speed={60} pauseOnHover gradient={false}>离开家乡以前我以为我想要的是雄心壮志和鹏程万里,后来才发现,我们不断追逐的也不过是饱餐一顿和一个不被闹钟吵醒的清晨。</Marquee>}/></div></div><Modal title="工具详情" open={isModalOpen} onOk={handleOk} onCancel={handleCancel}  footer={null}><img className="img-tools" src={imgUrl}/></Modal></div>)
}

线上体验地址:http://tlzcf.vip:9000/
在这里插入图片描述

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

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

相关文章

服务器数据恢复-raid10重建为raid6的数据恢复案例

服务器故障&#xff1a; 一台IBM V7000存储中的vdisk丢失&#xff0c;Solaris操作系统中的部署的Oracle数据库不可用。经过和工作人员的沟通得知故障原因&#xff1a;工作人员进行重建MDisk的操作&#xff0c;将原先的raid10重建为raid6&#xff0c;然后又再次重建为raid10&…

网络编程4——TCP协议的三大安全机制:三次握手四次挥手+确认应答机制+超时重传机制

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 连接管理机制 TCP建立连接&#xff1a;三次握手 TCP断开连接&#xff1a;四次挥手 三、TCP协议的 确认应答机制 四、TCP协议的 超时重传机制 总结 前言 本人是一个刚刚上路的I…

【Ubuntu学习MySQL——安装MySQL】

首先得su&#xff0c;然后输入密码&#xff0c;进入到root模式下&#xff0c;以下命令均在root用户模式下进行 1.在这里我们使用RPM包来安装Mysql&#xff0c;所以首先安装RPM包 apt install rpm2.安装完RPM包之后&#xff0c;检测系统是否自带安装MySQL&#xff0c;如果没有…

部署Git服务器

哈喽&#xff0c;大家好&#xff0c;本次为大家演示如何部署git服务器. 首先要准备gitea和phpstudy_pro phpstudy一路nest即可&#xff0c;可以帮你安装mysql和阿帕奇。 登录127.0.0.1:3000注册gitea即可。 如何在上传公钥的时候出现500的错误&#xff0c;加入这句便可解决…

vue运行background-removal-js库

前段时间在github上有个能在浏览器扣图的js库蛮火https://github.com/imgly/background-removal-js 演示网站&#xff1a;demo 不仅仅能将人物主体扣出&#xff0c;还能处理动物、植物等 最近我萌发出在vue中运行这个库的想法&#xff0c;记录一下 下载、配置 首先当然是通…

【专题速递】音频生成、TTS和AIGC在音乐上的运用

// AIGC的发展为音频带来了什么&#xff1f;AIGC如何赋能音乐创作&#xff1f;如何识别虚假音频&#xff1f;TTS可以在哪种场景下解决特定问题&#xff1f;7月29日LiveVideoStackCon2023上海站音频新体验专场&#xff0c;为您解答。 音频新体验 随着多媒体和通信网络技术的不…

嵌入式开发--XW09A触摸芯片的使用

XW09A触摸芯片 XW09A是厦门市芯网电子科技有限公司出品的一颗触摸芯片&#xff0c;支持9键多点触摸&#xff0c;I2C接口&#xff0c;带中断引脚。 以下摘抄自芯片手册 极高的灵敏度&#xff0c;可穿透13mm 的玻璃&#xff0c;感应到手指的触摸 超强的抗干扰和ESD 能力,不加任何…

Debian 11 x64 安装 MySQL 8.0.33

更新 sudo apt update sudo apt install gnupg安装 DEB Package wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb sudo dpkg -i mysql-apt-config_0.8.25-1_all.deb具体版本见官方网站&#xff1a;MySQL Community Downloads&#xff0c;这里仅以版本 …

AI 对抗超级细菌:麦克马斯特大学利用深度学习发现新型抗生素 abaucin

内容一览&#xff1a;鲍曼不动杆菌是一种常见的医院获得性革兰氏阴性病原体&#xff0c;通常表现出多重耐药性。利用传统方法&#xff0c;发现抑制此菌的新型抗生素很困难。但利用机器学习可以快速探索化学空间&#xff0c;从而增加发现新型抗菌分子的可能性。近期&#xff0c;…

Vue3 动态路由、动态组件使用示例

前期回顾 Vue3 TS Vite —— 大屏可视化 项目实战_vue3可视化大屏_彩色之外的博客-CSDN博客大屏可视化项目实战_vue3可视化大屏https://blog.csdn.net/m0_57904695/article/details/131014666?spm1001.2014.3001.5501 目录 &#x1f44d; 动态组件 &#x1f440; 动态路…

Java支付SDK接口远程调试 - 支付宝沙箱环境【公网地址调试】

文章目录 1.测试环境2.本地配置3. 内网穿透3.1 下载安装cpolar内网穿透3.2 创建隧道 4. 测试公网访问5. 配置固定二级子域名5.1 保留一个二级子域名5.2 配置二级子域名 6. 使用固定二级子域名进行访问 转载自cpolar极点云文章&#xff1a;Java支付宝沙箱环境支付&#xff0c;SD…

解密Docker容器网络

一个Linux容器能看见的“网络栈”&#xff0c;被隔离在它自己的Network Namespace中。 1 “网络栈”的内容 网卡&#xff08;Network Interface&#xff09;回环设备&#xff08;Loopback Device&#xff09;路由表&#xff08;Routing Table&#xff09;iptables规则 对于一…