|
|
@@ -1,67 +1,54 @@
|
|
|
<template>
|
|
|
<!-- 直播中控台 start -->
|
|
|
- <el-row type="flex" justify="center" class="live-console" :gutter="10" v-loading="loading">>
|
|
|
+ <el-row type="flex" justify="center" class="live-console live-page" :gutter="10" v-loading="loading">
|
|
|
<!-- 聊天 start -->
|
|
|
<el-col class="live-console-col" :span="6">
|
|
|
<el-tabs class="live-console-tab-left" v-model="tabRight.activeName" @tab-click="handleClick" :stretch="true">
|
|
|
<el-tab-pane label="讨论" name="talk">
|
|
|
- <el-scrollbar style="height: 500px; width: 100%;" ref="manageRightRef">
|
|
|
- <el-row v-for="m in msgList" style="margin-bottom: 20px;">
|
|
|
- <el-row v-if="m.userId !== userId" type="flex" align="top" >
|
|
|
- <el-col :span="24" style="display: flex; align-items: center;">
|
|
|
- <el-avatar style="width: 36px;height: 36px;" :src="m.avatar!==null?m.avatar: require('@/assets/image/default-a.png')"/>
|
|
|
- <div style="font-size: 14px; color: #999;margin: 0 12px;">{{ m.nickName }}</div>
|
|
|
- <div style="display: flex; align-items: center; gap: 8px;">
|
|
|
- <a style="cursor: pointer;color: #13C2C2;font-size: 14px;" @click="changeUserState(m)">{{ m.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
- <span style="color:#13C2C2;">|</span>
|
|
|
- <a style="cursor: pointer;color: #13C2C2;font-size: 14px;" @click="blockUser(m)">拉黑</a>
|
|
|
- <span style="color:#13C2C2;">|</span>
|
|
|
- <a style="cursor: pointer;color: #ff0000;padding: 8px 8px 0 0;font-size: 12px;" @click="deleteMsg(m)">删除</a>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row v-if="m.userId !== userId" type="flex" align="top">
|
|
|
- <el-col :span="19" :offset="3">
|
|
|
- <div class="msg-box">
|
|
|
- {{ m.msg }}
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-row v-if="m.userId === userId" style="padding: 8px 0;margin-right: 10px;" type="flex" align="top" justify="end">
|
|
|
- <div style="display: flex;justify-content: flex-end">
|
|
|
- <div style="display: flex;justify-content: flex-end;flex-direction: column;max-width: 200px;align-items: flex-end">
|
|
|
- <div style="display: flex;align-items: center;">
|
|
|
- <div style="font-size: 14px; color: #999;margin-right: 12px;">{{ m.nickName }}</div>
|
|
|
- <el-avatar :src="m.avatar?m.avatar: require('@/assets/image/default-a.png')" style="width: 36px;height: 36px;"/>
|
|
|
+ <el-scrollbar class="chat-scroll" ref="manageRightRef">
|
|
|
+ <div class="chat-msg" v-for="m in msgList" :key="m.msgId || m.userId + '-' + m.msg">
|
|
|
+ <div v-if="m.userId !== userId" class="chat-msg__row chat-msg__row--left">
|
|
|
+ <el-avatar class="chat-msg__avatar" :src="m.avatar!==null?m.avatar: require('@/assets/image/default-a.png')"/>
|
|
|
+ <div class="chat-msg__body">
|
|
|
+ <div class="chat-msg__meta">
|
|
|
+ <span class="chat-msg__name">{{ m.nickName }}</span>
|
|
|
+ <div class="chat-msg__ops">
|
|
|
+ <a class="chat-msg__op" @click="changeUserState(m)">{{ m.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
+ <a class="chat-msg__op" @click="blockUser(m)">拉黑</a>
|
|
|
+ <a class="chat-msg__op chat-msg__op--danger" @click="deleteMsg(m)">删除</a>
|
|
|
</div>
|
|
|
-
|
|
|
- <div class="msg-box-right">
|
|
|
- {{ m.msg }}</div>
|
|
|
</div>
|
|
|
-
|
|
|
+ <div class="msg-box">{{ m.msg }}</div>
|
|
|
</div>
|
|
|
- </el-row>
|
|
|
- </el-row>
|
|
|
- <!-- 底部留白 -->
|
|
|
- <div style="height: 20px;"></div>
|
|
|
+ </div>
|
|
|
+ <div v-else class="chat-msg__row chat-msg__row--right">
|
|
|
+ <div class="chat-msg__body chat-msg__body--right">
|
|
|
+ <div class="chat-msg__meta chat-msg__meta--right">
|
|
|
+ <span class="chat-msg__name">{{ m.nickName }}</span>
|
|
|
+ <el-avatar class="chat-msg__avatar" :src="m.avatar?m.avatar: require('@/assets/image/default-a.png')"/>
|
|
|
+ </div>
|
|
|
+ <div class="msg-box-right">{{ m.msg }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="chat-scroll__spacer"></div>
|
|
|
</el-scrollbar>
|
|
|
|
|
|
<!-- 消息输入区域 -->
|
|
|
- <div class="shuru" style="padding: 20px; border-top: 1px solid #ebeef5; background-color: #fff; min-height: 120px;">
|
|
|
+ <div class="shuru">
|
|
|
<el-input
|
|
|
type="textarea"
|
|
|
v-model="newMsg"
|
|
|
placeholder="请输入消息..."
|
|
|
- :rows="8"
|
|
|
+ :rows="3"
|
|
|
@keyup.enter.native="sendMessage"
|
|
|
clearable
|
|
|
resize="none"
|
|
|
- style="flex: 1; margin-right: 10px;"
|
|
|
>
|
|
|
</el-input>
|
|
|
- <div style="display: flex; justify-content: flex-end; margin-top: 10px;">
|
|
|
- <el-button style="background: #13C2C2;color: #fff;" @click="showTopMsgDialog">顶部消息</el-button>
|
|
|
- <el-button style="background: #13C2C2;color: #fff;" @click="sendMessage">发送</el-button>
|
|
|
+ <div class="shuru__actions">
|
|
|
+ <el-button class="btn-accent" @click="showTopMsgDialog">顶部消息</el-button>
|
|
|
+ <el-button class="btn-accent" @click="sendMessage">发送</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
@@ -72,14 +59,14 @@
|
|
|
|
|
|
<!-- 直播/视频 start -->
|
|
|
<el-col class="live-console-col" :span="12">
|
|
|
- <div style="background: #000; border-radius: 5px; overflow: hidden; margin: 10px 5px;">
|
|
|
- <div style="border-radius: 5px; overflow: hidden;" v-if="!isAudit">
|
|
|
- <img :src="require('@/assets/image/videoIsAudit.png')" style="width: 100%; height: 45vh;">
|
|
|
+ <div class="player-panel">
|
|
|
+ <div class="player-panel__inner" v-if="!isAudit">
|
|
|
+ <img :src="require('@/assets/image/videoIsAudit.png')" class="player-panel__poster">
|
|
|
</div>
|
|
|
- <div style="border-radius: 5px; overflow: hidden;" v-else-if="status != 2 && status != 4">
|
|
|
- <img :src="require('@/assets/image/videoNotStart.png')" style="width: 100%; height: 45vh;">
|
|
|
+ <div class="player-panel__inner" v-else-if="status != 2 && status != 4">
|
|
|
+ <img :src="require('@/assets/image/videoNotStart.png')" class="player-panel__poster">
|
|
|
</div>
|
|
|
- <div style="border-radius: 5px; overflow: hidden;" v-else-if="liveType == 1">
|
|
|
+ <div class="player-panel__inner" v-else-if="liveType == 1">
|
|
|
<video
|
|
|
id="live-tcplayer-container"
|
|
|
ref="livingPlayer"
|
|
|
@@ -94,7 +81,7 @@
|
|
|
已播放:<span id="liveElapsedTime">00:00:00</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div style="border-radius: 5px; overflow: hidden;" v-else-if="liveType == 2">
|
|
|
+ <div class="player-panel__inner" v-else-if="liveType == 2">
|
|
|
<video
|
|
|
controls
|
|
|
ref="videoPlayer"
|
|
|
@@ -120,7 +107,7 @@
|
|
|
已播放:<span id="elapsedTime">00:00:00</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div style="border-radius: 5px; overflow: hidden;" v-else-if="liveType == 3">
|
|
|
+ <div class="player-panel__inner" v-else-if="liveType == 3">
|
|
|
<video
|
|
|
controls
|
|
|
ref="liveReplay"
|
|
|
@@ -133,44 +120,39 @@
|
|
|
<source :src="videoUrl" type="application/x-mpegURL">
|
|
|
</video>
|
|
|
</div>
|
|
|
- <div style="border-radius: 5px; overflow: hidden;" v-else>
|
|
|
- <img :src="require('@/assets/image/videoNotStart.png')" style="width: 100%; height: 45vh;">
|
|
|
+ <div class="player-panel__inner" v-else>
|
|
|
+ <img :src="require('@/assets/image/videoNotStart.png')" class="player-panel__poster">
|
|
|
</div>
|
|
|
</div>
|
|
|
<!-- 底部导航栏 -->
|
|
|
- <div style="display: flex; justify-content: space-around; padding: 15px 0; background: #fff; border-top: 1px solid #f0f0f0;">
|
|
|
- <div class="top-box" style="display: flex; flex-direction: column; align-items: center; cursor: pointer;" @click="handleClickRed">
|
|
|
- <!-- <i class="el-icon-money" style="font-size: 20px;"></i> -->
|
|
|
- <img src="@/assets/image/hbpz.png" width="48"/>
|
|
|
- <span style="font-size: 12px; margin-top: 10px;">红包配置</span>
|
|
|
+ <div class="tool-bar">
|
|
|
+ <div class="top-box" @click="handleClickRed">
|
|
|
+ <img src="@/assets/image/hbpz.png"/>
|
|
|
+ <span>红包配置</span>
|
|
|
</div>
|
|
|
- <div class="top-box" style="display: flex; flex-direction: column; align-items: center; cursor: pointer;" @click="handleClickLottery">
|
|
|
- <!-- <i class="el-icon-present" style="font-size: 20px;"></i> -->
|
|
|
- <img src="@/assets/image/cjpz.png" width="48"/>
|
|
|
- <span style="font-size: 12px; margin-top: 10px;">抽奖配置</span>
|
|
|
+ <div class="top-box" @click="handleClickLottery">
|
|
|
+ <img src="@/assets/image/cjpz.png"/>
|
|
|
+ <span>抽奖配置</span>
|
|
|
</div>
|
|
|
- <div class="top-box" style="display: flex; flex-direction: column; align-items: center; cursor: pointer;" @click="handleClickGoods">
|
|
|
- <!-- <i class="el-icon-goods" style="font-size: 20px;"></i> -->
|
|
|
- <img src="@/assets/image/sp.png" width="48"/>
|
|
|
- <span style="font-size: 12px; margin-top: 10px;">商品</span>
|
|
|
+ <div class="top-box" @click="handleClickGoods">
|
|
|
+ <img src="@/assets/image/sp.png"/>
|
|
|
+ <span>商品</span>
|
|
|
</div>
|
|
|
- <div class="top-box" style="display: flex; flex-direction: column; align-items: center; cursor: pointer;" @click="handleClickOrder">
|
|
|
- <!-- <i class="el-icon-goods" style="font-size: 20px;"></i> -->
|
|
|
- <img src="@/assets/image/zbdd.png" width="48"/>
|
|
|
- <span style="font-size: 12px;margin-top: 10px;">直播订单</span>
|
|
|
+ <div class="top-box" @click="handleClickOrder">
|
|
|
+ <img src="@/assets/image/zbdd.png"/>
|
|
|
+ <span>直播订单</span>
|
|
|
</div>
|
|
|
- <div class="top-box" style="display: flex; flex-direction: column; align-items: center; cursor: pointer;" @click="handleClickCoupon">
|
|
|
- <!-- <i class="el-icon-goods" style="font-size: 20px;"></i> -->
|
|
|
- <img src="@/assets/image/zbyhq.png" width="48"/>
|
|
|
- <span style="font-size: 12px; margin-top: 10px;">直播优惠券</span>
|
|
|
+ <div class="top-box" @click="handleClickCoupon">
|
|
|
+ <img src="@/assets/image/zbyhq.png"/>
|
|
|
+ <span>直播优惠券</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<!-- <el-radio-group v-model="tableRadio" >
|
|
|
<el-radio-button label="订单数">订单数</el-radio-button>
|
|
|
</el-radio-group> -->
|
|
|
- <div style="position: relative;width: 100%; height: 270px;margin-top: 30px;">
|
|
|
- <div ref="chartContainer" style="width: 100%; height: 100%;"></div>
|
|
|
- <div style="position: absolute; top: 10px; right: 10px; background: #fff; padding: 5px; z-index: 1;">
|
|
|
+ <div class="chart-panel">
|
|
|
+ <div ref="chartContainer" class="chart-panel__canvas"></div>
|
|
|
+ <div class="chart-panel__filters">
|
|
|
<el-select v-model="searchQuery.timeOptions" placeholder="请选择" style="width: 150px" @change="timeChange">
|
|
|
<el-option
|
|
|
v-for="item in timeOptions"
|
|
|
@@ -197,69 +179,51 @@
|
|
|
<el-col class="live-console-col" :span="6">
|
|
|
<el-tabs class="live-console-tab-right" v-model="tabLeft.activeName" @tab-click="handleClick" :stretch="true">
|
|
|
<el-tab-pane :label="onlineLabel" name="online" style="height: 100%;">
|
|
|
- <el-scrollbar ref="manageLeftRef_online" style="height:100%; width: 100%;padding: 10px;">
|
|
|
- <el-row class="row-box" style="margin-bottom:10px" type="flex" align="middle" v-for="u in onlineDisplayList" :key="u.userId">
|
|
|
- <el-col :span="20">
|
|
|
- <el-row type="flex" align="middle">
|
|
|
- <el-col :span="4" style="padding-left: 10px;"><el-avatar :src="u.avatar"></el-avatar></el-col>
|
|
|
- <el-col :span="19" :offset="1">{{ u.nickName }}</el-col>
|
|
|
- <el-col :span="19" :offset="1">{{ u.userId }}</el-col>
|
|
|
- </el-row>
|
|
|
- </el-col>
|
|
|
- <el-col :span="4" >
|
|
|
- <el-popover
|
|
|
- width="100"
|
|
|
- trigger="click">
|
|
|
- <a style="cursor: pointer;color: #ff0000;" @click="changeUserState(u)">{{ u.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
- <a style="cursor: pointer;color: #ff0000;margin-left:10px" @click="blockUser(u)">拉黑</a>
|
|
|
- <i class="el-icon-more" slot="reference"></i>
|
|
|
- </el-popover>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <el-scrollbar ref="manageLeftRef_online" class="user-scroll">
|
|
|
+ <div class="row-box" v-for="u in onlineDisplayList" :key="u.userId">
|
|
|
+ <el-avatar class="user-row__avatar" :src="u.avatar"></el-avatar>
|
|
|
+ <div class="user-row__info">
|
|
|
+ <div class="user-row__name">{{ u.nickName }}</div>
|
|
|
+ <div class="user-row__id">{{ u.userId }}</div>
|
|
|
+ </div>
|
|
|
+ <el-popover width="100" trigger="click">
|
|
|
+ <a class="user-row__pop-op" @click="changeUserState(u)">{{ u.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
+ <a class="user-row__pop-op" @click="blockUser(u)">拉黑</a>
|
|
|
+ <i class="el-icon-more" slot="reference"></i>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
</el-scrollbar>
|
|
|
</el-tab-pane>
|
|
|
<el-tab-pane :label="offlineLabel" name="offline" style="height: 100%;">
|
|
|
- <el-scrollbar ref="manageLeftRef_offline" style="height:100%; width: 100%;padding: 10px;">
|
|
|
- <el-row class="row-box" style="margin-bottom:10px" type="flex" align="middle" v-for="u in offlineDisplayList" :key="u.userId">
|
|
|
- <el-col :span="20">
|
|
|
- <el-row type="flex" align="middle">
|
|
|
- <el-col :span="4" style="padding-left: 10px;"><el-avatar :src="u.avatar"></el-avatar></el-col>
|
|
|
- <el-col :span="19" :offset="1">{{ u.nickName }}</el-col>
|
|
|
- <el-col :span="19" :offset="1">{{ u.userId }}</el-col>
|
|
|
- </el-row>
|
|
|
- </el-col>
|
|
|
- <el-col :span="4" >
|
|
|
- <el-popover
|
|
|
- width="100"
|
|
|
- trigger="click">
|
|
|
- <a style="cursor: pointer;color: #ff0000;" @click="changeUserState(u)">{{ u.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
- <a style="cursor: pointer;color: #ff0000;margin-left:10px" @click="blockUser(u)">拉黑</a>
|
|
|
- <i class="el-icon-more" slot="reference"></i>
|
|
|
- </el-popover>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <el-scrollbar ref="manageLeftRef_offline" class="user-scroll">
|
|
|
+ <div class="row-box" v-for="u in offlineDisplayList" :key="u.userId">
|
|
|
+ <el-avatar class="user-row__avatar" :src="u.avatar"></el-avatar>
|
|
|
+ <div class="user-row__info">
|
|
|
+ <div class="user-row__name">{{ u.nickName }}</div>
|
|
|
+ <div class="user-row__id">{{ u.userId }}</div>
|
|
|
+ </div>
|
|
|
+ <el-popover width="100" trigger="click">
|
|
|
+ <a class="user-row__pop-op" @click="changeUserState(u)">{{ u.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
+ <a class="user-row__pop-op" @click="blockUser(u)">拉黑</a>
|
|
|
+ <i class="el-icon-more" slot="reference"></i>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
</el-scrollbar>
|
|
|
</el-tab-pane>
|
|
|
<el-tab-pane :label="silencedUserLabel" name="silenced" style="height: 100%;">
|
|
|
- <el-scrollbar ref="manageLeftRef_silenced" style="height: 800px; width: 100%;padding: 10px;">
|
|
|
- <el-row class="row-box" style="margin-bottom:10px" type="flex" align="middle" v-for="u in silencedDisplayList" :key="u.userId">
|
|
|
- <el-col :span="20">
|
|
|
- <el-row type="flex" align="middle">
|
|
|
- <el-col :span="4" style="padding-left: 10px;"><el-avatar :src="u.avatar"></el-avatar></el-col>
|
|
|
- <el-col :span="19" :offset="1">{{ u.nickName }}</el-col>
|
|
|
- <el-col :span="19" :offset="1">{{ u.userId }}</el-col>
|
|
|
- </el-row>
|
|
|
- </el-col>
|
|
|
- <el-col :span="4" >
|
|
|
- <el-popover
|
|
|
- width="100"
|
|
|
- trigger="click">
|
|
|
- <a style="cursor: pointer;color: #ff0000;" @click="changeUserState(u)">{{ u.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
- <a style="cursor: pointer;color: #ff0000;margin-left:10px" @click="blockUser(u)">拉黑</a>
|
|
|
- <i class="el-icon-more" slot="reference"></i>
|
|
|
- </el-popover>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ <el-scrollbar ref="manageLeftRef_silenced" class="user-scroll user-scroll--tall">
|
|
|
+ <div class="row-box" v-for="u in silencedDisplayList" :key="u.userId">
|
|
|
+ <el-avatar class="user-row__avatar" :src="u.avatar"></el-avatar>
|
|
|
+ <div class="user-row__info">
|
|
|
+ <div class="user-row__name">{{ u.nickName }}</div>
|
|
|
+ <div class="user-row__id">{{ u.userId }}</div>
|
|
|
+ </div>
|
|
|
+ <el-popover width="100" trigger="click">
|
|
|
+ <a class="user-row__pop-op" @click="changeUserState(u)">{{ u.msgStatus === 1 ? '解禁' : '禁言' }}</a>
|
|
|
+ <a class="user-row__pop-op" @click="blockUser(u)">拉黑</a>
|
|
|
+ <i class="el-icon-more" slot="reference"></i>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
</el-scrollbar>
|
|
|
</el-tab-pane>
|
|
|
</el-tabs>
|
|
|
@@ -470,6 +434,7 @@ export default {
|
|
|
);
|
|
|
}
|
|
|
})
|
|
|
+ this.releaseWebSocket()
|
|
|
},
|
|
|
// 使用 deactivated 和 activated 钩子替代 beforeDestroy 和 destroyed
|
|
|
deactivated() {
|
|
|
@@ -1270,13 +1235,29 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
connectWebSocket() {
|
|
|
- this.$store.dispatch('initLiveWs', {
|
|
|
+ this._wsMessageHandler = (event) => this.handleWsMessage(event)
|
|
|
+ this.$store.dispatch('acquireLiveWs', {
|
|
|
liveWsUrl: this.liveWsUrl,
|
|
|
liveId: this.liveId,
|
|
|
- userId: this.userId
|
|
|
+ userId: this.userId,
|
|
|
+ owner: 'console'
|
|
|
+ }).then((ws) => {
|
|
|
+ this.socket = ws || this.$store.state.liveWs[String(this.liveId)]
|
|
|
+ if (this.socket) {
|
|
|
+ this.socket.addMessageListener(this._wsMessageHandler)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ releaseWebSocket() {
|
|
|
+ if (this.socket && this._wsMessageHandler) {
|
|
|
+ this.socket.removeMessageListener(this._wsMessageHandler)
|
|
|
+ }
|
|
|
+ this._wsMessageHandler = null
|
|
|
+ this.$store.dispatch('releaseLiveWs', {
|
|
|
+ liveId: this.liveId,
|
|
|
+ owner: 'console'
|
|
|
})
|
|
|
- this.socket = this.$store.state.liveWs[this.liveId]
|
|
|
- this.socket.onmessage = (event) => this.handleWsMessage(event)
|
|
|
+ this.socket = null
|
|
|
},
|
|
|
handleWsMessage(event) {
|
|
|
let { code, data } = JSON.parse(event.data)
|
|
|
@@ -1425,112 +1406,267 @@ export default {
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
-<style lang="stylus" scoped>
|
|
|
- .top-box{
|
|
|
- justify-content: center;
|
|
|
- width: 140px;
|
|
|
- height: 110px;
|
|
|
- background: #FFFFFF;
|
|
|
- border-radius: 16px 16px 16px 16px;
|
|
|
- border: 1px solid #EBF0F9;
|
|
|
- }
|
|
|
- .row-box{
|
|
|
- padding: 10px 16px;
|
|
|
- background: #FAFBFD;
|
|
|
- border-radius: 8px 8px 8px 8px;
|
|
|
- }
|
|
|
- .msg-box{
|
|
|
- word-break: break-all;
|
|
|
- word-wrap: break-word;
|
|
|
- white-space: pre-wrap;
|
|
|
- background-color: #F7F8FA;
|
|
|
- padding: 10px;
|
|
|
- border-radius: 0px 12px 12px 12px;
|
|
|
- font-size: 14px;
|
|
|
- display: inline-block;
|
|
|
- }
|
|
|
- .msg-box-right{
|
|
|
- margin-right: 50px;
|
|
|
- word-break: break-all;
|
|
|
- word-wrap: break-word;
|
|
|
- white-space: pre-wrap;
|
|
|
- background-color:#13C2C2;
|
|
|
- padding: 10px;
|
|
|
- color: #fff;
|
|
|
- border-radius: 12px 0px 12px 12px;
|
|
|
- font-size: 14px;
|
|
|
- display: inline-block;
|
|
|
- }
|
|
|
- .shuru ::v-deep.el-textarea__inner{
|
|
|
- background-color: #F7F8FA !important;
|
|
|
- border-radius: 12px;
|
|
|
- }
|
|
|
- .el-icon-more{
|
|
|
- color:#D9D9D9
|
|
|
- }
|
|
|
- .live-console-tab-right{
|
|
|
- height: 100%;
|
|
|
- }
|
|
|
- .live-console-tab-right .el-scrollbar__view{
|
|
|
- padding: 10px;
|
|
|
- }
|
|
|
- .live-console-tab-right .el-col-offset-1{
|
|
|
- color:#666
|
|
|
- }
|
|
|
- .live-console-tab-right ::v-deep.el-tabs__content{
|
|
|
- height: 90%;
|
|
|
- }
|
|
|
-</style>
|
|
|
<style scoped>
|
|
|
-.talk-list{
|
|
|
+.live-console {
|
|
|
+ width: 90vw;
|
|
|
+ padding: 10px 0;
|
|
|
+}
|
|
|
+.live-console .live-console-col {
|
|
|
+ height: 88vh;
|
|
|
+ margin-left: 5px;
|
|
|
+ padding: 0 10px;
|
|
|
+ background-color: #fff;
|
|
|
+ border: 1px solid #e8eaed;
|
|
|
+ border-radius: 10px;
|
|
|
+}
|
|
|
+.chat-scroll {
|
|
|
+ height: 500px;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+.chat-scroll__spacer {
|
|
|
+ height: 12px;
|
|
|
+}
|
|
|
+.chat-msg {
|
|
|
+ margin-bottom: 14px;
|
|
|
+}
|
|
|
+.chat-msg__row {
|
|
|
display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+.chat-msg__row--right {
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
+.chat-msg__avatar {
|
|
|
+ width: 32px !important;
|
|
|
+ height: 32px !important;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
+.chat-msg__body {
|
|
|
+ min-width: 0;
|
|
|
+ flex: 1;
|
|
|
+}
|
|
|
+.chat-msg__body--right {
|
|
|
+ flex: 0 1 auto;
|
|
|
+ max-width: 220px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: flex-end;
|
|
|
+}
|
|
|
+.chat-msg__meta {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 6px 10px;
|
|
|
+ margin-bottom: 6px;
|
|
|
+}
|
|
|
+.chat-msg__meta--right {
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
+.chat-msg__name {
|
|
|
+ font-size: 13px;
|
|
|
+ color: #8a919f;
|
|
|
+}
|
|
|
+.chat-msg__ops {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+.chat-msg__op {
|
|
|
+ cursor: pointer;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #8a919f;
|
|
|
+ line-height: 1;
|
|
|
+}
|
|
|
+.chat-msg__op:hover {
|
|
|
+ color: #1a6d5b;
|
|
|
+}
|
|
|
+.chat-msg__op--danger:hover {
|
|
|
+ color: #c45656;
|
|
|
+}
|
|
|
+.msg-box {
|
|
|
+ word-break: break-all;
|
|
|
+ word-wrap: break-word;
|
|
|
+ white-space: pre-wrap;
|
|
|
+ background-color: #f4f6f8;
|
|
|
+ padding: 8px 10px;
|
|
|
+ border-radius: 0 10px 10px 10px;
|
|
|
+ font-size: 13px;
|
|
|
+ color: #1f2329;
|
|
|
+ display: inline-block;
|
|
|
+ line-height: 1.5;
|
|
|
+}
|
|
|
+.msg-box-right {
|
|
|
+ word-break: break-all;
|
|
|
+ word-wrap: break-word;
|
|
|
+ white-space: pre-wrap;
|
|
|
+ background-color: #1a6d5b;
|
|
|
+ padding: 8px 10px;
|
|
|
+ color: #fff;
|
|
|
+ border-radius: 10px 0 10px 10px;
|
|
|
+ font-size: 13px;
|
|
|
+ display: inline-block;
|
|
|
+ line-height: 1.5;
|
|
|
+}
|
|
|
+.shuru {
|
|
|
+ padding: 12px 14px;
|
|
|
+ border-top: 1px solid #e8eaed;
|
|
|
+ background-color: #fff;
|
|
|
+}
|
|
|
+.shuru__actions {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ gap: 8px;
|
|
|
+ margin-top: 8px;
|
|
|
+}
|
|
|
+.btn-accent {
|
|
|
+ background: #1a6d5b !important;
|
|
|
+ border-color: #1a6d5b !important;
|
|
|
+ color: #fff !important;
|
|
|
+}
|
|
|
+.shuru ::v-deep .el-textarea__inner {
|
|
|
+ background-color: #f4f6f8 !important;
|
|
|
+ border-radius: 8px;
|
|
|
+ border: none !important;
|
|
|
+ box-shadow: none !important;
|
|
|
+ resize: none !important;
|
|
|
+ min-height: 72px !important;
|
|
|
+}
|
|
|
+.player-panel {
|
|
|
+ background: #000;
|
|
|
+ border-radius: 10px;
|
|
|
+ overflow: hidden;
|
|
|
+ margin: 10px 5px;
|
|
|
+}
|
|
|
+.player-panel__inner {
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+.player-panel__poster {
|
|
|
+ width: 100%;
|
|
|
+ height: 45vh;
|
|
|
+ display: block;
|
|
|
+ object-fit: cover;
|
|
|
+}
|
|
|
+.tool-bar {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ align-items: center;
|
|
|
+ padding: 10px 8px;
|
|
|
+ background: #fff;
|
|
|
+ border-top: 1px solid #e8eaed;
|
|
|
+}
|
|
|
+.top-box {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ cursor: pointer;
|
|
|
+ min-width: 64px;
|
|
|
+ padding: 4px 6px;
|
|
|
+ border-radius: 8px;
|
|
|
+}
|
|
|
+.top-box:hover {
|
|
|
+ background: #f4f6f8;
|
|
|
+}
|
|
|
+.top-box img {
|
|
|
+ width: 36px;
|
|
|
+ height: 36px;
|
|
|
+ display: block;
|
|
|
+}
|
|
|
+.top-box span {
|
|
|
+ font-size: 12px;
|
|
|
+ margin-top: 6px;
|
|
|
+ color: #5c6470;
|
|
|
+}
|
|
|
+.chart-panel {
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ height: 270px;
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+.chart-panel__canvas {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+.chart-panel__filters {
|
|
|
+ position: absolute;
|
|
|
+ top: 10px;
|
|
|
+ right: 10px;
|
|
|
+ background: #fff;
|
|
|
+ padding: 5px;
|
|
|
+ z-index: 1;
|
|
|
+ display: flex;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+.user-scroll {
|
|
|
+ height: 100%;
|
|
|
+ width: 100%;
|
|
|
+ padding: 8px;
|
|
|
+}
|
|
|
+.user-scroll--tall {
|
|
|
+ height: 800px;
|
|
|
+}
|
|
|
+.row-box {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 10px;
|
|
|
+ padding: 10px 12px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ background: #fafbfc;
|
|
|
+ border-radius: 8px;
|
|
|
+ border: 1px solid transparent;
|
|
|
+}
|
|
|
+.row-box:hover {
|
|
|
+ border-color: #e8eaed;
|
|
|
+}
|
|
|
+.user-row__avatar {
|
|
|
+ width: 36px !important;
|
|
|
+ height: 36px !important;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
+.user-row__info {
|
|
|
+ flex: 1;
|
|
|
+ min-width: 0;
|
|
|
+}
|
|
|
+.user-row__name {
|
|
|
+ font-size: 13px;
|
|
|
+ color: #1f2329;
|
|
|
+ line-height: 1.35;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+}
|
|
|
+.user-row__id {
|
|
|
+ margin-top: 2px;
|
|
|
+ font-size: 12px;
|
|
|
+ color: #8a919f;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+}
|
|
|
+.user-row__pop-op {
|
|
|
+ cursor: pointer;
|
|
|
+ color: #c45656;
|
|
|
+ font-size: 12px;
|
|
|
+ margin-right: 8px;
|
|
|
+}
|
|
|
+.el-icon-more {
|
|
|
+ color: #c0c4cc;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+.live-console-tab-right {
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+.live-console-tab-right ::v-deep .el-tabs__content {
|
|
|
+ height: 90%;
|
|
|
+}
|
|
|
+::v-deep .el-scrollbar__wrap {
|
|
|
+ overflow-x: hidden;
|
|
|
+}
|
|
|
+.tcplayer-live {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+::v-deep .tcplayer {
|
|
|
+ margin: 0 auto;
|
|
|
}
|
|
|
- .live-console {
|
|
|
- width: 90vw;
|
|
|
- padding: 10px 0;
|
|
|
- }
|
|
|
- .live-console .live-console-col {
|
|
|
- height: 88vh;
|
|
|
- margin-left: 5px;
|
|
|
- padding: 0 10px;
|
|
|
- background-color: white;
|
|
|
- border-radius: 4px;
|
|
|
- }
|
|
|
- /*隐藏水平滚动条*/
|
|
|
- ::v-deep .el-scrollbar__wrap {
|
|
|
- overflow-x: hidden;
|
|
|
- }
|
|
|
- /* 消息输入区域 */
|
|
|
- .chat-input {
|
|
|
- display: flex;
|
|
|
- padding: 10px;
|
|
|
- border-top: 1px solid #ebeef5;
|
|
|
- background-color: #fff;
|
|
|
- min-height: 120px;
|
|
|
- }
|
|
|
-
|
|
|
- .chat-input .el-input {
|
|
|
- flex: 1;
|
|
|
- margin-right: 10px;
|
|
|
- }
|
|
|
-
|
|
|
- .chat-input .el-textarea__inner {
|
|
|
- resize: none;
|
|
|
- min-height: 100px;
|
|
|
- }
|
|
|
- ::v-deep .el-textarea__inner {
|
|
|
- border: none !important;
|
|
|
- box-shadow: none !important;
|
|
|
- resize: none !important;
|
|
|
- }
|
|
|
- ::v-deep .el-textarea__inner:focus {
|
|
|
- border: none !important;
|
|
|
- box-shadow: none !important;
|
|
|
- }
|
|
|
- .tcplayer-live {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
- ::v-deep .tcplayer {
|
|
|
- margin: 0 auto;
|
|
|
- }
|
|
|
</style>
|