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;自动补…

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…

数据结构与算法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…

根据模板和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 是用来设置单个优先级的抢占优先级和响应优先级的值。第二个…

恒压频比开环控制系统Matlab/Simulink仿真分析(SPWM控制方式)

介绍恒压频比的开环控制方法驱动永磁同步电机的转动&#xff0c;首先分析恒压频比的控制原理&#xff0c;然后在Matlab/Simulink中进行永磁同步电机恒压频比开环控制系统的仿真分析&#xff0c;最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行工程实现。 一、…

丝绸之路网络安全论坛成功举办,开源网安受邀分享软件供应链安全落地经验

5月23日&#xff0c;2024第八届丝绸之路网络安全论坛在陕西宾馆会议中心成功举办&#xff0c;本次论坛由陕西省信息网络安全协会主办&#xff0c;以“汇聚万千智慧 夯实安全堤坝”为主题&#xff0c;邀请业内专家学者、企业代表、行业代表共计400余人参加。开源网安常务副总王颉…

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候&#xff0c;通常会对表的每一行&#xff0c;都会进行检查以确保列为空/不为空&#xff0c;这是符合常理的。 但是如果本身这个列上有非空&#xff08;NOT NULL&#xff09;约束&#xff0c;再次检查就会浪费资源。甚至有时候…

Leetcode3165. 不包含相邻元素的子序列的最大和(Go中的线段树分治包含多类数据使用maintain进行维护)

题目截图 题目分析 不能取相邻的&#xff0c;就是打家劫舍 然后更改某一个值就是单点更新 更新后&#xff0c;需要更新区间的值 需要注意的是&#xff0c;使用分治时需要考虑到一头一尾的问题&#xff0c;所以有4种情况&#xff08;选or不选在两个位置&#xff09; 这四种情况…

编程入门(七)【虚拟机VMware安装Linux系统Ubuntu】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;Ubuntu知多少&#x1f680;安装的前期准备&am…