前端开发 -- 自动回复机器人【附完整源码】

news2025/1/2 23:00:36

一:效果展示

本项目实现了一个简单的网页聊天界面,用户可以在输入框中输入消息,并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容,通过关键字匹配来生成自动回复。
在这里插入图片描述

二:源代码分享

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>关键字自动回复</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
            overflow: hidden;
        }

        .chat-title {
            text-align: center;
            padding: 10px;
            font-weight: bold;
            border-bottom: 2px solid #ccc;
        }

        .chat-container {
            width: 300px;
            border: 2px solid #ccc;
            border-radius: 5px;
            background-color: #fff;
            display: flex;
            flex-direction: column;
            max-height: 90vh;
        }
        .chat-window {
            flex: 1;
            padding: 10px;
            overflow-y: auto;
            border-bottom: 2px solid #ccc;
        }
        .chat-window div {
            display: flex;
            margin-bottom: 10px;
        }
        .user-message {
            justify-content: flex-end;
            color: #007bff;
        }
        .bot-message {
            justify-content: flex-start;
            color: #28a745;
        }
        .message-content {
            display: flex;
            align-items: center;
        }
        .message-content img {
            width: 30px;
            height: 30px;
            border-radius: 50%;
            margin-right: 5px; 
        }
        .message-text {
            max-width: 200px; 
            padding: 5px;
            border-radius: 5px;
            word-wrap: break-word; 
            white-space: normal; 
        }
        .user-message .message-content {
            gap: 5px;
        }
        .user-message .message-text {
            background-color: #e9f5ff;
        }
        .bot-message .message-text {
            background-color: #d1f9d1;
        }
        .input-container {
            display: flex;
            padding: 10px;
        }
        #userInput {
            flex: 1;
            padding: 5px;
            border: 1px solid #ccc;
            border-radius: 3px;
        }
        #sendButton {
            padding: 5px 10px;
            margin-left: 5px;
            border: 1px solid #ccc;
            background-color: #007bff;
            color: #fff;
            border-radius: 3px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="chat-container">
        <div class="chat-title">自动回复机器人</div>
        <div class="chat-window" id="chatWindow">
        </div>
        <div class="input-container">
            <input type="text" id="userInput" placeholder="请输入......">
            <button id="sendButton">发送</button>
        </div>
    </div>
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const chatWindow = document.getElementById('chatWindow');
            const userInput = document.getElementById('userInput');
            const sendButton = document.getElementById('sendButton');

            sendButton.addEventListener('click', sendMessage);
            userInput.addEventListener('keypress', (e) => {
                if (e.key === 'Enter') {
                    sendMessage();
                }
            });

            function sendMessage() {
                const userMessage = userInput.value.trim();
                if (userMessage) {
                    addMessage(userMessage, 'user');

                    // 使用本地生成的回复
                    const reply = generateAIReply(userMessage);
                    addMessage(reply, 'bot');
                    userInput.value = '';
                }
            }

            function generateAIReply(message) {
                message = message.toLowerCase();
                if (message.includes("你好") || message.includes("hi")) {
                    return "你好!有什么我可以帮助你的吗?";
                } else if (message.includes("你想我吗")) {
                    return "我当然想和你聊天啦!";
                } else if (message.includes("你在干嘛")) {
                    return "我正在用人类的语言和你聊天呢!";
                } else if (message.includes("现在几点")) {
                    return "当前时间为:" + new Date().toLocaleTimeString();
                } else {
                    return "我不太明白你的意思,可以说得更清楚一些吗?";
                }
            }

            function addMessage(message, sender) {
                const messageElement = document.createElement('div');
                messageElement.className = sender === 'user' ? 'user-message' : 'bot-message';

                const messageContent = document.createElement('div');
                messageContent.className = 'message-content';

                const text = document.createElement('span');
                text.className = 'message-text';
                text.textContent = message;
                messageContent.appendChild(text);

                const avatar = document.createElement('img');
                if (sender === 'user') {
                    avatar.src = '头像1.jpg'; // 用户头像链接
                    messageContent.appendChild(avatar); 
                } else {
                    avatar.src = '头像2.jpg'; // 机器人头像链接
                    messageContent.insertBefore(avatar, text); 
                }

                messageElement.appendChild(messageContent);
                chatWindow.appendChild(messageElement);
                chatWindow.scrollTop = chatWindow.scrollHeight;
            }
        });
    </script>
</body>
</html>

三:代码分析

