仿真聊天代码调整

This commit is contained in:
joylink_cuiweidong 2020-05-28 13:21:51 +08:00
parent 062cdc69dd
commit 27981666b1
9 changed files with 327 additions and 79 deletions

View File

@ -2,7 +2,7 @@
<!-- v-quickMenuDrag --> <!-- v-quickMenuDrag -->
<div class="chatBox"> <div class="chatBox">
<div v-if="!minimize" class="chat-box"> <div v-if="!minimize" class="chat-box">
<chat-member-list ref="chatMemberList" :group="group" @addCoversition="addCoversition" /> <chat-member-list ref="chatMemberList" :group="group" :current-coversition="currentCoversition" @addCoversition="addCoversition" />
<div class="chat-box-main"> <div class="chat-box-main">
<chat-coversition-list ref="chatCoversitionList" @setCurrentCoversition="setCurrentCoversition" @setHeadTitle="setHeadTitle" /> <chat-coversition-list ref="chatCoversitionList" @setCurrentCoversition="setCurrentCoversition" @setHeadTitle="setHeadTitle" />
<div class="chat-window"> <div class="chat-window">
@ -11,8 +11,8 @@
<div class="minimality" @click="handleMinimality('min')"> <div class="minimality" @click="handleMinimality('min')">
<i class="el-icon-remove" /> <i class="el-icon-remove" />
</div> </div>
<div v-show="currentCoversition.group==undefined?true:currentCoversition.group" class="showMembers" @click="handleMembers()"> <div v-show="currentCoversition.all==undefined?true&&isShow:currentCoversition.all&&isShow" class="chat-createGroup" @click="handleCreateGroup()">
<i class="el-icon-user-solid" /> <i class="el-icon-plus" style="font-weight: bolder;" />
</div> </div>
<div class="chat-setting" @click="handleSetting()"> <div class="chat-setting" @click="handleSetting()">
<i class="el-icon-s-tools" /> <i class="el-icon-s-tools" />
@ -43,12 +43,14 @@
</div> </div>
</div> </div>
<chat-setting ref="chatSetting" :form="form" @setSetting="setSetting" /> <chat-setting ref="chatSetting" :form="form" @setSetting="setSetting" />
<chat-create-group ref="createGroup" :group="group" @addCoversition="addCoversition" />
</div> </div>
</template> </template>
<script> <script>
import CMD from '@/scripts/cmdPlugin/CommandEnum'; import CMD from '@/scripts/cmdPlugin/CommandEnum';
import ChatSetting from './chatSetting'; import ChatSetting from './chatSetting';
import ChatContent from './chatContent'; import ChatContent from './chatContent';
import ChatCreateGroup from './chatCreateGroup';
import ChatMemberList from './chatMemberList'; import ChatMemberList from './chatMemberList';
import ChatCoversitionList from './chatCoversitionList'; import ChatCoversitionList from './chatCoversitionList';
import RecordRTC from 'recordrtc'; import RecordRTC from 'recordrtc';
@ -59,12 +61,17 @@ export default {
ChatSetting, ChatSetting,
ChatContent, ChatContent,
ChatMemberList, ChatMemberList,
ChatCoversitionList ChatCoversitionList,
ChatCreateGroup
}, },
props: { props: {
group: { group: {
type: String, type: String,
required: true required: true
},
userRole: {
type: String,
required: true
} }
}, },
data() { data() {
@ -84,15 +91,12 @@ export default {
headerTitle:'' headerTitle:''
}; };
}, },
watch: { computed:{
'$store.state.socket.simulationRoleList': function (val) { isShow() {
if (val && val.length) { return this.userRole != 'ADMIN' && this.userRole != 'AUDIENCE';
this.$nextTick(() => {
this.$refs.chatMemberList && this.$refs.chatMemberList.setMemberStatus(val);
this.$refs.chatCoversitionList && this.$refs.chatCoversitionList.setCoversitionStatus(val);
});
} }
}, },
watch: {
'$store.state.socket.simulationScriptTip':function(val, old) { '$store.state.socket.simulationScriptTip':function(val, old) {
if (val) { if (val) {
if (val.type == 'Conversation') { if (val.type == 'Conversation') {
@ -134,7 +138,7 @@ export default {
}, },
setCurrentCoversition(coversition) { setCurrentCoversition(coversition) {
this.currentCoversition = coversition; this.currentCoversition = coversition;
if (coversition.group) { if (coversition.all) {
this.headerTitle = coversition.name; this.headerTitle = coversition.name;
} }
if (this.recordSending) { if (this.recordSending) {
@ -147,7 +151,7 @@ export default {
}, },
addCoversition({data, headerTitle}) { addCoversition({data, headerTitle}) {
this.$refs.chatCoversitionList.addCoversition(data, headerTitle); this.$refs.chatCoversitionList.addCoversition(data, headerTitle);
this.currentCoversition = {id:data.id, group:data.group}; this.currentCoversition = {id:data.id, all:data.all};
this.headerTitle = headerTitle; this.headerTitle = headerTitle;
}, },
changeCoversition(data) { changeCoversition(data) {
@ -259,12 +263,11 @@ export default {
} }
}); });
}, },
handleCreateGroup() {
this.$refs.createGroup.doShow();
},
handleSetting() { handleSetting() {
this.$refs.chatSetting.doShow(); this.$refs.chatSetting.doShow();
},
handleMembers() {
this.$refs.chatSetting.doClose();
this.$refs.chatMemberList.doShow();
} }
} }
}; };
@ -293,6 +296,10 @@ export default {
margin-left: 15px; margin-left: 15px;
display: inline-block; display: inline-block;
margin-top: 10px; margin-top: 10px;
width: 70%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
} }
.chat-box-content{ .chat-box-content{
width: 100%; width: 100%;
@ -312,6 +319,14 @@ export default {
display: inline-block; display: inline-block;
width: 400px; width: 400px;
} }
.chat-createGroup{
float: right;
line-height: 40px;
margin-right: 10px;
cursor: pointer;
font-size: 16px;
position: relative;
}
.chat-setting{ .chat-setting{
float: right; float: right;
line-height: 40px; line-height: 40px;

View File

@ -4,13 +4,13 @@
<div v-for="(chatContent,index) in chatContentList" :key="index" class="chatContentInClass"> <div v-for="(chatContent,index) in chatContentList" :key="index" class="chatContentInClass">
<div :class="chatContent.self?'rightUser':'leftUser'"> <div :class="chatContent.self?'rightUser':'leftUser'">
<div class="userHeader"> <div class="userHeader">
<div v-if="chatContent.group&& !chatContent.self" class="userName">{{ covertName(chatContent.member) }}</div> <div v-if="chatContent.all&& !chatContent.self" class="userName">{{ covertName(chatContent.member) }}</div>
<div :class="chatContent.self?'userChatTime textRight':'userChatTime'">{{ formatTime(chatContent.chatTime) }}</div> <div :class="chatContent.self?'userChatTime textRight':'userChatTime'">{{ formatTime(chatContent.chatTime) }}</div>
</div> </div>
<div class="userBubble" @click="playAudio('audio'+index)"> <div class="userBubble" @click="playAudio('audio'+index)">
<div class="userMessage"> <div class="userMessage">
<!-- &&!(chatContent.self) --> <!-- &&!(chatContent.self) -->
<span v-if="chatContent.group">@{{ covertName(chatContent.targetName) }}</span> <span v-if="chatContent.all">@{{ covertName(chatContent.targetName) }}</span>
<span class="el-icon-video-play playicon" /> <span class="el-icon-video-play playicon" />
<span class="messageText">{{ chatContent.message }}</span> <span class="messageText">{{ chatContent.message }}</span>
<audio :id="'audio'+index" :src="baseUrl+chatContent.src" style="display:none" /> <audio :id="'audio'+index" :src="baseUrl+chatContent.src" style="display:none" />
@ -46,7 +46,7 @@ export default {
this.chatContentList.push(simulationText); this.chatContentList.push(simulationText);
this.scrollTop(); this.scrollTop();
} else { } else {
if (!simulationText.group) { if (!simulationText.all) {
this.$emit('changeCoversition', simulationText); this.$emit('changeCoversition', simulationText);
// this.$emit('addCoversition', {data:simulationText, headerTitle:''}); // this.$emit('addCoversition', {data:simulationText, headerTitle:''});
this.chatContentList.push(simulationText); this.chatContentList.push(simulationText);

View File

@ -32,9 +32,14 @@ export default {
if (resp.data) { if (resp.data) {
const data = resp.data; const data = resp.data;
data.map(coversition=>{ data.map(coversition=>{
if (coversition.name) {
coversition.coverName = coversition.name;
coversition.isOnline = true;
} else {
const objectCover = this.handleMemberName(coversition); const objectCover = this.handleMemberName(coversition);
coversition.coverName = objectCover.coversitionName; coversition.coverName = objectCover.coversitionName;
coversition.isOnline = objectCover.isOnline; coversition.isOnline = objectCover.isOnline;
}
return coversition; return coversition;
}); });
this.coversitionList = data; this.coversitionList = data;
@ -49,8 +54,13 @@ export default {
const index = this.coversitionList.findIndex(item=>{ return item.id == data.id; }); const index = this.coversitionList.findIndex(item=>{ return item.id == data.id; });
if (index < 0) { if (index < 0) {
const objectCover = this.handleMemberName(data); const objectCover = this.handleMemberName(data);
if (data.name) {
data.coverName = data.name;
data.isOnline = true;
} else {
data.coverName = objectCover.coversitionName; data.coverName = objectCover.coversitionName;
data.isOnline = objectCover.isOnline; data.isOnline = objectCover.isOnline;
}
this.coversitionList.push(data); this.coversitionList.push(data);
if (headerTitle) { if (headerTitle) {
this.currentCoversition = data; this.currentCoversition = data;
@ -58,8 +68,8 @@ export default {
} }
}, },
changeCoversition(coversition) { changeCoversition(coversition) {
this.$emit('setHeadTitle', !coversition.isOnline ? coversition.coverName + ' (离线)' : coversition.coverName); this.$emit('setHeadTitle', coversition.coverName);
this.currentCoversition = {id:coversition.id, group:coversition.group}; this.currentCoversition = {id:coversition.id, all:coversition.all};
this.$emit('setCurrentCoversition', coversition); this.$emit('setCurrentCoversition', coversition);
// this.$refs.chatContent.reloadData(this.currentCoversition); // this.$refs.chatContent.reloadData(this.currentCoversition);
}, },
@ -74,7 +84,7 @@ export default {
this.changeCoversition(coversition); this.changeCoversition(coversition);
}, },
handleMemberName(conversition) { handleMemberName(conversition) {
if (conversition.group) { if (conversition.all) {
return {coversitionName:conversition.name, isOnline:true}; return {coversitionName:conversition.name, isOnline:true};
} else { } else {
let coversitionName = ''; let coversitionName = '';
@ -119,11 +129,6 @@ export default {
} }
return {coversitionName:coversitionName, isOnline:isOnline}; return {coversitionName:coversitionName, isOnline:isOnline};
} }
},
setCoversitionStatus(data) {
this.initPage(false);
this.$emit('setHeadTitle', !this.currentCoversition.isOnline ? this.currentCoversition.coverName + ' (离线)' : this.currentCoversition.coverName);
// this.changeCoversition(this.currentCoversition);
} }
} }
}; };

View File

@ -0,0 +1,224 @@
<template>
<div v-show="dialogVisible" class="chat-create-group">
<div class="create-group-header">
<div class="create-group-title">添加会话对象</div>
<div class="create-group-close">
<i class="el-icon-close" @click="dialogVisible=false" />
</div>
</div>
<div class="create-group-content">
<div class="chat-member-list">
<el-checkbox-group v-model="checkList">
<el-checkbox
v-for="member in memberList"
:key="member.id"
class="each-chat-member"
:label="member"
:disabled="member.userId === userId"
>{{ member.memberName }}</el-checkbox>
</el-checkbox-group>
</div>
<div class="currentSelectList">
<div
v-for="member in checkList"
:key="member.id"
class="eachSelect"
>
{{ member.memberName }}
</div>
</div>
<!-- :style="member.userId === userId ?'color:red':''" -->
</div>
<div class="create-group-bottom">
<el-button :loading="loading" size="small" type="primary" @click="doCreate">创建会话</el-button>
<el-button size="small" @click="doClose">取消</el-button>
</div>
</div>
</template>
<script>
import {getSimulationMembersNew, getSimulationConversationIdNew} from '@/api/chat';
import ConstConfig from '@/scripts/ConstConfig';
import Cookies from 'js-cookie';
export default {
name:'ChatCreateGroup',
props: {
group: {
type: String,
required: true
}
},
data() {
return {
dialogVisible:false,
loading:false,
memberList:[],
checkList:[]
};
},
computed:{
userId() {
return this.$store.state.user.id;
}
},
methods:{
doShow() {
this.getSimulationMembers();
this.dialogVisible = true;
},
getSimulationMembers() {
getSimulationMembersNew(this.$route.query.group).then(resp => {
let lastData = JSON.stringify(resp.data);
const roleTypeList = ConstConfig.ConstSelect.roleTypeNew;
roleTypeList.forEach(function(element) {
const rolename = element.value;
if (Cookies.get('user_lang') == 'en') {
lastData = lastData.replace(new RegExp(rolename, 'g'), element.enLabel);
} else {
lastData = lastData.replace(new RegExp(rolename, 'g'), element.label);
}
});
lastData = JSON.parse(lastData);
lastData = lastData.filter(memberIn=>{ return memberIn.role != '观众'; });
lastData.map(member=>{
const deviceName = member.deviceName ? '-' + member.deviceName : '';
const memberName = member.name ? '-' + member.name : '';
member.memberName = member.role + deviceName + memberName;
return member;
});
this.memberList = lastData;
});
},
doCreate() {
if (this.checkList.length > 0) {
this.loading = true;
const checkList = this.checkList.map(function(check) { return check.id; });
getSimulationConversationIdNew(checkList, this.group).then(resp => {
if (resp.data) {
const data = resp.data;
this.loading = false;
this.$emit('addCoversition', {data:data, headerTitle:resp.data.name});
this.dialogVisible = false;
this.checkList = [];
}
}).catch(error=>{
this.$messageBox('创建会话失败: ' + error.messagfe);
this.loading = false;
this.dialogVisible = false;
this.checkList = [];
});
}
},
doClose() {
this.checkList = [];
this.dialogVisible = false;
}
}
};
</script>
<style lang="scss" scoped>
.chat-create-group{
position: absolute;
width: 70%;
height: 300px;
border: 1px #dedede solid;
left: 26%;
top: 8%;
z-index: 7;
border-radius: 8px;
box-shadow: #b5aeae 0 0 10px;
background: #fff;
}
.create-group-header{
padding-left: 10px;
padding-top: 6px;
font-size: 14px;
border-bottom: 1px #dedede solid;
padding-bottom: 6px;
}
.create-group-title{
display: inline-block;
}
.create-group-close{
float: right;
display: inline-block;
margin-right: 5px;
font-size: 16px;
cursor: pointer;
}
.chat-member-list{
width: 54%;
height: 216px;
overflow-y: auto;
padding: 5px 10px;
font-size: 14px;
overflow-x: hidden;
border-right: 1px #ccc solid;
display:inline-block;
}
.create-group-content{
width: 100%;
height: 220px;
padding-bottom: 10px;
border-bottom: 1px #dedede solid;
}
.create-group-bottom{
text-align: center;
margin-top:8px;
}
.each-chat-member{
display:block;
margin-top:5px;
}
.currentSelectList{
display: inline-block;
width: 44%;
font-size: 14px;
vertical-align: top;
padding: 5px 10px;
overflow-x: hidden;
overflow-y: auto;
height: 216px;
}
.eachSelect{
display:block;
margin-top:5px;
}
// safariqq360
//
.chat-member-list::-webkit-scrollbar,.currentSelectList::-webkit-scrollbar {
width: 6px;
height: 6px;
// height: 110px;
background-color: #FFFFFF;
}
/*定义滚动条轨道 内阴影+圆角*/
.chat-member-list::-webkit-scrollbar-track,.currentSelectList::-webkit-scrollbar-track{
// box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
border-radius: 10px;
background-color: #FFFFFF;;
}
/*定义滑块 内阴影+圆角*/
.chat-member-list::-webkit-scrollbar-thumb,.currentSelectList::-webkit-scrollbar-thumb{
border-radius: 10px;
// box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #cacaca;
}
/*滑块效果*/
.chat-member-list::-webkit-scrollbar-thumb:hover,.currentSelectList::-webkit-scrollbar-thumb:hover {
border-radius: 5px;
// box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.4);
}
/*IE滚动条颜色*/
html {
scrollbar-face-color:#bfbfbf;/*滚动条颜色*/
scrollbar-highlight-color:#000;
scrollbar-3dlight-color:#000;
scrollbar-darkshadow-color:#000;
scrollbar-Shadow-color:#adadad;/*滑块边色*/
scrollbar-arrow-color:rgba(0,0,0,0.4);/*箭头颜色*/
scrollbar-track-color:#eeeeee;/*背景颜色*/
}
</style>

View File

@ -5,14 +5,16 @@
<div <div
v-for="member in memberList" v-for="member in memberList"
:key="member.id" :key="member.id"
:class="member.online?'each-chat-member':'each-chat-member each-chat-member-outline'" :style="member.userId === userId ?'color:red':''"
@click="createConversition(member)" class="each-chat-member"
:title="member.memberName"
>{{ member.memberName }}</div> >{{ member.memberName }}</div>
<!-- :class="member.online?'each-chat-member':'each-chat-member each-chat-member-outline'" -->
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import {getSimulationMembersNew, getSimulationConversationIdNew} from '@/api/chat'; import {getSimulationChatMemberNew} from '@/api/chat';
import ConstConfig from '@/scripts/ConstConfig'; import ConstConfig from '@/scripts/ConstConfig';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
export default { export default {
@ -21,43 +23,35 @@ export default {
group: { group: {
type: String, type: String,
required: true required: true
},
currentCoversition:{
type: Object,
required: true
} }
}, },
data() { data() {
return { return {
showMembers:false, showMembers:true,
memberList:[] memberList:[]
}; };
}, },
mounted() { computed:{
userId() {
return this.$store.state.user.id;
}
},
watch:{
currentCoversition:function (val, old) {
if (val) {
this.getSimulationMembers(); this.getSimulationMembers();
}
}
},
mounted() {
}, },
methods:{ methods:{
createConversition(member) {
if (member.userId != this.$store.state.user.id && member.online) {
getSimulationConversationIdNew({ memberId: member.id }, this.group).then(resp => {
if (resp.data) {
const data = resp.data;
this.$emit('addCoversition', {data:data, headerTitle:member.memberName});
this.showMembers = false;
}
});
}
},
setMemberStatus(memberInfo) {
this.getSimulationMembers();
// memberInfo.forEach(member=>{
// if (this.coversitionList) {
// this.coversitionList.forEach(item=>{
// if (item.id == member.id) {
// item.online = member.online;
// }
// });
// }
// });
},
getSimulationMembers() { getSimulationMembers() {
getSimulationMembersNew(this.$route.query.group).then(resp => { getSimulationChatMemberNew(this.$route.query.group, this.currentCoversition.id).then(resp => {
let lastData = JSON.stringify(resp.data); let lastData = JSON.stringify(resp.data);
const roleTypeList = ConstConfig.ConstSelect.roleTypeNew; const roleTypeList = ConstConfig.ConstSelect.roleTypeNew;
roleTypeList.forEach(function(element) { roleTypeList.forEach(function(element) {
@ -82,14 +76,6 @@ export default {
return this.memberList.filter(member=>{ return this.memberList.filter(member=>{
return member.id == memberId; return member.id == memberId;
}); });
},
doShow() {
if (this.showMembers) {
this.showMembers = false;
} else {
this.showMembers = true;
this.getSimulationMembers();
}
} }
} }
}; };

View File

@ -41,6 +41,7 @@
:group="group" :group="group"
:quest-id="questId" :quest-id="questId"
:show-station="showStation" :show-station="showStation"
:user-role="userRole"
@tryTime="tryTime" @tryTime="tryTime"
@hidepanel="hidepanel" @hidepanel="hidepanel"
@passflow="passflow" @passflow="passflow"
@ -253,6 +254,17 @@ export default {
}, },
project() { project() {
return getSessionStorage('project'); return getSessionStorage('project');
},
userRole() {
if (this.$route.query.prdType == '02') {
return 'DISPATCHER';
} else if (this.$route.query.prdType == '01') {
return 'STATION_SUPERVISOR';
} else if (this.$route.query.prdType == '04') {
return 'DRIVER';
} else {
return 'AUDIENCE';
}
} }
}, },
watch: { watch: {

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<chat-box ref="chatbox" :group="group" /> <chat-box ref="chatbox" :group="group" :user-role="userRole" />
<div class="display-card" :style="{top: offset+'px'}"> <div class="display-card" :style="{top: offset+'px'}">
<el-row> <el-row>
<span v-if="countTime" class="display-score">{{ $t('display.demon.trialTime') }} {{ countTime }}</span> <span v-if="countTime" class="display-score">{{ $t('display.demon.trialTime') }} {{ countTime }}</span>
@ -77,6 +77,10 @@ export default {
default() { default() {
return false; return false;
} }
},
userRole: {
type: String,
required: true
} }
}, },
data() { data() {

View File

@ -38,6 +38,7 @@ export default {
chatContentList:[], chatContentList:[],
coversition:{}, coversition:{},
currentAudioList:[], currentAudioList:[],
currentAudioIndex:0,
isPlay:false, isPlay:false,
baseUrl:process.env.VUE_APP_VOICE_API baseUrl:process.env.VUE_APP_VOICE_API
}; };
@ -122,17 +123,18 @@ export default {
return /\d{2}:\d{2}:\d{2}/.exec(time)[0] || time; return /\d{2}:\d{2}:\d{2}/.exec(time)[0] || time;
}, },
playAllAudio() { playAllAudio() {
// this.playEachAudio(this.currentAudioList[this.currentAudioIndex]); this.playEachAudio(this.currentAudioList[this.currentAudioIndex]);
}, },
playEachAudio(index) { playEachAudio(audioUrl) {
this.$nextTick(function() { this.$nextTick(function() {
document.querySelector('#audio' + index).play(); document.querySelector('#audioPlay').src = audioUrl;
document.querySelector('#audioPlay').play();
const that = this; const that = this;
document.querySelector('#audio' + index).onended = function() { document.querySelector('#audioPlay').onended = function() {
that.currentAudioList.shift(); that.currentAudioList.shift();
if (that.currentAudioList.length > 0) { if (that.currentAudioList.length > 0) {
// that.currentAudioIndex++; that.currentAudioIndex++;
// that.playEachAudio(that.currentAudioList[that.currentAudioIndex]); that.playEachAudio(that.currentAudioList[that.currentAudioIndex]);
} else { } else {
that.isPlay = false; that.isPlay = false;
} }

View File

@ -68,7 +68,7 @@ export default {
} }
}, },
changeCoversition(coversition) { changeCoversition(coversition) {
this.$emit('setHeadTitle', !coversition.isOnline ? coversition.coverName + ' (离线)' : coversition.coverName); this.$emit('setHeadTitle', coversition.coverName);
this.currentCoversition = {id:coversition.id, all:coversition.all}; this.currentCoversition = {id:coversition.id, all:coversition.all};
this.$emit('setCurrentCoversition', coversition); this.$emit('setCurrentCoversition', coversition);
// this.$refs.chatContent.reloadData(this.currentCoversition); // this.$refs.chatContent.reloadData(this.currentCoversition);