飞天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.

255 lines
9.4 KiB

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