1.HTML结构
<!DOCTYPE html>
<!-- 定义HTML文档的语言为英文 -->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 设置视口,使页面在移动设备上以合适的比例显示,宽度等于设备宽度,初始缩放比例为1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 设置网页的标题 -->
    <title>关键字自动回复</title>
    <style>
        /* CSS样式在这里定义,用于美化页面 */
    </style>
</head>
<body>
    <!-- 定义一个容器,用于包含聊天界面的所有元素 -->
    <div class="chat-container">
        <!-- 定义聊天窗口的标题 -->
        <div class="chat-title">自动回复机器人</div>
        <!-- 定义聊天窗口,用于显示聊天内容,设置id以便JS操作 -->
        <div class="chat-window" id="chatWindow"></div>
        <!-- 定义一个容器,包含输入框和发送按钮 -->
        <div class="input-container">
            <!-- 定义一个文本输入框,用户在此输入信息 -->
            <input type="text" id="userInput" placeholder="请输入......"> 
            <!-- 定义一个按钮,用户点击后发送输入框中的内容 -->
            <button id="sendButton">发送</button>            
        </div>
    </div>
    <script>
        // JavaScript代码在这里,用于实现页面的交互功能
    </script>
</body>
</html>
  • <head>部分:定义了文档的元数据,包括窗口设置和标题,以及内嵌的CSS样式。
  • <body>部分:包含一个聊天容器,其中包括聊天标题、聊天窗口和输入容器。
2.CSS结构

body {
    font-family: Arial, sans-serif;
    /* 设置页面整体字体为Arial,如果Arial不可用则使用sans-serif作为备用 */
    display: flex;
    /* 使用Flexbox布局,使子元素能够灵活排列 */
    justify-content: center;
    /* 水平方向上居中对齐子元素 */
    align-items: center;
    /* 垂直方向上居中对齐子元素 */
    height: 100vh;
    /* 设置页面高度为视口高度的100%,确保页面占满整个屏幕 */
    margin: 0;
    /* 移除默认的页面外边距 */
    background-color: #f0f0f0;
    /* 设置页面背景颜色为浅灰色 */
    overflow: hidden;
    /* 隐藏超出视口的内容,防止滚动条出现 */
}
 
.chat-title {
    text-align: center;
    /* 标题文本居中对齐 */
    padding: 10px;
    /* 在标题周围添加内边距,使其与边框有一定距离 */
    font-weight: bold;
    /* 设置标题字体为粗体 */
    border-bottom: 2px solid #ccc;
    /* 在标题下方添加一条2像素宽的灰色边框 */
}
 
.chat-container {
    width: 300px;
    /* 设置聊天容器的宽度为300像素 */
    border: 2px solid #ccc;
    /* 为聊天容器添加2像素宽的灰色边框 */
    border-radius: 5px;
    /* 设置聊天容器的边框圆角为5像素 */
    background-color: #fff;
    /* 设置聊天容器背景颜色为白色 */
    display: flex;
    /* 使用Flexbox布局,使聊天窗口和输入框能够灵活排列 */
    flex-direction: column;
    /* 设置Flexbox方向为垂直,使子元素垂直排列 */
    max-height: 90vh;
    /* 设置聊天容器的最大高度为视口高度的90% */
}
 
.chat-window {
    flex: 1;
    /* 使聊天窗口占据可用空间的剩余部分 */
    padding: 10px;
    /* 在聊天窗口内部添加内边距 */
    overflow-y: auto;
    /* 如果内容超出可视区域,允许垂直滚动 */
    border-bottom: 2px solid #ccc;
    /* 在聊天窗口底部添加一条2像素宽的灰色边框 */
}
 
.chat-window div {
    display: flex;
    /* 使用Flexbox布局,使消息能够灵活排列 */
    margin-bottom: 10px;
    /* 在每个消息下方添加10像素的外边距 */
}
 
.user-message {
    justify-content: flex-end;
    /* 将用户消息右对齐 */
    color: #007bff;
    /* 设置用户消息文本颜色为蓝色 */
}
 
.bot-message {
    justify-content: flex-start;
    /* 将机器人消息左对齐 */
    color: #28a745;
    /* 设置机器人消息文本颜色为绿色 */
}
 
.message-content {
    display: flex;
    /* 使用Flexbox布局,使头像和文本能够水平排列 */
    align-items: center;
    /* 垂直居中对齐头像和文本 */
}
 
.message-content img {
    width: 30px;
    /* 设置头像宽度为30像素 */
    height: 30px;
    /* 设置头像高度为30像素 */
    border-radius: 50%;
    /* 设置头像为圆形 */
    margin-right: 5px;
    /* 给头像右边添加5像素的外边距 */
}
 
