Vue3+Ts实现聊天机器人(chatBot-附代码)

news2024/9/28 7:25:32

一:项目介绍

        本次实验主要涉及到的技术是 Vue3 + Ts,当然其中也有部分是 Vue2 格式的代码以及 json 和 CSS 布局等。本来是想仿照 文心一言 来开发的一个聊天机器人案例。结果由于时间不足,可能只是做出来了一个半成品。不过核心功能是有的。由于大 json 内数据写的比较少,因此可测数据在下文中有。有需要的小伙伴可以自行添加,格式在文中也有。

        PS.代码在文章底部,需要的小伙伴请底部自取。

二:各部分代码

1、项目目录

        以下是项目的目录,index.vue 是我们所看到的主页面,components 下的两个文件一个是消息回复的组件,一个是左侧导航的组件。至于data.json 则是一个大 json 数据,回复的内容是从这里面拿的,判断问题产生回复。

2、index.vue代码

         这个页面呢,主要就是将各个组件进行逻辑串联。里面有定义清屏方法和加载提示等。该页面更多的是布局。这里小白的话可以看一下按回车发送消息的判断逻辑。

<template>
    <div class="screen">
        <div class="left">
            <leftMenu />
        </div>
        <div class="right">
            <div class="up">
                <chatMessage :sendMessage="sendMessage" :data='data' />
            </div>
            <div class="input">
                <el-input class="inputStyle" v-model="message" placeholder="Please input your problem" clearable />
                <el-button @click="send" @keyup.enter="keyDown($event)">send</el-button>
            </div>
        </div>
    </div>
    <el-button type="primary" @click="openFullScreen2"> 重新加载 </el-button>
</template>
  
<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import { ElLoading } from 'element-plus'
import leftMenu from '@/views/5_chatbotDemo/components/leftMenu.vue'
import chatMessage from '@/views/5_chatbotDemo/components/chatMessage.vue'

/** 发送消息模块 */
let message = ref('')
let sendMessage = ref('')
let data = ref() // 定义一个时间戳,方便检查是否更新发送了数据
/** 发送消息的方法 */
function send() {
    sendMessage.value = message.value
    data.value = Date.now()
    message.value = ''
    // console.log(data.value);
}

/** 刷新加载 */
onMounted(() => {
    openFullScreen2();
    window.addEventListener("keydown", keyDown);
});
/** 回车方法 */
function keyDown(e: any) {
    // 回车则执行登录方法 enter键的ASCII是13
    if (e.key == 'Enter') {
        send()
    }
}
/** 加载中... */
const openFullScreen2 = () => {
    const loading = ElLoading.service({
        lock: true,
        text: '',
        background: 'rgba(0, 0, 0, 0.7)',
    })
    setTimeout(() => {
        loading.close()
    }, 2000)
}
</script>
  
<style scoped>
.screen {
    height: 80vh;
    display: flex;
    flex-direction: row;
    background: rgb(236, 239, 246);
}

.right {
    width: 100%;
    position: relative;
}

.up {
    position: absolute;
    top: 10px;
    left: 30%;
    /* align-items: center; */
}

.input {
    position: absolute;
    display: flex;
    bottom: 0px;
    left: 40%;
}

.inputStyle {
    width: 300px;
    margin-right: 10px;
}
</style>

3、data.json数据

        这个是大json里面存储的数据,我们可以看到这里是一个放了很多对象的数组,对象里有问题字段 question 和回复字段 replay 而我们实现的逻辑则是判断用户发送的消息是否被这些 question 所包含,如果包含的话就会返回对应的 replay 。

[
    {
        "question":"你叫什么名字?",
        "replay":"我的名字是小娃!"
    },{
        "question":"你的年龄是几岁?",
        "replay":"我今年20岁啦!"
    },{
        "question":"你上几年级",
        "replay":"我今年大四了!"
    },{
        "question":"你是哪里人",
        "replay":"我来自浙江温州"
    },{
        "question":"你现在在干嘛?",
        "replay":"我正在学习..."
    },{
        "question":"你是猪吗?",
        "replay":"是的,我是一头大笨猪~"
    },{
        "question":"今天天气怎么样?",
        "replay":"为什么要问天气怎么样?有这精力不如好好赚钱,好好想想自己的原因,这么多年了工资涨没涨心里有点数!"
    },{
        "question":"我好无聊。",
        "replay":"不要无聊,小娃给你唱首歌吧,太阳当空照,花儿对我笑,小鸟说:喳喳喳,你为什么背上炸药包?"
    }
]

