如何实现一个前端对话

初始:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>模拟gpt前端</title>
    <style>
        /* 样式可以根据需要进行修改 */
        #chat-box {
            width: 300px;
            height: 200px;
            border: 1px solid #ccc;
            overflow-y: scroll;
            margin-bottom: 10px;
        }

        #question-input {
            width: 300px;
            height: 30px;
        }

        #send-button {
            margin-left: 10px;
        }
    </style>
</head>
<body>
<h1>带有聊天框的多次一问一答</h1>
<div id="chat-box"></div>
<input type="text" id="question-input" placeholder="请输入问题">
<button id="send-button" onclick="submitQuestion()">发送</button>
<button onclick="continueQuestion()">继续提问</button>

<script>
    function submitQuestion() {
        var question = document.getElementById("question-input").value;
        // 在这里调用后端API或者查询答案库,获取答案
        var answer = getAnswerFromBackend(question);
        // 将问题和答案添加到聊天框中
        var chatBox = document.getElementById("chat-box");
        chatBox.innerHTML += "<p><strong>我:</strong>" + question + "</p>";
        chatBox.innerHTML += "<p><strong>助手:</strong>" + answer + "</p>";
        // 滚动到聊天框底部
        chatBox.scrollTop = chatBox.scrollHeight;
        document.getElementById("question-input").value = ""; // 清空输入框
    }

    function continueQuestion() {
        document.getElementById("question-input").value = ""; // 清空输入框
    }

    function getAnswerFromBackend(question) {
        // 模拟从后端获取答案的过程
        var answers = {
            "什么是计算机?": "计算机是一种能够执行指令并进行计算的机器。",
            "什么是编程?": "编程是指使用特定的编程语言编写计算机程序的过程。"
        };
        return answers[question] || "对不起,我无法回答这个问题。";
    }
</script>
</body>
</html>

效果如下:

 然后我希望能够实现多次聊天,接入自己后端的数据,并且调用markdown模式,可以这样子修改代码:

 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Chatbot</title>
  <style>
    /* 样式可以根据需要进行修改 */
    .chat-container {
      width: 400px;
      height: 500px;
      border: 1px solid #ccc;
      padding: 10px;
      overflow-y: scroll;
    }

    .message {
      margin-bottom: 10px;
    }

    .user-message {
      text-align: right;
    }

    .gpt-message {
      text-align: left;
    }

    .avatar {
      width: 30px;
      height: 30px;
      border-radius: 50%;
      margin-right: 10px;
    }

    .input-container {
      display: flex;
      margin-top: 10px;
    }

    .input-field {
      flex: 1;
      padding: 5px;
    }

    .send-button {
      padding: 5px 10px;
    }
  </style>
<!--  <script src="/js/marked.min.js"></script>-->
</head>
<body>
<div class="chat-container" id="chatContainer">
  <!-- 聊天记录将在这里显示 -->
</div>
<!--<div id="response"></div>-->
<div class="input-container">
  <img src="/images/ziyuan/user1.png" alt="Avatar" class="avatar">
  <input type="text" id="inputField" class="input-field" placeholder="请输入问题">
  <button id="sendButton" class="send-button">发送</button>
</div>

<script>
  // 获取DOM元素
  const chatContainer = document.getElementById('chatContainer');
  const inputField = document.getElementById('inputField');
  const sendButton = document.getElementById('sendButton');

  // 添加事件监听器
  sendButton.addEventListener('click', function() {
    const userMessage = inputField.value;
    const gptMessage = getAnswerFromBackend(userMessage); // 调用后端API获取答案


    // 创建消息元素并添加到聊天容器中
    const userMsgElement = createMessageElement('user', userMessage);
    const gptMsgElement = createMessageElement('gpt', gptMessage);
    console.log("--gptMsgElement--: ",gptMsgElement)
    chatContainer.appendChild(userMsgElement);
    chatContainer.appendChild(gptMsgElement);

    // 清空输入框并滚动到底部
    inputField.value = '';
    chatContainer.scrollTop = chatContainer.scrollHeight;
  });

  // 创建消息元素的函数
  function createMessageElement(type, message) {
    const messageElement = document.createElement('div');
    messageElement.classList.add('message', type + '-message');

    // console.log("111:",message);
    const avatarElement = document.createElement('img');
    if(type === 'user'){
      avatarElement.src = '/images/ziyuan/user1.png';
    }
    else {
      avatarElement.src = '/images/ziyuan/gpt.png';
    }

    avatarElement.alt = 'Avatar';
    avatarElement.classList.add('avatar');

    const textElement = document.createElement('span');
    // textElement.textContent = message;
    textElement.innerHTML = marked(message);
    // console.log("marked 222: ",textElement.textContent)
    //设置markdown风格,,没成功。。
    // textElement.style.fontFamily = 'Arial, sans-serif';
    // textElement.style.fontSize = '16px';
    // textElement.style.lineHeight = '1.5';

    messageElement.appendChild(avatarElement);
    messageElement.appendChild(textElement);

    return messageElement;
  }

  // 模拟从后端获取答案的过程(实际应调用后端API)
  function getAnswerFromBackend(question) {
    // 这里可以替换为实际的后端API调用逻辑
    // var inputdata = $('#inputField').val(); // 获取输入框的值
    var str = '出错了,待会再试试吧...';
    $.ajax({
      // url: '/getres', // 后端接口地址
      url: '/sendQuestion', // 后端接口地址
      type: 'get', // 请求方法为POST
      async: false,
      data: { inputField: question }, // 要发送的数据
      success: function(res) {
        console.log("返回状态:"+res.state);
        console.log("返回数据:"+res.data);
        // $('#response').html('后端返回的数据:' + res.data);
        // return res.data;
        str=res.data;
      },
      error: function(error) {
        console.log(error.state);
      }
    });
    return str;
  }
</script>
<script src="/js/jquery-3.1.1.js"></script>
<script src="https://cdn.bootcss.com/marked/0.8.1/marked.min.js"></script>
</body>
</html>

 

 接着,更改一下前端页面的风格,美化一下,感觉暂时来说达到我要想要实现的东西,当然还是需要优化一下对话框之类的。。

posted on 2024-05-03 14:15  201812  阅读(167)  评论(0编辑  收藏  举报