.message-text {
    max-width: 200px;
    /* 控制消息文本的最大宽度 */
    padding: 5px;
    /* 在消息文本周围添加内边距 */
    border-radius: 5px;
    /* 设置消息文本的边框圆角为5像素 */
    word-wrap: break-word;
    /* 确保长单词也能换行 */
    white-space: normal;
    /* 允许文本内的空白符正常显示,允许换行 */
}
 
.user-message .message-content {
    gap: 5px;
    /* 使用gap属性增加头像和文本之间的间距 */
}
 
.user-message .message-text {
    background-color: #e9f5ff;
    /* 设置用户消息背景颜色为浅蓝色 */
}
 
.bot-message .message-text {
    background-color: #d1f9d1;
    /* 设置机器人消息背景颜色为浅绿色 */
}
 
.input-container {
    display: flex;
    /* 使用Flexbox布局,使输入框和按钮能够水平排列 */
    padding: 10px;
    /* 在输入容器内部添加内边距 */
}
 
#userInput {
    flex: 1;
    /* 使输入框占据可用空间的剩余部分 */
    padding: 5px;
    /* 在输入框内部添加内边距 */
    border: 1px solid #ccc;
    /* 为输入框添加1像素宽的灰色边框 */
    border-radius: 3px;
    /* 设置输入框的边框圆角为3像素 */
}
 
#sendButton {
    padding: 5px 10px;
    /* 在按钮内部添加内边距,上下5像素,左右10像素 */
    margin-left: 5px;
    /* 在按钮左边添加5像素的外边距,与输入框保持一定距离 */
    border: 1px solid #ccc;
    /* 为按钮添加1像素宽的灰色边框 */
    background-color: #007bff;
    /* 设置按钮背景颜色为蓝色 */
    color: #fff;
    /* 设置按钮文本颜色为白色 */
    border-radius: 3px;
    /* 设置按钮的边框圆角为3像素 */
    cursor: pointer;
    /* 当鼠标悬停在按钮上时,显示为手型光标,表示可点击 */
}
  • 布局与对齐:使用Flexbox布局来实现元素的居中对齐和分布,使得聊天界面在不同设备上都能保持良好的显示效果。
  • 样式与主题:通过颜色和背景的设置,区分用户消息和机器人消息,增强用户体验。使用圆角、边距和内边距来增加视觉层次和舒适度。
  • 响应式设计:通过设置最大高度和允许滚动,确保聊天窗口在内容过多时不会破坏页面的整体布局。
