Commit 1028eedeb8cec074139cb56a1d88f5ca93e6c0c8
1 parent
62299c31
fix bug
Showing
7 changed files
with
155 additions
and
21 deletions
server/app.js
| @@ -10,9 +10,21 @@ var content; | @@ -10,9 +10,21 @@ var content; | ||
| 10 | 10 | ||
| 11 | io.on('connection', function(socket) { | 11 | io.on('connection', function(socket) { |
| 12 | 12 | ||
| 13 | - // | 13 | + // 进入房间后同步老师端内容 |
| 14 | io.emit('programming.content', content || ""); | 14 | io.emit('programming.content', content || ""); |
| 15 | 15 | ||
| 16 | + // 开始直播 | ||
| 17 | + socket.on('start.live', function(msg) { | ||
| 18 | + console.log('input ---- ' + msg); | ||
| 19 | + io.emit('start.live', msg); | ||
| 20 | + }); | ||
| 21 | + | ||
| 22 | + // 同步老师代码 | ||
| 23 | + socket.on('sync.programming', function(msg) { | ||
| 24 | + console.log('input ---- ' + msg); | ||
| 25 | + io.emit('programming.content', content); | ||
| 26 | + }); | ||
| 27 | + | ||
| 16 | // 老师录制代码 | 28 | // 老师录制代码 |
| 17 | socket.on('teacher.programming', function(msg) { | 29 | socket.on('teacher.programming', function(msg) { |
| 18 | console.log('input ---- ' + msg); | 30 | console.log('input ---- ' + msg); |
| @@ -23,7 +35,6 @@ io.on('connection', function(socket) { | @@ -23,7 +35,6 @@ io.on('connection', function(socket) { | ||
| 23 | socket.on('programming.content', function(msg) { | 35 | socket.on('programming.content', function(msg) { |
| 24 | console.log('programming.content ---- ' + msg); | 36 | console.log('programming.content ---- ' + msg); |
| 25 | content = msg; | 37 | content = msg; |
| 26 | - // io.emit('programming.content', msg); | ||
| 27 | }); | 38 | }); |
| 28 | 39 | ||
| 29 | // 编译操作 | 40 | // 编译操作 |
| @@ -36,7 +47,13 @@ io.on('connection', function(socket) { | @@ -36,7 +47,13 @@ io.on('connection', function(socket) { | ||
| 36 | socket.on('programming.clear', function(msg) { | 47 | socket.on('programming.clear', function(msg) { |
| 37 | console.log('programming.clear ---- ' + msg); | 48 | console.log('programming.clear ---- ' + msg); |
| 38 | content = msg; | 49 | content = msg; |
| 39 | - // io.emit('programming.content', msg); | 50 | + io.emit('programming.content', msg); |
| 51 | + }); | ||
| 52 | + | ||
| 53 | + // 切换编译 tab | ||
| 54 | + socket.on('check.tab', function(msg) { | ||
| 55 | + console.log('check.tab ---- ' + msg); | ||
| 56 | + io.emit('check.tab', msg); | ||
| 40 | }); | 57 | }); |
| 41 | 58 | ||
| 42 | // 选择 menu | 59 | // 选择 menu |
src/live/js/student.js
| 1 | $(function() { | 1 | $(function() { |
| 2 | var teacherId = document.getElementById('teacher'); | 2 | var teacherId = document.getElementById('teacher'); |
| 3 | var studentId = document.getElementById('student'); | 3 | var studentId = document.getElementById('student'); |
| 4 | - var socket = io('https://live-api.gaoxiaobang.com'); | ||
| 5 | - // var socket = io('http://live-api:5000'); | 4 | + // var socket = io('https://live-api.gaoxiaobang.com'); |
| 5 | + var socket = io('http://localhost:5000'); | ||
| 6 | 6 | ||
| 7 | var teacher = CodeMirror.fromTextArea(teacherId, { | 7 | var teacher = CodeMirror.fromTextArea(teacherId, { |
| 8 | value: '输入HTML代码', | 8 | value: '输入HTML代码', |
| @@ -19,22 +19,41 @@ $(function() { | @@ -19,22 +19,41 @@ $(function() { | ||
| 19 | smartIndent: false | 19 | smartIndent: false |
| 20 | }); | 20 | }); |
| 21 | 21 | ||
| 22 | + // 标准输入 | ||
| 23 | + socket.on('start.live', function(msg) { | ||
| 24 | + console.log('start.live ---- ' + msg); | ||
| 25 | + var seconds = 2; | ||
| 26 | + $('.countdown').show(); | ||
| 27 | + var countdown = setInterval(function() { | ||
| 28 | + $(".countdown h1").html(seconds); | ||
| 29 | + seconds = seconds - 1; | ||
| 30 | + if (seconds == -1) { | ||
| 31 | + $(".countdown").hide(); | ||
| 32 | + clearInterval(countdown); | ||
| 33 | + | ||
| 34 | + // | ||
| 35 | + socket.on('teacher.programming', function(msg) { | ||
| 36 | + console.log(msg); | ||
| 37 | + var msgObj = JSON.parse(msg) | ||
| 38 | + // student.setValue(msg) | ||
| 39 | + processChangeObject(teacher, msgObj); | ||
| 40 | + | ||
| 41 | + $('#messages').append($('<li>').text(msg)); | ||
| 42 | + window.scrollTo(0, document.body.scrollHeight); | ||
| 43 | + }); | ||
| 44 | + } | ||
| 45 | + }, 1000); | ||
| 46 | + }); | ||
| 22 | 47 | ||
| 23 | - socket.on('teacher.programming', function(msg) { | ||
| 24 | - console.log(msg); | ||
| 25 | - var msgObj = JSON.parse(msg) | ||
| 26 | - // student.setValue(msg) | ||
| 27 | - processChangeObject(teacher, msgObj); | ||
| 28 | 48 | ||
| 29 | - $('#messages').append($('<li>').text(msg)); | ||
| 30 | - window.scrollTo(0, document.body.scrollHeight); | ||
| 31 | - }); | ||
| 32 | 49 | ||
| 50 | + // 同步代码内容 | ||
| 33 | socket.on('programming.content', function(msg) { | 51 | socket.on('programming.content', function(msg) { |
| 34 | - console.log('programming.content ---- ' + msg); | ||
| 35 | teacher.setValue(msg); | 52 | teacher.setValue(msg); |
| 36 | - // socket.emit('programming.content', teacher.getValue()); | ||
| 37 | }); | 53 | }); |
| 54 | + | ||
| 55 | + | ||
| 56 | + | ||
| 38 | 57 | ||
| 39 | // 选中 input | 58 | // 选中 input |
| 40 | socket.on('select.menu', function(msg) { | 59 | socket.on('select.menu', function(msg) { |
| @@ -48,6 +67,21 @@ $(function() { | @@ -48,6 +67,21 @@ $(function() { | ||
| 48 | $('#runtimeArgus').val(msg) | 67 | $('#runtimeArgus').val(msg) |
| 49 | }); | 68 | }); |
| 50 | 69 | ||
| 70 | + // 切换 tab | ||
| 71 | + socket.on('check.tab', function(msg) { | ||
| 72 | + console.log('check.tab ---- ' + msg); | ||
| 73 | + if(msg === 0){ | ||
| 74 | + $('#cmprun-tabs a[href="#stdin"]').tab('show'); | ||
| 75 | + }else if(msg === 1){ | ||
| 76 | + $('#cmprun-tabs a[href="#cmpinfo"]').tab('show'); | ||
| 77 | + }else if(msg === 2){ | ||
| 78 | + $('#cmprun-tabs a[href="#stderr"]').tab('show'); | ||
| 79 | + }else if(msg === 3){ | ||
| 80 | + $('#cmprun-tabs a[href="#output"]').tab('show'); | ||
| 81 | + } | ||
| 82 | + // $('#runtimeArgus').val(msg) | ||
| 83 | + }); | ||
| 84 | + | ||
| 51 | 85 | ||
| 52 | 86 | ||
| 53 | 87 |
src/live/js/teacher.js
| 1 | $(function(){ | 1 | $(function(){ |
| 2 | var teacherId = document.getElementById('teacher'); | 2 | var teacherId = document.getElementById('teacher'); |
| 3 | - var socket = io('https://live-api.gaoxiaobang.com'); | ||
| 4 | - // var socket = io('http://live-api:5000'); | 3 | + // var socket = io('https://live-api.gaoxiaobang.com'); |
| 4 | + var socket = io('http://localhost:5000'); | ||
| 5 | 5 | ||
| 6 | // 初始化codemirror页面 | 6 | // 初始化codemirror页面 |
| 7 | var teacher = CodeMirror.fromTextArea(teacherId, { | 7 | var teacher = CodeMirror.fromTextArea(teacherId, { |
| @@ -30,9 +30,9 @@ $(function(){ | @@ -30,9 +30,9 @@ $(function(){ | ||
| 30 | }); | 30 | }); |
| 31 | 31 | ||
| 32 | // 链接时执行初始化代码 | 32 | // 链接时执行初始化代码 |
| 33 | - socket.on('programming.content', function(msg) { | 33 | + // socket.on('programming.content', function(msg) { |
| 34 | // teacher.setValue(msg); | 34 | // teacher.setValue(msg); |
| 35 | - }); | 35 | + // }); |
| 36 | 36 | ||
| 37 | 37 | ||
| 38 | 38 | ||
| @@ -98,11 +98,32 @@ $(function(){ | @@ -98,11 +98,32 @@ $(function(){ | ||
| 98 | 98 | ||
| 99 | LiveTeacher.init(); | 99 | LiveTeacher.init(); |
| 100 | 100 | ||
| 101 | + | ||
| 102 | + $('#cmprun-tabs').on('click', 'li', function(){ | ||
| 103 | + console.log($(this).index()); | ||
| 104 | + socket.emit('check.tab', $(this).index()); | ||
| 105 | + }) | ||
| 106 | + | ||
| 107 | + | ||
| 101 | // 开始录制 | 108 | // 开始录制 |
| 102 | function liveStartFun(){ | 109 | function liveStartFun(){ |
| 103 | // $('.tip-wrap').show(); | 110 | // $('.tip-wrap').show(); |
| 111 | + var seconds = 2; | ||
| 112 | + socket.emit('start.live') | ||
| 113 | + $('.countdown').show(); | ||
| 104 | $('#liveStart').hide(); | 114 | $('#liveStart').hide(); |
| 105 | $('#liveEnd').show(); | 115 | $('#liveEnd').show(); |
| 116 | + | ||
| 117 | + // 倒计时 | ||
| 118 | + var countdown = setInterval(function() { | ||
| 119 | + $(".countdown h1").html(seconds); | ||
| 120 | + seconds = seconds - 1; | ||
| 121 | + if (seconds == -1) { | ||
| 122 | + $(".countdown").hide(); | ||
| 123 | + clearInterval(countdown); | ||
| 124 | + socket.emit('sync.programming'); | ||
| 125 | + } | ||
| 126 | + }, 1000); | ||
| 106 | } | 127 | } |
| 107 | 128 | ||
| 108 | // 确认开始录制 | 129 | // 确认开始录制 |
src/live/js/utils.js
| @@ -3,6 +3,40 @@ | @@ -3,6 +3,40 @@ | ||
| 3 | * by Kira 2017-5-19 | 3 | * by Kira 2017-5-19 |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | + $(document).on('click', '#full-screen', function(event) { | ||
| 7 | + event.preventDefault(); | ||
| 8 | + launchFullScreen(document.body); | ||
| 9 | + $('#back-screen').show(); | ||
| 10 | + $('#full-screen').hide(); | ||
| 11 | +}); | ||
| 12 | +$(document).on('click', '#back-screen', function(event) { | ||
| 13 | + exitFullscreen(); | ||
| 14 | + $('#full-screen').show(); | ||
| 15 | + $('#back-screen').hide(); | ||
| 16 | +}) | ||
| 17 | + | ||
| 18 | +// 找到支持的方法, 使用需要全屏的 element 调用 | ||
| 19 | +function launchFullScreen(element) { | ||
| 20 | + if (element.requestFullscreen) { | ||
| 21 | + element.requestFullscreen(); | ||
| 22 | + } else if (element.mozRequestFullScreen) { | ||
| 23 | + element.mozRequestFullScreen(); | ||
| 24 | + } else if (element.webkitRequestFullscreen) { | ||
| 25 | + element.webkitRequestFullscreen(); | ||
| 26 | + } else if (element.msRequestFullscreen) { | ||
| 27 | + element.msRequestFullscreen(); | ||
| 28 | + } | ||
| 29 | +} | ||
| 30 | +function exitFullscreen() { | ||
| 31 | + if (document.exitFullscreen) { | ||
| 32 | + document.exitFullscreen(); | ||
| 33 | + } else if (document.mozExitFullScreen) { | ||
| 34 | + document.mozExitFullScreen(); | ||
| 35 | + } else if (document.webkitExitFullscreen) { | ||
| 36 | + document.webkitExitFullscreen(); | ||
| 37 | + } | ||
| 38 | +} | ||
| 39 | + | ||
| 6 | // 往编辑器中写入代码 | 40 | // 往编辑器中写入代码 |
| 7 | function processChangeObject(playbackcm, obj) { | 41 | function processChangeObject(playbackcm, obj) { |
| 8 | 42 |
src/live/student.html
| @@ -132,7 +132,10 @@ | @@ -132,7 +132,10 @@ | ||
| 132 | <!-- 录制控制区 --> | 132 | <!-- 录制控制区 --> |
| 133 | <!-- <div class="live-ctrl"></div> --> | 133 | <!-- <div class="live-ctrl"></div> --> |
| 134 | </div> | 134 | </div> |
| 135 | - </div> | 135 | + </div> |
| 136 | + <div class="countdown"> | ||
| 137 | + <h1>3</h1> | ||
| 138 | + </div> | ||
| 136 | </div> | 139 | </div> |
| 137 | 140 | ||
| 138 | 141 |
src/live/style/main.css
| @@ -238,6 +238,27 @@ button{ | @@ -238,6 +238,27 @@ button{ | ||
| 238 | .tips .tip-content{} | 238 | .tips .tip-content{} |
| 239 | .tips .tip-btn{} | 239 | .tips .tip-btn{} |
| 240 | 240 | ||
| 241 | +.countdown{ | ||
| 242 | + position: absolute; | ||
| 243 | + top: 0; | ||
| 244 | + width: 100%; | ||
| 245 | + height: 100%; | ||
| 246 | + background: rgba(0, 0, 0, 0.7); | ||
| 247 | + z-index: 9999; | ||
| 248 | + display: none; | ||
| 249 | +} | ||
| 250 | +.countdown h1{ | ||
| 251 | + font-size: 360px; | ||
| 252 | + color: #fff; | ||
| 253 | + display: block; | ||
| 254 | + position: absolute; | ||
| 255 | + font-weight: bold; | ||
| 256 | + top: 50%; | ||
| 257 | + left: 50%; | ||
| 258 | + transform: translate(-50%, -50%); | ||
| 259 | + margin-top: -35px; | ||
| 260 | +} | ||
| 261 | + | ||
| 241 | 262 | ||
| 242 | 263 | ||
| 243 | 264 |
src/live/teacher.html
| @@ -73,10 +73,14 @@ | @@ -73,10 +73,14 @@ | ||
| 73 | <button class="btn compile-btn" id="liveEnd">结束</button> | 73 | <button class="btn compile-btn" id="liveEnd">结束</button> |
| 74 | </div> | 74 | </div> |
| 75 | <div class="save-cancel"> | 75 | <div class="save-cancel"> |
| 76 | - <button class="btn compile-btn" id="liveSave" disabled="disabled">保存</button> | 76 | + <!-- <button class="btn compile-btn" id="liveSave" disabled="disabled">保存</button> --> |
| 77 | <button class="btn compile-btn" id="liveOut">关闭</button> | 77 | <button class="btn compile-btn" id="liveOut">关闭</button> |
| 78 | </div> | 78 | </div> |
| 79 | </div> | 79 | </div> |
| 80 | + | ||
| 81 | + <div class="countdown"> | ||
| 82 | + <h1>3</h1> | ||
| 83 | + </div> | ||
| 80 | 84 | ||
| 81 | <div class="tip-wrap"> | 85 | <div class="tip-wrap"> |
| 82 | <div class="tips"> | 86 | <div class="tips"> |