Commit 08286742064a6d1e7c6a5fb06e3866e054cd7ff5
1 parent
6fc2f36b
fix play compile
Showing
12 changed files
with
361 additions
and
50 deletions
src/css/ide.css
| ... | ... | @@ -287,3 +287,12 @@ html, body { |
| 287 | 287 | top: 50%; |
| 288 | 288 | left: 50%; |
| 289 | 289 | transform: translate(-50%, -50%); } |
| 290 | + | |
| 291 | +#playFooter { | |
| 292 | + height: 60px; | |
| 293 | + width: 100%; | |
| 294 | + z-index: 999; | |
| 295 | + background-color: #23383f; | |
| 296 | + padding: 10px 24px; } | |
| 297 | + #playFooter #componentWrapper { | |
| 298 | + width: 100%; } | ... | ... |
src/css/main.css
| ... | ... | @@ -209,3 +209,12 @@ html, body { |
| 209 | 209 | top: 50%; |
| 210 | 210 | left: 50%; |
| 211 | 211 | transform: translate(-50%, -50%); } |
| 212 | + | |
| 213 | +#playFooter { | |
| 214 | + height: 60px; | |
| 215 | + width: 100%; | |
| 216 | + z-index: 999; | |
| 217 | + background-color: #23383f; | |
| 218 | + padding: 10px 24px; } | |
| 219 | + #playFooter #componentWrapper { | |
| 220 | + width: 100%; } | ... | ... |
src/gxb-ide/CodingEditer.js
| ... | ... | @@ -76,6 +76,10 @@ |
| 76 | 76 | */ |
| 77 | 77 | playCoding: function(){ |
| 78 | 78 | CodingEditer.resetCodeMirrorValue(1) |
| 79 | + var iterm = new Iterm(); | |
| 80 | + iterm.compileResult() | |
| 81 | + console.log('------------------CodingEditer.records') | |
| 82 | + console.log(CodingEditer.records) | |
| 79 | 83 | var playbackrecord = CodingEditer.records; |
| 80 | 84 | var starttime = 0; |
| 81 | 85 | $('#recordertab a:eq(1)').tab('show'); |
| ... | ... | @@ -315,20 +319,19 @@ |
| 315 | 319 | record.trigger = 1; //标记已运行 |
| 316 | 320 | record.playTime = new Date().getTime(); // 播放开始时间 |
| 317 | 321 | |
| 318 | - // var iterm = new Iterm(); | |
| 319 | - // var resultData = { | |
| 320 | - // status: record.status || 200, | |
| 321 | - // compilerInfo: record.compilerInfo || '', | |
| 322 | - // content: record.content || '', | |
| 323 | - // error: record.error || '', | |
| 324 | - // code: record.code || '' | |
| 325 | - // }; | |
| 326 | - // console.log("================== _role ======================"); | |
| 327 | - // console.log(record); | |
| 328 | - // console.log(_role); | |
| 329 | - // if (record.code == 0 || record.code == 1) { | |
| 330 | - // iterm.compileResult(resultData, ecord.runtimeArgus) | |
| 331 | - // } | |
| 322 | + | |
| 323 | + console.log("================== _role ======================"); | |
| 324 | + if (record.code == 0 || record.code == 1) { | |
| 325 | + var iterm = new Iterm(); | |
| 326 | + var resultData = { | |
| 327 | + status: record.status || 200, | |
| 328 | + compilerInfo: record.compilerInfo || '', | |
| 329 | + content: record.content || '', | |
| 330 | + error: record.error || '', | |
| 331 | + code: record.code || '' | |
| 332 | + }; | |
| 333 | + iterm.compileResult(resultData) | |
| 334 | + } | |
| 332 | 335 | |
| 333 | 336 | CodingEditer.triggertotal += 1; |
| 334 | 337 | ... | ... |
src/gxb-ide/ToolBox.js
| ... | ... | @@ -72,6 +72,7 @@ |
| 72 | 72 | $('#start-recording').hide() |
| 73 | 73 | $('#stop-recording').show() |
| 74 | 74 | var _this = this; |
| 75 | + _this.readOnly(0) | |
| 75 | 76 | if (typeof _this.options.startCallback == 'function') { |
| 76 | 77 | console.log('startCallback'); |
| 77 | 78 | _this.options.startCallback(); |
| ... | ... | @@ -87,11 +88,9 @@ |
| 87 | 88 | Hourglass.stopTimer() |
| 88 | 89 | var _this = this; |
| 89 | 90 | _this.readOnly(1) |
| 90 | - console.log('-===============******************' + _this.options.role) | |
| 91 | 91 | // 老师端录制停止录音 |
| 92 | 92 | if (_this.options.role == 0) { |
| 93 | 93 | _this.stopAudio(); |
| 94 | - console.log('-===============******************') | |
| 95 | 94 | } |
| 96 | 95 | // 回调 |
| 97 | 96 | if (typeof _this.options.stopCallback == 'function') { |
| ... | ... | @@ -121,8 +120,6 @@ |
| 121 | 120 | var _this = this; |
| 122 | 121 | if (_this.options.role == 0) { |
| 123 | 122 | HZRecorder.get(function(rec) { |
| 124 | - console.log('-============================================') | |
| 125 | - console.log(rec); | |
| 126 | 123 | recorder = rec; |
| 127 | 124 | recorder.start(); |
| 128 | 125 | CodingEditer.initRecodesValue() | ... | ... |
src/index.html
src/js/player.js
| 1 | 1 | $(function(){ |
| 2 | - $('#full-screen').click(function(){ | |
| 3 | - var fullData = $(this).data('full'); | |
| 4 | - launchFullScreen(document.getElementById("player")); | |
| 5 | - $('#back-screen').show(); | |
| 6 | - $('#full-screen').hide(); | |
| 2 | + var _languageid = getQuery('languageid'); | |
| 3 | + var _userId = getQuery('userId'); | |
| 4 | + var _role = getQuery('role'); | |
| 5 | + var _codeReplayId = getQuery('codeReplayId'); | |
| 6 | + var player = $.AudioPlayer; | |
| 7 | + | |
| 8 | + $("title").html("C 语言"); | |
| 9 | + // new一个基本IDE结构 | |
| 10 | + var ide = new GxbIde({ | |
| 11 | + el: '#folder', | |
| 12 | + languageid: parseInt(_languageid) | |
| 7 | 13 | }); |
| 8 | 14 | |
| 9 | - $('#back-screen').click(function(){ | |
| 10 | - exitFullscreen(); | |
| 11 | - $('#full-screen').show(); | |
| 12 | - $('#back-screen').hide(); | |
| 13 | - }) | |
| 14 | - // 找到支持的方法, 使用需要全屏的 element 调用 | |
| 15 | - function launchFullScreen(element) { | |
| 16 | - if (element.requestFullscreen) { | |
| 17 | - element.requestFullscreen(); | |
| 18 | - } else if (element.mozRequestFullScreen) { | |
| 19 | - element.mozRequestFullScreen(); | |
| 20 | - } else if (element.webkitRequestFullscreen) { | |
| 21 | - element.webkitRequestFullscreen(); | |
| 22 | - } else if (element.msRequestFullscreen) { | |
| 23 | - element.msRequestFullscreen(); | |
| 24 | - } | |
| 15 | + // 编译控制台 | |
| 16 | + var iterm = new Iterm({ | |
| 17 | + userId: _userId, | |
| 18 | + languageId: _languageid | |
| 19 | + }); | |
| 20 | + | |
| 21 | + console.log(_role) | |
| 22 | + if (_role == 0) { | |
| 23 | + playUrl = gxb_api + "/programming/codeReplay/" + _codeReplayId + "/api"; | |
| 24 | + getCodeData(playUrl) | |
| 25 | + } else if (_role == 1) { | |
| 26 | + playUrl = gxb_api + "/programming/student/studentReplay/" + _codeReplayId + "/api"; | |
| 27 | + getCodeData(playUrl) | |
| 28 | + } | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + // 获取code | |
| 34 | + function getCodeData(url){ | |
| 35 | + console.log(url) | |
| 36 | + $.ajax({ | |
| 37 | + type: "get", | |
| 38 | + url: url, | |
| 39 | + dataType: "json", | |
| 40 | + contentType: "application/json", | |
| 41 | + success: function(res) { | |
| 42 | + console.log('++++++++--------'); | |
| 43 | + console.log(res) | |
| 44 | + var coderecords = res.codeRecordList | |
| 45 | + var audioUrl = res.audioUrl; | |
| 46 | + | |
| 47 | + initTrigger(coderecords) | |
| 48 | + AudioPlayer(audioUrl) | |
| 49 | + }, | |
| 50 | + error: function(error) { | |
| 51 | + console.log(error) | |
| 52 | + } | |
| 53 | + }); | |
| 25 | 54 | } |
| 26 | 55 | |
| 27 | - function exitFullscreen() { | |
| 28 | - if (document.exitFullscreen) { | |
| 29 | - document.exitFullscreen(); | |
| 30 | - } else if (document.mozExitFullScreen) { | |
| 31 | - document.mozExitFullScreen(); | |
| 32 | - } else if (document.webkitExitFullscreen) { | |
| 33 | - document.webkitExitFullscreen(); | |
| 56 | + // 初始化tigger | |
| 57 | + function initTrigger(records){ | |
| 58 | + var records = records | |
| 59 | + for (var i = 0, leg = records.length; i < leg; i++) { | |
| 60 | + if (!records[i].trigger) records[i].trigger = 0; | |
| 61 | + records[i].changeobj = jQuery.parseJSON(records[i].changeobj); | |
| 62 | + records[i].treefile = jQuery.parseJSON(records[i].treefile); | |
| 34 | 63 | } |
| 64 | + CodingEditer.records = records; | |
| 65 | + } | |
| 66 | + | |
| 67 | + // 初始化播放音频控制条 | |
| 68 | + function AudioPlayer(audioUrl){ | |
| 69 | + player.init({ | |
| 70 | + container: '#audioWrap', | |
| 71 | + source: "https://gxb-file.oss-cn-beijing.aliyuncs.com" + audioUrl, | |
| 72 | + imagePath: '../js/audioPlayer/image', | |
| 73 | + debuggers: false, | |
| 74 | + allowSeek: false, | |
| 75 | + playCallback: function() { // 播放 | |
| 76 | + console.log('++++++++'); | |
| 77 | + CodingEditer.playCoding(); | |
| 78 | + }, | |
| 79 | + pauseCallback: function() { // 暂停 | |
| 80 | + }, | |
| 81 | + seekedCallback: function() { // 拖拽 | |
| 82 | + }, | |
| 83 | + endedCallback: function() { // 结束播放 | |
| 84 | + playEnd() | |
| 85 | + } | |
| 86 | + }); | |
| 35 | 87 | } |
| 36 | 88 | |
| 37 | 89 | ... | ... |
src/js/player1.js
0 → 100644
| 1 | +$(function(){ | |
| 2 | + $('#full-screen').click(function(){ | |
| 3 | + var fullData = $(this).data('full'); | |
| 4 | + launchFullScreen(document.getElementById("player")); | |
| 5 | + $('#back-screen').show(); | |
| 6 | + $('#full-screen').hide(); | |
| 7 | + }); | |
| 8 | + | |
| 9 | + $('#back-screen').click(function(){ | |
| 10 | + exitFullscreen(); | |
| 11 | + $('#full-screen').show(); | |
| 12 | + $('#back-screen').hide(); | |
| 13 | + }) | |
| 14 | + // 找到支持的方法, 使用需要全屏的 element 调用 | |
| 15 | + function launchFullScreen(element) { | |
| 16 | + if (element.requestFullscreen) { | |
| 17 | + element.requestFullscreen(); | |
| 18 | + } else if (element.mozRequestFullScreen) { | |
| 19 | + element.mozRequestFullScreen(); | |
| 20 | + } else if (element.webkitRequestFullscreen) { | |
| 21 | + element.webkitRequestFullscreen(); | |
| 22 | + } else if (element.msRequestFullscreen) { | |
| 23 | + element.msRequestFullscreen(); | |
| 24 | + } | |
| 25 | + } | |
| 26 | + | |
| 27 | + function exitFullscreen() { | |
| 28 | + if (document.exitFullscreen) { | |
| 29 | + document.exitFullscreen(); | |
| 30 | + } else if (document.mozExitFullScreen) { | |
| 31 | + document.mozExitFullScreen(); | |
| 32 | + } else if (document.webkitExitFullscreen) { | |
| 33 | + document.webkitExitFullscreen(); | |
| 34 | + } | |
| 35 | + } | |
| 36 | + | |
| 37 | + | |
| 38 | +}) | |
| 0 | 39 | \ No newline at end of file | ... | ... |
src/player.html
| ... | ... | @@ -17,7 +17,7 @@ |
| 17 | 17 | <link rel="stylesheet" href="js/audioPlayer/theme.default.css"> |
| 18 | 18 | |
| 19 | 19 | <script> |
| 20 | - var gxb_api = "https://restful1.gaoxiaobang.com"; | |
| 20 | + var gxb_api = "https://restful.gaoxiaobang.com"; | |
| 21 | 21 | // var gxb_api = "https://restful.gaoxiaobang.com" |
| 22 | 22 | </script> |
| 23 | 23 | ... | ... |
src/scss/main.scss
| ... | ... | @@ -277,6 +277,28 @@ html, body{ |
| 277 | 277 | } |
| 278 | 278 | } |
| 279 | 279 | |
| 280 | +// player | |
| 281 | +#playFooter{ | |
| 282 | + height: 60px; | |
| 283 | + width: 100%; | |
| 284 | + z-index: 999; | |
| 285 | + background-color: #23383f; | |
| 286 | + padding: 10px 24px; | |
| 287 | + | |
| 288 | + #componentWrapper{ | |
| 289 | + width: 100%; | |
| 290 | + } | |
| 291 | +} | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 280 | 302 | |
| 281 | 303 | |
| 282 | 304 | ... | ... |
src/v1.1/index.html
| ... | ... | @@ -50,7 +50,7 @@ |
| 50 | 50 | <script src="../js/gbdebug/mode/clike/clike.js"></script> |
| 51 | 51 | |
| 52 | 52 | <script> |
| 53 | - var gxb_api = "https://restful1.gaoxiaobang.com"; | |
| 53 | + var gxb_api = "https://restful.gaoxiaobang.com"; | |
| 54 | 54 | // var gxb_api = "http://192.168.80.223:8080" |
| 55 | 55 | $(function(){ |
| 56 | 56 | $('.my-button').click(function(){ | ... | ... |
src/v1.1/index1.html
| ... | ... | @@ -20,7 +20,7 @@ |
| 20 | 20 | <link rel="stylesheet" href="../js/zTree_v3-3.5.27/css/zTreeStyle/zTreeStyle.css"> |
| 21 | 21 | |
| 22 | 22 | <script> |
| 23 | - var gxb_api = "https://restful1.gaoxiaobang.com"; | |
| 23 | + var gxb_api = "https://restful.gaoxiaobang.com"; | |
| 24 | 24 | // var gxb_api = "http://192.168.80.223:8080" |
| 25 | 25 | |
| 26 | 26 | </script> | ... | ... |
src/v1.1/player1.html
0 → 100644
| 1 | +<!DOCTYPE html> | |
| 2 | +<html lang="en"> | |
| 3 | +<head> | |
| 4 | + <meta charset="UTF-8"> | |
| 5 | + <title>JAVA</title> | |
| 6 | + <link rel="stylesheet" href="../css/responsive/css/bootstrap.min.css"> | |
| 7 | + <link href="../css/codemirror.css" rel="stylesheet"> | |
| 8 | + <link href="../css/reset.css" rel="stylesheet"> | |
| 9 | + <link rel="stylesheet" href="../js/audioPlayer/theme.default.css"> | |
| 10 | + <link rel="stylesheet" href="../js/zTree_v3-3.5.27/css/zTreeStyle/zTreeStyle.css"> | |
| 11 | + | |
| 12 | + <link href="../common/fonts/iconfont.css" rel="stylesheet"> | |
| 13 | + | |
| 14 | + <link href="../css/cm-theme/gbtags.css" rel="stylesheet"> | |
| 15 | + <link href="../css/cm-theme/eclipse.css" rel="stylesheet"> | |
| 16 | + <link href="../css/cm-theme/gbtags-dark.css" rel="stylesheet"> | |
| 17 | + | |
| 18 | + <link rel="stylesheet" href="../gxb-ide/toolBox.css"> | |
| 19 | + <link rel="stylesheet" href="../css/ide.css"> | |
| 20 | + | |
| 21 | + <script src="../js/jquery-1.7.1.js"></script> | |
| 22 | + <script src="../js/bootstrap.js"></script> | |
| 23 | + <script src="../js/codemirror.js"></script> | |
| 24 | + <script type="text/javascript" src="../js/zTree_v3-3.5.27/js/jquery.ztree.core.js"></script> | |
| 25 | + <script type="text/javascript" src="../js/zTree_v3-3.5.27/js/jquery.ztree.exedit.js"></script> | |
| 26 | + <script src="../js/emmet.js"></script> | |
| 27 | + | |
| 28 | + <link rel="stylesheet" href="../js/ladda/ladda-themeless.min.css"> | |
| 29 | + <script src="../js/ladda/spin.js"></script> | |
| 30 | + <script src="../js/ladda/ladda.js"></script> | |
| 31 | + | |
| 32 | + <script src="../js/util/Hourglass.js"></script> | |
| 33 | + <script src="../js/util/util.js"></script> | |
| 34 | + | |
| 35 | + <script src="../js/05-util.js"></script> | |
| 36 | + <script src="../js/03-http.js"></script> | |
| 37 | + | |
| 38 | + <script src="../js/recorder/Myna.js"></script> | |
| 39 | + <script src="../gxb-ide/Dir.js"></script> | |
| 40 | + <script src="../gxb-ide/CodingEditer.js"></script> | |
| 41 | + <script src="../gxb-ide/Iterm.js"></script> | |
| 42 | + <script src="../gxb-ide/Ide.js"></script> | |
| 43 | + <script src="../gxb-ide/ToolBox.js"></script> | |
| 44 | + <script type="text/javascript" src="../js/audioPlayer/jQuery.AudioPlayer.js"></script> | |
| 45 | + | |
| 46 | + <script src="../js/player.js"></script> | |
| 47 | + | |
| 48 | + <script src="../js/gbdebug/mode/xml/xml.js"></script> | |
| 49 | + <script src="../js/gbdebug/mode/javascript/javascript.js"></script> | |
| 50 | + <script src="../js/gbdebug/mode/css/css.js"></script> | |
| 51 | + <script src="../js/gbdebug/mode/htmlmixed/htmlmixed.js"></script> | |
| 52 | + <script src="../js/gbdebug/mode/clike/clike.js"></script> | |
| 53 | + | |
| 54 | + <script> | |
| 55 | + var gxb_api = "https://restful.gaoxiaobang.com"; | |
| 56 | + // var gxb_api = "http://192.168.80.223:8080" | |
| 57 | + </script> | |
| 58 | + | |
| 59 | + <style> | |
| 60 | + .ladda-button[data-style=expand-right] .ladda-spinner{ | |
| 61 | + right: 0; | |
| 62 | + } | |
| 63 | + .ladda-button[data-style=expand-right][data-loading]{ | |
| 64 | + padding-right: 32px; | |
| 65 | + } | |
| 66 | + .ladda-button .ladda-spinner{ | |
| 67 | + top: 0; | |
| 68 | + } | |
| 69 | + </style> | |
| 70 | + | |
| 71 | + | |
| 72 | +</head> | |
| 73 | +<body> | |
| 74 | + <div class="programing"> | |
| 75 | + <!-- 控制条 --> | |
| 76 | + <div class="record-title"> | |
| 77 | + <ul id="recordertab" class="nav nav-tabs pull-left"> | |
| 78 | + <li class="active"> | |
| 79 | + <a href="#recordzone" data-toggle="tab"> | |
| 80 | + <i class="icon iconfont icon-suspend"></i>课程录制区 | |
| 81 | + </a> | |
| 82 | + </li> | |
| 83 | + <li> | |
| 84 | + <a href="#replayzone" data-toggle="tab"> | |
| 85 | + <i class="icon iconfont icon-yulan"></i>课程预览区 | |
| 86 | + </a> | |
| 87 | + </li> | |
| 88 | + </ul> | |
| 89 | + </div> | |
| 90 | + | |
| 91 | + <!-- 录制区 --> | |
| 92 | + <div class="record-wrap"> | |
| 93 | + <!-- 录制区 --> | |
| 94 | + <div class="gxb-record"> | |
| 95 | + <div id="ideDir"> | |
| 96 | + <div class="tree-header">目录</div> | |
| 97 | + <ul id="folder" class="ztree"></ul> | |
| 98 | + <div id="handleLM"></div> | |
| 99 | + </div> | |
| 100 | + | |
| 101 | + <div id="ideEditer" class="tab-content"> | |
| 102 | + <div id="recordzone" class="tab-pane active"></div> | |
| 103 | + <div id="replayzone" class="tab-pane"></div> | |
| 104 | + </div> | |
| 105 | + </div> | |
| 106 | + <div class="pause-shodow" style="display: none;"> | |
| 107 | + <div class="compile-loading"> | |
| 108 | + <img src="../img/loading.png" alt=""> | |
| 109 | + </div> | |
| 110 | + <div class="compile-reslut" style="display: none;"> | |
| 111 | + <div class="tip-header"> | |
| 112 | + <span>成功获取编译运行结果</span> | |
| 113 | + </div> | |
| 114 | + <div class="tip-content"> | |
| 115 | + <p>保存编译结果后,播放到此处会在运行区域直接显示结果。需要保存结果后继续录制吗?</p> | |
| 116 | + </div> | |
| 117 | + <div class="tip-footer"> | |
| 118 | + <button class="btn btn-success btn-sm" id="save_compile">保存并继续录制</button> | |
| 119 | + <button class="btn btn-danger btn-sm" id="cancel_compile">不保存继续录制</button> | |
| 120 | + </div> | |
| 121 | + </div> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + | |
| 125 | + <!-- 控录制录制 --> | |
| 126 | + <div class="record-toolbox"> | |
| 127 | + <!-- 运行结果区 --> | |
| 128 | + <div class="console-wrap"> | |
| 129 | + <div id="toolbar"> | |
| 130 | + <!-- Nav tabs --> | |
| 131 | + <ul class="nav nav-tabs result-tabs need-compile" role="tablist" id="cmprun-tabs"> | |
| 132 | + <li class="active"><a href="#stdin" role="tab" data-toggle="tab" class="text">标准</a></li> | |
| 133 | + <li><a href="#cmpinfo" role="tab" data-toggle="tab" class="text">编译</a></li> | |
| 134 | + <li><a href="#stderr" role="tab" data-toggle="tab" class="text">错误</a></li> | |
| 135 | + <li><a href="#output" role="tab" data-toggle="tab" class="text">结果</a></li> | |
| 136 | + </ul> | |
| 137 | + <div class="pull-right func"> | |
| 138 | + <a class="btn btn-success" id="CompileBtn"> | |
| 139 | + <span class="ladda-label">编译运行</span> | |
| 140 | + </a> | |
| 141 | + <a id="full-screen" class=""><i class="icon iconfont icon-quanping1"></i></a> | |
| 142 | + <!-- <a id="back-screen" class=""><i class="icon iconfont icon-quanping1"></i></a> --> | |
| 143 | + </div> | |
| 144 | + </div> | |
| 145 | + | |
| 146 | + <!-- Tab panes --> | |
| 147 | + <div id="resultoutput" class="tab-content need-compile"> | |
| 148 | + <div class="tab-pane active padall15" id="stdin"> | |
| 149 | + <input type="text" class="form-control" id="runtimeArgus" placeholder="标准输入"> | |
| 150 | + </div> | |
| 151 | + <div class="tab-pane padall15" id="cmpinfo"></div> | |
| 152 | + <div class="tab-pane padall15" id="stderr"></div> | |
| 153 | + <div class="tab-pane padall15" id="output"></div> | |
| 154 | + </div> | |
| 155 | + <div class="panel-body no-compile" id="ifrcontainer"> | |
| 156 | + <iframe id="resultiframe" frameBorder="0" width="100%"></iframe> | |
| 157 | + </div> | |
| 158 | + </div> | |
| 159 | + <input type="hidden" class="audio-url" value=""> | |
| 160 | + <div id="playFooter"> | |
| 161 | + <div class="" id="audioWrap"> | |
| 162 | + <button class="play-code" style="display: none;"> | |
| 163 | + <i class="icon iconfont icon-play"></i> | |
| 164 | + </button> | |
| 165 | + </div> | |
| 166 | + </div> | |
| 167 | + </div> | |
| 168 | + | |
| 169 | + <!-- 准备开始 --> | |
| 170 | + <div id="countdown" style="display: none;"> | |
| 171 | + <img src="" alt=""> | |
| 172 | + </div> | |
| 173 | + <!-- 保存提示 --> | |
| 174 | + <div class="upload-tip" style="display: none;"> | |
| 175 | + <img src="../img/upload_tip.png" alt=""> | |
| 176 | + </div> | |
| 177 | + | |
| 178 | + </div> | |
| 179 | + | |
| 180 | +</body> | |
| 181 | +</html> | |
| 0 | 182 | \ No newline at end of file | ... | ... |