vue实现简易基本对话功能

基于vue3.0实现的功能,仿照微信、QQ聊天界面。

HTML代码块

<template><el-container style="height: 100%" ref="bodyform"><div class="el_main_content"><div class="main_content_header">这是一个对话框</div><div class="main_content_center"><el-scrollbarclass="faultExpertConsultation_scrollbar"ref="scrollbarRef"><!--对话内容--><divv-for="(item, index) in messagesWithTimestamps":key="index"v-show="messagesWithTimestamps.length > 0"><!--对话时间--><div v-if="item.showTime" class="chat_time">{{ formatSendTime(item.timestamp) }}</div><!--提问--><div class="question chat"><div class="chat_question chat_common"><span>{{ item.question }}</span></div><el-avatar class="avatar"><span class="me">我</span></el-avatar></div><!--回答--><div class="answer chat" v-if="item.answer"><el-avatar :src="robot" /><div class="chat_answer chat_common"><span>{{ item.answer }}</span></div></div></div></el-scrollbar></div><div class="main_content_footer"><div class="input_box"><textarea class="chat-input no-border" v-model="question" /></div><div class="btn_box"><el-button type="primary" class="btn" @click="askClick(question)">发送</el-button></div></div></div></el-container>
</template>

JavaScript代码块

<script setup>
import { ref, onMounted, nextTick, computed, watch } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
const question = ref(""); //输入框值
const chatList = ref([]); //循环的聊天数组
const scrollbarRef = ref(null);
//创建新的对话数组,加上属性showTime
const messagesWithTimestamps = computed(() => {return chatList.value.map((item, index) => ({...item,showTime: index === 0 || shouldShowTime(index),}));
});
//计算两次会话时间是否超过3分钟方法
const shouldShowTime = (index) => {const current = new Date(chatList.value[index - 1].timestamp);const next = new Date(chatList.value[index].timestamp);const diff = next ? next - current : 0;return diff > 3 * 60 * 1000; // 如果间隔超过3分钟返回true
};
//提问方法
const askClick = (val) => {if (val != "") {chatList.value.push({question: val, //问题answer: "", //回答timestamp: new Date(), //时间戳to: "", //接收者form: "", //发送者});} else {ElMessage("不能发送空白消息");}
};
//滚动事件到底部事件
const scrollToBottom = () => {nextTick(() => {let chat = document.querySelector(".main_content_center");scrollbarRef.value.wrapRef.scrollTop = chat.scrollHeight;});
};
watch(chatList.value,(newVal, oldVal) => {scrollToBottom();},{ immediate: true }
);const formatSendTime = (sendTime) => {const now = new Date();const sendDate = new Date(sendTime);// 计算时间差(以毫秒为单位)const timeDiff = now - sendDate;const startOfToday = new Date(now.getFullYear(),now.getMonth(),now.getDate());const startOfTargetDate = new Date(sendDate.getFullYear(),sendDate.getMonth(),sendDate.getDate());// 一天内的毫秒数const oneDay = 24 * 60 * 60 * 1000;// 如果发送时间在当前时间之前if (timeDiff < 0) {return "Invalid time"; // 或者其他错误处理}// 发生在同一天if (startOfToday.getTime() === startOfTargetDate.getTime()) {return formatTime(sendDate);}// 如果发送时间在一天内if (timeDiff < oneDay) {return "昨天 " + formatTime(sendDate);}// 如果发送时间在二天至七天内if (timeDiff < 7 * oneDay) {const weekday = getWeekday(sendDate);return weekday + " " + formatTime(sendDate);}// 如果发送时间超过七天return (sendDate.toLocaleDateString("zh-CN", {year: "numeric",month: "2-digit",day: "2-digit",}) +" " +formatTime(sendDate));
};
const formatTime = (date) => {// 格式化时间为“时:分”const hours = date.getHours().toString().padStart(2, "0");const minutes = date.getMinutes().toString().padStart(2, "0");return hours + ":" + minutes;
};
const getWeekday = (date) => {// 获取星期几的中文表示const weekdays = ["星期天","星期一","星期二","星期三","星期四","星期五","星期六",];return weekdays[date.getDay()];
};
</script>

CSS代码块

<style>
.no-border {border: none;/* 可选的样式,以去除焦点时的边框(如果需要的话) */outline: none;width: none;height: none;resize: none;
}
</style><style lang="less" scoped>
.el_main_content {width: 50%;height: 70%;border-radius: 5px;border: 1px solid #e4e7ed;box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);margin: auto;.main_content_header {width: 100%;height: 50px;border-radius: 5px;background-color: #7de0bd;display: flex;align-items: center;justify-content: center;font-size: 16px;}.main_content_center {width: 100%;position: relative;height: calc(100% - 170px);margin: 10px 0px;.chat_time {display: flex;justify-content: center;font-size: 10px;}.question {justify-content: flex-end;}.chat_question {background-color: #8ce45f;margin-right: 5px;color: #ffffff;}.chat_answer {background-color: #f2f3f5;margin-left: 5px;}.chat {width: 98%;margin: 10px auto;display: flex;}.chat_common {max-width: 40%;padding: 10px;border-radius: 2px;word-break: break-all;display: flex;align-items: center;}.avatar {background-color: #409eff;border: 2px solid #409eff;}.me {font-size: 16px;color: #ffffff;font-weight: bold;}}.main_content_footer {width: 100%;height: 100px;border-top: 1px solid #e4e7ed;.input_box {width: 100%;height: 60px;.chat-input {width: calc(100% - 20px);padding: 10px;margin: auto;}}.btn_box {width: 100%;height: 40px;display: flex;justify-content: flex-end;align-items: center;.btn {margin-right: 10px;}}}
}
</style>

运行效果

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

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

相关文章

Git基本配置,使用Gitee(一)

1、设置Giter的user name和email 设置提交用户的信息 git config --global user.name "username" git config --global user.email "Your e-mail"查看配置 git config --list2、生成 SSH 公钥 通过命令 ssh-keygen 生成 SSH Key -t key 类型 -C 注释 ssh-…

K8S 证书过期不能使用kubectl之后,kubeadm 重新生成证书

查询证书过期时间 kubeadm certs check-expiration重新生成证书 # 重新生成所有证书 kubeadm certs renew all # 重新生成某个组件的证书 kubeadm certs renew 组件名称 如&#xff1a;apiserver生成新的配置 # 重新生成kubeconfig配置 kubeadm init phase kubeconfig # 重…

LabVIEW中PID控制器系统的噪声与扰动抑制策略

在LabVIEW中处理PID控制器系统中的噪声和外部扰动&#xff0c;需要从信号处理、控制算法优化、硬件滤波和系统设计四个角度入手。采用滤波技术、调节PID参数、增加前馈控制和实施硬件滤波器等方法&#xff0c;可以有效减少噪声和扰动对系统性能的影响&#xff0c;提高控制系统的…

原生小程序一键获取手机号

1.效果图 2.代码index.wxml <!-- 获取手机号 利用手机号快速填写的功能&#xff0c;将button组件 open-type 的值设置为 getPhoneNumber--><button open-type"getPhoneNumber" bindgetphonenumber"getPhoneNumber">获取手机号</button> …

Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架&#xff0c;它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。 以下是一些在 Spring 框架中常见的设计模式&#xff0c;以及用代码示例来解释它们&#xff1a; 一、工厂模式&#xff08;Factory Pattern&#xff…

elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester&#xff08;补全建议&#xff09; Elasticsearch7.15安装 官方文档 补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能&#xff0c;引导用户在输入时找到相关结果&#xff0c;提高搜索精度。 理想情况下&#xff0c;自动补…

自学动态规划——最长公共子序列(子序列问题)

最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 我又悟了&#xff01;本题和之前刷的那些子序列区别之处在于&#xff0c;可以是不连续的。下面小小总结一波&#xff1a; 初始序列有俩——创建二维dp[i][j]表示当text1取i个&#xff0c;text2…

研发数据库的思路

一、设计目的 设计一款关系型网络数据库。 二、设计要求&#xff1a; (一)安装快速 安装程序特别简单。 (二)配置简单 最小化配置。 (三)使用简单&#xff0c;高效 程序占用空间小&#xff0c;支持基本的SQL语法。 (四)稳定可靠 尽量不依赖其他不稳定库。 (五)其他要求 属于…

快速排序法

算法概况 快速排序&#xff08;QuickSort&#xff09;是对冒泡排序的一种改进&#xff0c;快速排序由C.A.R.Hoare在1960年提出。 算法思路 通过一趟排序将待排序数组分割成两部分&#xff0c;其中一部分所有数据都比另一部分所有数据小&#xff0c;然后再按此方法对这两部分…

02-CSS3基本样式

目录 1. CSS3简介 1.1 CSS3的兼容情况 1.2 优雅降级和渐进增强的开发思想 2. 新增选择器 2.1 选择相邻兄弟 2.2 匹配选择器 2.3 属性选择器(重点) 2.4 结构性伪类选择器&#xff08;重点&#xff09; 2.4.1 整体结构类型 2.4.2 标签结构类型 2.4.3 指定子元素的序号&…

模型训练、结果存储、API 调用的系列优化|ModelWhale 版本更新

蜂飞蝶舞&#xff0c;万物并秀&#xff0c;明媚的春光中 ModelWhale 带来新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 新增 IDE 中使用训练记录&#xff08;专业版✓ 团队版✓&…

Ansible04-Ansible Vars变量详解

目录 写在前面6 Ansible Vars 变量6.1 playbook中的变量6.1.1 playbook中定义变量的格式6.1.2 举例6.1.3 小tip 6.2 共有变量6.2.1 变量文件6.2.1.1 变量文件编写6.2.1.2 playbook编写6.2.1.3 运行测试 6.2.2 根据主机组使用变量6.2.2.1 groups_vars编写6.2.2.2 playbook编写6.…

迈的普拉姆利普绘图:深入解析与实战应用

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;matplotlib绘图的基本原理 代码案例 二、深入了解&#xff1a;matplo…

python数据库操作

数据库基本操作 一、 数据库操作1. mysql 驱动安装&#xff1a;2. mysql基本操作: 二、代码演示 一、 数据库操作 1. mysql 驱动安装&#xff1a; MySQL 是最流行的关系型数据库管理系统&#xff0c;如果你不熟悉 MySQL&#xff0c;可以阅读我们的 MySQL 教程。 本章节我们为…

数据结构与算法02-排序算法

介绍 排序算法是计算机科学中被广泛研究的一个课题。历时多年&#xff0c;它发展出了数十种算法&#xff0c;这些 算法都着眼于一个问题&#xff1a;如何将一个无序的数字数组整理成升序&#xff1f;先来学习一些“简单排序”&#xff0c;它们很好懂&#xff0c;但效率不如其他…

闽盾杯 2021 DNS协议分析

今年CISCN的Tough DNS 的前戏就是DNS协议分析 直接可以查找到flag的base64形式Zmxh 发现就是请求的dnslog 携带的数据 过滤器就是 dns tshark -r dns.pcapng -T json -Y "dns" >1.json 字段选择 dns.qry.name tshark -r dns.pcapng -T json -Y "dns"…

内网渗透-隧道搭建ssp隧道代理工具

内网渗透-隧道搭建&ssp隧道代理工具 目录 内网渗透-隧道搭建&ssp隧道代理工具spp隧道代理工具spp工作原理图cs上线主机spp代理通信服务端配置客户端配置CS配置设置CS生成木马的监听器配置CS监听上线的监听器生成木马 spp隧道搭建服务端配置客户端配置CS配置 内网穿透&a…

基于语音识别的智能电子病历(四)语音识别的要求

从本章开始 讲解 医疗行业的语音识别。在开始之前先聊聊 医疗行业的语音识别的一些要求。 识别的结果要满足下面的要求&#xff1a; 一、Capitalization单词大写处理 句首单词首字母大写.人称代词I出现在句中任何位置都要大写.标题(heading)全部字母大写.例如: PAST MEDICAL…

根据模板和git commit自动生成日·周·月·季报

GitHub - qiaotaizi/dailyreport: 日报生成器 GitHub - yurencloud/daily: 程序员专用的日报、周报、月报、季报自动生成器&#xff01; config.json: { "Author": "gitname", "Exclude": ["update:", "add:", "…

实际测试stm32中断优先级

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);第一个函数 HAL_NVIC_SetPriority 是用来设置单个优先级的抢占优先级和响应优先级的值。第二个…