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

276 lines
10 KiB

11 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
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
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
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/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="config.js"></script>
  101. <script type="text/javascript" src="js/index.js"></script>
  102. <script>
  103. $(document).ready(function() {
  104. $('.ai-wrapper').append('<iframe id="myIframe" style="position: absolute; top: 0; left: -34%; border: none; z-index: 9;" width="100%" height="100%" src="'+config.chatUrl+'"></iframe>')
  105. const $sendButton = $('.send-button');
  106. const $textArea = $('.chat-send textarea');
  107. const $chatContent = $('.chat-content');
  108. let isBotReplying = false;
  109. let isBotTyping = false;
  110. // 默认进来AI数字人发送欢迎消息
  111. function sendWelcomeMessage() {
  112. const welcomeMessage = '您好!请问有什么问题可以帮您解答吗?';
  113. appendMessage(welcomeMessage, false, false, true);
  114. }
  115. sendWelcomeMessage();
  116. // 初始化时检查按钮状态
  117. updateSendButtonState();
  118. function updateSendButtonState() {
  119. const message = $textArea.val().trim();
  120. // && !isBotReplying && !isBotTyping
  121. if (message) {
  122. $sendButton.prop('disabled', false).removeClass('send-disabled-button');
  123. } else {
  124. $sendButton.prop('disabled', true).addClass('send-disabled-button');
  125. }
  126. }
  127. // 当 textarea 内容变化时更新按钮状态
  128. $textArea.on('input', function() {
  129. updateSendButtonState();
  130. });
  131. // 发送消息并接收机器人的回复
  132. $sendButton.click(function() {
  133. if (!isBotReplying && !isBotTyping) {
  134. const message = $textArea.val().trim();
  135. if (message) {
  136. appendMessage(message, true, false);
  137. $textArea.val('');
  138. $sendButton.prop('disabled', true).addClass('send-disabled-button');
  139. // loading
  140. appendMessage('', false, true);
  141. isBotReplying = true;
  142. $.ajax({
  143. url: config.apiUrl+'/api/v1/workspace/dxhtsg/chat',
  144. type: 'POST',
  145. headers: {
  146. 'Authorization': config.apiKey
  147. },
  148. contentType:'application/json',
  149. dataType: "json",
  150. data: JSON.stringify({
  151. 'message': message,
  152. 'mode':'chat'
  153. }),
  154. success: function (res) {
  155. $('.loading').parent().remove();
  156. const botReply = res.textResponse.replace(/\【(\/)?SYS\】/gi, '飞天智能AI小助手');
  157. // const botReply = res.textResponse.replace(/【(.*?)】/g, function(match, p1) {
  158. // return '【飞天智能AI小助手】';
  159. // });
  160. console.log(botReply);
  161. // 添加完整的机器人回复
  162. appendMessage('', false, false);
  163. isBotTyping = true;
  164. let i = 0;
  165. const speed = 50; // 每个字符的打字速度,单位:毫秒
  166. typeWriter();
  167. function typeWriter() {
  168. if (!isBotTyping) {
  169. // 如果isBotReplying为false,则停止打字
  170. return;
  171. }
  172. if (i < botReply.length) {
  173. $chatContent.find('.bot-message:last-child p').append(botReply.charAt(i));
  174. i++;
  175. setTimeout(typeWriter, speed);
  176. $chatContent.scrollTop($chatContent[0].scrollHeight);
  177. } else {
  178. // 完成打字后更新状态
  179. isBotTyping = false;
  180. isBotReplying = false;
  181. $('#stop-btn').remove()
  182. }
  183. }
  184. },
  185. error: function (err) {
  186. console.log(err);
  187. layer.msg('因网络原因,您的问题暂时无法解答,请稍后再试!', {
  188. offset: [$(window).height()/2-100, $(window).width() /2 + 100],
  189. anim: 5
  190. });
  191. $('.loading').parent().remove();
  192. isBotTyping = false;
  193. isBotReplying = false;
  194. }
  195. });
  196. }
  197. } else if (isBotTyping) {
  198. console.log('isBotTyping',isBotTyping)
  199. // 输入中
  200. layer.msg('请等待当前对话完成,稍后再试。', {
  201. offset: [$(window).height()/2-100, $(window).width() /2 + 100],
  202. anim: 6
  203. });
  204. } else if (isBotReplying) {
  205. // loading中
  206. layer.msg('请等待当前对话完成,稍后再试。', {
  207. offset: [$(window).height()/2-100, $(window).width() /2 + 100],
  208. anim: 6
  209. });
  210. }
  211. });
  212. // 回车键发送消息
  213. $textArea.keypress(function(event) {
  214. if (event.which === 13) {
  215. event.preventDefault(); // 防止默认换行行为
  216. $sendButton.click();
  217. }
  218. });
  219. // 热搜词提问
  220. $('.hot-word span').click(function() {
  221. const hotMessage = $(this).html()
  222. $textArea.val(hotMessage)
  223. $sendButton.click();
  224. })
  225. function appendMessage(content, isUserMessage, isLoading, isWelcomeMessage) {
  226. const className = isUserMessage ? 'user-message' : 'bot-message';
  227. // const avatarSrc = isUserMessage ? 'images/other/pic1.jpg' : 'images/other/pic2.jpg';
  228. let messageContent
  229. if (isLoading) {
  230. messageContent = '<p class="loading"><img src="images/loading.webp" alt="" /></p>';
  231. } else {
  232. // 当isUserMessage为false时,才添加<span>停止输出</span>
  233. messageContent = isUserMessage
  234. ? `<p>${content}</p>`
  235. : isWelcomeMessage
  236. ? `<p>${content}</p>` // 如果是欢迎消息,即使isUserMessage为false,也不添加<span>停止输出</span>
  237. : `<p>${content}<span id="stop-btn">停止输出</span></p>`;
  238. }
  239. // const messageHtml = `
  240. // <div class="chat-message ${className}">
  241. // ${messageContent}
  242. // <img src="${avatarSrc}" alt="${isUserMessage ? '用户' : 'AI数字人'}">
  243. // </div>`;
  244. const messageHtml = `
  245. <div class="chat-message ${className}">
  246. ${messageContent}
  247. </div>`;
  248. $chatContent.append(messageHtml);
  249. $chatContent.scrollTop($chatContent[0].scrollHeight);
  250. $('#stop-btn').click(function() {
  251. isBotTyping = false;
  252. isBotReplying = false;
  253. $(this).removeAttr('id').addClass('remove-btn').html('用户取消')
  254. });
  255. }
  256. });
  257. </script>
  258. </html>