|
@@ -0,0 +1,710 @@
|
|
|
+<template>
|
|
|
+ <div class="live">
|
|
|
+ <!--顶部-->
|
|
|
+ <div class="live-top">
|
|
|
+ <div class="live-title">
|
|
|
+ <div class="live-title-name">{{ roomInfo.cs_item_name }} {{ roomInfo.task_name }}</div>
|
|
|
+ <div>
|
|
|
+ <el-button @click="exitRoom">退出房间</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="live-course-name">{{ roomInfo.course_name }}</div>
|
|
|
+ <div class="live-teacher">
|
|
|
+ <span class="live-teacher-name">
|
|
|
+ <svg-icon icon-class="person" />{{ roomInfo.teacher_name }}
|
|
|
+ </span>
|
|
|
+ <span><svg-icon icon-class="people" />{{ roomInfo.student_count }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 主容器 -->
|
|
|
+ <div class="live-container">
|
|
|
+ <!-- 左侧 -->
|
|
|
+ <div class="live-container-left">
|
|
|
+ <div v-show="callLoading" class="loading">
|
|
|
+ <div class="loading-wrapper">
|
|
|
+ <p class="loading-title">教师邀请您连麦中</p>
|
|
|
+ <div>
|
|
|
+ <!-- <el-button
|
|
|
+ type="success"
|
|
|
+ icon="el-icon-phone-outline"
|
|
|
+ circle
|
|
|
+ @click="inviteAccept"
|
|
|
+ ></el-button> -->
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-show="connect" id="student"></div>
|
|
|
+ <div v-show="isDraw" id="draw-parent">
|
|
|
+ <div v-show="isDrawSetting" class="draw-setting">
|
|
|
+ <span class="brush-shape">
|
|
|
+ <svg-icon icon-class="brush-shape" />
|
|
|
+ </span>
|
|
|
+ <span
|
|
|
+ v-for="item in drawColorList"
|
|
|
+ :key="item"
|
|
|
+ :class="['draw-color', item === '#FF4747' ? 'current' : '']"
|
|
|
+ :style="{ 'background-color': item }"
|
|
|
+ ></span>
|
|
|
+ <span v-for="item in drawThicknessList" :key="item" class="draw-thickness">
|
|
|
+ <span :style="{ width: item * 2 + 'px', height: item * 2 + 'px' }"></span>
|
|
|
+ </span>
|
|
|
+ <span class="brush-clear">
|
|
|
+ <svg-icon icon-class="clear" />
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="button-group">
|
|
|
+ <div class="button-group-left"></div>
|
|
|
+ <div class="button-group-right"></div>
|
|
|
+ </div>
|
|
|
+ <div class="live-container-left-chat">
|
|
|
+ <div class="chat-top">
|
|
|
+ <span>聊天</span>
|
|
|
+ </div>
|
|
|
+ <div class="chat-window">
|
|
|
+ <ul class="chat-window-ul">
|
|
|
+ <li v-for="(item, i) in chatList" :key="i">
|
|
|
+ <div class="msg-normal">
|
|
|
+ <span>{{ item.username }}: </span>
|
|
|
+ <span>{{ item.msg }}</span>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div class="chat-speak">
|
|
|
+ <el-input
|
|
|
+ v-model="msg"
|
|
|
+ placeholder="输入发言"
|
|
|
+ maxlength="400"
|
|
|
+ @keydown.enter.native="sendMsg"
|
|
|
+ >
|
|
|
+ <el-button slot="append" @click="sendMsg">发送</el-button>
|
|
|
+ </el-input>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 右侧 -->
|
|
|
+ <div class="live-container-right">
|
|
|
+ <div class="live-teacher-lens" @mouseover="liveWrapperOver" @mouseout="liveWrapperOut">
|
|
|
+ <div id="live"></div>
|
|
|
+ <div v-show="liveMenuShow" class="live-wrapper">
|
|
|
+ <div>
|
|
|
+ {{ roomInfo.teacher_name }}
|
|
|
+ </div>
|
|
|
+ <div></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="student-list">
|
|
|
+ <div class="student-list-title">学生列表</div>
|
|
|
+ <ul>
|
|
|
+ <li v-for="item in student_list" :key="item.room_user_id">
|
|
|
+ <div class="student-list-left">
|
|
|
+ <el-avatar icon="el-icon-user" size="small" :src="item.student_image_url" />
|
|
|
+ <span class="name">{{ item.student_name }}</span>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 学员当前推送资料 -->
|
|
|
+ <cur-material
|
|
|
+ :task-id="task_id"
|
|
|
+ :dialog-visible-material="dialogVisibleMaterial"
|
|
|
+ :material-id="material_id"
|
|
|
+ :material-name="material_name"
|
|
|
+ :material-type="material_type"
|
|
|
+ :material-picture-url="material_picture_url"
|
|
|
+ @dialogMaterialClose="dialogMaterialClose"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import {
|
|
|
+ GetLiveRoomStudentList,
|
|
|
+ StudentExitLiveRoom,
|
|
|
+ GetCurMaterialSent,
|
|
|
+ GetLiveRoomInfo
|
|
|
+} from '@/api/live';
|
|
|
+import CurMaterial from '@/components/live/CurMaterial.vue';
|
|
|
+import * as common from './live';
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: 'Live',
|
|
|
+ components: {
|
|
|
+ CurMaterial
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ task_id: this.$route.query.task_id,
|
|
|
+ room_user_id: this.$route.query.room_user_id,
|
|
|
+ // 已连接
|
|
|
+ connect: false,
|
|
|
+ // 等待接通
|
|
|
+ callLoading: false,
|
|
|
+ dialogVisibleMaterial: false,
|
|
|
+ // 资料信息
|
|
|
+ material_id: '',
|
|
|
+ material_name: '',
|
|
|
+ material_type: '',
|
|
|
+ material_picture_url: '',
|
|
|
+ // 定时器
|
|
|
+ timer: null,
|
|
|
+ rtc: null,
|
|
|
+ roomData: {
|
|
|
+ desc: '直播间标题',
|
|
|
+ name: '姓名',
|
|
|
+ user: {
|
|
|
+ id: '',
|
|
|
+ name: '',
|
|
|
+ role: 'talker',
|
|
|
+ rommid: ''
|
|
|
+ },
|
|
|
+ max_users: 1,
|
|
|
+ allow_chat: true,
|
|
|
+ allow_audio: true,
|
|
|
+ allow_speak: true
|
|
|
+ },
|
|
|
+ roomInfo: {
|
|
|
+ room_id: '',
|
|
|
+ video_mode: 1,
|
|
|
+ task_name: '',
|
|
|
+ cs_item_name: '',
|
|
|
+ course_name: '',
|
|
|
+ teacher_name: '',
|
|
|
+ student_count: 0
|
|
|
+ },
|
|
|
+ loadedNumber: 0,
|
|
|
+ speakData: {},
|
|
|
+ roomContext: {},
|
|
|
+ msg: '',
|
|
|
+ chatList: [],
|
|
|
+ isDrawSetting: false,
|
|
|
+ drawColorList: ['#FF4747', '#343434', '#628EFF', '#FFCA0E'],
|
|
|
+ drawThicknessList: ['1', '3', '5'],
|
|
|
+ // 直播间学员列表
|
|
|
+ student_list: [],
|
|
|
+ // 直播状态
|
|
|
+ liveStat: false,
|
|
|
+ liveMenuShow: false
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ // 画板模式
|
|
|
+ isDraw() {
|
|
|
+ return !this.connect && !this.callLoading;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ loadedNumber(newVal) {
|
|
|
+ if (newVal === 5) {
|
|
|
+ this.initSDK();
|
|
|
+ this.$loading().close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.downloadWebSDK();
|
|
|
+ this.getLiveRoomStudentList();
|
|
|
+ this.getLiveRoomInfo();
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.getCurMaterialSent();
|
|
|
+ this.getLiveRoomStudentListPolling();
|
|
|
+ },
|
|
|
+ beforeDestroy() {
|
|
|
+ // 清除所有定时器
|
|
|
+ // let end = setInterval(() => {}, 1000);
|
|
|
+ // for (let i = 1; i <= end; i++) {
|
|
|
+ // clearInterval(i);
|
|
|
+ // }
|
|
|
+ clearInterval(this.timer);
|
|
|
+ StudentExitLiveRoom({ task_id: this.task_id, room_user_id: this.room_user_id });
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ // 加载直播所需 SDK,加载完成后才能初始化
|
|
|
+ downloadWebSDK() {
|
|
|
+ this.$loading({
|
|
|
+ text: '加载直播所需SDK中...',
|
|
|
+ background: '#fff'
|
|
|
+ });
|
|
|
+ let script = this.createScript('https://class.csslcloud.net/static/dist/js/websdk_4.0.js');
|
|
|
+ let link = this.createLink('https://class.csslcloud.net/static/SDK/docSDK/draw.css');
|
|
|
+
|
|
|
+ link.onload = () => {
|
|
|
+ this.loadedNumber += 1;
|
|
|
+ };
|
|
|
+
|
|
|
+ script.onload = () => {
|
|
|
+ let scriptArray = [
|
|
|
+ 'https://class.csslcloud.net/static/dist/js/classMode.js',
|
|
|
+ 'https://class.csslcloud.net/static/dist/js/classUpdateChat.js',
|
|
|
+ 'https://image.csslcloud.net/js/dpc.js'
|
|
|
+ ];
|
|
|
+ for (let i = 0; i < scriptArray.length; i++) {
|
|
|
+ let classMode = this.createScript(scriptArray[i]);
|
|
|
+ classMode.onload = () => {
|
|
|
+ this.loadedNumber += 1;
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ let jq = this.createScript('https://class.csslcloud.net/static/js/jquery/jquery.min.js');
|
|
|
+ jq.onload = () => {
|
|
|
+ let classMode = this.createScript(
|
|
|
+ 'https://class.csslcloud.net/static/SDK/docSDK/drawSdk_3.0.js'
|
|
|
+ );
|
|
|
+ classMode.onload = () => {
|
|
|
+ this.loadedNumber += 1;
|
|
|
+ };
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ createScript(url) {
|
|
|
+ let script = document.createElement('script');
|
|
|
+ script.type = 'text/javascript';
|
|
|
+ script.src = url;
|
|
|
+ document.getElementsByTagName('body')[0].appendChild(script);
|
|
|
+ return script;
|
|
|
+ },
|
|
|
+
|
|
|
+ createLink(url) {
|
|
|
+ let link = document.createElement('link');
|
|
|
+ link.rel = 'stylesheet';
|
|
|
+ link.href = url;
|
|
|
+ document.getElementsByTagName('body')[0].appendChild(link);
|
|
|
+ return link;
|
|
|
+ },
|
|
|
+
|
|
|
+ initSDK() {
|
|
|
+ const { live_room_sys_user_id, room_id, session_id } = this.$route.query;
|
|
|
+ this.rtc = common.initSDK({
|
|
|
+ userid: live_room_sys_user_id,
|
|
|
+ roomid: room_id,
|
|
|
+ sessionid: session_id
|
|
|
+ });
|
|
|
+ common.initListener(this); // 注册监听事件
|
|
|
+ window.rtc = this.rtc;
|
|
|
+ this.getLiveStat();
|
|
|
+ },
|
|
|
+
|
|
|
+ getLiveRoomInfo() {
|
|
|
+ GetLiveRoomInfo({ task_id: this.task_id }).then(
|
|
|
+ ({
|
|
|
+ room_id,
|
|
|
+ video_mode,
|
|
|
+ task_name,
|
|
|
+ cs_item_name,
|
|
|
+ course_name,
|
|
|
+ teacher_name,
|
|
|
+ student_count
|
|
|
+ }) => {
|
|
|
+ this.roomInfo = {
|
|
|
+ room_id,
|
|
|
+ video_mode,
|
|
|
+ task_name,
|
|
|
+ cs_item_name,
|
|
|
+ course_name,
|
|
|
+ teacher_name,
|
|
|
+ student_count
|
|
|
+ };
|
|
|
+ }
|
|
|
+ );
|
|
|
+ },
|
|
|
+
|
|
|
+ exitRoom() {
|
|
|
+ StudentExitLiveRoom({ task_id: this.task_id, room_user_id: this.room_user_id }).then(() => {
|
|
|
+ this.$router.push('/');
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ getLiveStat() {
|
|
|
+ common.getLiveStat({
|
|
|
+ success: data => {
|
|
|
+ this.liveStat = data.started;
|
|
|
+ },
|
|
|
+ fail: str => {
|
|
|
+ this.liveStat = false;
|
|
|
+ console.log('直播关闭状态或查询直播失败', str);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ // 发消息
|
|
|
+ sendMsg() {
|
|
|
+ common.sendMsg(this.msg);
|
|
|
+ this.msg = '';
|
|
|
+ },
|
|
|
+
|
|
|
+ getDevice() {
|
|
|
+ common.getDevice();
|
|
|
+ },
|
|
|
+
|
|
|
+ inviteAccept() {
|
|
|
+ common.inviteAccept();
|
|
|
+ },
|
|
|
+
|
|
|
+ getLiveRoomStudentList() {
|
|
|
+ GetLiveRoomStudentList({ task_id: this.task_id }).then(({ student_list }) => {
|
|
|
+ this.student_list = student_list;
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ getLiveRoomStudentListPolling() {
|
|
|
+ this.timer = setInterval(() => {
|
|
|
+ this.getLiveRoomStudentList();
|
|
|
+ }, 5000);
|
|
|
+ },
|
|
|
+
|
|
|
+ // 弹出框方法
|
|
|
+ dialogMaterialClose() {
|
|
|
+ this.dialogVisibleMaterial = false;
|
|
|
+ this.getCurMaterialSent();
|
|
|
+ },
|
|
|
+
|
|
|
+ liveWrapperOver() {
|
|
|
+ this.liveMenuShow = true;
|
|
|
+ },
|
|
|
+
|
|
|
+ liveWrapperOut() {
|
|
|
+ this.liveMenuShow = false;
|
|
|
+ },
|
|
|
+
|
|
|
+ getCurMaterialSent() {
|
|
|
+ const timer = setInterval(() => {
|
|
|
+ GetCurMaterialSent({ task_id: this.task_id })
|
|
|
+ .then(({ material_id, material_name, material_type, material_picture_url }) => {
|
|
|
+ if (material_id !== undefined && material_id.length > 0) {
|
|
|
+ this.dialogVisibleMaterial = true;
|
|
|
+ this.material_id = material_id;
|
|
|
+ this.material_name = material_name;
|
|
|
+ this.material_type = material_type;
|
|
|
+ this.material_picture_url = material_picture_url;
|
|
|
+ clearInterval(timer);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ clearInterval(timer);
|
|
|
+ });
|
|
|
+ }, 2000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+@import '~@/styles/mixin.scss';
|
|
|
+$live-bc: #3d3938;
|
|
|
+
|
|
|
+.live {
|
|
|
+ @include container;
|
|
|
+
|
|
|
+ // 顶部
|
|
|
+ &-top {
|
|
|
+ background-color: #fff;
|
|
|
+ padding: 24px 32px;
|
|
|
+ border-top-left-radius: 8px;
|
|
|
+ border-top-right-radius: 8px;
|
|
|
+
|
|
|
+ .live-title {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+
|
|
|
+ &-name {
|
|
|
+ font-size: 22px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-button {
|
|
|
+ border-radius: 4px;
|
|
|
+ padding: 7px 12px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .live-course-name {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #737373;
|
|
|
+ line-height: 30px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .live-teacher {
|
|
|
+ margin-top: 12px;
|
|
|
+
|
|
|
+ .svg-icon {
|
|
|
+ margin-right: 8px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &-name {
|
|
|
+ margin-right: 60px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 主容器
|
|
|
+ &-container {
|
|
|
+ display: flex;
|
|
|
+ justify-content: left;
|
|
|
+
|
|
|
+ &-left {
|
|
|
+ width: 832px;
|
|
|
+ background-color: #fff;
|
|
|
+ border-radius: 8px;
|
|
|
+
|
|
|
+ .loading {
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ height: 468px;
|
|
|
+ color: #fff;
|
|
|
+ background-color: #646464;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ &-wrapper {
|
|
|
+ text-align: center;
|
|
|
+
|
|
|
+ .loading-title {
|
|
|
+ margin-bottom: 24px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #student {
|
|
|
+ width: 100%;
|
|
|
+ height: 468px;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ position: relative;
|
|
|
+ background-color: $live-bc;
|
|
|
+ }
|
|
|
+
|
|
|
+ #draw-parent {
|
|
|
+ width: 100%;
|
|
|
+ height: 468px;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ position: relative;
|
|
|
+ background-color: $live-bc;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ // 设置屏幕画笔
|
|
|
+ .draw-setting {
|
|
|
+ position: absolute;
|
|
|
+ bottom: 13px;
|
|
|
+ left: 22px;
|
|
|
+ z-index: 9999;
|
|
|
+ background-color: #a0a0a0;
|
|
|
+ padding: 6px;
|
|
|
+ border-radius: 40px;
|
|
|
+ height: 40px;
|
|
|
+ width: 275px;
|
|
|
+ line-height: 28px;
|
|
|
+
|
|
|
+ & > span {
|
|
|
+ display: inline-block;
|
|
|
+ text-align: center;
|
|
|
+ margin-right: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ & > span.brush-shape {
|
|
|
+ width: 28px;
|
|
|
+ height: 28px;
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: #fff;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ .draw-color {
|
|
|
+ position: relative;
|
|
|
+ top: 5px;
|
|
|
+ height: 18px;
|
|
|
+ width: 18px;
|
|
|
+ border-radius: 50%;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ .current::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ bottom: -7px;
|
|
|
+ left: 7px;
|
|
|
+ width: 4px;
|
|
|
+ height: 4px;
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: #292929;
|
|
|
+ }
|
|
|
+
|
|
|
+ .draw-thickness {
|
|
|
+ height: 18px;
|
|
|
+ width: 18px;
|
|
|
+ cursor: pointer;
|
|
|
+ display: inline-flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ vertical-align: middle;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ span {
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: #000;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ & > .brush-clear {
|
|
|
+ width: 28px;
|
|
|
+ height: 28px;
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: #666;
|
|
|
+ cursor: pointer;
|
|
|
+ margin-right: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .button-group {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ height: 48px;
|
|
|
+ background-color: #4d4d4d;
|
|
|
+ padding: 0 15px;
|
|
|
+ border-bottom-left-radius: 5px;
|
|
|
+
|
|
|
+ .svg-icon {
|
|
|
+ font-size: 20px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &-left {
|
|
|
+ > span {
|
|
|
+ display: inline-block;
|
|
|
+ height: 100%;
|
|
|
+ padding: 14px 16px;
|
|
|
+ cursor: pointer;
|
|
|
+
|
|
|
+ &:active,
|
|
|
+ &:hover {
|
|
|
+ background-color: #3d3d3d;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 聊天窗口
|
|
|
+ &-chat {
|
|
|
+ height: 278px;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ border-bottom-left-radius: 8px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: space-between;
|
|
|
+
|
|
|
+ .chat-top {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 15px 15px 10px;
|
|
|
+ border-bottom: 1px solid #e6e6e6;
|
|
|
+ color: #959595;
|
|
|
+
|
|
|
+ label {
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ .allow-chat {
|
|
|
+ margin-right: 12px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .chat-window {
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ &-ul {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ overflow: auto;
|
|
|
+
|
|
|
+ .msg-normal {
|
|
|
+ padding: 7px 16px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .chat-speak {
|
|
|
+ padding: 16px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &-right {
|
|
|
+ padding: 8px;
|
|
|
+ background-color: #2c2c2c;
|
|
|
+ border-end-end-radius: 8px;
|
|
|
+
|
|
|
+ .live-teacher-lens {
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ #live {
|
|
|
+ width: 352px;
|
|
|
+ height: 198px;
|
|
|
+ background-color: $live-bc;
|
|
|
+ }
|
|
|
+
|
|
|
+ .live-wrapper {
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0;
|
|
|
+ height: 40px;
|
|
|
+ width: 100%;
|
|
|
+ background-color: #000;
|
|
|
+ opacity: 0.7;
|
|
|
+ color: #fff;
|
|
|
+ line-height: 40px;
|
|
|
+ padding: 0 16px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .student-list {
|
|
|
+ width: 100%;
|
|
|
+ padding: 24px 16px;
|
|
|
+ margin-top: 2px;
|
|
|
+ height: calc(100% - 200px);
|
|
|
+ background-color: #2c2c2c;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #fff;
|
|
|
+
|
|
|
+ &-title {
|
|
|
+ margin-bottom: 16px;
|
|
|
+ }
|
|
|
+
|
|
|
+ li {
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 16px;
|
|
|
+
|
|
|
+ .student-list-left {
|
|
|
+ flex: 7;
|
|
|
+
|
|
|
+ .name {
|
|
|
+ vertical-align: super;
|
|
|
+ margin-left: 8px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .student-list-right {
|
|
|
+ flex: 3;
|
|
|
+
|
|
|
+ .svg-icon {
|
|
|
+ font-size: 18px;
|
|
|
+ cursor: pointer;
|
|
|
+ margin-top: 7px;
|
|
|
+ margin-right: 8px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|