Commit 7869a1781a0517b613c851af90609390b5bb804c

Authored by ykxie
1 parent 042bc469

add teacher and student page

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>
... ...