|
|
|
@ -1,6 +1,5 @@ |
|
|
|
<template> |
|
|
|
<template> |
|
|
|
<div class="meeting-container"> |
|
|
|
<div class="meeting-container"> |
|
|
|
<!-- 顶部导航栏 --> |
|
|
|
|
|
|
|
<header class="top-bar"> |
|
|
|
<header class="top-bar"> |
|
|
|
<div class="logo"> |
|
|
|
<div class="logo"> |
|
|
|
<img src="@/assets/logo/logo.png" /> |
|
|
|
<img src="@/assets/logo/logo.png" /> |
|
|
|
@ -12,19 +11,15 @@ |
|
|
|
<i class="el-icon-close" @click="closeWindow"></i> |
|
|
|
<i class="el-icon-close" @click="closeWindow"></i> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</header> |
|
|
|
</header> |
|
|
|
<!-- 主画面区域:2x2网格布局 --> |
|
|
|
|
|
|
|
<main class="main-content"> |
|
|
|
<main class="main-content"> |
|
|
|
<div class="video-grid" v-for="(item, index) in list" :key="index"> |
|
|
|
<div class="video-grid" v-for="(item, index) in list" :key="index"> |
|
|
|
<div class="video-box"> |
|
|
|
<div class="video-box"> |
|
|
|
<!-- 空状态:加号靠右垂直居中 --> |
|
|
|
|
|
|
|
<div v-if="!item.user || !item.user.id" class="empty-state"> |
|
|
|
<div v-if="!item.user || !item.user.id" class="empty-state"> |
|
|
|
<button class="add-user-btn" @click="handleUpdate(index)"> |
|
|
|
<button class="add-user-btn" @click="handleUpdate(index)"> |
|
|
|
<i class="el-icon-plus"></i> |
|
|
|
<i class="el-icon-plus"></i> |
|
|
|
</button> |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<!-- 有用户时显示内容 --> |
|
|
|
|
|
|
|
<div v-else class="user-state"> |
|
|
|
<div v-else class="user-state"> |
|
|
|
<!-- 单元格顶部行:左音量、中姓名、右取消质控 --> |
|
|
|
|
|
|
|
<div class="cell-top-bar"> |
|
|
|
<div class="cell-top-bar"> |
|
|
|
<div class="signal-icon"> |
|
|
|
<div class="signal-icon"> |
|
|
|
<i |
|
|
|
<i |
|
|
|
@ -39,8 +34,8 @@ |
|
|
|
取消质控 |
|
|
|
取消质控 |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<!-- 中间横向:头像 + 名字 + 离线按钮 --> |
|
|
|
<div class="video-area"> |
|
|
|
<div class="user-info"> |
|
|
|
<div class="video-placeholder"> |
|
|
|
<img |
|
|
|
<img |
|
|
|
v-if="item.user.avatar" |
|
|
|
v-if="item.user.avatar" |
|
|
|
:src="getAvatarUrl(item.user.avatar)" |
|
|
|
:src="getAvatarUrl(item.user.avatar)" |
|
|
|
@ -49,8 +44,18 @@ |
|
|
|
<div v-else class="default-avatar"> |
|
|
|
<div v-else class="default-avatar"> |
|
|
|
{{ item.user.name.charAt(0) || "?" }} |
|
|
|
{{ item.user.name.charAt(0) || "?" }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="user-info-overlay"> |
|
|
|
<span class="user-name">{{ item.user.name }}</span> |
|
|
|
<span class="user-name">{{ item.user.name }}</span> |
|
|
|
<span class="offline-tag">离线</span> |
|
|
|
<span |
|
|
|
|
|
|
|
:class="[ |
|
|
|
|
|
|
|
'status-tag', |
|
|
|
|
|
|
|
item.user.online === 1 ? 'online' : 'offline', |
|
|
|
|
|
|
|
]" |
|
|
|
|
|
|
|
> |
|
|
|
|
|
|
|
{{ item.user.online === 1 ? "在线" : "离线" }} |
|
|
|
|
|
|
|
</span> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -117,8 +122,8 @@ export default { |
|
|
|
{ signalLevel: 2, user: {} }, |
|
|
|
{ signalLevel: 2, user: {} }, |
|
|
|
], |
|
|
|
], |
|
|
|
queryParams: { |
|
|
|
queryParams: { |
|
|
|
name: "测试部门的云质控", |
|
|
|
name: "", |
|
|
|
room_id: "6689110", |
|
|
|
room_id: "", |
|
|
|
}, |
|
|
|
}, |
|
|
|
index: 0, |
|
|
|
index: 0, |
|
|
|
form: {}, |
|
|
|
form: {}, |
|
|
|
@ -135,6 +140,8 @@ export default { |
|
|
|
}; |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
mounted() { |
|
|
|
mounted() { |
|
|
|
|
|
|
|
this.queryParams.room_id = this.$route.query.roomId_id; |
|
|
|
|
|
|
|
this.queryParams.name = this.$route.query.name + "的云质控"; |
|
|
|
this.$store.dispatch("app/toggleSideBarHide", true); |
|
|
|
this.$store.dispatch("app/toggleSideBarHide", true); |
|
|
|
this.$store.dispatch("settings/changeSetting", { |
|
|
|
this.$store.dispatch("settings/changeSetting", { |
|
|
|
key: "fixedHeader", |
|
|
|
key: "fixedHeader", |
|
|
|
@ -147,6 +154,17 @@ export default { |
|
|
|
this.getList(); |
|
|
|
this.getList(); |
|
|
|
// this.initRTC(); |
|
|
|
// this.initRTC(); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
beforeDestroy() { |
|
|
|
|
|
|
|
this.$store.dispatch("app/toggleSideBarHide", false); |
|
|
|
|
|
|
|
this.$store.dispatch("settings/changeSetting", { |
|
|
|
|
|
|
|
key: "fixedHeader", |
|
|
|
|
|
|
|
value: true, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
this.$store.dispatch("settings/changeSetting", { |
|
|
|
|
|
|
|
key: "tagsView", |
|
|
|
|
|
|
|
value: true, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}, |
|
|
|
// beforeUnmount() { |
|
|
|
// beforeUnmount() { |
|
|
|
// this.leaveRoom(); |
|
|
|
// this.leaveRoom(); |
|
|
|
// this.unbindEvent(); |
|
|
|
// this.unbindEvent(); |
|
|
|
@ -538,38 +556,67 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.user-info { |
|
|
|
.video-area { |
|
|
|
height: calc(100% - 45px); |
|
|
|
height: calc(100% - 45px); |
|
|
|
|
|
|
|
position: relative; |
|
|
|
display: flex; |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
justify-content: center; |
|
|
|
gap: 16px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.user-avatar { |
|
|
|
.video-placeholder { |
|
|
|
width: 90px; |
|
|
|
width: 120px; |
|
|
|
height: 90px; |
|
|
|
height: 120px; |
|
|
|
border-radius: 14px; |
|
|
|
border-radius: 14px; |
|
|
|
|
|
|
|
overflow: hidden; |
|
|
|
|
|
|
|
background: #00695c; |
|
|
|
|
|
|
|
display: flex; |
|
|
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.user-avatar { |
|
|
|
|
|
|
|
width: 100%; |
|
|
|
|
|
|
|
height: 100%; |
|
|
|
object-fit: cover; |
|
|
|
object-fit: cover; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.default-avatar { |
|
|
|
.default-avatar { |
|
|
|
width: 90px; |
|
|
|
font-size: 36px; |
|
|
|
height: 90px; |
|
|
|
color: #fff; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.user-info-overlay { |
|
|
|
|
|
|
|
position: absolute; |
|
|
|
|
|
|
|
bottom: 15px; |
|
|
|
|
|
|
|
left: 50%; |
|
|
|
|
|
|
|
transform: translateX(-50%); |
|
|
|
display: flex; |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
gap: 12px; |
|
|
|
font-size: 26px; |
|
|
|
background: rgba(0, 0, 0, 0.6); |
|
|
|
} |
|
|
|
padding: 8px 16px; |
|
|
|
|
|
|
|
border-radius: 20px; |
|
|
|
|
|
|
|
|
|
|
|
.user-name { |
|
|
|
.user-name { |
|
|
|
font-size: 18px; |
|
|
|
font-size: 16px; |
|
|
|
|
|
|
|
color: #fff; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.offline-tag { |
|
|
|
.status-tag { |
|
|
|
background: #00897b; |
|
|
|
padding: 4px 10px; |
|
|
|
padding: 8px 22px; |
|
|
|
border-radius: 10px; |
|
|
|
border-radius: 6px; |
|
|
|
font-size: 12px; |
|
|
|
font-size: 16px; |
|
|
|
|
|
|
|
|
|
|
|
&.online { |
|
|
|
|
|
|
|
background: #4cd964; |
|
|
|
|
|
|
|
color: #000; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.offline { |
|
|
|
|
|
|
|
background: #546e7a; |
|
|
|
|
|
|
|
color: #fff; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|