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

6 months ago
6 months ago
5 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
5 months ago
6 months ago
6 months ago
5 months ago
6 months ago
5 months ago
6 months ago
5 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="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>