Commit 7869a1781a0517b613c851af90609390b5bb804c
1 parent
042bc469
add teacher and student page
Showing
4 changed files
with
510 additions
and
66 deletions
src/live/review.html
0 → 100644
src/live/student.html
| ... | ... | @@ -3,46 +3,179 @@ |
| 3 | 3 | <head> |
| 4 | 4 | <meta charset="UTF-8"> |
| 5 | 5 | <title>学生端</title> |
| 6 | + <link href="../css/reset.css" rel="stylesheet"> | |
| 7 | + <link rel="stylesheet" href="../css/responsive/css/bootstrap.min.css"> | |
| 6 | 8 | <link rel="stylesheet" href="../js/codemirror-5.25.0/lib/codemirror.css"> |
| 9 | + <link rel="stylesheet" href="style/main.css"> | |
| 10 | +<style> | |
| 11 | + | |
| 12 | + .teacher-live, .student-work{ | |
| 13 | + position: absolute; | |
| 14 | + width: 50%; | |
| 15 | + height: 100%; | |
| 16 | + } | |
| 17 | + .teacher-live{ | |
| 18 | + left: 0; | |
| 19 | + border-right: 1px solid #999; | |
| 20 | + } | |
| 21 | + .student-work{ | |
| 22 | + right: 0; | |
| 23 | + } | |
| 24 | +</style> | |
| 7 | 25 | </head> |
| 8 | 26 | <body> |
| 9 | - <h1>学生端</h1> | |
| 10 | - <ul id="messages"></ul> | |
| 11 | - <textarea id="student" title="HTML"></textarea> | |
| 27 | +<div class="student"> | |
| 28 | + <div class="teacher-live"> | |
| 29 | + <div class="live-wrap"> | |
| 30 | + <!-- 头部信息 --> | |
| 31 | + <div class="header"> | |
| 32 | + <h1>老师端</h1> | |
| 33 | + </div> | |
| 34 | + | |
| 35 | + <!-- 录制区域 --> | |
| 36 | + <div class="live-code"> | |
| 37 | + <textarea id="teacher" title="HTML"></textarea> | |
| 38 | + </div> | |
| 39 | + | |
| 40 | + <!-- 编译操作区 --> | |
| 41 | + <!-- 运行结果区 --> | |
| 42 | + <div class="live-console-wrap"> | |
| 43 | + <div id="toolbar"> | |
| 44 | + <!-- Nav tabs --> | |
| 45 | + <ul class="nav nav-tabs result-tabs need-compile" role="tablist" id="cmprun-tabs"> | |
| 46 | + <li class="active"><a href="#stdin" role="tab" data-toggle="tab" class="text">标准</a></li> | |
| 47 | + <li><a href="#cmpinfo" role="tab" data-toggle="tab" class="text">编译</a></li> | |
| 48 | + <li><a href="#stderr" role="tab" data-toggle="tab" class="text">错误</a></li> | |
| 49 | + <li><a href="#output" role="tab" data-toggle="tab" class="text">结果</a></li> | |
| 50 | + </ul> | |
| 51 | + <div class="pull-right func"> | |
| 52 | + <button class="btn compile-btn" id="CompileBtn"> | |
| 53 | + <span class="ladda-label">编译运行</span> | |
| 54 | + </button> | |
| 55 | + <a id="full-screen" class="fb"> | |
| 56 | + <img src="../img/full-screen-icon.svg" alt=""> | |
| 57 | + </a> | |
| 58 | + <a id="back-screen" class="fb" style="display: none;"> | |
| 59 | + <img src="../img/full-screen-icon.svg" alt=""> | |
| 60 | + </a> | |
| 61 | + </div> | |
| 62 | + </div> | |
| 63 | + | |
| 64 | + <!-- Tab panes --> | |
| 65 | + <div id="resultoutput" class="tab-content need-compile"> | |
| 66 | + <div class="tab-pane active padall15" id="stdin"> | |
| 67 | + <div class="stdin-wrap"> | |
| 68 | + <input class="effect-2" id="runtimeArgus" type="text" placeholder="标准输入"> | |
| 69 | + <span class="focus-border"></span> | |
| 70 | + </div> | |
| 71 | + </div> | |
| 72 | + <div class="tab-pane padall15" id="cmpinfo"></div> | |
| 73 | + <div class="tab-pane padall15" id="stderr"></div> | |
| 74 | + <div class="tab-pane padall15" id="output"></div> | |
| 75 | + </div> | |
| 76 | + <div class="panel-body no-compile" id="ifrcontainer"> | |
| 77 | + <iframe id="resultiframe" frameBorder="0" width="100%"></iframe> | |
| 78 | + </div> | |
| 79 | + </div> | |
| 80 | + | |
| 81 | + <!-- 录制控制区 --> | |
| 82 | + <div class="live-ctrl"> | |
| 83 | + | |
| 84 | + </div> | |
| 85 | + </div> | |
| 86 | + </div> | |
| 87 | + <div class="student-work"> | |
| 88 | + <div class="live-wrap"> | |
| 89 | + <!-- 头部信息 --> | |
| 90 | + <div class="header"> | |
| 91 | + <h1>学生端</h1> | |
| 92 | + </div> | |
| 93 | + | |
| 94 | + <!-- 录制区域 --> | |
| 95 | + <div class="live-code"> | |
| 96 | + <textarea id="student" title="HTML"></textarea> | |
| 97 | + </div> | |
| 98 | + | |
| 99 | + <!-- 编译操作区 --> | |
| 100 | + <!-- 运行结果区 --> | |
| 101 | + <div class="live-console-wrap"> | |
| 102 | + <div id="toolbar"> | |
| 103 | + <!-- Nav tabs --> | |
| 104 | + <ul class="nav nav-tabs result-tabs need-compile" role="tablist" id="cmprun-tabs"> | |
| 105 | + <li class="active"><a href="#stdin" role="tab" data-toggle="tab" class="text">标准</a></li> | |
| 106 | + <li><a href="#cmpinfo" role="tab" data-toggle="tab" class="text">编译</a></li> | |
| 107 | + <li><a href="#stderr" role="tab" data-toggle="tab" class="text">错误</a></li> | |
| 108 | + <li><a href="#output" role="tab" data-toggle="tab" class="text">结果</a></li> | |
| 109 | + </ul> | |
| 110 | + <div class="pull-right func"> | |
| 111 | + <button class="btn compile-btn" id="CompileBtn"> | |
| 112 | + <span class="ladda-label">编译运行</span> | |
| 113 | + </button> | |
| 114 | + <a id="full-screen" class="fb"> | |
| 115 | + <img src="../img/full-screen-icon.svg" alt=""> | |
| 116 | + </a> | |
| 117 | + <a id="back-screen" class="fb" style="display: none;"> | |
| 118 | + <img src="../img/full-screen-icon.svg" alt=""> | |
| 119 | + </a> | |
| 120 | + </div> | |
| 121 | + </div> | |
| 122 | + | |
| 123 | + <!-- Tab panes --> | |
| 124 | + <div id="resultoutput" class="tab-content need-compile"> | |
| 125 | + <div class="tab-pane active padall15" id="stdin"> | |
| 126 | + <div class="stdin-wrap"> | |
| 127 | + <input class="effect-2" id="runtimeArgus" type="text" placeholder="标准输入"> | |
| 128 | + <span class="focus-border"></span> | |
| 129 | + </div> | |
| 130 | + </div> | |
| 131 | + <div class="tab-pane padall15" id="cmpinfo"></div> | |
| 132 | + <div class="tab-pane padall15" id="stderr"></div> | |
| 133 | + <div class="tab-pane padall15" id="output"></div> | |
| 134 | + </div> | |
| 135 | + <div class="panel-body no-compile" id="ifrcontainer"> | |
| 136 | + <iframe id="resultiframe" frameBorder="0" width="100%"></iframe> | |
| 137 | + </div> | |
| 138 | + </div> | |
| 139 | + | |
| 140 | + <!-- 录制控制区 --> | |
| 141 | + <div class="live-ctrl"> | |
| 142 | + | |
| 143 | + </div> | |
| 144 | + </div> | |
| 145 | + </div> | |
| 146 | +</div> | |
| 147 | + | |
| 12 | 148 | |
| 13 | 149 | <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> |
| 14 | 150 | <script src="https://code.jquery.com/jquery-1.11.1.js"></script> |
| 15 | 151 | <script src="../js/codemirror-5.25.0/lib/codemirror.js"></script> |
| 152 | +<script src="../js/bootstrap.js"></script> | |
| 16 | 153 | <script> |
| 17 | 154 | $(function() { |
| 155 | + var teacherId = document.getElementById('teacher'); | |
| 18 | 156 | var studentId = document.getElementById('student'); |
| 19 | 157 | var socket = io('http://localhost:3000'); |
| 20 | 158 | |
| 21 | - var student = CodeMirror.fromTextArea(studentId, { | |
| 159 | + var teacher = CodeMirror.fromTextArea(teacherId, { | |
| 22 | 160 | value: '输入HTML代码', |
| 23 | 161 | mode: 'text/javascript', |
| 24 | 162 | lineNumbers: true, |
| 25 | 163 | smartIndent: false |
| 26 | 164 | }); |
| 27 | 165 | |
| 28 | - // CodeMirror.on(student, "change", function(instance, changeObj) { | |
| 29 | - // console.log(instance); | |
| 30 | - // console.log(changeObj); | |
| 31 | - // }); | |
| 166 | + var student = CodeMirror.fromTextArea(studentId, { | |
| 167 | + value: '输入HTML代码', | |
| 168 | + mode: 'text/javascript', | |
| 169 | + lineNumbers: true, | |
| 170 | + smartIndent: false | |
| 171 | + }); | |
| 32 | 172 | |
| 33 | - socket.on('connect', function () { | |
| 34 | - socket.on('programming.content', function(msg) { | |
| 35 | - console.log('programming.content ---- ' + msg); | |
| 36 | - student.setValue(msg); | |
| 37 | - }); | |
| 38 | - }); | |
| 39 | 173 | |
| 40 | - socket.on('chat message', function(msg) { | |
| 174 | + socket.on('teacher.programming', function(msg) { | |
| 41 | 175 | console.log(msg); |
| 42 | 176 | var msgObj = JSON.parse(msg) |
| 43 | 177 | // student.setValue(msg) |
| 44 | - | |
| 45 | - processChangeObject(student, msgObj); | |
| 178 | + processChangeObject(teacher, msgObj); | |
| 46 | 179 | |
| 47 | 180 | $('#messages').append($('<li>').text(msg)); |
| 48 | 181 | window.scrollTo(0, document.body.scrollHeight); | ... | ... |
src/live/style/main.css
0 → 100644
| 1 | +* { | |
| 2 | + box-sizing: border-box; | |
| 3 | +} | |
| 4 | + | |
| 5 | +body { | |
| 6 | + font: 13px Helvetica, Arial; | |
| 7 | +} | |
| 8 | + | |
| 9 | +.live-wrap { | |
| 10 | + position: absolute; | |
| 11 | + width: 100%; | |
| 12 | + height: 100%; | |
| 13 | + overflow: hidden; | |
| 14 | +} | |
| 15 | + | |
| 16 | +.header { | |
| 17 | + text-align: center; | |
| 18 | + border-bottom: 1px solid #c1c1c1; | |
| 19 | + padding: 8px 0; | |
| 20 | +} | |
| 21 | + | |
| 22 | +.header h1 { | |
| 23 | + font-size: 18px; | |
| 24 | + margin: 0; | |
| 25 | +} | |
| 26 | + | |
| 27 | +.live-code { | |
| 28 | + position: relative; | |
| 29 | + width: 100%; | |
| 30 | + height: 100%; | |
| 31 | + padding-bottom: 296px; | |
| 32 | +} | |
| 33 | + | |
| 34 | +.live-code .CodeMirror { | |
| 35 | + height: 100%; | |
| 36 | +} | |
| 37 | + | |
| 38 | +.live-console-wrap { | |
| 39 | + width: 100%; | |
| 40 | + background-color: #FFF; | |
| 41 | + height: 200px; | |
| 42 | + position: absolute; | |
| 43 | + bottom: 60px; | |
| 44 | + z-index: 999; | |
| 45 | + overflow: hidden; | |
| 46 | +} | |
| 47 | + | |
| 48 | +#toolbar { | |
| 49 | + width: 100%; | |
| 50 | + height: 40px; | |
| 51 | + overflow: hidden; | |
| 52 | + background-color: #F4F6F9; | |
| 53 | + padding: 0 36px; | |
| 54 | +} | |
| 55 | + | |
| 56 | +.result-tabs { | |
| 57 | + overflow: hidden; | |
| 58 | + margin: 5px 10px; | |
| 59 | + color: #fff; | |
| 60 | +} | |
| 61 | + | |
| 62 | +.text { | |
| 63 | + color: #1FB6FF; | |
| 64 | +} | |
| 65 | + | |
| 66 | +.result-tabs>li.active>a, | |
| 67 | +.result-tabs>li.active>a:hover, | |
| 68 | +.result-tabs>li>a:hover, | |
| 69 | +.result-tabs>li.active>a:focus { | |
| 70 | + color: #FFF; | |
| 71 | + background-image: -webkit-linear-gradient(left, #1FB6FF 0%, #62DCF5 100%); | |
| 72 | + background-image: linear-gradient(to right, #1FB6FF 0%, #62DCF5 100%); | |
| 73 | + -webkit-transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important; | |
| 74 | + transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important; | |
| 75 | + box-shadow: 0px 0px 2px 0px #B3E5FF; | |
| 76 | + border: none; | |
| 77 | +} | |
| 78 | + | |
| 79 | +.result-tabs>li>a, | |
| 80 | +.result-tabs>li.active>a:hover { | |
| 81 | + padding: 4px 21px; | |
| 82 | + border: none; | |
| 83 | + margin: 1px; | |
| 84 | + border-radius: 15px; | |
| 85 | + font-size: 14px; | |
| 86 | + transition: all 0.1s ease; | |
| 87 | +} | |
| 88 | + | |
| 89 | +.func { | |
| 90 | + height: 36px; | |
| 91 | + padding-top: 5px; | |
| 92 | +} | |
| 93 | + | |
| 94 | +.stdin-wrap { | |
| 95 | + margin: 0 48px; | |
| 96 | + position: relative; | |
| 97 | +} | |
| 98 | + | |
| 99 | +#stdin { | |
| 100 | + position: absolute; | |
| 101 | + width: 100%; | |
| 102 | +} | |
| 103 | + | |
| 104 | +#stdin:focus { | |
| 105 | + outline: none; | |
| 106 | +} | |
| 107 | + | |
| 108 | +#stdin input[type="text"] { | |
| 109 | + font: 15px/24px "Lato", Arial, sans-serif; | |
| 110 | + color: #333; | |
| 111 | + width: 100%; | |
| 112 | + box-sizing: border-box; | |
| 113 | + letter-spacing: 1px; | |
| 114 | + padding-left: 12px; | |
| 115 | + outline: none; | |
| 116 | +} | |
| 117 | + | |
| 118 | +#stdin .effect-2 { | |
| 119 | + border: 0; | |
| 120 | + padding: 12px 0 1px; | |
| 121 | + border-bottom: 1px solid #ccc; | |
| 122 | +} | |
| 123 | + | |
| 124 | +#stdin .effect-2 ~ .focus-border { | |
| 125 | + position: absolute; | |
| 126 | + bottom: 0; | |
| 127 | + left: 50%; | |
| 128 | + width: 0; | |
| 129 | + height: 2px; | |
| 130 | + background-color: #62DCF5; | |
| 131 | + transition: 1s; | |
| 132 | +} | |
| 133 | + | |
| 134 | +#stdin .effect-2:focus ~ .focus-border { | |
| 135 | + width: 100%; | |
| 136 | + transition: 1s; | |
| 137 | + left: 0; | |
| 138 | +} | |
| 139 | + | |
| 140 | +.nav-tabs { | |
| 141 | + border: none; | |
| 142 | + float: left; | |
| 143 | + border-bottom: 0; | |
| 144 | +} | |
| 145 | + | |
| 146 | +.panel-body { | |
| 147 | + padding: 0; | |
| 148 | +} | |
| 149 | + | |
| 150 | +.compile-btn { | |
| 151 | + background: #FFF; | |
| 152 | + border: 1px solid #3ad5f5; | |
| 153 | + color: #1FB6FF; | |
| 154 | + border-radius: 24px; | |
| 155 | +} | |
| 156 | + | |
| 157 | +.btn { | |
| 158 | + padding: 3px 18px; | |
| 159 | +} | |
| 160 | + | |
| 161 | +.fb { | |
| 162 | + float: right; | |
| 163 | + margin: 0 16px; | |
| 164 | + cursor: pointer; | |
| 165 | +} | |
| 166 | + | |
| 167 | +.fb img { | |
| 168 | + width: 32px; | |
| 169 | +} | |
| 170 | + | |
| 171 | +.live-ctrl { | |
| 172 | + width: 100%; | |
| 173 | + height: 60px; | |
| 174 | + position: absolute; | |
| 175 | + bottom: 0; | |
| 176 | + z-index: 999; | |
| 177 | + padding: 0 136px; | |
| 178 | + background-color: #23383f; | |
| 179 | + box-sizing: border-box; | |
| 180 | +} | ... | ... |
src/live/teacher.html
| ... | ... | @@ -4,6 +4,8 @@ |
| 4 | 4 | <head> |
| 5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> |
| 6 | 6 | <title>老师端</title> |
| 7 | + <link href="../css/reset.css" rel="stylesheet"> | |
| 8 | + <link rel="stylesheet" href="../css/responsive/css/bootstrap.min.css"> | |
| 7 | 9 | <link rel="stylesheet" href="../js/codemirror-5.25.0/lib/codemirror.css"> |
| 8 | 10 | |
| 9 | 11 | <style> |
| ... | ... | @@ -16,68 +18,201 @@ |
| 16 | 18 | body { |
| 17 | 19 | font: 13px Helvetica, Arial; |
| 18 | 20 | } |
| 19 | - | |
| 20 | - form { | |
| 21 | - background: #000; | |
| 22 | - padding: 3px; | |
| 23 | - position: fixed; | |
| 21 | + .live-wrap{ | |
| 22 | + position: absolute; | |
| 24 | 23 | width: 100%; |
| 24 | + height: 100%; | |
| 25 | + overflow: hidden; | |
| 25 | 26 | } |
| 26 | - | |
| 27 | - form input { | |
| 28 | - border: 0; | |
| 29 | - padding: 10px; | |
| 30 | - width: 80%; | |
| 31 | - margin-right: .5%; | |
| 27 | + .header{ | |
| 28 | + text-align: center; | |
| 29 | + border-bottom: 1px solid #c1c1c1; | |
| 30 | + padding: 8px 0; | |
| 32 | 31 | } |
| 33 | - | |
| 34 | - form button { | |
| 35 | - width: 19%; | |
| 36 | - background: rgb(130, 224, 255); | |
| 32 | + .header h1{ | |
| 33 | + font-size: 18px; | |
| 34 | + margin: 0; | |
| 35 | + } | |
| 36 | + .live-code{ | |
| 37 | + position: relative; | |
| 38 | + width: 100%; | |
| 39 | + height: 100%; | |
| 40 | + padding-bottom: 296px; | |
| 41 | + } | |
| 42 | + .live-code .CodeMirror{ | |
| 43 | + height: 100%; | |
| 44 | + } | |
| 45 | + .live-console-wrap{ | |
| 46 | + width: 100%; | |
| 47 | + background-color: #FFF; | |
| 48 | + height: 200px; | |
| 49 | + position: absolute; | |
| 50 | + bottom: 60px; | |
| 51 | + z-index: 999; | |
| 52 | + overflow: hidden; | |
| 53 | + } | |
| 54 | + #toolbar{ | |
| 55 | + width: 100%; | |
| 56 | + height: 40px; | |
| 57 | + overflow: hidden; | |
| 58 | + background-color: #F4F6F9; | |
| 59 | + padding: 0 36px; | |
| 60 | + } | |
| 61 | + .result-tabs{ | |
| 62 | + overflow: hidden; | |
| 63 | + margin: 5px 10px; | |
| 64 | + color: #fff; | |
| 65 | + } | |
| 66 | + .text{ | |
| 67 | + color: #1FB6FF; | |
| 68 | + } | |
| 69 | + .result-tabs>li.active>a, .result-tabs>li.active>a:hover, .result-tabs>li>a:hover, .result-tabs>li.active>a:focus{ | |
| 70 | + color: #FFF; | |
| 71 | + background-image: -webkit-linear-gradient(left, #1FB6FF 0%, #62DCF5 100%); | |
| 72 | + background-image: linear-gradient(to right, #1FB6FF 0%, #62DCF5 100%); | |
| 73 | + -webkit-transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important; | |
| 74 | + transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) all !important; | |
| 75 | + box-shadow: 0px 0px 2px 0px #B3E5FF; | |
| 37 | 76 | border: none; |
| 38 | - padding: 10px; | |
| 39 | 77 | } |
| 40 | - | |
| 41 | - #messages { | |
| 42 | - list-style-type: none; | |
| 43 | - margin: 0; | |
| 78 | + .result-tabs>li>a, .result-tabs>li.active>a:hover{ | |
| 79 | + padding: 4px 21px; | |
| 80 | + border: none; | |
| 81 | + margin: 1px; | |
| 82 | + border-radius: 15px; | |
| 83 | + font-size: 14px; | |
| 84 | + transition: all 0.1s ease; | |
| 85 | + } | |
| 86 | + .func{ | |
| 87 | + height: 36px; | |
| 88 | + padding-top: 5px; | |
| 89 | + } | |
| 90 | + .stdin-wrap { | |
| 91 | + margin: 0 48px; | |
| 92 | + position: relative; | |
| 93 | + } | |
| 94 | + #stdin { | |
| 95 | + position: absolute; | |
| 96 | + width: 100%; | |
| 97 | + } | |
| 98 | + #stdin :focus{outline: none;} | |
| 99 | + | |
| 100 | + #stdin input[type="text"]{font: 15px/24px "Lato", Arial, sans-serif; color: #333; width: 100%; box-sizing: border-box; letter-spacing: 1px;padding-left: 12px;} | |
| 101 | + | |
| 102 | + #stdin .effect-2{border: 0; padding: 12px 0 1px; border-bottom: 1px solid #ccc;} | |
| 103 | + #stdin .effect-2 ~ .focus-border{position: absolute; bottom: 0; left: 50%; width: 0; height: 2px; background-color: #62DCF5; transition: 1s;} | |
| 104 | + #stdin .effect-2:focus ~ .focus-border{width: 100%; transition: 1s; left: 0;} | |
| 105 | + .nav-tabs { | |
| 106 | + border: none; | |
| 107 | + float: left; | |
| 108 | + border-bottom: 0; | |
| 109 | + } | |
| 110 | + .panel-body{ | |
| 44 | 111 | padding: 0; |
| 45 | 112 | } |
| 46 | - | |
| 47 | - #messages li { | |
| 48 | - padding: 5px 10px; | |
| 113 | + | |
| 114 | + .compile-btn { | |
| 115 | + background: #FFF; | |
| 116 | + border: 1px solid #3ad5f5; | |
| 117 | + color: #1FB6FF; | |
| 118 | + border-radius: 24px; | |
| 49 | 119 | } |
| 50 | - | |
| 51 | - #messages li:nth-child(odd) { | |
| 52 | - background: #eee; | |
| 120 | + .btn { | |
| 121 | + padding: 3px 18px; | |
| 53 | 122 | } |
| 54 | - | |
| 55 | - #messages { | |
| 56 | - margin-bottom: 40px | |
| 123 | + .fb { | |
| 124 | + float: right; | |
| 125 | + margin: 0 16px; | |
| 126 | + cursor: pointer; | |
| 127 | + } | |
| 128 | + .fb img { | |
| 129 | + width: 32px; | |
| 130 | + } | |
| 131 | + | |
| 132 | + .live-ctrl{ | |
| 133 | + width: 100%; | |
| 134 | + height: 60px; | |
| 135 | + position: absolute; | |
| 136 | + bottom: 0; | |
| 137 | + z-index: 999; | |
| 138 | + padding: 0 136px; | |
| 139 | + background-color: #23383f; | |
| 140 | + box-sizing: border-box; | |
| 57 | 141 | } |
| 58 | 142 | </style> |
| 59 | 143 | </head> |
| 60 | 144 | |
| 61 | 145 | <body> |
| 62 | - <h1>老师端</h1> | |
| 63 | - <ul id="messages"></ul> | |
| 64 | - <textarea id="teacher" title="HTML"></textarea> | |
| 65 | 146 | |
| 66 | - | |
| 67 | - <form action=""> | |
| 68 | - <input id="" autocomplete="off" /> | |
| 69 | - <button>Send</button> | |
| 70 | - </form> | |
| 147 | +<div class="live-wrap"> | |
| 148 | + <!-- 头部信息 --> | |
| 149 | + <div class="header"> | |
| 150 | + <h1>老师端</h1> | |
| 151 | + </div> | |
| 152 | + | |
| 153 | + <!-- 录制区域 --> | |
| 154 | + <div class="live-code"> | |
| 155 | + <textarea id="teacher" title="HTML"></textarea> | |
| 156 | + </div> | |
| 157 | + | |
| 158 | + <!-- 编译操作区 --> | |
| 159 | + <!-- 运行结果区 --> | |
| 160 | + <div class="live-console-wrap"> | |
| 161 | + <div id="toolbar"> | |
| 162 | + <!-- Nav tabs --> | |
| 163 | + <ul class="nav nav-tabs result-tabs need-compile" role="tablist" id="cmprun-tabs"> | |
| 164 | + <li class="active"><a href="#stdin" role="tab" data-toggle="tab" class="text">标准</a></li> | |
| 165 | + <li><a href="#cmpinfo" role="tab" data-toggle="tab" class="text">编译</a></li> | |
| 166 | + <li><a href="#stderr" role="tab" data-toggle="tab" class="text">错误</a></li> | |
| 167 | + <li><a href="#output" role="tab" data-toggle="tab" class="text">结果</a></li> | |
| 168 | + </ul> | |
| 169 | + <div class="pull-right func"> | |
| 170 | + <button class="btn compile-btn" id="CompileBtn"> | |
| 171 | + <span class="ladda-label">编译运行</span> | |
| 172 | + </button> | |
| 173 | + <a id="full-screen" class="fb"> | |
| 174 | + <img src="../img/full-screen-icon.svg" alt=""> | |
| 175 | + </a> | |
| 176 | + <a id="back-screen" class="fb" style="display: none;"> | |
| 177 | + <img src="../img/full-screen-icon.svg" alt=""> | |
| 178 | + </a> | |
| 179 | + </div> | |
| 180 | + </div> | |
| 181 | + | |
| 182 | + <!-- Tab panes --> | |
| 183 | + <div id="resultoutput" class="tab-content need-compile"> | |
| 184 | + <div class="tab-pane active padall15" id="stdin"> | |
| 185 | + <div class="stdin-wrap"> | |
| 186 | + <input class="effect-2" id="runtimeArgus" type="text" placeholder="标准输入"> | |
| 187 | + <span class="focus-border"></span> | |
| 188 | + </div> | |
| 189 | + </div> | |
| 190 | + <div class="tab-pane padall15" id="cmpinfo"></div> | |
| 191 | + <div class="tab-pane padall15" id="stderr"></div> | |
| 192 | + <div class="tab-pane padall15" id="output"></div> | |
| 193 | + </div> | |
| 194 | + <div class="panel-body no-compile" id="ifrcontainer"> | |
| 195 | + <iframe id="resultiframe" frameBorder="0" width="100%"></iframe> | |
| 196 | + </div> | |
| 197 | + </div> | |
| 198 | + | |
| 199 | + <!-- 录制控制区 --> | |
| 200 | + <div class="live-ctrl"> | |
| 201 | + | |
| 202 | + </div> | |
| 203 | +</div> | |
| 71 | 204 | |
| 72 | 205 | |
| 73 | 206 | <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> |
| 74 | 207 | <script src="https://code.jquery.com/jquery-1.11.1.js"></script> |
| 75 | 208 | <script src="../js/codemirror-5.25.0/lib/codemirror.js"></script> |
| 209 | +<script src="../js/bootstrap.js"></script> | |
| 76 | 210 | <script> |
| 77 | 211 | $(function() { |
| 78 | 212 | var teacherId = document.getElementById('teacher'); |
| 79 | 213 | var socket = io('http://localhost:3000'); |
| 80 | 214 | |
| 215 | + // 初始化codemirror页面 | |
| 81 | 216 | var teacher = CodeMirror.fromTextArea(teacherId, { |
| 82 | 217 | value: '输入HTML代码', |
| 83 | 218 | mode: 'text/javascript', |
| ... | ... | @@ -85,28 +220,24 @@ |
| 85 | 220 | smartIndent: false |
| 86 | 221 | }); |
| 87 | 222 | |
| 223 | + // 记录每次操作的变化 | |
| 88 | 224 | CodeMirror.on(teacher,"change", function(instance, changeObj) { |
| 89 | 225 | console.log(instance); |
| 90 | 226 | console.log(changeObj); |
| 91 | 227 | var changeObjStr = JSON.stringify(changeObj); |
| 92 | 228 | |
| 93 | - socket.emit('chat message', changeObjStr); | |
| 229 | + socket.emit('teacher.programming', changeObjStr); | |
| 94 | 230 | |
| 95 | 231 | socket.emit('programming.content', teacher.getValue()); |
| 96 | 232 | |
| 97 | 233 | }); |
| 98 | 234 | |
| 99 | - | |
| 100 | - // $('form').submit(function() { | |
| 101 | - // socket.emit('chat message', $('#m').val()); | |
| 102 | - // $('#m').val(''); | |
| 103 | - // return false; | |
| 104 | - // }); | |
| 105 | - // socket.on('chat message', function(msg) { | |
| 106 | - // console.log(msg); | |
| 107 | - // $('#messages').append($('<li>').text(msg)); | |
| 108 | - // window.scrollTo(0, document.body.scrollHeight); | |
| 109 | - // }); | |
| 235 | + // 链接时执行初始化代码 | |
| 236 | + socket.on('programming.content', function(msg) { | |
| 237 | + console.log('programming.content ---- ' + msg); | |
| 238 | + teacher.setValue(msg); | |
| 239 | + }); | |
| 240 | + | |
| 110 | 241 | }); |
| 111 | 242 | </script> |
| 112 | 243 | </body> | ... | ... |