6 changed files with 182 additions and 445 deletions
@ -1,251 +0,0 @@ |
|||||
<template> |
|
||||
<el-container class="r-chat-box"> |
|
||||
<el-header height="60px"> |
|
||||
{{chat.showName}} |
|
||||
</el-header> |
|
||||
<el-main class="im-chat-main" id="chatScrollBox"> |
|
||||
<div class="im-chat-box"> |
|
||||
<ul> |
|
||||
<li v-for="msgInfo in chat.messages" :key="msgInfo.id"> |
|
||||
<message-item :mine="msgInfo.sendId == mine.id" :headImage="headImage(msgInfo)" :showName="showName(msgInfo)" |
|
||||
:msgInfo="msgInfo"> |
|
||||
</message-item> |
|
||||
</li> |
|
||||
</ul> |
|
||||
</div> |
|
||||
</el-main> |
|
||||
<el-footer height="25%" class="im-chat-footer"> |
|
||||
<div class="chat-tool-bar"> |
|
||||
<div class="el-icon-eleme" ref="emotion" @click="switchEmotionBox()"> |
|
||||
<emotion v-show="showEmotion" :pos="emoBoxPos" @emotion="handleEmotion"></Emotion> |
|
||||
</div> |
|
||||
<div> |
|
||||
<file-upload :action="imageAction" :maxSize="5*1024*1024" :fileTypes="['image/jpeg', 'image/png', 'image/jpg','image/webp', 'image/gif']" |
|
||||
@before="handleImageBefore" @success="handleImageSuccess" @fail="handleImageFail"> |
|
||||
<i class="el-icon-picture-outline"></i> |
|
||||
</file-upload> |
|
||||
</div> |
|
||||
<div> |
|
||||
<file-upload :action="fileAction" :maxSize="10*1024*1024" @before="handleFileBefore" @success="handleFileSuccess" |
|
||||
@fail="handleFileFail"> |
|
||||
<i class="el-icon-wallet"></i> |
|
||||
</file-upload> |
|
||||
</div> |
|
||||
<div class="el-icon-chat-dot-round"></div> |
|
||||
</div> |
|
||||
<textarea v-model="sendText" ref="sendBox" class="send-text-area" @keyup.enter="sendTextMessage()"></textarea> |
|
||||
<div class="im-chat-send"> |
|
||||
<el-button type="primary" @click="sendTextMessage()">发送</el-button> |
|
||||
</div> |
|
||||
</el-footer> |
|
||||
</el-container> |
|
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
import MessageItem from "./MessageItem.vue"; |
|
||||
import FileUpload from "../common/FileUpload.vue"; |
|
||||
import Emotion from "../common/Emotion.vue"; |
|
||||
|
|
||||
export default { |
|
||||
name: "chatPrivate", |
|
||||
components: { |
|
||||
MessageItem, |
|
||||
FileUpload, |
|
||||
Emotion |
|
||||
}, |
|
||||
props: { |
|
||||
chat: { |
|
||||
type: Object |
|
||||
} |
|
||||
}, |
|
||||
data() { |
|
||||
return { |
|
||||
sendText: "", |
|
||||
showEmotion: false, |
|
||||
emoBoxPos: { |
|
||||
x: 0, |
|
||||
y: 0 |
|
||||
} |
|
||||
} |
|
||||
}, |
|
||||
methods: { |
|
||||
handleImageSuccess(res, file) { |
|
||||
let msgInfo = { |
|
||||
recvId: file.raw.targetId, |
|
||||
content: JSON.stringify(res.data), |
|
||||
type: 1 |
|
||||
} |
|
||||
this.$http({ |
|
||||
url: '/message/private/send', |
|
||||
method: 'post', |
|
||||
data: msgInfo |
|
||||
}).then((data) => { |
|
||||
let info = { |
|
||||
type: 'PRIVATE', |
|
||||
targetId: file.raw.targetId, |
|
||||
fileId: file.raw.uid, |
|
||||
content: JSON.stringify(res.data), |
|
||||
loadStatus: "ok" |
|
||||
} |
|
||||
this.$store.commit("handleFileUpload", info); |
|
||||
}) |
|
||||
}, |
|
||||
handleImageFail(res, file) { |
|
||||
let info = { |
|
||||
type: 'PRIVATE', |
|
||||
targetId: file.raw.targetId, |
|
||||
fileId: file.raw.uid, |
|
||||
loadStatus: "fail" |
|
||||
} |
|
||||
this.$store.commit("handleFileUpload", info); |
|
||||
}, |
|
||||
handleImageBefore(file) { |
|
||||
let url = URL.createObjectURL(file); |
|
||||
let data = { |
|
||||
originUrl: url, |
|
||||
thumbUrl: url |
|
||||
} |
|
||||
let msgInfo = { |
|
||||
fileId: file.uid, |
|
||||
sendId: this.mine.id, |
|
||||
recvId: this.chat.targetId, |
|
||||
content: JSON.stringify(data), |
|
||||
sendTime: new Date().getTime(), |
|
||||
selfSend: true, |
|
||||
type: 1, |
|
||||
loadStatus: "loading" |
|
||||
} |
|
||||
// 插入消息 |
|
||||
this.$store.commit("insertMessage", msgInfo); |
|
||||
// 滚动到底部 |
|
||||
this.scrollToBottom(); |
|
||||
// 借助file对象保存对方id |
|
||||
file.targetId = this.chat.targetId; |
|
||||
}, |
|
||||
handleFileSuccess(res, file) { |
|
||||
console.log(res.data); |
|
||||
let data = { |
|
||||
name: file.name, |
|
||||
size: file.size, |
|
||||
url: res.data |
|
||||
} |
|
||||
let msgInfo = { |
|
||||
recvId: file.raw.targetId, |
|
||||
content: JSON.stringify(data), |
|
||||
type: 2 |
|
||||
} |
|
||||
this.$http({ |
|
||||
url: '/message/private/send', |
|
||||
method: 'post', |
|
||||
data: msgInfo |
|
||||
}).then(() => { |
|
||||
let info = { |
|
||||
type: 'PRIVATE', |
|
||||
targetId: file.raw.targetId, |
|
||||
fileId: file.raw.uid, |
|
||||
content: JSON.stringify(data), |
|
||||
loadStatus: "ok" |
|
||||
} |
|
||||
this.$store.commit("handleFileUpload", info); |
|
||||
}) |
|
||||
}, |
|
||||
handleFileFail(res, file) { |
|
||||
let info = { |
|
||||
type: 'PRIVATE', |
|
||||
targetId: file.raw.targetId, |
|
||||
fileId: file.raw.uid, |
|
||||
loadStatus: "fail" |
|
||||
} |
|
||||
this.$store.commit("handleFileUpload", info); |
|
||||
}, |
|
||||
handleFileBefore(file) { |
|
||||
let url = URL.createObjectURL(file); |
|
||||
let data = { |
|
||||
name: file.name, |
|
||||
size: file.size, |
|
||||
url: url |
|
||||
} |
|
||||
let msgInfo = { |
|
||||
fileId: file.uid, |
|
||||
sendId: this.mine.id, |
|
||||
recvId: this.chat.targetId, |
|
||||
content: JSON.stringify(data), |
|
||||
sendTime: new Date().getTime(), |
|
||||
selfSend: true, |
|
||||
type: 2, |
|
||||
loadStatus: "loading" |
|
||||
} |
|
||||
// 插入消息 |
|
||||
this.$store.commit("insertMessage", msgInfo); |
|
||||
// 滚动到底部 |
|
||||
this.scrollToBottom(); |
|
||||
// 借助file对象保存对方id |
|
||||
file.targetId = this.chat.targetId; |
|
||||
}, |
|
||||
switchEmotionBox() { |
|
||||
this.showEmotion = !this.showEmotion; |
|
||||
let width = this.$refs.emotion.offsetWidth; |
|
||||
let left = this.$elm.fixLeft(this.$refs.emotion); |
|
||||
let top = this.$elm.fixTop(this.$refs.emotion); |
|
||||
this.emoBoxPos.y = top; |
|
||||
this.emoBoxPos.x = left + width/2; |
|
||||
}, |
|
||||
handleEmotion(emoText) { |
|
||||
this.sendText += emoText; |
|
||||
}, |
|
||||
sendTextMessage() { |
|
||||
let msgInfo = { |
|
||||
recvId: this.chat.targetId, |
|
||||
content: this.sendText, |
|
||||
type: 0 |
|
||||
} |
|
||||
this.$http({ |
|
||||
url: '/message/private/send', |
|
||||
method: 'post', |
|
||||
data: msgInfo |
|
||||
}).then((data) => { |
|
||||
this.$message.success("发送成功"); |
|
||||
this.sendText = ""; |
|
||||
msgInfo.sendTime = new Date().getTime(); |
|
||||
msgInfo.sendId = this.$store.state.userStore.userInfo.id; |
|
||||
msgInfo.selfSend = true; |
|
||||
this.$store.commit("insertMessage", msgInfo); |
|
||||
// 保持输入框焦点 |
|
||||
this.$refs.sendBox.focus(); |
|
||||
// 滚动到底部 |
|
||||
this.scrollToBottom(); |
|
||||
}) |
|
||||
}, |
|
||||
showName(msg) { |
|
||||
return msg.sendId == this.mine.id ? this.mine.nickName : this.chat.showName |
|
||||
}, |
|
||||
headImage(msg) { |
|
||||
return msg.sendId == this.mine.id ? this.mine.headImageThumb : this.chat.headImage |
|
||||
}, |
|
||||
scrollToBottom() { |
|
||||
this.$nextTick(() => { |
|
||||
const div = document.getElementById("chatScrollBox"); |
|
||||
div.scrollTop = div.scrollHeight; |
|
||||
}); |
|
||||
} |
|
||||
}, |
|
||||
computed: { |
|
||||
mine() { |
|
||||
return this.$store.state.userStore.userInfo; |
|
||||
}, |
|
||||
imageAction() { |
|
||||
return `${process.env.VUE_APP_BASE_API}/image/upload`; |
|
||||
}, |
|
||||
fileAction() { |
|
||||
return `${process.env.VUE_APP_BASE_API}/file/upload`; |
|
||||
} |
|
||||
}, |
|
||||
mounted() { |
|
||||
console.log("private mount...") |
|
||||
this.scrollToBottom(); |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<style> |
|
||||
</style> |
|
||||
Loading…
Reference in new issue