飞天AI数字人展会页面
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

272 lines
10 KiB

6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
  8. <meta http-equiv="Pragma" content="no-cache" />
  9. <meta http-equiv="Expires" content="0" />
  10. <link rel="stylesheet" type="text/css" href="css/libs/reset.css">
  11. <link rel="stylesheet" type="text/css" href="css/index.css">
  12. <title>AI数字人</title>
  13. <!--[if lt IE 9]>
  14. <script src="js/html5shiv.js"></script>
  15. <script src="js/respond.min.js"></script>
  16. <![endif]-->
  17. </head>
  18. <body>
  19. <div class="ai-wrapper">
  20. <video class="ai-bg" src="images/bg2.mp4" autoplay="autoplay" loop="loop" muted="muted"></video>
  21. <div class="ai-header-wrapper">
  22. <div class="ai-header">
  23. <div class="header-left">
  24. <div class="header-btn header-home" onclick="window.location.href='index.html'; return false;"><span></span><p>首页</p></div>
  25. </div>
  26. <div class="header-title">
  27. <h2>AI数字人</h2>
  28. </div>
  29. <div class="header-btn header-login"><span></span><p>登录</p></div>
  30. </div>
  31. </div>
  32. <div class="chat-wrapper">
  33. <div class="chat-content">
  34. </div>
  35. <div class="chat-send">
  36. <textarea cols="50" rows="7" placeholder="请输入你想咨询的问题"></textarea>
  37. <!-- <div class="send-button">send</div> -->
  38. <div class="send-button-container">
  39. <div class="hot-word">
  40. <span>什么是“人工智能”?</span>
  41. <span>什么是“AI大模型”?</span>
  42. </div>
  43. <span class="send-button">发送</span>
  44. <!-- <input type="button" value="发送" class="send-button"> -->
  45. </div>
  46. </div>
  47. </div>
  48. <!-- 账号:admin 密码:83560792 -->
  49. <!-- 登录 -->
  50. <div id="form-layer" class="layer-login" style="display: none;">
  51. <h3>账号登录</h3>
  52. <ul class="login-form">
  53. <li>
  54. <p>账号</p>
  55. <input type="text" placeholder="请输入账号" value="admin" />
  56. </li>
  57. <li>
  58. <p>密码</p>
  59. <input type="password" placeholder="请输入密码" value="83560792" />
  60. </li>
  61. </ul>
  62. <button type="submit" class="login-submit" id="btn-submit-form">立即登录</button>
  63. </div>
  64. <!-- 用户信息 -->
  65. <div id="user-layer" class="layer-login" style="display: none;">
  66. <div class="user-info">
  67. <img src="images/index-img2.png" alt="" />
  68. <p class="user-name">Admin</p>
  69. <ul class="user-other">
  70. <li>
  71. <p>8个</p>
  72. <span>代码上传</span>
  73. </li>
  74. <li>
  75. <p>100</p>
  76. <span>积分</span>
  77. </li>
  78. <li>
  79. <p>10</p>
  80. <span>获赞</span>
  81. </li>
  82. </ul>
  83. <div class="change-accout-btn">切换账号</div>
  84. </div>
  85. </div>
  86. <!-- 微信登录 -->
  87. <div id="wechat-layer" class="layer-login" style="display: none;">
  88. <h3>账号登录</h3>
  89. <div class="wechat-login">
  90. <img src="images/wechat.png" alt="" />
  91. <span>请使用微信扫描二维码登录</span>
  92. </div>
  93. </div>
  94. </div>
  95. </body>
  96. <script type="text/javascript" src="js/libs/jquery-3.7.1.min.js"></script>
  97. <!-- 弹出框 -->
  98. <script type="text/javascript" src="js/libs/layer/layer.js"></script>
  99. <script type="text/javascript" src="js/libs/flexible.js"></script>
  100. <script type="text/javascript" src="js/index.js"></script>
  101. <script>
  102. $(document).ready(function() {
  103. const $sendButton = $('.send-button');
  104. const $textArea = $('.chat-send textarea');
  105. const $chatContent = $('.chat-content');
  106. let isBotReplying = false;
  107. let isBotTyping = false;
  108. // 默认进来AI数字人发送欢迎消息
  109. function sendWelcomeMessage() {
  110. const welcomeMessage = '您好!请问有什么问题可以帮您解答吗?';
  111. appendMessage(welcomeMessage, false, false, true);
  112. }
  113. sendWelcomeMessage();
  114. // 初始化时检查按钮状态
  115. updateSendButtonState();
  116. function updateSendButtonState() {
  117. const message = $textArea.val().trim();
  118. // && !isBotReplying && !isBotTyping
  119. if (message) {
  120. $sendButton.prop('disabled', false).removeClass('send-disabled-button');
  121. } else {
  122. $sendButton.prop('disabled', true).addClass('send-disabled-button');
  123. }
  124. }
  125. // 当 textarea 内容变化时更新按钮状态
  126. $textArea.on('input', function() {
  127. updateSendButtonState();
  128. });
  129. // 发送消息并接收机器人的回复
  130. $sendButton.click(function() {
  131. if (!isBotReplying && !isBotTyping) {
  132. const message = $textArea.val().trim();
  133. if (message) {
  134. appendMessage(message, true, false);
  135. $textArea.val('');
  136. $sendButton.prop('disabled', true).addClass('send-disabled-button');
  137. // loading
  138. appendMessage('', false, true);
  139. isBotReplying = true;
  140. $.ajax({
  141. url: 'http://192.168.99.86:3001/api/v1/workspace/dxhtsg/chat',
  142. type: 'POST',
  143. headers: {
  144. 'Authorization': 'Bearer XVSPT0T-6P54SZH-QP36QKJ-KK77TN6'
  145. },
  146. contentType:'application/json',
  147. dataType: "json",
  148. data: JSON.stringify({
  149. 'message': message,
  150. 'mode':'chat'
  151. }),
  152. success: function (res) {
  153. $('.loading').parent().remove();
  154. const botReply = res.textResponse.replace(/\【(\/)?SYS\】/gi, '飞天智能AI小助手');
  155. // const botReply = res.textResponse.replace(/【(.*?)】/g, function(match, p1) {
  156. // return '【飞天智能AI小助手】';
  157. // });
  158. console.log(botReply);
  159. // 添加完整的机器人回复
  160. appendMessage('', false, false);
  161. isBotTyping = true;
  162. let i = 0;
  163. const speed = 50; // 每个字符的打字速度,单位:毫秒
  164. typeWriter();
  165. function typeWriter() {
  166. if (!isBotTyping) {
  167. // 如果isBotReplying为false,则停止打字
  168. return;
  169. }
  170. if (i < botReply.length) {
  171. $chatContent.find('.bot-message:last-child p').append(botReply.charAt(i));
  172. i++;
  173. setTimeout(typeWriter, speed);
  174. $chatContent.scrollTop($chatContent[0].scrollHeight);
  175. } else {
  176. // 完成打字后更新状态
  177. isBotTyping = false;
  178. isBotReplying = false;
  179. $('#stop-btn').remove()
  180. }
  181. }
  182. },
  183. error: function (err) {
  184. console.log(err);
  185. layer.msg('因网络原因,您的问题暂时无法解答,请稍后再试!', {
  186. offset: [$(window).height()/2-100, $(window).width() /2 + 100],
  187. anim: 5
  188. });
  189. $('.loading').parent().remove();
  190. isBotTyping = false;
  191. isBotReplying = false;
  192. }
  193. });
  194. }
  195. } else if (isBotTyping) {
  196. console.log('isBotTyping',isBotTyping)
  197. // 输入中
  198. layer.msg('请等待当前对话完成,稍后再试。', {
  199. offset: [$(window).height()/2-100, $(window).width() /2 + 100],
  200. anim: 6
  201. });
  202. } else if (isBotReplying) {
  203. // loading中
  204. layer.msg('请等待当前对话完成,稍后再试。', {
  205. offset: [$(window).height()/2-100, $(window).width() /2 + 100],
  206. anim: 6
  207. });
  208. }
  209. });
  210. // 回车键发送消息
  211. $textArea.keypress(function(event) {
  212. if (event.which === 13) {
  213. event.preventDefault(); // 防止默认换行行为
  214. $sendButton.click();
  215. }
  216. });
  217. // 热搜词提问
  218. $('.hot-word span').click(function() {
  219. const hotMessage = $(this).html()
  220. $textArea.val(hotMessage)
  221. $sendButton.click();
  222. })
  223. function appendMessage(content, isUserMessage, isLoading, isWelcomeMessage) {
  224. const className = isUserMessage ? 'user-message' : 'bot-message';
  225. // const avatarSrc = isUserMessage ? 'images/other/pic1.jpg' : 'images/other/pic2.jpg';
  226. let messageContent
  227. if (isLoading) {
  228. messageContent = '<p class="loading"><img src="images/loading.webp" alt="" /></p>';
  229. } else {
  230. // 当isUserMessage为false时,才添加<span>停止输出</span>
  231. messageContent = isUserMessage
  232. ? `<p>${content}</p>`
  233. : isWelcomeMessage
  234. ? `<p>${content}</p>` // 如果是欢迎消息,即使isUserMessage为false,也不添加<span>停止输出</span>
  235. : `<p>${content}<span id="stop-btn">停止输出</span></p>`;
  236. }
  237. // const messageHtml = `
  238. // <div class="chat-message ${className}">
  239. // ${messageContent}
  240. // <img src="${avatarSrc}" alt="${isUserMessage ? '用户' : 'AI数字人'}">
  241. // </div>`;
  242. const messageHtml = `
  243. <div class="chat-message ${className}">
  244. ${messageContent}
  245. </div>`;
  246. $chatContent.append(messageHtml);
  247. $chatContent.scrollTop($chatContent[0].scrollHeight);
  248. $('#stop-btn').click(function() {
  249. isBotTyping = false;
  250. isBotReplying = false;
  251. $(this).removeAttr('id').addClass('remove-btn').html('用户取消')
  252. });
  253. }
  254. });
  255. </script>
  256. </html>