最近在自己的小程序中做了一个智能客服,API使用的是云厂商的API,然后聊天页面...嗯,找了一下关于UniApp(vite/ts)版本的好像不多,有一个官方的但其中的其他代码太多了,去看懂再删除那些对我无用的代码不如自己手撸一个,先看效果:
好,下面开始介绍如何一步一步实现
(资料图片仅供参考)
可以发现一般的气泡是有个“小箭头”,一般是指向用户的头像,所以这里我们的初步思路就是通过before与after伪类来放置这个小三角形,这个小三角形通过隐藏border的其余三边来实现。
然后其中一个细节就是聊天气泡的最大宽度不超过对方的头像,超过就换行。这个简单,设置一个max-width: cacl(100vw - XX)就可以了
考虑到用户可能输入多行文字,这里使用的是标签,点开微信发个消息试试,发现它是自适应的,这里去调研了解了一下,发现小程序自带组件有这个实现,好,那直接用:
然后我们继续注意到发送按钮与输入框的底线保持水平,这个flex里有对应属性可以实现,跳过...
当聊天消息较多时,我们发现我们继续输入消息,页面并没有更新(滚动)。打开微信聊天框一看,当消息过多时,你发一条消息,页面就自动滚动到了最新的消息,这又是怎实现的呢?
继续调研,发现小程序自带的标签中有个属性scroll-into-view可以自动跳转:
略
简单分析下来好像一点都不难,如下是我的文件列表,话不多说,开始撸代码!
chat├─ chat.vue├─ leftBubble.vue└─ rightBubble.vue
左气泡模块就是刚刚分析的那一部分,然后增加一点点细节,如下:
<script setup lang="ts">import { userDefaultData } from "@/const";interface propsI {message: string;avatarUrl: string;}const props = withDefaults(defineProps {{ props.message }} (), {avatarUrl: userDefaultData.avatarUrl,});</script>
右气泡模块我们需要将三角形放在右边,这个好实现。然后这整个气泡我们需要让它处于水平居右,所以这里我使用了:
display: flex;direction: rtl;
这个属性,但使用的过程中发现气泡中的内容(符号与文字)会出现翻转,“遇事不决,再加一层”,所以我们在内容节点外再套一层:
{{ props.message }} 然后继续增加一点点细节:
<script setup lang="ts">import { userDefaultData } from "@/const";interface propsI {message: string;avatarUrl: string;}const props = withDefaults(defineProps {{ props.message }} (), {avatarUrl: userDefaultData.avatarUrl,});</script>
没啥说的,需要注意的是:Button记得防抖
发送
1)考虑如何存储消息
这里仅考虑内存中如何存储,不考虑本地存储,后续思考中会聊到。
export interface messagesI { left: boolean; text: string; time: number;}如上是消息列表中的一项,为了区分是渲染到左气泡还是右气泡,这里用left来区分了一下;
const messages: Ref= ref([]);
2)如何推荐消息
这边我封装的服务端接口是这样的:
mutation chat{ customerChat(talk: "你好啊"){ knowledge text recommend }}recommend是用户可能输入了错误的消息,这里是预测用户的输入字符串,所以我们需要在得到这个字符串后直接显示,然后用户可以一键通过这条消息回复:
function submit(){// 略...const finalMsg = receive?.knowledge || receive?.text || "你是否想问: " + receive?.recommend;// 略...if (receive?.recommend) {input.value = receive?.recommend;} else {input.value = "";}}如上,得益于Vue框架,这里实现起来也非常简单,当用户提交之后,如果有推荐的消息,就直接修改input.value从而修改输入框的文字;如果没有就直接清空方便下一次输入。
接下来继续增加一点点细节(chat.vue文件)
<script setup lang="ts">import { ref, type Ref } from "vue";import leftBubble from "./leftBubble.vue";import rightBubble from "./rightBubble.vue";import type { messagesI } from "./chat.interface";import { chatGQL } from "@/graphql/me.graphql";import { useMutation } from "villus";import { logoUrl } from "@/const";import { useMeStore } from "@/stores/me.store";const meStore = useMeStore();const messages: Ref 发送 = ref([]);const input = ref("");async function submit() {if (input.value === "") return;messages.value.push({left: true,text: input.value,time: new Date().getTime(),});const { execute } = useMutation(chatGQL);const { error, data } = await execute({ talk: input.value })if (error) {uni.showToast({title: `加载错误`,icon: "error",duration: 3000,});throw new Error(`加载错误: ${error}`);}const receive = data?.customerChat;const finalMsg = receive?.knowledge || receive?.text || "你是否想问: " + receive?.recommend;messages.value.push({left: false,text: finalMsg,time: new Date().getTime(),});if (receive?.recommend) {input.value = receive?.recommend;} else {input.value = "";}}</script>
如何保存到本地,然后每次加载最新消息,然后向上滚动进行懒加载?
我这里没有实现该功能,毕竟只是一个客服,前端没必要保存消息记录到本地如Localstorage。
这里抛砖引玉,想到了一个最基础的数据结构--链表,用Localstorage-key/value的形式来实现消息队列在本地的多段存储:
当然,有效性有待验证,这里仅仅属于一些想法
然后,我撸了小半天的页面,准备给朋友看看来着,他告诉我微信小程序自带一个客服系统,只需要让button的open-type属性等于contract;
记录--Vue3+TS(uniapp)手撸一个聊天页面|每日热讯
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助Vue3+TS(uniapp)手撸一个聊天页面前言最近
浦发银行降薪引发员工抗议 董监事会办公室:正在核实
浦发银行降薪引发员工抗议董监事会办公室:正在核实,降薪,浦发银行,董监事会,邮储银行,上海浦东发展银行
环球即时:江山控股(00295)前4个月太阳能发电站发电量约为13.713万兆瓦时 同比增长21.26%
江山控股(00295)公布,该集团拥有的太阳能发电站于2023年1月至4月总发电量
孟羽童离开,格力打造年轻化IP为什么受挫? | 如数家珍
“孟羽童”的名字5月11日上午登上了微博热搜第一。她一年多前被格力电器董事长兼总裁董明珠捧为“接班人”
湖北出台新政扶持重点群体创业
5月11日电(武一力陈维)湖北省人社厅等九部门近日印发《湖北省实施重点群体创业推进行动工作方案》(以下简称
陕西煤业:截至目前 公司总核定产能1.62亿吨
每经AI快讯,有投资者在投资者互动平台提问:请问下属各个煤矿的核定产能分别是多少?陕西煤业(601225 SH
记录--Vue3+TS(uniapp)手撸一个聊天页面|每日热讯
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助Vue3+TS(uniapp)手撸一个聊天页面前言最近
【天天快播报】前4个月我国新能源汽车产销量同比均增长42.8%
中国汽车工业协会5月11日发布数据显示2023年前4个月我国新能源汽车产销量分别达229 1万辆和222 2万辆同比均
追梦谈G6:湖人不会把胜利拱手相让 我们仍然面临淘汰-全球热门
NBA西部半决赛G4,勇士主场121-106击败湖人,总比分仍2-3落后,赛后,勇士球员追梦接受了记者的采访。谈到G
浦发银行降薪引发员工抗议 董监事会办公室:正在核实
浦发银行降薪引发员工抗议董监事会办公室:正在核实,降薪,浦发银行,董监事会,邮储银行,上海浦东发展银行
当前播报:浦发银行回应员工“降薪”:网传图片系两起独立事件 相关问题已在解决中
浦发银行回应员工“降薪”:网传图片系两起独立事件相关问题已在解决中
成立19年规模不足150亿元,中海基金去年净利润再陷亏损 | 基金
Wind数据显示,截至今年一季度末,成立已有19年的中海基金管理规模为125 49亿元,环比减少24 23亿元,降幅
环球即时:江山控股(00295)前4个月太阳能发电站发电量约为13.713万兆瓦时 同比增长21.26%
江山控股(00295)公布,该集团拥有的太阳能发电站于2023年1月至4月总发电量
全球球精选!新疆库车:守住“烟火气” 电“靓”夜经济
天气逐渐转暖,新疆库车南湖夜市也迎来人流量高峰,街区游客熙攘,小吃摊前座无虚席,夜经济火爆十足。5月1
凭交通事故责任认定书起诉可以胜诉吗?关于交通事故不出具责任认定书怎么投诉?
交通事故不出具责任认定书怎么投诉如果一直不出具交通事故责任认定书,属于行政不作为,可以找主管部门的行
孟羽童离开,格力打造年轻化IP为什么受挫? | 如数家珍
“孟羽童”的名字5月11日上午登上了微博热搜第一。她一年多前被格力电器董事长兼总裁董明珠捧为“接班人”
微型电动车战火再起!长安Lumin周年庆至高优惠1万硬刚|速讯
快科技5月11日消息,近期随着新能源汽车下乡活动的开启,微型电动车也再次燃起了激烈的战火。就在今日,长
商务部再次表态:如美国胁迫盟友共同遏华,将坚决反对 热头条
在5月11日下午举行的例行记者会上,商务部新闻发言人束珏婷再次表态,如美国胁迫盟友(七国集团其他成员国
商务部:如美国胁迫盟友共同遏华,将坚决反对!
在5月11日下午举行的例行记者会上,商务部新闻发言人束珏婷再次表态,如美国胁迫盟友(七国集团其他成员国
湖北出台新政扶持重点群体创业
5月11日电(武一力陈维)湖北省人社厅等九部门近日印发《湖北省实施重点群体创业推进行动工作方案》(以下简称
女子地铁上隔空收到不雅照!杭州警方最新通报 环球今日报
5月10日,浙江省杭州市公安局地铁分局发布警情通报:近日,一则“杭州女生地铁上隔空收到不雅照”信息在网
2023扣扣炫舞情侣网名精选网名91个(最新qq炫舞) 天天看热讯
扣扣炫舞情侣网名1、下联:2、(去声七麌)3、忽闻喊话声,齐整三爷住。4、千,载德延传谁比肩?龙风曲韵,敢
听说回族都非常热情好客,是真的吗?
我认为,也不是所有的回族人都是非常热情好客的,这个有点绝对也有点笼统了。还是要因人而异了。首先举个简
陕西煤业:截至目前 公司总核定产能1.62亿吨
每经AI快讯,有投资者在投资者互动平台提问:请问下属各个煤矿的核定产能分别是多少?陕西煤业(601225 SH
快看点丨如何显示文件后缀 2个步骤,不到1分钟学会!
电脑作为小伙伴日常办公的工具,很多时候都会存储很多文件。不少的小伙伴可能会遇到相似的情况,自己重新开
外交部回应“中朝边界于6月解封”:将持续合作
5月11日,中国外交部发言人汪文斌主持例行记者会。有记者提问,据媒体报道,中朝边界将于6月解封,届时将恢
江苏江阴枪击案告破 两名嫌犯均已死亡-天天快资讯
2023年5月4日凌晨5时许,江苏省江阴市毗陵东路发生一起涉枪伤害案件,犯罪嫌疑人作案后逃离现场,伤者经救
相距仅4.6米!俄罗斯与波兰战机在黑海上空险相撞
据美国《星条旗报》网站5月9日报道,以美国为首的北约9日说,在一架俄罗斯战机和一架波兰战机险些在黑海上
ESG跨境与法国电商Cdiscount共建中国本土服务团队 世界报资讯
法国电商平台Cdiscount Octopia和ESG跨境电商共同组建中国本土服务团队,帮助中国卖家进入欧洲市场。
痰多咳嗽是什么原因_痰多咳嗽
1、红糖姜汤材料:红糖、姜做法:提前把姜切片,用砂锅熬水,待水烧开放入红糖,红糖融化以后,放入姜片,
中简科技:公司ZT9系列产品在2015年已研制成功,持续与客户开展了多个应用领域的研...
每经AI快讯,有投资者在投资者互动平台提问:董秘,你好!ZT9系列产品几个型号参与下游主机厂论证?中简科
天舟六号货运飞船发射任务取得圆满成功 天天通讯
空间站应用与发展阶段飞行任务首战告捷据中国载人航天工程办公室消息,北京时间2023年5月10日21时22分,搭
“美育芳草”国家大剧院青少年艺术节促进京藏学生交往交流交融
“美育芳草”国家大剧院青少年艺术节促进京藏学生交往交流交融
世界看点:关注!这些产品正在召回 涉及作业本塑料购物袋等
记者5月11日从四川省市场监管局获悉,按照《消费品召回管理暂行规定》,近日,相关公司向该局报告召回计划
特朗普“逆反效应”?美媒:党内支持率大幅上升 天天热推荐
当地时间5月9日,纽约法院陪审团认定特朗普上世纪90年代对女作家卡罗尔实施性虐待和诽谤的罪名成立。此前,
【全球时快讯】美屠宰厂非法雇佣上百童工上夜班 有孩子被灼伤
据《卫报》等外媒5月9日报道,美国劳工部公布了一组童工戴护目镜、穿防护服,在屠宰厂使用化学药品消毒设备
商务部再次表态:如美国胁迫盟友共同遏华,将坚决反对 热头条
在5月11日下午举行的例行记者会上...
商务部:如美国胁迫盟友共同遏华,将坚决反对!
在5月11日下午举行的例行记者会上...
外交部回应“中朝边界于6月解封”:将持续合作
5月11日,中国外交部发言人汪文斌...
江苏江阴枪击案告破 两名嫌犯均已死亡-天天快资讯
2023年5月4日凌晨5时许,江苏省江...
62%受访者对新能源汽车基本了解 汽车“里程焦虑”较为突出
近日,重庆市万州区、开州区、城口...
聚焦!2022年全国“绿色产品认证与标识宣传周”正式启动
9月26日,由市场监管总局主办的202...
昆明市体育中心足球锦标赛落幕 组委会已经在为新赛季做准备
9月18日,全民健身·2021昆明市体...
中安街道种植了100亩万寿菊 每亩产值是种植包谷的两倍多
时下,正是万寿菊收获的季节。走进...