3.JavaScript结构
document.addEventListener('DOMContentLoaded', () => {
    // 当DOM内容加载完毕后,执行以下代码

    const chatWindow = document.getElementById('chatWindow');
    // 获取页面中ID为'chatWindow'的元素,用于显示聊天消息

    const userInput = document.getElementById('userInput');
    // 获取页面中ID为'userInput'的元素,用于用户输入消息

    const sendButton = document.getElementById('sendButton');
    // 获取页面中ID为'sendButton'的元素,即发送消息的按钮

    sendButton.addEventListener('click', sendMessage);
    // 为发送按钮添加点击事件监听器,点击时调用sendMessage函数

    userInput.addEventListener('keypress', (e) => {
        // 为用户输入框添加键盘按键事件监听器
        if (e.key === 'Enter') {
            // 如果按下的键是'Enter'(回车键)
            sendMessage();
            // 调用sendMessage函数发送消息
        }
    });

    function sendMessage() {
        // 定义sendMessage函数,用于处理消息发送逻辑
        const userMessage = userInput.value.trim();
        // 获取用户输入框的值,并去除首尾空白
        if (userMessage) {
            addMessage(userMessage, 'user');
            // 调用addMessage函数,将用户消息添加到聊天窗口
            const reply = generateAIReply(userMessage);
            // 调用generateAIReply函数,生成AI的回复
            addMessage(reply, 'bot');
            // 调用addMessage函数,将AI的回复添加到聊天窗口
            userInput.value = '';
            // 清空用户输入框
        }
    }

    function generateAIReply(message) {
        // 定义generateAIReply函数,用于生成AI的回复
        message = message.toLowerCase();
        // 将用户消息转换为小写,以便进行不区分大小写的匹配
        if (message.includes("你好") || message.includes("hi")) {
            // 如果消息包含"你好"或"hi"
            return "你好!有什么我可以帮助你的吗?";
            // 返回AI的问候语
        }
        // 其他关键字回复
        else {
            // 如果消息不包含上述关键字
            return "我不太明白你的意思,可以说得更清楚一些吗?";
            // 返回AI的不理解回复
        }
    }

    function addMessage(message, sender) {
        // 定义addMessage函数,用于将消息添加到聊天窗口
        const messageElement = document.createElement('div');
        // 创建一个div元素,作为消息容器
        messageElement.className = sender === 'user' ? 'user-message' : 'bot-message';
        // 根据发送者(用户或AI)设置消息容器的类名

        const messageContent = document.createElement('div');
        // 创建一个div元素,作为消息内容的容器
        messageContent.className = 'message-content';
        // 设置消息内容容器的类名

        const text = document.createElement('span');
        // 创建一个span元素,用于显示消息文本
        text.className = 'message-text';
        // 设置消息文本的类名
        text.textContent = message;
        // 设置消息文本的内容
        messageContent.appendChild(text);
        // 将消息文本添加到消息内容容器中

        const avatar = document.createElement('img');
        // 创建一个img元素,用于显示发送者的头像
        if (sender === 'user') {
            avatar.src = '头像1.jpg';
            // 设置头像的图片源为用户头像
            messageContent.appendChild(avatar);
        } else {
            avatar.src = '头像2.jpg';
            // 设置头像的图片源为AI头像
            messageContent.insertBefore(avatar, text);
        }

        messageElement.appendChild(messageContent);
        // 将消息内容容器添加到消息容器中
        chatWindow.appendChild(messageElement);
        // 将消息容器添加到聊天窗口中
        chatWindow.scrollTop = chatWindow.scrollHeight;
        // 将聊天窗口滚动到最底部,以便显示最新消息
    }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2011-2019年各省总抚养比数据

2011-2019年各省总抚养比数据 1、时间&#xff1a;2011-2019年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;行政区划代码、地区、年份、总抚养比(人口抽样调查)(%) 4、范围&#xff1a;31省 5、指标解释&#xff1a;总抚养比也称总负担系数。指人口总体中非劳动年…

【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式

文章目录 一、匿名函数&#xff08;delegate &#xff09;1、什么是匿名函数&#xff1f;2、匿名函数的基本语法2.1 语法2.2 **没有参数的匿名函数&#xff1a;**2.3 **有参数的匿名函数&#xff1a;**2.4 **有返回值的匿名函数&#xff1a;** 3、匿名函数的使用示例3.1 作为参…

脱离电路图编程

SM0.0常开始终吸合 SM0.1&#xff08;特殊中继&#xff09; 常开&#xff1a;闭合一次再断开 常闭&#xff1a;断开一次再闭合 上述是依据电路图编程

人工智能及深度学习的一些题目

1、一个含有2个隐藏层的多层感知机&#xff08;MLP&#xff09;&#xff0c;神经元个数都为20&#xff0c;输入和输出节点分别由8和5个节点&#xff0c;这个网络有多少权重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;权重是连接神经元的参数&#xff0c;每个连接都有一…

OpenGL变换矩阵和输入控制

在前面的文章当中我们已经成功播放了动画&#xff0c;让我们的角色动了起来&#xff0c;这一切变得比较有意思了起来。不过我们发现&#xff0c;角色虽然说是动了起来&#xff0c;不过只是在不停地原地踏步而已&#xff0c;而且我们也没有办法通过键盘来控制这个角色来进行移动…

【ArcGIS Pro】完整的nc文件整理表格模型构建流程及工具练习数据分享

学术科研啥的要用到很多数据&#xff0c;nc文件融合了时间空间数据是科研重要文件。之前分享过怎样将nc文件处理成栅格后整理成表格。小编的读者还是有跑不通整个流程的&#xff0c;再来做一篇总结篇&#xff0c;也分享下练习数据跟工具&#xff0c;如果还是弄不了的&#xff0…

linux-21 目录管理(一)mkdir命令,创建空目录

对linux而言&#xff0c;对一个系统管理来讲&#xff0c;最关键的还是文件管理。那所以我们接下来就来看看如何实现文件管理。当然&#xff0c;在文件管理之前&#xff0c;我们说过&#xff0c;文件通常都放在目录下&#xff0c;对吧&#xff1f;所以先了解目录&#xff0c;可能…

vulnhub jangow靶机

1.扫描靶机IP arp-scan -l如果扫不到靶机的话根据以下配置 启动时点击第二个 按回车 继续选择第二个 按e进入编辑 删除"recovery nomodeset" 在末尾添加"quiet splash rw init/bin/bash" Ctrlx 启动进入如下界面 passwd修改root密码 重启电脑登录root修…

惠普HP proliant DL380 G6服务器使用

惠普HP proliant DL380 G6服务器使用经历 前言 HP ProLiant DL380 G6是一款机架式服务器&#xff0c;标配1个Xeon E5504处理器。 已被列入“高耗能老旧通信设备淘汰指导目录” 配置 基本类别 类别 机架式 结构 2U 内存 内存类型 DDRIII 内存大小 4GB&#xff08;单条插槽…

java 斐波那契查找,涵盖原理、算法分析、实现细节、优缺点、应用场景等

一、定义 斐波那契查找&#xff08;Fibonacci Search&#xff09;是一种基于斐波那契数列的查找算法&#xff0c;适用于已排序的数组。它利用斐波那契数列的性质来减少比较次数&#xff0c;并且能够在某些条件下比二分查找更快。 更多优质资源推荐&#xff1a; http://sj.yso…

内网学习:工作组用户与权限

目录 一、本地用户组介绍本地工作组介绍用户与组的关系 二、四种用户类型及权限比较本地系统最高权限&#xff08;System账户&#xff09;特性Administrator与System账户的区别 本地最高管理员&#xff08;Administrator用户&#xff09;特性 本地普通管理员特性 本地普通用户特…

图片转成oled使用的字模数据

目录 oled尺寸 如何生成用到的图片 图片转字模 1.首先用Img2Lcd转成bmp单色图片 2.然后用PCtoLCD2002把单色图片转字模 oled尺寸 我使用0.96寸oled模块&#xff0c;对应着的分辨率是128*64&#xff0c;对应着宽高像素比128*64。所以不是随意一张图片就能用的&#xff0c;…

PTPVT 插值说明

文章目录 PTPVT 插值说明 PTPVT 插值说明PVT Hermite插值PVT 三次多项式插值PT 插值Sin轨迹测试结果PVT Hermite插值结果PVT 三次多项式插值结果PT 插值结果 用户轨迹测试结果PVT Hermite插值结果PT 插值结果 PTPVT 插值说明 PT模式&#xff1a; 位置-时间路径插值算法。 PVT模…

Mac安装多个版本node、java、python 等开发软件环境,安装、卸载、升级多个数据库

安装多个版本node、java、python 等开发软件环境 使用nvm&#xff08;Node.js Version Manager&#xff09;来管理多个Node.js版本。 使用jenv来管理多个Java版本。 使用pyenv来管理多个Python版本。 以下是安装和使用这些版本管理器的基本步骤&#xff1a; 1. 安装多个版本…

【深度学习】卷积网络代码实战ResNet

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

添砖java第四更@(+)@

今天的学习内容主要是围绕着实体类来进行的&#xff0c;就是说在java里面我们常常会把数据存放和方法分别存放在不同的类里面。 首先就是关于实体类是什么&#xff0c;实体类就是只提供了get方法,set方法,和默认构造器的类。 接着就是熟悉java与别的语言的不同之处就在于它是…

算法题(19):多数元素

审题&#xff1a; 数组不为空且一定存在众数。需要返回众数的数值 思路&#xff1a; 方法一&#xff1a;哈希映射 先用哈希映射去存储对应数据出现的次数&#xff0c;然后遍历找到众数并输出 当然也可以在第一次映射的过程中就维护一个出现次数最多的数据&#xff0c;这样子就可…

电子商务网站的三层架构的理解和实践

在电子商务领域&#xff0c;网站架构的设计对于系统的稳定性、可扩展性和用户体验至关重要。其中&#xff0c;三层架构作为一种经典的设计模式&#xff0c;被广泛应用于各类电子商务网站中。本文将从理论、理解和实践三个方面&#xff0c;详细探讨电子商务网站的三层架构。 一、…

LVS 负载均衡原理 | 配置示例

注&#xff1a;本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时&#xff0c;可以看看原理实现。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写&#xff0c;翻译成中文就是负…

JavaScript甘特图 dhtmlx-gantt

背景 需求是在后台中&#xff0c;需要用甘特图去展示管理任务相关视图&#xff0c;并且不用依赖vue&#xff0c;兼容JavaScript原生开发。最终使用dhtmlx-gantt&#xff0c;一个半开源的库&#xff0c;基础功能免费&#xff0c;更多功能付费。 甘特图需求如图&#xff1a; 调…