Files
aida_front/src/component/Account/message/privateChat.vue
X1627315083 4b694236ee 页面调整
2025-07-19 14:04:48 +08:00

427 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="account_privateChatMessage">
<div class="account_generalMessage_title modal_title_text">
<!-- <span>私信</span> -->
<div class="account_generalMessage_title_setting">全部已读</div>
</div>
<div class="account_privateChatMessage_content">
<div class="content_left">
<div class="content_left_item" v-for="item,index in privateChatList" :class="{active:item.active}" @click.stop="openPrivateChat(item,index)">
<div class="content_left_item_btn" @click.stop="deletePrivateChat(item,index)">
<i class="fi fi-rr-cross-small"></i>
</div>
<!-- <img :src="item.img" alt=""> -->
<img src="../../../assets/images/homePage/alipay.svg" alt="">
<div class="modal_title_text">
<div class="modal_title_text_assistant" :title="item.title">{{item.title}}</div>
<div class="modal_title_text_intro" :title="item.intro">{{item.intro}}</div>
</div>
</div>
</div>
<div class="content_right" v-if="currentPrivateChat >= 0">
<div class="content_right_top">
<div class="modal_title_text">
<div class="">{{ privateChat[currentPrivateChat]?.title }}</div>
</div>
</div>
<div class="content_right_record">
<div class="content_right_record_item" v-for="item in privateChat[currentPrivateChat]?.messageList">
<div v-if="item.type == 'time'" class="content_right_record_item_time">
{{ item.data }}
</div>
<div v-else class="content_right_record_item_content" :class="{active:item.type == 'user'}">
<div class="content_right_record_item_HeadImg">
<img src="../../../assets/images/homePage/alipay.svg" alt="">
</div>
<div class="content_right_record_item_text">
{{ item.data }}
</div>
</div>
</div>
</div>
<div class="content_right_send">
<div class="content_right_operation">
<div>icon</div>
<div>icon</div>
<div>icon</div>
</div>
<div class="content_right_input">
<textarea ref="textarea" v-if="privateChat[currentPrivateChat]?.title" v-model="privateChat[currentPrivateChat].temporary"></textarea>
</div>
<div class="content_right_btn modal_title_text">
<div class="content_right_btn_astrict modal_title_text_intro">
<span :style="{color:privateChat[currentPrivateChat]?.temporary.length>500?'red':''}">
{{privateChat[currentPrivateChat]?.temporary.length}}
</span>
/500</div>
<div class="content_right_btn_send started_btn" @click="sendCli">发送</div>
</div>
</div>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</div>
<div class="content_right content_right_null" v-else>
您还未选中或者发起聊天快去跟好友聊一聊吧
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,reactive,nextTick,toRefs,createVNode, onMounted} from 'vue'
import { Https } from "@/tool/https";
import { useRouter,useRoute } from 'vue-router'
import { Modal,message } from 'ant-design-vue';
import { useStore } from "vuex";
import { useI18n } from 'vue-i18n'
export default defineComponent({
components:{
},
setup() {
const router = useRouter()
const store = useStore();
let accountPrivateChat:any = reactive({
activeKey: ref('1'),
privateChatList:[
{
title:'AI Fashion Designer1',
intro:'333',
img:'../../../assets/images/homePage/alipay.svg',
active:false,
id:1,
},
{
title:'AI Fashion Designer2',
intro:'222',
img:'../../../assets/images/homePage/alipay.svg',
active:false,
id:2,
},
{
title:'AI Fashion Designer3',
intro:'111',
img:'../../../assets/images/homePage/alipay.svg',
active:false,
id:3,
}
],
currentPrivateChat:-1,
privateChat:{
1:{
title:'ABC',
temporary:'',
messageList:[
{
type:'time',
data:'2022-12-12 12:12:12'
},{
type:'opposite',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'time',
data:'2022-12-22 12:12:12'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},{
type:'user',
img:'../../../assets/images/homePage/alipay.svg',
data:'hello,'
},
]
}
},
})
let loadingShow = ref(false)
let textarea = ref()
// let ws = new WebSocket('ws://127.0.0.1:3000')
// console.log(ws);
// ws.onopen = ()=>{
// console.log(222);
// let data = {
// cmd:4,
// data:{
// msg:'222'
// }
// }
// ws.send(JSON.stringify(data))
// // ws.onmessage = (data)=>{
// // console.log(data);
// // }
// }
// provide('exhibitionList',exhibitionList)
let openPrivateChat = (data:any,index:number)=>{
accountPrivateChat.privateChatList.forEach((item:any)=>{
item.active = false
})
// accountPrivateChat.privateChat
accountPrivateChat.currentPrivateChat = data.id
data.active = true
getPrivateChat(data)
}
let deletePrivateChat = (data:any,index:number)=>{
if(data.active){
accountPrivateChat.privateChatList[0].active = true
getPrivateChat(data)
accountPrivateChat.currentPrivateChat = accountPrivateChat.privateChatList[0].id
}
accountPrivateChat.privateChatList.splice(index,1)
}
let getPrivateChat = async (data:any)=>{
if(!accountPrivateChat.privateChat[data.id]){
loadingShow.value = true
await new Promise((resolve:any, reject:any) => {
setTimeout(()=>{
accountPrivateChat.privateChat[data.id] = JSON.parse(JSON.stringify(accountPrivateChat.privateChat[1]))
loadingShow.value = false
resolve('')
},1000)
})
// Https.axiosGet(Https.httpUrls.accountBindEmail,{}).then((res:any)=>{
// console.log(res);
// })
}
nextTick(()=>{
if(textarea.value){
textarea.value.focus()
}
})
}
let sendCli = ()=>{
if(accountPrivateChat.privateChat[accountPrivateChat.currentPrivateChat]?.temporary.length>500){
return message.info('输入的内容超过最大限制')
}
}
onMounted (()=>{
})
return{
...toRefs(accountPrivateChat),
loadingShow,
textarea,
openPrivateChat,
deletePrivateChat,
sendCli,
}
},
data(){
return{
}
},
})
</script>
<style lang="less" scoped>
.account_privateChatMessage{
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.account_privateChatMessage_content{
flex: 1;
box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.12);
border: 1px solid #e9eaec;
border-radius: 5px;
display: flex;
margin-right: 5rem;
margin-left: 5rem;
.content_left{
width: 20%;
border-right: 1px solid #e9eaec;
height: 100%;
.content_left_item {
display: flex;
align-items: center;
padding: 2rem 2rem;
padding-left: 0;
border-bottom: 1px solid #e9eaec;
cursor: pointer;
overflow: hidden;
&.active{
background: #e4e5e6;
}
img{
width: 6rem;
height: 6rem;
border-radius: 50%;
margin-right: 2rem;
}
.modal_title_text{
width: calc(100% - 6rem - 2rem - 4rem);
margin-bottom: 0;
div{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.content_left_item_btn{
transform: translateX(-100%);
transition: all .3s;
i{
width: 4rem;
height: 4rem;
font-size: 3rem;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.content_left_item:hover{
background: #e4e5e6;
.content_left_item_btn{
transform: translateX(0%);
}
}
}
.content_right{
width: 80%;
display: flex;
flex-direction: column;
background: #f4f5f7;
position: relative;
.mark_loading{
position: absolute;
}
&.content_right_null{
display: flex;
justify-content: center;
align-items: center;
font-size: 3rem;
color: #bec9d2;
font-weight: 900;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.content_right_top{
.modal_title_text{
margin: 0;
text-align: center;
background: #fff;
padding: 1.5rem 0
}
border-bottom: 1px solid #e9eaec;
}
.content_right_record{
flex: 1;
overflow-y: auto;
max-height: 38.5rem;
&.content_right_record::-webkit-scrollbar {
display: none;
}
.content_right_record_item{
display: flex;
margin: 2rem 0;
padding: 0 2rem;
.content_right_record_item_time{
width: 100%;
text-align: center;
}
.content_right_record_item_content{
display: flex;
width: 100%;
align-items: flex-start;
.content_right_record_item_HeadImg{
img{
width: 5rem;
height: 5rem;
border-radius: 50%;
margin-right: 2rem;
}
}
.content_right_record_item_text{
background: #fff;
padding: 1rem;
transform: translateY(1rem);
border-radius: 0 2rem 2rem 2rem;
}
&.active{
flex-direction: row-reverse;
.content_right_record_item_HeadImg{
margin-left: 2rem;
margin-right: 0rem;
}
.content_right_record_item_text{
border-radius: 2rem 0rem 2rem 2rem;
background: #000;
color: #fff;
}
}
}
}
}
.content_right_send{
border-top: 1px solid #e9eaec;
height: 20rem;
width: 100%;
padding: 1rem 2rem;
display: flex;
flex-direction: column;
.content_right_operation{
height: 4rem;
display: flex;
div{
margin-right: 1rem;
}
div:last-child{
margin-right: 0;
}
}
.content_right_input{
flex: 1;
textarea{
width: 100%;
border: none;
max-height: 100%;
min-height: 100%;
background: rgba(0, 0, 0, 0);
}
}
.content_right_btn{
display: flex;
margin: 0;
margin-left: auto;
margin-top: 1rem;
.content_right_btn_astrict{
margin-right: 2rem;
}
.content_right_btn_send{
}
}
}
}
}
}
</style>