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

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year 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>