**
首先说一下思路:
需要用到websocket
作用:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息
第一步:需要和websocket建立连接(由后端提供websocket服务器地址)
第二步:连接成功发送消息
第三步:收到消息并将消息渲染到页面
第四步:监听链接是否成功添加心跳
第五步:链接失败断开连接
**
**
原生的用法在浏览器里面是可以用的,但是打包成例如APP就必须要按照uni的写法来使用,简单举例 原生写法:
从商店进入聊天页面首先发一条商家信息,然后是文字发送
**
initwebsocket() {
this.status = 'loading';
//实例化websock
this.websock = new WebSocket(path)//path是后端提供的
//监听websock消息
this.websock.onmessage = this.websocketonmessage
//监听websock连接
this.websock.onopen = this.websocketonopen
//监听websock错误信息
this.websock.onerror = this.websocketonerror
//连接关闭
this.websock.onclose = this.websocketclose
},
websocketsend(data) {
console.log(data)
console.log(this.websocket)
if (this.websocket == undefined) {
console.log(1)
this.addMessage(data)
}
this.websock.send(data)
},
websocketonopen() {
console.log('初始化成功')
this.websocketsend(JSON.stringify({
'uid': this.user_id,
'type': 0
}))
uni.setNavigationBarTitle({
title: this.shopname
})
this.load = false
this.numconnect = 0;
//心跳
if (!this.heartbeat) {
this.load = true
this.heartbeat = setInterval(() => {
this.websocketsend(JSON.stringify({
'type': 'ping'
}), 1)
}, 1000 * 50);
}
if (this.fa == 1) { //首次进入先发送
if (this.name != "") { //从商店进入发送商店信息
this.sendsp()
}
this.fa = 2 //只发送一次
}
},
websocketonmessage(e) {
this.data = JSON.parse(e.data)
//判断发送消息是接受者还是发送者且获取信息push新数组
if (this.data.uid == this.user_id && this.data.to_uid == this.touid) {
let resmsg = {
isme: true,
type: this.data.type,
msg: this.data.msg
}
this.chatlist.push(resmsg)
}
if (this.data.uid == this.touid && this.data.to_uid == this.user_id) {
let resmsg = {
isme: false,
type: this.data.type,
msg: this.data.msg
}
this.chatlist.push(resmsg)
}
this.load = false;
setTimeout(() => {
uni.pageScrollTo({
duration: 0,
scrollTop: 999999 //滚动高度,单位px,这里也可用选择器属性:selector:选择器
})
}, 50)
},
websocketonerror() {
this.initwebsocket()
},
websocketclose() {
this.reconnectsys()
},
reconnectsys() {
if (this.sysconnect > 0) {
this.sysconnect--;
this.numconnect++;
this.load = true
this.loadingText = '第' + this.numconnect + '次重连'
setTimeout(() => {
this.initwebsocket()
}, 10000);
} else {
this.loadingText = '连接超时'
}
},
//发送商店信息
sendsp() {
let messagedata = {
uid: this.user_id,
to_uid: this.touid,
type: 6,
msg: {
"shopname": this.shopname, //对方聊天的名字
"shopid": this.touid, //对方聊天的userID
"shop_id": this.shop_id, //商店ID
"name": this.name, //商店名称
"photos": this.photos, //商店图片
// "shopname": this.name, //对方聊天的名字
}
}
this.websocketsend(JSON.stringify(messagedata))
},
//发送文字
sendtext() {
if (this.txt.trim() == "") { //清除空格且判断是否为空
uni.showToast({
title: "请输入内容",
icon: "error",
duration: 2000
})
} else {
let messagedata = {
uid: this.user_id,
to_uid: this.touid,
type: 1,
msg: this.txt.trim()
}
this.websocketsend(JSON.stringify(messagedata))
setTimeout(() => {
uni.pageScrollTo({
scrollTop: 999999,
duration: 0, // 间隔时间
})
})
this.txt = ""
}
},
**
uni写法,可查看uni官方文档
**
iniSys() {
// 1.建立链接
this.sys_info.socket = uni.connectSocket({
url: this.sys_info.path,
success: (e) => {
console.log('链接建立成功', e)
}
});
// 2.打开链接
this.sys_info.socket.onOpen((e) => {
console.log('链接建立')
let obj = {
uid: this.user_info.user_id,
type: 0
};
// 建立映射关系
this.sendMsg(JSON.stringify(obj));
// 发送店铺或商品信息卡片
if (!this.send_info.log) {
// 为确保信息获取到,延迟发送
this.sendShopOrGoods();
}
});
// 3.监听错误
this.sys_info.socket.onError((e) => {
console.log('链接错误:', e.errMsg);
});
// 4.监听WebSocket接受到服务器的消息事件
this.sys_info.socket.onMessage((e) => {
let data = JSON.parse(e.data);
console.log('接收到推送信息',data);
if ((data.uid == this.user_info.user_id && data.to_uid ==this.to_info.to_uid) || (data.uid ==this.to_info.to_uid && data.to_uid == this.user_info.user_id)) {
// 处理消息
this.setMsg(data, 2);
// 滚动到最底部
this.setScroll();
}
});
// 5.断线重连
this.sys_info.socket.onClose((e) => {
console.log('链接关闭:', e);
this.reConnect();
});
// 6.心跳
this.heartJump();
},
// socket重连
reConnect() {
if (this.sys_info.sysconnect > 0) {
this.sys_info.sysconnect--;
this.sys_info.numconnect++;
console.log('第' + this.sys_info.numconnect + '次重连');
setTimeout(() => {
this.iniSys();
}, 10000);
} else {
console.log('连接已超时');
}
},
// 心跳
heartJump() {
if (!!!this.heartbeat) {
this.heartbeat = setInterval(() => {
this.sendMsg(JSON.stringify({
type: 'ping'
}))
}, 1000 * 30)
}
},
// 发送店铺/商品信息
sendShopOrGoods() {
if (this.send_info.type == 1) {
// 发送店铺消息,且没有发送过消息
let obj = {
uid: this.user_info.user_id,
to_uid: this.to_info.to_uid,
type: 6,
msg: {
page_title: this.shop_info.shop_name,
shop_id: this.shop_info.shop_id,
name: this.shop_info.shop_name,
photos: this.shop_info.shop_photo
}
};
this.sendMsg(JSON.stringify(obj));
this.send_info.log = true;
}
if (this.send_info.type == 2) {
// 发送商品信息
let obj = {
uid: this.user_info.user_id,
to_uid: this.to_info.to_uid,
type: 5,
msg: {
page_title: this.shop_info.shop_name,
shop_id: this.shop_info.shop_id,
goods_id: this.goods_info.goods_id,
title: this.goods_info.goods_name,
photo: this.goods_info.goods_photo,
price: this.goods_info.price
}
};
this.sendMsg(JSON.stringify(obj))
this.send_info.log = true;
}
},
sendMsg(data) {
if (!!this.sys_info.socket) {
// 发送消息
this.sys_info.socket.send({
data: data,
success: (e) => {
console.log('消息推送成功',data)
},
fail: (e) => {
console.log("消息推送失败",data)
}
})
} else {
// 调接口发送消息
this.addMsg(data);
}
},
setMsg(data, from = 1) {
// 处理接受到的消息:from[1聊天记录消息;2推送消息]
console.log(from==1 ? '处理接收到的信息' : '发送的信息',data)
console.log('处理消息-发送人信息',this.user_info)
console.log('处理消息-接收人信息',this.to_info)
let obj = {};
obj.type = data.type;
if(from == 1){
if (data.user_id == this.user_info.user_id) {
obj.isme = true;
obj.nickname = this.user_info.nickname;
obj.face = this.user_info.face;
} else {
obj.isme = false;
obj.nickname = this.to_info.to_nickname;
obj.face = this.to_info.to_face;
}
}
if(from == 2){
if (data.uid == this.user_info.user_id) {
obj.isme = true;
obj.nickname = this.user_info.nickname;
obj.face = this.user_info.face;
} else {
obj.isme = false;
obj.nickname = this.to_info.to_nickname;
obj.face = this.to_info.to_face;
}
}
if (data.type == 1) {
// 文字消息
obj.msg = data.msg;
}
if (data.type == 2) {
// 图片消息
obj.img_url = data.msg;
}
// 音频消息
// if(data.type == 3){}
// 文件消息
// if(data.type == 4){}
if (data.type == 5) {
// 商品消息
obj.goods_id = data.msg.goods_id;
obj.goods_img = data.msg.photo;
obj.goods_title = data.msg.title;
obj.goods_price = data.msg.price;
}
if (data.type == 6) {
// 店铺消息
obj.shop_id = data.msg.shop_id;
obj.shop_img = data.msg.photos;
obj.shop_name = data.msg.name;
}
if (from == 1) {
// 聊天记录往前插入
this.chatlist.unshift(obj);
}
if (from == 2) {
// 推送消息往后插入
this.chatlist.push(obj);
}
},
//点击发送按钮
sendText() {
if (this.txt.trim() == "") { //清除空格且判断是否为空
uni.showToast({
title: "请输入内容",
icon: "error",
duration: 1000
})
} else {
let obj = {
uid: this.user_info.user_id,
to_uid: this.to_info.to_uid,
type: 1,
msg: this.txt.trim()
}
this.sendMsg(JSON.stringify(obj));
this.txt = "";
}
},
**
因为uni打包其他不可以直接用原生,所以比较推荐用uni写法,最后附上全部代码
**
<template>
<view style="height: auto !important;">
<view class="chat-body">
<u-loadmore :status="page_info.status" :loadingText="page_info.loadingText" v-show="page_info.load" />
<view v-for="(item,index) in chatlist" :key="index">
<view class="chat-one" v-if="!item.isme">
<image :src="item.face" mode="" />
<view class="chat-box">
<view class="chat-sender" style="width: 70px;">
{{item.nickname}}
</view>
<view class="chat-content" v-if="item.type == 1">
{{item.msg}}
</view>
<view class="chat-img" v-if="item.type == 2">
<image :src="item.img_url" mode="widthFix" />
</view>
<view class="chat-goos" v-if="item.type == 5" @click="goodsid(item.goods_id)">
<view class="left">
<image :src="item.goods_img" mode=""></image>
</view>
<view class="right">
<text>{{item.goods_title}}</text><br>
<text style="font-size: 13px;">¥{{item.goods_price}}</text>
</view>
</view>
<view class="chat-goos" v-if="item.type == 6" @click="spid(item.shop_id)">
<view class="left">
<image :src="item.shop_img" mode=""></image>
</view>
<view class="right">
<text>{{item.shop_name}}</text>
</view>
</view>
</view>
</view>
<view class="chat-one" style="text-align: right;" v-if="item.isme">
<view class="chat-box">
<view class="chat-sender" style="display: inline-block;text-align: right;" v-if="item.isme">
{{item.nickname}}
</view>
<view class="chat-content" v-if="item.type == 1">
{{item.msg}}
</view>
<view class="chat-img" v-if="item.type == 2">
<image :src="item.img_url" mode="widthFix" />
</view>
<view class="chat-goos" v-if="item.type == 5" @click="goodsid(item.goods_id)">
<view class="left">
<image :src="item.goods_img" mode=""></image>
</view>
<view class="right">
<text>{{item.goods_title}}</text><br>
<text style="font-size: 13px;">¥{{item.goods_price}}</text>
</view>
</view>
<view class="chat-goos" v-if="item.type == 6" @click="spid(item.shop_id)">
<view class="left">
<image :src="item.shop_img" mode=""></image>
</view>
<view class="right">
<text>{{item.shop_name}}</text>
</view>
</view>
</view>
<image :src="item.face" mode="" />
</view>
</view>
<view class="send">
<input type="text" value="" placeholder="请输入聊天内容" v-model="txt" />
<image src="../../static/xiangce.png" @click="sendImg"></image>
<button type="default" @click="sendText">发送</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
chatlist: [], //聊天记录
txt: "", //发送消息
send_info: {
type: 0, //0进入页面不发送消息;1发送店家信息;2发送商品信息
log: false, //true有发送记录;false没有发送记录
},
user_info: { //发送消息用户信息
user_id: uni.getStorageSync("user_id"), //发送消息人uid
nickname: uni.getStorageSync("nickname"), //发送消息人昵称
face: uni.getStorageSync("myphoto") //发送消息人头像
},
to_info: { //接收消息用户信息
to_uid: '', //接收消息人uid
to_nickname: '', //接收消息人昵称
to_face: '' //接收消息人头像
},
shop_info: { //店铺信息
shop_id: '', //店铺shop_id
shop_name: '', //店铺名称
shop_photo: '' //店铺图片
},
goods_info: { //商品信息
goods_id: '', //商品goods_id
goods_name: '', //商品名称
goods_photo: '', //商品图片
price: '', //商品价格易货额
xj: '' //商品现金
},
sys_info: { //websocket配置参数
path: 'wss://chart.zhilongyihuo.com/wss', //websocket服务器地址
socket: null, //websocket对象
sysconnect: 3, //断线重连次数
numconnect: 0, //重连计数
heartbeat: null, //心跳对象
},
page_info: { //页面配置参数
load: false, //聊天顶部提示信息控制开关
loadingText: '正在连接', //聊天顶部提示信息
status: 'loadmore', //loadmore:加载更多,loading:正在加载,nomore:加载完毕,没有了
pageindex: 1, //分页当前页码
count: 0, //聊天记录总数
nums: 0, //已经获取到的聊天记录数目
}
}
},
onLoad(options) {
// 设置配置参数
this.setConfig(options);
// 确保用户信息存在
if (!!!this.user_info.user_id) {
this.isLogin();
return;
}
// 向上解决问题:把问题解决在源头
// 获取聊天记录
setTimeout(()=>{
this.getchatlist();
},300)
// // 链接socket
setTimeout(()=>{
this.iniSys();
},800)
},
destroyed() {
// 生命周期结束关闭socket链接
uni.closeSocket()
},
onShow() {},
onPullDownRefresh() {
if (this.page_info.nums < this.page_info.count) {
this.page_info.status = 'loading';
this.page_info.pageindex++;
this.getchatlist();
console.log("下拉翻页");
}
},
methods: {
setConfig(options) {
if (!!options.user_id) {
// 发送人user_id
this.user_info.user_id = options.user_id;
this.getUserInfo(this.user_info.user_id);
}
if (!!options.to_user_id) {
// 接收人user_id
this.to_info.to_uid = options.to_user_id;
this.getUserInfo(this.to_info.to_uid, 2)
}
if (!!options.shop_id) {
// 点击店铺进入页面
this.getShopInfo(options.shop_id);
this.send_info.type = 1;
}
if (!!options.goods_id) {
// 点击商品进入页面
this.getGoodsInfo(options.goods_id);
this.send_info.type = 2;
}
},
// 获取用户信息
async getUserInfo(user_id, type = 1) {
const res = await this.$myrequest({
url: '/app/user/getUserInfo',
method: 'POST',
data: {
user_id: user_id,
},
});
if (res.data.code == 1) {
let obj = res.data.data;
if (type == 1) {
// 发送人信息
this.user_info.nickname = obj.nickname;
this.user_info.face = obj.face;
}
if (type == 2) {
// 接收人信息
this.to_info.to_nickname = obj.nickname;
this.to_info.to_face = obj.face;
uni.setNavigationBarTitle({
'title': obj.shop_name
})
}
}
},
// 获取商店信息
async getShopInfo(shop_id) {
const res = await this.$myrequest({
url: '/app/shop/details',
method: 'POST',
data: {
shop_id: shop_id,
},
});
if (res.data.code == 1) {
let obj = res.data.data;
this.shop_info.shop_id = obj.shop_id;
this.shop_info.shop_name = obj.shop_name;
this.shop_info.shop_photo = obj.photo;
}
},
// 获取商品信息
async getGoodsInfo(goods_id) {
const res = await this.$myrequest({
url: '/app/goods/details',
method: 'POST',
data: {
goods_id: goods_id,
},
})
if (res.data.code == 1) {
let obj = res.data.data;
this.shop_info.shop_id = obj.shop_id;
this.shop_info.shop_name = obj.shop.shop_name;
this.shop_info.shop_photo = obj.shop.photo;
this.goods_info.goods_id = obj.goods_id;
this.goods_info.goods_name = obj.title;
this.goods_info.goods_photo = obj.photo;
this.goods_info.price = obj.price;
this.goods_info.xj = obj.xj;
}
},
// 登录
isLogin() {
uni.showModal({
content: '请先登录',
success: (e) => {
if (e.confirm) {
// 点击确定按钮,跳转登录
uni.navigateTo({
url: "/pages/my/login"
})
}
if (e.cancel) {
// 点击取消按钮,返回上一页
uni.navigateBack()
}
}
})
return;
},
// 让页面滚动到最底部
setScroll() {
setTimeout(() => {
uni.pageScrollTo({
duration: 0,
scrollTop: 999999 //滚动高度,单位px,这里也可用选择器属性:selector:选择器
})
}, 50)
},
iniSys() {
// 1.建立链接
this.sys_info.socket = uni.connectSocket({
url: this.sys_info.path,
success: (e) => {
console.log('链接建立成功', e)
}
});
// 2.打开链接
this.sys_info.socket.onOpen((e) => {
console.log('链接建立')
let obj = {
uid: this.user_info.user_id,
type: 0
};
// 建立映射关系
this.sendMsg(JSON.stringify(obj));
// 发送店铺或商品信息卡片
if (!this.send_info.log) {
// 为确保信息获取到,延迟发送
this.sendShopOrGoods();
}
});
// 3.监听错误
this.sys_info.socket.onError((e) => {
console.log('链接错误:', e.errMsg);
});
// 4.监听WebSocket接受到服务器的消息事件
this.sys_info.socket.onMessage((e) => {
let data = JSON.parse(e.data);
console.log('接收到推送信息',data);
if ((data.uid == this.user_info.user_id && data.to_uid == this.to_info.to_uid) || (data.uid ==
this.to_info.to_uid && data.to_uid == this.user_info.user_id)) {
// 处理消息
this.setMsg(data, 2);
// 滚动到最底部
this.setScroll();
}
});
// 5.断线重连
this.sys_info.socket.onClose((e) => {
console.log('链接关闭:', e);
this.reConnect();
});
// 6.心跳
this.heartJump();
},
// socket重连
reConnect() {
if (this.sys_info.sysconnect > 0) {
this.sys_info.sysconnect--;
this.sys_info.numconnect++;
console.log('第' + this.sys_info.numconnect + '次重连');
setTimeout(() => {
this.iniSys();
}, 10000);
} else {
console.log('连接已超时');
}
},
// 心跳
heartJump() {
if (!!!this.heartbeat) {
this.heartbeat = setInterval(() => {
this.sendMsg(JSON.stringify({
type: 'ping'
}))
}, 1000 * 30)
}
},
// 发送店铺/商品信息
sendShopOrGoods() {
if (this.send_info.type == 1) {
// 发送店铺消息,且没有发送过消息
let obj = {
uid: this.user_info.user_id,
to_uid: this.to_info.to_uid,
type: 6,
msg: {
page_title: this.shop_info.shop_name,
shop_id: this.shop_info.shop_id,
name: this.shop_info.shop_name,
photos: this.shop_info.shop_photo
}
};
this.sendMsg(JSON.stringify(obj));
this.send_info.log = true;
}
if (this.send_info.type == 2) {
// 发送商品信息
let obj = {
uid: this.user_info.user_id,
to_uid: this.to_info.to_uid,
type: 5,
msg: {
page_title: this.shop_info.shop_name,
shop_id: this.shop_info.shop_id,
goods_id: this.goods_info.goods_id,
title: this.goods_info.goods_name,
photo: this.goods_info.goods_photo,
price: this.goods_info.price
}
};
this.sendMsg(JSON.stringify(obj))
this.send_info.log = true;
}
},
sendMsg(data) {
if (!!this.sys_info.socket) {
// 发送消息
this.sys_info.socket.send({
data: data,
success: (e) => {
console.log('消息推送成功',data)
},
fail: (e) => {
console.log("消息推送失败",data)
}
})
} else {
// 调接口发送消息
this.addMsg(data);
}
},
setMsg(data, from = 1) {
// 处理接受到的消息:from[1聊天记录消息;2推送消息]
console.log(from==1 ? '处理接收到的信息' : '发送的信息',data)
console.log('处理消息-发送人信息',this.user_info)
console.log('处理消息-接收人信息',this.to_info)
let obj = {};
obj.type = data.type;
if(from == 1){
if (data.user_id == this.user_info.user_id) {
obj.isme = true;
obj.nickname = this.user_info.nickname;
obj.face = this.user_info.face;
} else {
obj.isme = false;
obj.nickname = this.to_info.to_nickname;
obj.face = this.to_info.to_face;
}
}
if(from == 2){
if (data.uid == this.user_info.user_id) {
obj.isme = true;
obj.nickname = this.user_info.nickname;
obj.face = this.user_info.face;
} else {
obj.isme = false;
obj.nickname = this.to_info.to_nickname;
obj.face = this.to_info.to_face;
}
}
if (data.type == 1) {
// 文字消息
obj.msg = data.msg;
}
if (data.type == 2) {
// 图片消息
obj.img_url = data.msg;
}
// 音频消息
// if(data.type == 3){}
// 文件消息
// if(data.type == 4){}
if (data.type == 5) {
// 商品消息
obj.goods_id = data.msg.goods_id;
obj.goods_img = data.msg.photo;
obj.goods_title = data.msg.title;
obj.goods_price = data.msg.price;
}
if (data.type == 6) {
// 店铺消息
obj.shop_id = data.msg.shop_id;
obj.shop_img = data.msg.photos;
obj.shop_name = data.msg.name;
}
if (from == 1) {
// 聊天记录往前插入
this.chatlist.unshift(obj);
}
if (from == 2) {
// 推送消息往后插入
this.chatlist.push(obj);
}
},
// 获取聊天记录
async getchatlist() {
this.status = 'loading';
const res = await this.$myrequest({
url: '/app/chat/lists?page=' + this.page_info.pageindex,
method: 'POST',
header: {
'token': uni.getStorageSync("token"), //自定义请求头信息
},
data: {
user_id: this.user_info.user_id,
to_user_id: this.to_info.to_uid
}
});
if (res.data.code == 1) {
// 聊天记录总数
this.page_info.count = res.data.data.count;
// 已获取的聊天记录数目
this.page_info.nums += res.data.data.list.length;
if (res.data.data.count < 20) {
// 加载下一页,<20条没有更多
this.status = 'nomore';
}
if (res.data.data.list.length > 0) {
res.data.data.list.forEach((e) => {
this.setMsg(e);
})
}
if (this.page_info.pageindex == 1) {
// 渲染第一页聊天记录后,定位到页面最底部
this.setScroll()
}
} else {
this.status = "nomore"
uni.showToast({
title: res.data.msg,
icon: "error",
duration: 1000
})
}
},
//点击发送按钮
sendText() {
if (this.txt.trim() == "") { //清除空格且判断是否为空
uni.showToast({
title: "请输入内容",
icon: "error",
duration: 1000
})
} else {
let obj = {
uid: this.user_info.user_id,
to_uid: this.to_info.to_uid,
type: 1,
msg: this.txt.trim()
}
this.sendMsg(JSON.stringify(obj));
this.txt = "";
}
},
//发送图片
sendImg() {
uni.chooseImage({
count: 1, //选择图片张数
sizeType: ['original', 'compressed'], //类型:压缩或者原图
sourceType: ['album', 'camera'], //来源:相册或相机
success: res => {
this.uploadFilePromise(res.tempFilePaths[0])
this.$nextTick(() => {
uni.pageScrollTo({
scrollTop: 99999,
duration: 0
})
})
}
})
},
//上传图片
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
let a = uni.uploadFile({
url: 'https://www.zhilongyihuo.com/index.php?s=/app/upload/uploadVideo', // 仅为示例,非真实的接口地址
filePath: url,
name: 'file',
formData: {
user: 'test'
},
success: (res) => {
console.log(res.data)
let obj = {
uid: this.user_info.user_id,
to_uid: this.to_info.to_uid,
type: 2,
msg: "https://www.zhilongyihuo.com/attachs/" + res.data
}
this.sendMsg(JSON.stringify(obj))
}
});
})
},
// 发送聊天
async addMsg(obj) {
const res = await this.$myrequest({
url: '/app/chat/addMessage',
method: 'POST',
header: {
'token': uni.getStorageSync("token"), //自定义请求头信息
},
data: {
msg: obj
}
});
if (res.data.code == 1) {
// 发送成功
let e = JSON.parse(obj);
if (e.type != 0 && e.type != 'ping') {
// 处理消息
await this.setMsg(e, 2);
// 滚动到最底部
this.setScroll();
}
} else {
// 发送失败
uni.showToast({
title: res.data.msg,
icon: "error",
duration: 1000
})
}
},
//商品跳转信息
goodsid(id) {
uni.navigateTo({
url: "/pages/goos_detail/goos_detail?id=" + id
})
},
//商店跳转信息
spid(id) {
uni.navigateTo({
url: "/pages/shop_detail/shop_detail?id=" + id
})
},
}
}
</script>
<style lang="scss" scoped>
.chat-body {
width: 100%;
background: #e1e1e1;
top: 0px;
padding-bottom: 70px;
position: absolute;
.chat-one {
padding: 1%;
image {
width: 40px;
height: 40px;
border-radius: 50%;
display: inline-block;
vertical-align: top
}
.chat-box {
display: inline-block;
vertical-align: sub;
.chat-sender {
width: 70px;
background: #dadada;
color: #888;
}
.chat-content {
background: white;
padding: 1%;
border-radius: 5px;
max-width: 300px;
text-align: left;
}
.chat-goos {
background: white;
border-radius: 5px;
max-width: 300px;
display: flex;
.left {
display: inline-block;
image {
width: 100px;
margin: 5px;
}
}
.right {
display: flex;
flex-direction: column;
justify-content: center;
margin-right: 10px;
}
}
image {
border-radius: 0px;
height: 88px;
width: 200px;
}
}
}
.send {
width: 96%;
background: #d1d1d1;
padding: 2%;
position: fixed;
bottom: 0;
z-index: 9;
input {
width: 65%;
height: 40px;
display: inline-block;
border-radius: 15px;
background: white;
padding-left: 3%;
}
image {
width: 40px;
height: 40px;
margin-left: 5px;
}
button {
display: inline-block;
margin-left: 3%;
height: 40px;
background: #368fec;
color: white;
line-height: 40px;
font-size: 15px;
}
}
}
</style>
完结,撒花~欢迎大佬指正