当前位置:   article > 正文

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

vue聊天机器人

一:项目介绍

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

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

二:各部分代码

1、项目目录

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

2、index.vue代码

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

  1. <template>
  2. <div class="screen">
  3. <div class="left">
  4. <leftMenu />
  5. </div>
  6. <div class="right">
  7. <div class="up">
  8. <chatMessage :sendMessage="sendMessage" :data='data' />
  9. </div>
  10. <div class="input">
  11. <el-input class="inputStyle" v-model="message" placeholder="Please input your problem" clearable />
  12. <el-button @click="send" @keyup.enter="keyDown($event)">send</el-button>
  13. </div>
  14. </div>
  15. </div>
  16. <el-button type="primary" @click="openFullScreen2"> 重新加载 </el-button>
  17. </template>
  18. <script lang="ts" setup>
  19. import { ref, onMounted } from 'vue'
  20. import { ElLoading } from 'element-plus'
  21. import leftMenu from '@/views/5_chatbotDemo/components/leftMenu.vue'
  22. import chatMessage from '@/views/5_chatbotDemo/components/chatMessage.vue'
  23. /** 发送消息模块 */
  24. let message = ref('')
  25. let sendMessage = ref('')
  26. let data = ref() // 定义一个时间戳,方便检查是否更新发送了数据
  27. /** 发送消息的方法 */
  28. function send() {
  29. sendMessage.value = message.value
  30. data.value = Date.now()
  31. message.value = ''
  32. // console.log(data.value);
  33. }
  34. /** 刷新加载 */
  35. onMounted(() => {
  36. openFullScreen2();
  37. window.addEventListener("keydown", keyDown);
  38. });
  39. /** 回车方法 */
  40. function keyDown(e: any) {
  41. // 回车则执行登录方法 enter键的ASCII是13
  42. if (e.key == 'Enter') {
  43. send()
  44. }
  45. }
  46. /** 加载中... */
  47. const openFullScreen2 = () => {
  48. const loading = ElLoading.service({
  49. lock: true,
  50. text: '',
  51. background: 'rgba(0, 0, 0, 0.7)',
  52. })
  53. setTimeout(() => {
  54. loading.close()
  55. }, 2000)
  56. }
  57. </script>
  58. <style scoped>
  59. .screen {
  60. height: 80vh;
  61. display: flex;
  62. flex-direction: row;
  63. background: rgb(236, 239, 246);
  64. }
  65. .right {
  66. width: 100%;
  67. position: relative;
  68. }
  69. .up {
  70. position: absolute;
  71. top: 10px;
  72. left: 30%;
  73. /* align-items: center; */
  74. }
  75. .input {
  76. position: absolute;
  77. display: flex;
  78. bottom: 0px;
  79. left: 40%;
  80. }
  81. .inputStyle {
  82. width: 300px;
  83. margin-right: 10px;
  84. }
  85. </style>

3、data.json数据

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

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

4、leftMenu.vue代码

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

  1. <template>
  2. <div class="home">
  3. <div class="title">我能做什么?</div>
  4. <div class="menu">
  5. <div class="item" v-for="item in menuItem">{{ item }}</div>
  6. </div>
  7. </div>
  8. </template>
  9. <script setup>
  10. let menuItem=['陪你唠嗑','发现生活','周游世界','吃吃喝喝','一起长胖']
  11. </script>
  12. <style lang="scss" scoped>
  13. .home{
  14. width: 200px;
  15. height: 100%;
  16. background: linear-gradient(to bottom, rgb(238,231,235), rgb(221,221,245));
  17. }
  18. .title{
  19. color: rgb(81,122,237);
  20. height: 80px;
  21. line-height: 80px;
  22. text-align: center;
  23. font-size: 26px;
  24. border-bottom: 1px solid rgb(222,219,232);
  25. }
  26. .menu{
  27. .item{
  28. font-size: 18px;
  29. text-align: center;
  30. height: 60px;
  31. line-height: 60px;
  32. }
  33. .item:hover{
  34. cursor: pointer;
  35. background: rgb(221,221,245);
  36. }
  37. }
  38. </style>