4、leftMenu.vue代码

        该组件由于时间关系并没有写逻辑,只是简单地布局,如果有小伙伴感兴趣的话可以自己思考开发一些东西上去。布局已经布好啦。 

<template>
  <div class="home">
    <div class="title">我能做什么?</div>
    <div class="menu">
      <div class="item" v-for="item in menuItem">{{ item }}</div>
    </div>
  </div>
</template>

<script setup>
let menuItem=['陪你唠嗑','发现生活','周游世界','吃吃喝喝','一起长胖']
</script>

<style lang="scss" scoped>
.home{
    width: 200px;
    height: 100%;
    background: linear-gradient(to bottom, rgb(238,231,235), rgb(221,221,245));
}
.title{
    color: rgb(81,122,237);
    height: 80px;
    line-height: 80px;
    text-align: center;
    font-size: 26px;
    border-bottom: 1px solid rgb(222,219,232);
}
.menu{
  .item{
    font-size: 18px;
    text-align: center;
    height: 60px;
    line-height: 60px;
  }
  .item:hover{
    cursor: pointer;
    background: rgb(221,221,245);
  }
}
</style>

5、chatMessage.vue代码

        来了来了,这个页面是我们的核心组件,消息的发送,判断,回复等逻辑都是写在了这个组件里的。里面有写了注释,各位小伙伴可以沉下心来看一看哦、

<template>
  <div class="clear">
    <el-button type="primary" @click="clearScreen">清屏</el-button>
  </div>

  <div class="home" >
    <div v-for="(item, index) in chatArr" :key="index">
      <div class="reply" v-if="item.status === '0'">
      <div class="avatar"><img width="50" src="@/assets/images/avatar.jpeg" alt=""></div>
      <div class="left"></div>
      <div class="content">{{ item.content }}</div>
    </div>

    <div class="question" v-if="item.status === '1'">
      <div class="content">{{ item.content }}</div>
      <div class="left"></div>
      <div class="avatar"><img width="50" src="@/assets/images/avatar2.png" alt=""></div>
    </div>
    </div>
  </div>
</template>

<script >
import { defineComponent, reactive } from "vue";
import jsonData from "@/views/5_chatbotDemo/data.json"

export default defineComponent({
  watch: {
    data(newValue) {
      this.addArr('1', this.sendMessage);
      this.replayFnc() // 当监听到有消息传入的时候调用回复方法产生回复
    }
  },
  // props:['sendMessage']
  props: {
    sendMessage: {
      type: String,
      default: "",
    },
    data: 0
  },
  setup() {
    let chatArr = reactive([
      {
        status: '0', // 0-回复,1-问题
        content: '您好,我是你的机器助手,有什么可以帮助到您的吗?'
      }, {
        status: '1',
        content: '我要开始提问啦!'
      }, {
        status: '0',
        content: '请问您想要问什么呢?'
      }
    ]);
    /** 判断问题,产生回复的方法 */
    function replayFnc() {
      let hasQuestion = false
      let replayMessage = '听不懂'
      /** 循环判断是否存在该问题的答案,存在的话就改变回复的内容 */
      for (let index = 0; index < jsonData.length; index++) {
        if(jsonData[index].question.indexOf(this.sendMessage) > -1){
          replayMessage =jsonData[index].replay 
          hasQuestion = true
        }
      }
      addArr('0',replayMessage)
    }

    /** 添加进数组的方法 */
    function addArr(status, content) {
      let obj = {
        status: status,
        content: content
      }
      chatArr.push(obj)
    }
    /** 清屏 */
    function clearScreen(){
      chatArr.length = 0
      console.log(chatArr);
    }
    return {
      clearScreen,
      replayFnc,
      chatArr,
      addArr
    }
  }
});
</script>

<style lang="scss" scoped>
.clear{
  width: 800px;
  margin-bottom: 10px;
  display: flex;
  justify-content: right;
}
.home {
  height: 70vh;
  position: relative;
  width: 800px;
  overflow: auto; // 滚动条
}

