Commit 35349457b78c1dc7a2e4cda18e4b21cdf18dc7db

Authored by ykxie
2 parents 40c82262 630c0bdb

Merge branch 'feature/20170112_Multiple_files' of gitlab.gaoxiaobang.com:kira/pr…

…ogramming into new_Kira

Conflicts:
	src/js/gb.js
src/css/demo.css
... ... @@ -114,12 +114,18 @@ ul.ztree li a{
114 114 border: none;
115 115 opacity: 1;
116 116 }
  117 +ul.ztree li span.node_name input{
  118 + outline: none;
  119 +}
117 120 ul.ztree li span.button.switch{
118 121 display: none;
119 122 }
120 123 ul.ztree li span.button.ico_open,
121 124 ul.ztree li span.button.ico_close,
122   -ul.ztree li span.button.ico_docu{
  125 +ul.ztree li span.button.ico_docu,
  126 +ul.ztree li span.button.add,
  127 +ul.ztree li span.button.edit,
  128 +ul.ztree li span.button.remove{
123 129 margin-top: 4px;
124 130 margin-right: 2px;
125 131 vertical-align: top;
... ... @@ -131,6 +137,9 @@ ul.ztree li span.button.ico_close{
131 137 ul.ztree li span.button.ico_docu{
132 138 background: url(../img/icon-files-java.png) no-repeat scroll center center transparent;
133 139 }
  140 +ul.ztree li span.button.add {
  141 + background-position:-144px 0;
  142 +}
134 143  
135 144 textarea[id^="tab"]{ display: none; }
136 145 textarea[id^="tab"].active{ display: block; }
... ...
src/css/recording.css
... ... @@ -554,7 +554,7 @@ button {
554 554 display: inline-flex;
555 555 z-index: 999;
556 556 background-color: #333;
557   - padding: 4px 74px 0 32px;
  557 + padding: 4px 10px 0 10px;
558 558 box-shadow: 0px 2px 10px #333; }
559 559  
560 560 #full-screen, #back-screen {
... ...
src/js/gb.js
1 1 // 2016-11-4 By Kira
  2 +
2 3 $(function() {
3 4 /**
4 5 * 互动编程播放页面参数
... ... @@ -33,97 +34,249 @@ $(function() {
33 34 csshlLine = null,
34 35 jshlLine = null;
35 36  
36   - if(document.URL.indexOf('player') >= 0){
37   - isReplayPage = true;
38   - // if(!_codeReplayId || !_userId || !_role || !_chapterId){
39   - // utils.errorVisit.template = $('<div id="tips" class="tips">' +
40   - // '<div class="tips-inner">' +
41   - // '访问参数出错,请联系管理人员。' +
42   - // '</div>' +
43   - // '</div>');
44   - // utils.errorVisit.show();
45   - // }else{
46   - // $('#app').show();
47   - // }
48   - // }else{
49   - // if(!_languageid || !_userId || !_role || !_source){
50   - // utils.errorVisit.show();
51   - // }else{
52   - // $('#app').show();
53   - // }
  37 + var playUrl;
  38 + var playData;
  39 + var playTreePathData = {"tree": []};
  40 +
  41 + var playFoo = {
  42 + showPLayError: function(){
  43 + utils.errorVisit.template = $('<div id="tips" class="tips">' +
  44 + '<div class="tips-inner">' +
  45 + '访问参数出错,请联系管理人员。' +
  46 + '</div>' +
  47 + '</div>');
  48 + utils.errorVisit.show();
  49 + },
  50 + programFileListToTreeJson: function(arr){
  51 + var playTreeFolder = [],
  52 + playTreeFile = [];
  53 + var n = 0,
  54 + m = 0
  55 + l = 0;
  56 + playData.programmingFileList.length = 10;
  57 + for (var i = 0; i < playData.programmingFileList.length; i++) {
  58 + var temArr = playData.programmingFileList[i].path.split('/');
  59 + if(playTreeFolder.length > 0){
  60 + for (var j = 0; j < playTreeFolder.length; j++) {
  61 + if(playTreeFolder[j]){
  62 + if(playTreeFolder[j].name != temArr[0]){
  63 + playTreeFolder[n] = {"name": temArr[0], "open": true, "isParent": true, "collapse": false };
  64 + }else{
  65 + // console.log('playTreeFolder[j] else');
  66 + }
  67 + }
  68 + }
  69 + }else{
  70 + playTreeFolder[n] = {"name": temArr[0], "open": true, "isParent": true, "collapse": false };
  71 + n++;
  72 + }
  73 +
  74 + if(playTreeFile.length > 0){
  75 + for (var j = 0; j < playTreeFile.length; j++) {
  76 + if(playTreeFile[j]){
  77 + if(playTreeFile[j].name != temArr[1]){
  78 + playTreeFile[m] = {'pName': temArr[0], "name": temArr[1], "type": "java" };
  79 + }else{
  80 + playTreeFile[m] = {'pName': temArr[0], "name": temArr[1], "type": "java" };
  81 + m++;
  82 + }
  83 + }
  84 + }
  85 + }else{
  86 + playTreeFile[m] = {'pName': temArr[0], "name": temArr[1], "type": "java" };
  87 + m++;
  88 + }
  89 + }
  90 + for (var i = 0; i < playTreeFolder.length; i++) {
  91 + playTreeFolder[i].pId = 0;
  92 + playTreeFolder[i].id = i+1;
  93 + playTreePathData['tree'].push(playTreeFolder[i]);
  94 + }
  95 + for (var i = 0; i < playTreeFile.length; i++) {
  96 + for (var j = 0; j < playTreeFolder.length; j++) {
  97 + if(playTreeFile[i].pName == playTreeFolder[j].name){
  98 + playTreeFile[i].id = (playTreeFolder[j].id.toString() + i.toString()) * 1;
  99 + playTreeFile[i].pId = playTreeFolder[j].id;
  100 + playTreePathData.tree.push(playTreeFile[i]);
  101 + }
  102 + }
  103 + }
  104 + return playTreePathData.tree;
  105 + }
54 106 }
55   - $('#app').show();
  107 +
56 108 // 储存一个树结构和编辑器的对应关系
57 109 var treeLinkEditor = [], // 缓存整个目录树结构和代码编辑器的关系
58 110 treeData = {}, // 缓存目录树返回结果
59 111 mainPath, // 运行编译时候需要知道当前是哪个文件
60 112 fileList, // 有值的文件数据结构
61 113 treeObj; // 获取ztree对象
62   -
63   - var ZTREE = {
64   - /**
65   - * ztreeSetting 配置文件
66   - * @Author syantao
67   - * Created by Keystion on 2017-01-19
68   - */
69   - config: {
70   - view: { showLine: false }
71   - ,data: {
72   - simpleData: { enable: true }
  114 + var treeFoo = {
  115 + beforeClick: function (treeId, treeNode){
  116 + console.info('ZTREE.config.callback.beforeClick');
  117 + console.log('点击了 ' + treeNode.name);
  118 + console.log(treeNode);
  119 + // 判断是否点击了文件夹
  120 + if (treeNode.isParent) {
  121 + return false;
73 122 }
74   - ,callback: {
75   - /**
76   - * ztree 每一项点击事件
77   - * @Author syantao
78   - * Created by Keystion on 2017-01-19
79   - */
80   - beforeClick: function(treeId, treeNode){
81   - // console.info('ZTREE.config.callback.beforeClick');
82   - // console.log('点击了 ' + treeNode.name);
83   - // console.log(treeNode);
84   - // 判断是否点击了文件夹
  123 + treeObj.expandNode(treeNode);
  124 + console.log(GBCodePlayBack.isRecordPlay);
  125 + if (GBCodePlayBack.isRecordPlay == 1) {
  126 + GBCodePlayBack.check_tree_time = new Date().getTime(); // 获取焦点的时间
  127 + var recordobj = {
  128 + intervaltime: GBCodePlayBack.check_tree_time - GBCodePlayBack.record_startime,
  129 + editor: 'tab',
  130 + changeobj: {
  131 + from: {
  132 + ch: 0,
  133 + line: 0,
  134 + },
  135 + text: '',
  136 + to: {
  137 + ch: 0,
  138 + line: 0,
  139 + }
  140 + },
  141 + treefile: treeNode,
  142 + trigger: 0,
  143 + playTime: 0
  144 + };
  145 + GBCodePlayBack.records.push(recordobj);
  146 + console.log(GBCodePlayBack.records);
  147 + GBCodePlayBack.record_startime = GBCodePlayBack.check_tree_time;
  148 + }
  149 +
  150 + console.log(GBCodePlayBack.records);
  151 + // 处理显示目录树对应的编辑器目录
  152 + ZTREE.showEdite({'treeNode': treeNode});
  153 + },
  154 + beforeDrag: function (treeId, treeNodes) {
  155 + return false;
  156 + },
  157 + beforeEditName: function (treeId, treeNode) {
  158 + treeObj.selectNode(treeNode);
  159 + setTimeout(function() {
  160 + // if (confirm("进入节点 -- " + treeNode.name + " 的编辑状态吗?")) {
  161 + // setTimeout(function() {
  162 + treeObj.editName(treeNode);
  163 + // }, 0);
  164 + // }
  165 + }, 0);
  166 + return false;
  167 + },
  168 + renameAlert: function (str, treeNode){
  169 + setTimeout(function() {
  170 + // treeObj.cancelEditName(newName);
  171 + alert(str);
  172 + }, 0);
85 173  
86   - console.log('==========================================')
87   - console.log(treeNode)
88   - console.log('==========================================')
  174 + // 优化体验再次进入编辑状态
  175 + setTimeout(function() {
  176 + treeObj.selectNode(treeNode);
  177 + treeObj.editName(treeNode);
  178 + }, 0);
  179 + },
  180 + beforeRename: function (treeId, treeNode, newName, isCancel) {
  181 + var _this = this;
  182 + // console.info('beforeRename');
  183 + // console.info(treeNode);
  184 + if (newName.length == 0) {
  185 + treeFoo.renameAlert("文件名名称不能为空.", treeNode);
  186 + return false;
  187 + }else if(newName != treeNode.name){
  188 + for (var i = 0; i < treeLinkEditor.length; i++) {
89 189  
90   - if (treeNode.isParent) {
  190 + // 判断是否重名
  191 + if(treeLinkEditor[i].file === newName){
  192 + treeFoo.renameAlert("文件名“" + newName + "”已被占用,请选取其他名称。", treeNode);
91 193 return false;
  194 + }else if(/.java$/.test(newName) && newName.split('.').length > 2){
  195 + treeFoo.renameAlert("文件名“" + newName + "”有误,请选取其他名称。", treeNode);
  196 + return false;
  197 + }else if(!/.java$/.test(newName)){
  198 + treeFoo.renameAlert("文件后缀名“" + newName + "”有误,请选取其他名称。", treeNode);
  199 + return false;
  200 + }else{
  201 + console.log('else');
  202 + // 更新 treeLinkEditor 存值
  203 + if(treeLinkEditor[i].file === treeNode.name){
  204 + var _temName = treeLinkEditor[i].name;
  205 + var _name = ZTREE.manageName(newName);
  206 +
  207 + // 缓存值得更新
  208 + treeLinkEditor[i].name = _name;
  209 + treeLinkEditor[i].file = newName;
  210 + treeLinkEditor[i].filePath = ZTREE.getTreePath(treeNode.name, newName);
  211 + treeLinkEditor[i].record = _name + 'Record';
  212 + treeLinkEditor[i].replay = _name + 'Replay';
  213 + treeLinkEditor[i].CodeMirrorRecordId = treeLinkEditor[i].record + 'CodeMirror';
  214 + treeLinkEditor[i].CodeMirrorReplayId = treeLinkEditor[i].replay + 'CodeMirror';
  215 +
  216 + mainPath = treeLinkEditor[i].filePath;
  217 +
  218 + // 更新DOM相关
  219 + $('#'+ _temName +'RecordWrap').attr({
  220 + id: _name +'RecordWrap'
  221 + });
  222 + $('#'+ _temName + 'Record').attr({
  223 + id: _name + 'Record',
  224 + title: _name
  225 + });
  226 + $('#'+ _temName + 'RecordCodeMirror').attr({
  227 + id: _name + 'RecordCodeMirror'
  228 + });
  229 +
  230 + $('#'+ _temName +'ReplayWrap').attr({
  231 + id: _name +'ReplayWrap'
  232 + });
  233 + $('#'+ _temName + 'Replay').attr({
  234 + id: _name + 'Replay',
  235 + title: _name
  236 + });
  237 + $('#'+ _temName + 'ReplayCodeMirror').attr({
  238 + id: _name + 'ReplayCodeMirror'
  239 + });
  240 + // treeLinkEditor[i].CodeMirrorRecord.setValue(treeLinkEditor[i].CodeMirrorRecord.getValue() + '\n\n'+ _name);
  241 + }
92 242 }
93   - treeObj = $.fn.zTree.getZTreeObj("folder");
94   - treeObj.expandNode(treeNode);
95   - // console.log(GBCodePlayBack.isRecordPlay);
96   - if (GBCodePlayBack.isRecordPlay == 1) {
97   - GBCodePlayBack.check_tree_time = new Date().getTime(); // 获取焦点的时间
98   - var recordobj = {
99   - intervaltime: GBCodePlayBack.check_tree_time - GBCodePlayBack.record_startime,
100   - editor: 'tab',
101   - changeobj: {
102   - from: {
103   - ch: 0,
104   - line: 0,
105   - },
106   - text: '',
107   - to: {
108   - ch: 0,
109   - line: 0,
110   - }
111   - },
112   - treefile: treeNode,
113   - trigger: 0,
114   - playTime: 0
115   - };
116   - GBCodePlayBack.records.push(recordobj);
117   - // console.log(GBCodePlayBack.records);
118   - GBCodePlayBack.record_startime = GBCodePlayBack.check_tree_time;
119   - }
120   -
121   - // console.log(GBCodePlayBack.records);
122   - // 处理显示目录树对应的编辑器目录
123   - ZTREE.showEdite({'treeNode': treeNode});
124 243 }
  244 + }else{
  245 + isCancel = true;
125 246 }
  247 + return true;
  248 + },
  249 + onRename: function (e, treeId, treeNode, isCancel) {
  250 + console.info('onRename');
  251 + },
  252 + showRemoveBtn: function (treeId, treeNode) {
  253 + return !treeNode.isFirstNode;
  254 + },
  255 + showRenameBtn: function (treeId, treeNode) {
  256 + return !treeNode.isLastNode;
126 257 },
  258 + addHoverDom: function (treeId, treeNode) {
  259 + // console.info('addHoverDom');
  260 + // 修复第一个文件夹
  261 + if(treeNode.isParent){
  262 + $('a[title="'+ treeNode.name +'"]').find("#" + treeId + "_" + treeNode.id + "_edit").hide();
  263 + return false;
  264 + }
  265 +
  266 + // 不知道为什么 ztree 最后一项不显示编辑按钮
  267 + // 只能通过改变参数的值来让它显示编辑按钮
  268 + if(treeNode.isLastNode){
  269 + treeNode.isLastNode = false;
  270 + }
  271 + },
  272 + removeHoverDom: function (treeId, treeNode) {
  273 + // console.info('removeHoverDom');
  274 + if(!treeNode.isParent){
  275 + $("#folder_" + treeNode.tId + "_edit").unbind().remove();
  276 + }
  277 + }
  278 + }
  279 + var ZTREE = {
127 280 /**
128 281 * 通过目录树的点击来显示对应的编辑器
129 282 * @Author syantao
... ... @@ -176,13 +329,18 @@ $(function() {
176 329 * TODO treeNode放到一个变量或者隐藏域里面
177 330 */
178 331 // 根据提供的 name 获取 pId , 再根据 pId 获取 夫级 name
179   - getTreePath: function (name){
180   - // console.info('ZTREE.getTreePath');
  332 + // newName 替换 name 更名需求
  333 + getTreePath: function (name, newName){
  334 + console.info('ZTREE.getTreePath');
181 335 var _pid, _folder, _filename;
182 336 for (var i = 0; i < treeData.length; i++) {
183 337 if(treeData[i].name == name){
184 338 _pid = treeData[i].pId;
185   - _filename = treeData[i].name;
  339 + if(newName){
  340 + _filename = newName;
  341 + }else{
  342 + _filename = treeData[i].name;
  343 + }
186 344 }
187 345 }
188 346 for (var i = 0; i < treeData.length; i++) {
... ... @@ -300,16 +458,122 @@ $(function() {
300 458 var node = treeObj.getNodeByParam("name", _thisName, null);
301 459  
302 460 treeObj.selectNode(node, false, true);
303   - }
  461 + },
  462 + /**
  463 + * ztreeSetting 配置文件
  464 + * @Author syantao
  465 + * Created by Keystion on 2017-01-19
  466 + */
  467 + config: {
  468 + view: {
  469 + addHoverDom: treeFoo.addHoverDom,
  470 + removeHoverDom: treeFoo.removeHoverDom,
  471 + selectedMulti: false,
  472 + showLine: false
  473 + }
  474 + ,edit: {
  475 + enable: true,
  476 + editNameSelectAll: true,
  477 + showRemoveBtn: false,
  478 + showRenameBtn: treeFoo.showRenameBtn
  479 + }
  480 + ,data: {
  481 + simpleData: { enable: true }
  482 + }
  483 + ,callback: {
  484 + /**
  485 + * ztree 每一项点击事件
  486 + * @Author syantao
  487 + * Created by Keystion on 2017-01-19
  488 + */
  489 + beforeClick: treeFoo.beforeClick,
  490 + beforeDrag: treeFoo.beforeDrag,
  491 + beforeEditName: treeFoo.beforeEditName,
  492 + beforeRename: treeFoo.beforeRename,
  493 + onRename: treeFoo.onRename
  494 + }
  495 + },
304 496 }
305 497  
306   - $(document).on('click', '#cancel', function(event) {
307   - event.preventDefault();
308   - /* Act on the event */
  498 + if(document.URL.indexOf('player') >= 0){
  499 + isReplayPage = true;
  500 + if (_role == 0) {
  501 + playUrl = gxb_api + "/programming/codeReplay/" + _codeReplayId + "/api";
  502 + } else if (_role == 1) {
  503 + playUrl = gxb_api + "/programming/student/studentReplay/" + _codeReplayId + "/api";
  504 + }
  505 + $.ajax({
  506 + type: "get",
  507 + url: playUrl,
  508 + dataType: "json",
  509 + contentType: "application/json",
  510 + success: function(res) {
  511 + console.info(playUrl)
  512 + console.log(res)
  513 + // 判断数据是否正常
  514 + if(res.codeReplayId){
  515 + playData = res;
  516 + _languageid = playData.languageid;
  517 + console.log(playData.audioUrl);
  518 +
  519 + if(playData.programmingFileList){
  520 +
  521 + treeData = playFoo.programFileListToTreeJson(playData.programmingFileList);
309 522  
310   - // GBCodePlayBack.resetCodeMirrorValue();
  523 + console.log(treeData);
311 524  
312   - });
  525 + treeData = playTreePathData.tree;
  526 + treeObj = $.fn.zTree.init($("#folder"), ZTREE.config, treeData);
  527 +
  528 + GBCodePlayBack.recordinit(treeData);
  529 + }
  530 + $('#app').show();
  531 + }else{
  532 + playFoo.showPLayError();
  533 + }
  534 + },
  535 + error: function() {
  536 + playFoo.showPLayError();
  537 + alert('错误')
  538 + }
  539 + });
  540 + // if(!_codeReplayId || !_userId || !_role || !_chapterId){
  541 + // utils.errorVisit.template = $('<div id="tips" class="tips">' +
  542 + // '<div class="tips-inner">' +
  543 + // '访问参数出错,请联系管理人员。' +
  544 + // '</div>' +
  545 + // '</div>');
  546 + // utils.errorVisit.show();
  547 + // }else{
  548 + // $('#app').show();
  549 + // }
  550 + }else{
  551 + // 动态获取目录结构
  552 + // if(!_languageid || !_userId || !_role || !_source){
  553 + // utils.errorVisit.show();
  554 + // }else{
  555 + $.ajax({
  556 + type: "GET",
  557 + url: "../js/tree.json",
  558 + dataType: "json",
  559 + contentType: "application/json",
  560 + success: function(res) {
  561 + console.info();
  562 + treeData = res.tree;
  563 +
  564 + treeObj = $.fn.zTree.init($("#folder"), ZTREE.config, treeData);
  565 +
  566 + GBCodePlayBack.recordinit(treeData);
  567 +
  568 + },
  569 + error: function(XMLHttpRequest, textStatus, errorThrown) {
  570 + console.log('Ajax tree.json error');
  571 + console.log(XMLHttpRequest);
  572 + }
  573 + });
  574 + $('#app').show();
  575 + // }
  576 + }
313 577  
314 578 // 根据不同的角色渲染页面
315 579 if (_role == 1) {
... ... @@ -667,107 +931,69 @@ $(function() {
667 931  
668 932  
669 933 if (document.URL.indexOf('player.htm') >= 0) {
670   - if (_role == 0) {
671   - var apiUrl = gxb_api + "/programming/codeReplay/" + _codeReplayId + "/api";
672   - // var apiUrl = gxb_api + "/gxb-web/programmingMulti/" + _codeReplayId + "/api";
673   - // var apiUrl = "../js/codedata.json";
674   -
675   - initPlayerPage(apiUrl)
676   -
677   - } else if (_role == 1) {
678   - var apiUrl = gxb_api + "/programming/student/studentReplay/" + _codeReplayId + "/api";
679   - // var apiUrl = gxb_api + "/gxb-web/programmingMulti/" + _codeReplayId + "/api";
680   - // var apiUrl = "../js/codedata.json";
681   -
682   - initPlayerPage(apiUrl)
683   - }
  934 + initPlayerPage()
684 935 } else {
685 936 compileMode(_languageid)
686 937 }
687 938  
688 939 // 初始化渲染页面
689   - function initPlayerPage(apiUrl) {
690   - initJavaPage(treeData)
691   - $.ajax({
692   - type: "get",
693   - url: apiUrl,
694   - dataType: "json",
695   - contentType: "application/json",
696   - success: function(coderecords) {
697   - console.log(coderecords);
698   - GBCodePlayBack.langid = parseInt(coderecords.languageid);
699   - var langid = GBCodePlayBack.langid;
700   - selectLang(langid);
701   - compileMode(langid);
702   -
703   - // $("#play_audio").attr('src', "http://gxb-file.oss-cn-beijing.aliyuncs.com" + coderecords.audioUrl);
704   - // $("#play_audio").attr('src', coderecords.audioUrl);
705   - console.log("http://gxb-file.oss-cn-beijing.aliyuncs.com" + coderecords.audioUrl)
706   - var flag = true;
707   - player.init({
708   - container: '#audioWrap',
709   - source: "http://gxb-file.oss-cn-beijing.aliyuncs.com" + coderecords.audioUrl,
710   - imagePath: '../js/audioPlayer/image',
711   - debuggers: false,
712   - allowSeek: false,
713   - playCallback: function() { // 播放
714   - console.log('++++++++');
715   - playCode();
716   -
717   - // if(flag){
718   - // playCode();
719   - // }
720   -
721   - // $('#play').trigger('click');
722   - // GBCodePlayBack.htmlplayereditor.setOption('readOnly', true);
723   - },
724   - pauseCallback: function() { // 暂停
725   - // flag = false;
726   - // player.play();
727   -
728   - GBCodePlayBack.audioTime = parseInt(player.elements.audioDom.currentTime*1000)
729   - GBCodePlayBack.treeSelectNode = treeObj.getSelectedNodes()[0];
730   - pauseCode();
731   - GBCodePlayBack.firstPlay = 0;
732   - GBCodePlayBack.getCodeMirrorValue();
733   -
734   - // GBCodePlayBack.pauseValue = GBCodePlayBack.htmlplayereditor.getValue();
735   - // GBCodePlayBack.htmlplayereditor.setOption('readOnly', false);
736   - },
737   - seekedCallback: function() { // 拖拽
738   -
739   - },
740   - endedCallback: function() { // 结束播放
741   - playEnd()
742   - }
743   - });
744   -
745   - var coderecords = coderecords.codeRecordList;
746   - console.log(coderecords);
747   - // if (_role == 0) {
748   - // var coderecords = coderecords.codeRecordList;
749   - // } else if (_role == 1) {
750   - // var coderecords = coderecords.studentRecordList;
  940 + function initPlayerPage() {
  941 + console.info('initPlayerPage')
  942 + console.log(playData);
  943 + var langid = parseInt(playData.languageid);
  944 + var coderecords = playData.codeRecordList;
  945 +
  946 + selectLang(langid);
  947 + compileMode(langid);
  948 +
  949 + console.log("http://gxb-file.oss-cn-beijing.aliyuncs.com" + playData.audioUrl)
  950 + player.init({
  951 + container: '#audioWrap',
  952 + source: "http://gxb-file.oss-cn-beijing.aliyuncs.com" + playData.audioUrl,
  953 + imagePath: '../js/audioPlayer/image',
  954 + debuggers: false,
  955 + allowSeek: false,
  956 + playCallback: function() { // 播放
  957 + console.log('++++++++');
  958 + playCode();
  959 +
  960 + // if(flag){
  961 + // playCode();
751 962 // }
752   - // GBCodePlayBack.htmlplayereditor.setValue('');
753   - // GBCodePlayBack.cssplayereditor.setValue('');
754   - // GBCodePlayBack.jsplayereditor.setValue('');
755   -
756   - var starttime = 0;
757   - for (var i = 0; i < coderecords.length; i++) {
758   - if (!coderecords[i].trigger) coderecords[i].trigger = 0;
759   - coderecords[i].changeobj = jQuery.parseJSON(coderecords[i].changeobj);
760   - coderecords[i].treefile = jQuery.parseJSON(coderecords[i].treefile);
761   - }
762   -
763   - GBCodePlayBack.records = coderecords;
764   - console.log(GBCodePlayBack.records);
  963 +
  964 + // $('#play').trigger('click');
  965 + // GBCodePlayBack.htmlplayereditor.setOption('readOnly', true);
765 966 },
766   - error: function() {
767   - console.log('-------------------');
768   - alert('错误')
  967 + pauseCallback: function() { // 暂停
  968 + // flag = false;
  969 + // player.play();
  970 +
  971 + GBCodePlayBack.audioTime = parseInt(player.elements.audioDom.currentTime*1000)
  972 + GBCodePlayBack.treeSelectNode = treeObj.getSelectedNodes()[0];
  973 + pauseCode();
  974 + GBCodePlayBack.firstPlay = 0;
  975 + GBCodePlayBack.getCodeMirrorValue();
  976 +
  977 + // GBCodePlayBack.pauseValue = GBCodePlayBack.htmlplayereditor.getValue();
  978 + // GBCodePlayBack.htmlplayereditor.setOption('readOnly', false);
  979 + },
  980 + seekedCallback: function() { // 拖拽
  981 +
  982 + },
  983 + endedCallback: function() { // 结束播放
  984 + playEnd()
769 985 }
770 986 });
  987 +
  988 + var starttime = 0;
  989 + for (var i = 0; i < coderecords.length; i++) {
  990 + if (!coderecords[i].trigger) coderecords[i].trigger = 0;
  991 + coderecords[i].changeobj = jQuery.parseJSON(coderecords[i].changeobj);
  992 + coderecords[i].treefile = jQuery.parseJSON(coderecords[i].treefile);
  993 + }
  994 +
  995 + GBCodePlayBack.records = coderecords;
  996 + console.log(GBCodePlayBack.records);
771 997 }
772 998  
773 999 // 使编辑器满屏
... ... @@ -1316,90 +1542,6 @@ $(function() {
1316 1542 alert('代码保存失败重新保存')
1317 1543 }
1318 1544 });
1319   -
1320   - // replaydto.html = GBCodePlayBack.htmleditor.getValue();
1321   - // replaydto.css = GBCodePlayBack.csseditor.getValue();
1322   - // replaydto.javascript = GBCodePlayBack.jseditor.getValue();
1323   - // // replaydto.audioUrl = $('.audio-url').val();
1324   - // replaydto.audioUrl = '/uploads/programming_audio/link/17/01/24/38029c9698e144d2bd590b35eb6af56e';
1325   - // replaydto.deleteFlag = 1
1326   -
1327   - // //保存序列化录制内容
1328   - // var recorddatas = [];
1329   - // for (var i = 0; i < GBCodePlayBack.records.length; i++) {
1330   - // console.log(GBCodePlayBack.records);
1331   - // var recorddata = {
1332   - // intervaltime: GBCodePlayBack.records[i].intervaltime,
1333   - // editor: GBCodePlayBack.records[i].editor,
1334   - // changeobj: JSON.stringify(GBCodePlayBack.records[i].changeobj),
1335   - // cmpinfo: GBCodePlayBack.records[i].cmpinfo,
1336   - // output: GBCodePlayBack.records[i].output,
1337   - // result: GBCodePlayBack.records[i].result,
1338   - // stderr: GBCodePlayBack.records[i].stderr
1339   - // }
1340   -
1341   - // recorddatas.push(recorddata);
1342   - // }
1343   -
1344   - // //回放入库
1345   - // recorddatas.deleteFlag = 1
1346   -
1347   - // var keepTimer = $('.recording-time').val()
1348   - // replaydto.totaltime = parseInt(keepTimer);
1349   - // if (_role == 0) {
1350   - // replaydto.codeRecordList = recorddatas;
1351   - // $.ajax({
1352   - // type: "post",
1353   - // url: gxb_api + "/programming/codeReplay/api",
1354   - // data: JSON.stringify(replaydto),
1355   - // dataType: "json",
1356   - // contentType: "application/json",
1357   - // success: function(data) {
1358   - // $(window).unbind('beforeunload');
1359   - // var _data = {
1360   - // "programId": data.codeReplayId,
1361   - // "programLanguageName": data.languageName,
1362   - // "programAudioLength": keepTimer
1363   - // }
1364   - // $('.upload-tip').hide();
1365   -
1366   - // $('#cancel').prop("disabled", false);
1367   -
1368   - // window.opener.postMessage(_data, _source);
1369   - // window.close();
1370   - // },
1371   - // error: function() {
1372   - // $('.upload-tip').hide();
1373   - // alert('代码保存失败重新保存')
1374   - // }
1375   - // });
1376   - // } else if (_role == 1) {
1377   - // replaydto.studentRecordList = recorddatas;
1378   - // $.ajax({
1379   - // type: "post",
1380   - // url: gxb_api + "/programming/student/studentReplay/api",
1381   - // data: JSON.stringify(replaydto),
1382   - // dataType: "json",
1383   - // contentType: "application/json",
1384   - // success: function(data) {
1385   - // $(window).unbind('beforeunload');
1386   - // var _data = {
1387   - // "programId": data.studentReplayId,
1388   - // "programLanguageName": data.languageName,
1389   - // "programAudioLength": keepTimer
1390   - // }
1391   - // $('.upload-tip').hide();
1392   - // $('#cancel').prop("disabled", false);
1393   - // window.opener.postMessage(_data, _source);
1394   - // window.close();
1395   - // },
1396   - // error: function() {
1397   - // $('.upload-tip').hide();
1398   - // alert('代码保存失败重新保存')
1399   - // }
1400   - // });
1401   - // }
1402   -
1403 1545 });
1404 1546  
1405 1547 $('#toggle_replay_enhancement').click(function() {
... ... @@ -1692,23 +1834,23 @@ $(function() {
1692 1834 var isRightResizing = false;
1693 1835 var _width = 0;
1694 1836 var _tempWidth = 0;
1695   - var appLeftRatio = 140 / appMinWidth;
  1837 + var appLeftRatio = 200 / appMinWidth;
1696 1838 var appRightRatio = 320 / appMinWidth;
1697 1839  
1698 1840 if($(window).width() <= appMinWidth){
1699 1841 $('body').width(appMinWidth)
1700 1842 app.width(appMinWidth);
1701 1843 appContainer.height($(window).height() - appFooter.height());
1702   - appLeft.width(140);
  1844 + appLeft.width(200);
1703 1845 appMian.width(400);
1704 1846 appRight.width(320);
1705   - appMainHeader.css('margin-left', -140);
  1847 + appMainHeader.css('margin-left', -200);
1706 1848 $('.recording-ctrl-bar').css('padding', '0 20px');
1707 1849 }else{
1708 1850 $('body').width('100%');
1709 1851 app.width('100%');
1710 1852 appContainer.height($(window).height() - appFooter.height());
1711   - appLeft.width(140);
  1853 + appLeft.width(200);
1712 1854 appMian.width(parseInt($(window).width() - appLeft.width() - appRight.width()));
1713 1855 appRight.width(320);
1714 1856 appMainHeader.css('margin-left', -appLeft.width());
... ... @@ -2027,26 +2169,6 @@ $(function() {
2027 2169  
2028 2170 $('.record-before').hide();
2029 2171  
2030   - // 动态获取目录结构
2031   - $.ajax({
2032   - type: "GET",
2033   - url: "../js/tree.json",
2034   - dataType: "json",
2035   - contentType: "application/json",
2036   - success: function(res) {
2037   - console.info();
2038   - treeData = res.tree;
2039   -
2040   - treeObj = $.fn.zTree.init($("#folder"), ZTREE.config, treeData);
2041   -
2042   - GBCodePlayBack.recordinit(treeData);
2043   - },
2044   - error: function(XMLHttpRequest, textStatus, errorThrown) {
2045   - console.log('Ajax tree.json error');
2046   - console.log(XMLHttpRequest);
2047   - }
2048   - });
2049   -
2050 2172 $(window).resize(function() {
2051 2173 setTimeout(function () {
2052 2174 GBCodePlayBack.resizeWindow();
... ... @@ -2096,6 +2218,13 @@ $(function() {
2096 2218 // 切换到录制区域
2097 2219 $('#recordertab a:eq(0)').tab('show');
2098 2220  
  2221 + // 禁止重命名
  2222 + setTimeout(function(){
  2223 + treeObj.setting.edit.showRenameBtn = false;
  2224 + treeObj.setting.edit.enable = false;
  2225 + $('.button.edit').hide();
  2226 + },0)
  2227 +
2099 2228 // 编译状态
2100 2229 var data = $(this).attr('data');
2101 2230 var seconds = 0;
... ... @@ -2339,7 +2468,7 @@ $(function() {
2339 2468 }
2340 2469 var compileData = {
2341 2470 "userId": _userId,
2342   - "langId": GBCodePlayBack.langid,
  2471 + "langId": _languageid,
2343 2472 "mainPath": mainPath,
2344 2473 "mainArgus": "",
2345 2474 "runtimeArgus": runtimeArgus,
... ... @@ -2368,37 +2497,8 @@ $(function() {
2368 2497 ladda.remove();
2369 2498 alert('错误');
2370 2499 console.log(XMLHttpRequest);
2371   - }
  2500 + },
2372 2501 });
2373   -
2374   - // var code = (typeof GBCodePlayBack.htmleditor !=='undefined' && GBCodePlayBack.htmleditor.getValue())
2375   - // || (typeof GBCodePlayBack.htmlplayereditor !=='undefined' && GBCodePlayBack.htmlplayereditor.getValue());
2376   - // var langid = $('#htmlbutton').data("languageid");
2377   - // var runtimeArgus = $('#runtimeArgus').val() || '';
2378   - // var compileData = {
2379   - // code: code,
2380   - // langid: langid,
2381   - // input: runtimeArgus
2382   - // }
2383   - // $.ajax({
2384   - // type: "post",
2385   - // url: gxb_api + "/submit/submitCode/api",
2386   - // data: JSON.stringify(compileData),
2387   - // dataType: "json",
2388   - // contentType: "application/json",
2389   - // success: function(data) {
2390   - // compileResult(data)
2391   - // ladda.remove();
2392   -
2393   - // $('.compile-loading').hide();
2394   - // $('.compile-reslut').show();
2395   - // GBCodePlayBack.compileResultData = data;
2396   - // },
2397   - // error: function(){
2398   - // ladda.remove();
2399   - // alert('错误');
2400   - // }
2401   - // });
2402 2502 }
2403 2503  
2404 2504 // 初始化页面
... ... @@ -2425,7 +2525,7 @@ $(function() {
2425 2525 // 编译结果
2426 2526 function compileResult(data, value) {
2427 2527 var runtimeArgus = value || '';
2428   - console.log('********************************')
  2528 + console.info('compileResult')
2429 2529 if (value != '') {
2430 2530 $('#cmprun-tabs a[href="#stdin"]').tab('show');
2431 2531 $('#stdin input').val(runtimeArgus);
... ... @@ -2450,23 +2550,6 @@ $(function() {
2450 2550 if(!data.compilerInfo.length){
2451 2551 $('#cmpinfo').prepend('<p class="alert alert-success"><i class="glyphicon glyphicon-ok-sign"></i> 编译已成功</p>');
2452 2552 }
2453   -
2454   - // if (data.code == 0) {
2455   - // $('#output').html('<p class="text-success">' + data.content.replace(/\n/g, "<br />") + "</p>");
2456   - // $('#cmpinfo').prepend('<p class="alert alert-success"><i class="glyphicon glyphicon-ok-sign"></i> 编译成功 </p>');
2457   - // $('#cmprun-tabs a[href="#output"]').tab('show');
2458   - // } else if (data.code == 1) {
2459   - // if (data.error.length) {
2460   - // $('#cmpinfo').html('<p class="text-warning">' + data.error.replace(/\n/g, "<br />") + "</p>");
2461   - // }else if (data.compilerInfo.length){
2462   - // $('#cmpinfo').html('<p class="text-warning">' + data.compilerInfo.replace(/\n/g, "<br />") + "</p>");
2463   - // }else{
2464   - // $('#cmpinfo').html('<p class="alert alert-danger"><i class="glyphicon glyphicon-exclamation-sign"></i> 编译超时,请重新编译 </p>');
2465   - // }
2466   - // $('#cmprun-tabs a[href="#cmpinfo"]').tab('show');
2467   - // }else{
2468   - // $('#cmpinfo').prepend('<p class="alert alert-success"><i class="glyphicon glyphicon-ok-sign"></i> 等待编译 </p>');
2469   - // }
2470 2553 }else if(data.status == 500){
2471 2554 $('#cmprun-tabs a[href="#stderr"]').tab('show');
2472 2555 $('#stderr').html('<p class="text-danger">' + data.error.replace(/\n/g, "<br />") + "</p>");
... ... @@ -2772,7 +2855,7 @@ $(function() {
2772 2855 }
2773 2856 }
2774 2857 function processChangeObject(playbackcm, obj) {
2775   - console.log('processChangeObject');
  2858 + console.info('processChangeObject');
2776 2859 // 菜单选中
2777 2860 ZTREE.showEdite({'treeNode': {'name': getEditor(playbackcm, 'name')},'replay': true});
2778 2861 for (var i = 0; i < obj.text.length; i++) {
... ...
src/scss/recording.scss
... ... @@ -713,7 +713,7 @@ button{
713 713 display: inline-flex;
714 714 z-index: 999;
715 715 background-color: #333;
716   - padding: 4px 74px 0 32px;
  716 + padding: 4px 10px 0 10px;
717 717 box-shadow: 0px 2px 10px #333;
718 718 }
719 719  
... ...
src/v1.1/index.html
... ... @@ -52,6 +52,7 @@
52 52  
53 53 <link rel="stylesheet" href="../css/demo.css">
54 54 <script type="text/javascript" src="../js/zTree_v3-3.5.27/js/jquery.ztree.core.js"></script>
  55 + <script type="text/javascript" src="../js/zTree_v3-3.5.27/js/jquery.ztree.exedit.js"></script>
55 56 <script src="../js/gb.js"></script>
56 57 <!-- <script src="../js/gbreplayer.js"></script> -->
57 58  
... ...