5、chatMessage.vue代码

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

  1. <template>
  2. <div class="clear">
  3. <el-button type="primary" @click="clearScreen">清屏</el-button>
  4. </div>
  5. <div class="home" >
  6. <div v-for="(item, index) in chatArr" :key="index">
  7. <div class="reply" v-if="item.status === '0'">
  8. <div class="avatar"><img width="50" src="@/assets/images/avatar.jpeg" alt=""></div>
  9. <div class="left"></div>
  10. <div class="content">{{ item.content }}</div>
  11. </div>
  12. <div class="question" v-if="item.status === '1'">
  13. <div class="content">{{ item.content }}</div>
  14. <div class="left"></div>
  15. <div class="avatar"><img width="50" src="@/assets/images/avatar2.png" alt=""></div>
  16. </div>
  17. </div>
  18. </div>
  19. </template>
  20. <script >
  21. import { defineComponent, reactive } from "vue";
  22. import jsonData from "@/views/5_chatbotDemo/data.json"
  23. export default defineComponent({
  24. watch: {
  25. data(newValue) {
  26. this.addArr('1', this.sendMessage);
  27. this.replayFnc() // 当监听到有消息传入的时候调用回复方法产生回复
  28. }
  29. },
  30. // props:['sendMessage']
  31. props: {
  32. sendMessage: {
  33. type: String,
  34. default: "",
  35. },
  36. data: 0
  37. },
  38. setup() {
  39. let chatArr = reactive([
  40. {
  41. status: '0', // 0-回复,1-问题
  42. content: '您好,我是你的机器助手,有什么可以帮助到您的吗?'
  43. }, {
  44. status: '1',
  45. content: '我要开始提问啦!'
  46. }, {
  47. status: '0',
  48. content: '请问您想要问什么呢?'
  49. }
  50. ]);
  51. /** 判断问题,产生回复的方法 */
  52. function replayFnc() {
  53. let hasQuestion = false
  54. let replayMessage = '听不懂'
  55. /** 循环判断是否存在该问题的答案,存在的话就改变回复的内容 */
  56. for (let index = 0; index < jsonData.length; index++) {
  57. if(jsonData[index].question.indexOf(this.sendMessage) > -1){
  58. replayMessage =jsonData[index].replay
  59. hasQuestion = true
  60. }
  61. }
  62. addArr('0',replayMessage)
  63. }
  64. /** 添加进数组的方法 */
  65. function addArr(status, content) {
  66. let obj = {
  67. status: status,
  68. content: content
  69. }
  70. chatArr.push(obj)
  71. }
  72. /** 清屏 */
  73. function clearScreen(){
  74. chatArr.length = 0
  75. console.log(chatArr);
  76. }
  77. return {
  78. clearScreen,
  79. replayFnc,
  80. chatArr,
  81. addArr
  82. }
  83. }
  84. });
  85. </script>
  86. <style lang="scss" scoped>
  87. .clear{
  88. width: 800px;
  89. margin-bottom: 10px;
  90. display: flex;
  91. justify-content: right;
  92. }
  93. .home {
  94. height: 70vh;
  95. position: relative;
  96. width: 800px;
  97. overflow: auto; // 滚动条
  98. }
  99. // 回复的样式
  100. .reply {
  101. display: flex;
  102. margin-top: 5px;
  103. .content {
  104. padding: 15px;
  105. max-width: 500px;
  106. border: 1px solid;
  107. color: #676490;
  108. ;
  109. }
  110. .left {
  111. width: 0px;
  112. height: 0px;
  113. border: 15px solid transparent;
  114. border-right-color: rgba(222, 222, 244);
  115. }
  116. }
  117. // 提问的样式
  118. .question {
  119. display: flex;
  120. margin-top: 5px;
  121. // background: greenyellow;
  122. justify-content: right;
  123. .content {
  124. padding: 15px;
  125. max-width: 500px;
  126. border: 1px solid;
  127. color: #676490;
  128. }
  129. .left {
  130. width: 0px;
  131. height: 0px;
  132. border: 15px solid transparent;
  133. border-left-color: rgba(222, 222, 244);
  134. }
  135. }
  136. </style>

三:结尾

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/900208
推荐阅读
相关标签
  

闽ICP备14008679号