// 回复的样式
.reply {
  display: flex;
  margin-top: 5px;

  .content {
    padding: 15px;
    max-width: 500px;
    border: 1px solid;
    color: #676490;
    ;
  }

  .left {
    width: 0px;
    height: 0px;
    border: 15px solid transparent;
    border-right-color: rgba(222, 222, 244);
  }
}

// 提问的样式
.question {
  display: flex;
  margin-top: 5px;
  // background: greenyellow;
  justify-content: right;

  .content {
    padding: 15px;
    max-width: 500px;
    border: 1px solid;
    color: #676490;
  }

  .left {
    width: 0px;
    height: 0px;
    border: 15px solid transparent;
    border-left-color: rgba(222, 222, 244);
  }
}
</style>

三:结尾

        其实本次实验的整体逻辑代码是很简单的,只是使用了 Vue3 + Ts 技术,其实现的逻辑和细节部分才是本次实验的重点。也算是通过本次复习了 Vue3 + Ts + json +css 等诸多内容吧。最后附上gitee的地址:

乾辰/vue3全家桶练习icon-default.png?t=N7T8https://gitee.com/qianchen12138/vue3-family-bucket-practice

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

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

相关文章

java项目之消防物资存储系统(ssm+vue)

项目简介 消防物资存储系统实现了以下功能&#xff1a; 管理员功能: 管理员登陆后&#xff0c;主要模块包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;仓库管理&#xff0c;物资入库管理&#xff0c;物资出库管理&#xff0c;仓库管理&#xff0c;物资详情管…

AI数字人授课/朗读文章会是什么样子的(叮,您的视频生成好了)

阿酷TONY&#xff0c;长沙&#xff0c;2023.11.23 AI数字人授课/朗读文章&#xff08;叮&#xff0c;您的视频生成好了&#xff09; 1.前几天的教程 上篇文章教程&#xff1a; 太累了&#xff0c;是时候让AI数字人来帮我干活了&#xff08;走&#xff0c;上教程&#xff09;…

2016年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2016 级考研管理类联考数学真题一、问题求解&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。真题&#xff08;2016-01&…

2022年全国英烈纪念设施数据,各区县均有!

中国是一个拥有悠久历史和灿烂文化的国家&#xff0c;其英烈纪念设施承载着中国人民对为国家独立、民族解放和民主进步而英勇斗争的先烈们的崇敬和缅怀之情。 这些设施不仅是中国革命历史和先烈精神的重要载体&#xff0c;也是传承红色文化、弘扬革命精神的重要场所。 今天分享…

十一 动手学深度学习v2计算机视觉 ——微调

一、网络架构 一个神经网络一般可以分成两块 特征抽取&#xff0c;将原始像素变成容易线性分割的特征。线性分类器来做分类。 二、训练 是一个目标数据集上的正常训练任务&#xff0c; 但使用更强的正则化 使用更小的学习率使用更少的数据迭代 源数据集远远复杂于目标数据集…

十八、初识elasticsearsh (索引)

目录 一、Elasticsearch的介绍&#xff1a; 二、正向索引和倒排索引 1、正向索引 2、倒排索引 3、索引(index) :相同类型的文档的集合 4、映射(mapping):索引中文档的字段约束信息&#xff0c;类似表的结构约束 一、Elasticsearch的介绍&#xff1a; Elasticsearch是一个…

2-Linux学习环境搭建

1 Linux学习环境搭建 1.1 虚拟化介绍 # win 机器----》装一个虚拟化软件----》虚拟化出linux操作系统# kvm vmware openstack docker k8s # kvm vmware 虚拟化软件 -运行在linux上&#xff0c;做虚拟化的软件 -vmware运行在win&#xff0c;linux&#xff0c;商业软件…

软件测试岗位与职业发展

一、软件测试岗位有哪些&#xff1f; 在企业中&#xff0c;软件测试领域的几个典型的职位有&#xff1a;功能测试工程师&#xff08;也叫手工测试&#xff09;、自动化测试工程师、性能测试工程师、测试开发等。 1、功能测试&#xff08;手工测试&#xff09;工程师 主要工作内…

tomcat国密ssl测试

文章目录 程序包准备部署配置访问测试 程序包准备 下载 tomcat8.5 https://www.gmssl.cn/gmssl/index.jsp 下载 tomcat 国密组件及证书 本次测试所有的程序文件均已打包&#xff0c;可以直接 点击下载 部署配置 自行完成 完成centos 的jdk配置。 部署tomcat,将 gmssl4t.jar…

