You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

213 lines
5.8 KiB

<template>
<HeaderNav :title="title" :is-back="true"></HeaderNav>
<view class="body-background" :style="{
backgroundImage:'url('+staticImage.wallpaperBgImage+')'
}"></view>
<view class="app-wallpaper">
<view class="detail-container">
<view class="detail-content-container">
<scroll-view class="detail-content" :scroll-y="true" :scroll-top="scrollTop"
style="padding-bottom: 90px;box-sizing: border-box;" :style="{height:windowHeihgt-40+'px'}">
<view id="scroll-view-content">
<view :class="item.send_user_id === user_id && type === item.type ? 'chat-item my-chat row' : 'chat-item other-chat row'"
v-for="(item, index) in messageList">
<view class="chat-item-content row">
<view class="chat-avator " v-if="item.send_user_id !== user_id || type !== item.type">
<image mode="aspectFill" class="img" :src="item.avatar ? item.avatar : user.avatar"/>
</view>
<view class="chat-content-container " style="max-width: calc(100% - 50px);">
<view class="chat-time">{{item.user_name}} {{ item.create_time }}</view>
<view class="chat-content" style="word-break: break-all;">{{ item.info }}</view>
</view>
<view class="chat-avator " v-if="item.send_user_id === user_id && type === item.type">
<image mode="aspectFill" class="img" :src="item.avatar ? item.avatar : user.avatar"/>
</view>
</view>
</view>
</view>
</scroll-view>
<view class="detail-input-group-container">
<view class="detail-input-group row">
<view class="col">
<input class="detail-input" v-model="message" type="text"/>
</view>
<MzButton
title="发送"
font-color="#fff"
button-color="#4DC3B8"
button-width="auto"
class="detail-input-button"
@click.stop="sendMessage"
>
</MzButton>
</view>
</view>
</view>
</view>
<view class="detail-background-container">
<view class="detail-background"></view>
</view>
</view>
</template>
<script>
import {
imghost
} from '@/config/host'
import api from '../../utils/functions.js';
import HeaderNav from '../../components/HeaderNav/Index.vue';
import MzButton from '../../components/MzButton/Index.vue';
import {getToken} from "@/api/chat";
import log from "@/utils/log";
export default {
components: {
HeaderNav,
MzButton
},
data: {
scrollTop:0,
windowHeihgt: 1000,
staticImage: {
wallpaperBgImage: imghost + '/static/image/background.png',
},
user: {
avatar: imghost + '/static/image/banner.png',
nickname: '清晨的风',
background: imghost + '/static/image/banner.png',
sex: '女',
phone: '15012345678',
coupons: 221,
id: 88685,
birthday: '2002-05-11',
},
ableChat: false,
message: '',
chat_id: 0,
type: 0,
user_id: 0,
messageList: [],
title:"在线咨询"
},
onLoad(options) {
this.getToken(options.id, options.type ?? 1);
},
onReady() {
},
methods: {
scrollToBottom() {
this.$nextTick(() => {
uni.createSelectorQuery().in(this).select('#scroll-view-content').boundingClientRect((res) => {
let top = res.height - this.windowHeihgt + 500;
console.log(res)
console.log(top)
if (top > 0) {
this.scrollTop = top;
}
}).exec()
})
},
getToken(order_id, type) {
getToken(order_id, type).then(data => {
this.chat_id = data.data.chat_id;
this.type = data.data.type;
this.user_id = data.data.user_id;
uni.connectSocket({
url: data.data.chat_url
});
uni.onSocketOpen((res) => {
this.ableChat = true;
console.log('WebSocket连接已打开!');
});
uni.onSocketClose((res) => {
this.ableChat = false;
console.log('WebSocket 已关闭!');
});
uni.onSocketMessage((res) => {
this.newMessage(res);
})
})
},
newMessage(messages) {
log(messages);
messages = JSON.parse(messages.data);
log(messages);
if (messages.do_type === 'init') {
this.messageList = messages.data;
uni.$u.sleep(200).then(()=>{
this.scrollToBottom();
})
return;
}
this.messageList.push(messages);
log(this.messageList);
this.scrollToBottom();
},
sendMessage() {
if (!this.message) {
return uni.showToast({
title: "消息不能为空",
icon: 'error'
})
}
uni.showLoading({
title: '消息发送中...',
mask: true,
});
if (!this.ableChat) {
setInterval((t) => {
if (!this.ableChat) {
return;
}
clearInterval(t);
uni.sendSocketMessage({
data: this.message
});
uni.hideLoading();
}, 50);
} else {
uni.sendSocketMessage({
data: JSON.stringify({
do_type: 'add',
info: this.message,
msg_type: 1,
send_user_id: this.user_id,
type: this.type,
chat_id: this.chat_id,
})
});
uni.hideLoading();
this.message = '';
}
this.scrollToBottom();
}
},
onPageScroll(res) {
},
onUnload() {
try {
uni.closeSocket();
} catch {
}
},
created() {
this.windowHeihgt = api.navHeight().windowHeihgt;
}
}
</script>
<style lang="scss">
@import './components/index.scss';
</style>