人机交互模块的发展

人机交互&#xff08;Human-Computer Interaction&#xff0c;HCI&#xff09;是指人与计算机之间进行交互和信息交换的过程。人机交互模块的发展经历了多个阶段&#xff0c;从早期的命令行界面到现在多样化的交互方式&#xff0c;不断发展和创新。以下是一些人机交互模块的发展…

【成功案例】7日ROI超65%!注册率超85%!雷霆网络 联手 NetMarvel 实现效果翻倍增长!

雷霆网络旗下多款角色扮演手游在国内长期霸占买量榜前列&#xff0c;而这股“买量大户”的风依旧吹到了海外&#xff0c;其中《地下城堡3》依靠买量在境外业务收入上增长明显&#xff0c;目前市场潜力巨大。 然而&#xff0c;面对竞争激烈的PRG游戏出海局面&#xff0c;打开市…

如何设置实现本地JumpServer远程访问管理界面

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

在 CentOS 7 上安装 MySQL 8

在 CentOS 7 上安装 MySQL 8 步骤 1: 添加 MySQL Yum 存储库 首先&#xff0c;我们需要添加 MySQL Yum 存储库。打开终端并执行以下命令&#xff1a; sudo yum install -y https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm步骤 2: 导入 MySQL GPG 公钥 …

消息中间件——RabbitMQ(五)快速入门生产者与消费者,SpringBoot整合RabbitMQ!

前言 本章我们来一次快速入门RabbitMQ——生产者与消费者。需要构建一个生产端与消费端的模型。什么意思呢&#xff1f;我们的生产者发送一条消息&#xff0c;投递到RabbitMQ集群也就是Broker。 我们的消费端进行监听RabbitMQ&#xff0c;当发现队列中有消息后&#xff0c;就进…

Django之cookie和session

文章目录 Cookie的介绍Cookie的由来什么是CookieCookie原理Cookie覆盖浏览器查看Cookie 在Django中操作Cookie设置Cookie查询浏览器携带的Cookie删除Cookie Cookie校验登录sessionSession的由来Session设置查看、更新Session值删除Session值Seesion的其他方法Session的其他配置…

Atlassian Confluence 路径遍历和命令执行漏洞 (CVE-2019-3396)

漏洞描述 Confluence 是由澳大利亚软件公司 Atlassian 开发的基于 Web 的企业 wiki。 Atlassian Confluence 6.14.2 版本之前存在一个未经授权的目录遍历漏洞&#xff0c;攻击者可以使用 Velocity 模板注入读取任意文件或执行任意命令。 漏洞环境及漏洞利用 启动docker环境…

主播产品塑造话术

产品卖点 一、品质卓越 我们的产品始终坚持高品质的标准&#xff0c;从原材料的选择到生产工艺的把控&#xff0c;每一个环节都经过严格的品质检测。我们注重产品的耐用性和稳定性&#xff0c;确保您在使用过程中无需担心质量问题。 二、功能强大 我们的产品不仅具备基本的…

HTTP ERROR 403 No valid crumb was included in the request

1、报错截图&#xff1a; 2、产生原因&#xff1a; 开启了csrf&#xff0c;即跨站请求伪造 3、新版本不支持页面修改&#xff0c;故需要修改jenkins配置文件 3.1 进入编辑配置文件 vim /etc/sysconfig/jenkins 3.2 修改JENKINS_JAVA_OPTIONS&#xff0c;并保存修改 JENKI…

获取地区天气

上网找了半天js获取天气的方法&#xff0c;试了好几个都不行&#xff0c;还是得用api才行 1.用的心知天气的api 很简单,注册就能用,调用api需要key,官方网站&#xff1a;https://gaofen.mlogcn.com/documentation/0/00 2.areacode 这个网页里面找 精确到县&#xff1a;https:/…

mysql允许远程连接

1. 检查服务器防火墙 防火墙若开启则需要开放mysql使用的3306端口才可远程访问&#xff1b; 若无安全性要求也可以直接关闭防火墙。 防火墙相关命令&#xff1a; # 检查防火墙状态 systemctl status firewalld # 开启防火墙 systemctl start firewalld # 停止防火墙 systemctl …