OJ的前端界面實現(xiàn)

持續(xù)兩周的課程設(shè)計結(jié)束了,本次已經(jīng)是我們小組第三次合作了,相比以前大家都進(jìn)步了很多,所以合作還是很順利的。我們這次做的是一個OJ(Online Judge在線檢測代碼的平臺)。我想作為一個喜愛編程或者學(xué)習(xí)編程的人或多或少都有接觸過算法,本人曾經(jīng)也刷過一些算法,可是相對組長的題量簡直是九牛一毛,我想一個對于算法這么有研究的大神,肯定特別想做個自己的OJ,這是一種情懷,最近覺得好像學(xué)習(xí)計算機(jī)的人都特別有情懷。廢話不多說了,我是寫前端的,所以后臺就讓專業(yè)的人說,我就總結(jié)下自己的前端知識。


一. 代碼編輯框

我想大家最在乎的應(yīng)該就是代碼編輯框應(yīng)該怎么實現(xiàn),當(dāng)然這不是我自己寫的,畢竟只有兩周的時間,造輪子搞出來個這個肯定是不可能的,所以就去github找了個開源的代碼編輯器,然后搜了下用過的人還是挺多的。支持多種語言,像C/C++,Java等當(dāng)然不在話下,這是鏈接:https://github.com/ajaxorg/ace
需要的直接下載就行,下來就簡單的說下怎么用吧:

html部分代碼:

<div class="code">
    <form role="form">
        <div class="editor-header">
            <select class="form-control form-control-plus"onchange="choiceLang(this)">
                <option value="ace/mode/c_cpp">語言</option>
                <option value="ace/mode/c_cpp" selected="selected">C/C++語言</option>
                <option value="ace/mode/java">JAVA語言</option>
                <option value="ace/mode/javascript">JavaScript語言</option>
            </select>
            <select class="form-control form-control-plus" onchange="choiceBack(this)">
                <option>環(huán)境配色</option>
                <option value="ace/theme/xcode" selected="selected">高亮</option>
                <option value="ace/theme/monokai">暗色</option>
            </select>
            <select class="form-control form-control-plus" onchange="choiceSJ(this)">
                <option value="4">代碼縮進(jìn)</option>
                <option>2</option>
                <option selected="selected">4</option>
                <option>8</option>
            </select>
            <div class="flex-btn" onclick="expand('spanid')">
            <span class="glyphicon glyphicon-resize-full" id="spanid"></span>
            </div>
        </div>
    </form>
    <pre id="editor" style="height:400px"></pre> 
    <button class="btn btn-primary" onclick="submit()">提交</button>
</div>

form表單中的下拉框是用來選擇語言,編輯器背景,以及代碼的縮進(jìn)的,將下拉框中的value值設(shè)為指定的值,傳入對應(yīng)的接口就可以了。
下面來簡單的講一下所要用到的接口:

初始化:將語言默認(rèn)為C/C++,背景默認(rèn)為高亮,縮進(jìn)默認(rèn)為4

var editor = ace.edit("editor");  //該值為編輯框的id值
window.onload = (function () {
    editor.setTheme("ace/theme/xcode"); //設(shè)置背景色為高亮
    editor.session.setMode("ace/mode/c_cpp");  //設(shè)置默認(rèn)語言為c/c++
    editor.getSession().setTabSize(4);  //設(shè)置默認(rèn)縮進(jìn)大小
})();

更改語言,背景色,縮進(jìn)大小,value為下拉框的值:

 //設(shè)置語言
function choiceLang(select){
    editor.session.setMode(select.value);
}
//設(shè)置背景色
function choiceBack(select){
    editor.setTheme(select.value); 
}
//設(shè)置縮進(jìn)大小
function choiceSJ(select){
    editor.getSession().setTabSize(select.value);
}

獲得所要提交的代碼:

function submit(){
    var code  = editor.getValue();
}

放幾張圖看下效果:


這里寫圖片描述
這里寫圖片描述

二. 動態(tài)更改代碼運行狀態(tài)

先上圖:

這里寫圖片描述

這里用到了一個加載轉(zhuǎn)圈的插件,下載鏈接:https://github.com/fgnass/spin.js

//動畫
window.onload = function(){
    //加載轉(zhuǎn)圈,插件提供的配置接口
    var opts = {
          lines: 13, //小長條的數(shù)量
          length: 13, //小長條的長度
          width: 3, //小長條的寬度
          radius: 15, //內(nèi)環(huán)的半徑長
          corners: 1, // Corner roundness (0..1)
          rotate: 0, //旋轉(zhuǎn)角度
          direction: 1, //1:順時針方向 -1:逆時針方向
          color: '#000', //顏色
          speed: 1, //每秒轉(zhuǎn)多少圈
          trail: 60, //余暉效果百分比
          shadow: false, //渲染陰影
          hwaccel: false, //加速
          className: 'spinner', //類名spinner
          zIndex: 2e9, //顯示在最頂層
          top: 'auto', //相對父元素的top
          left: 'auto' //相對父元素的left ,默認(rèn)情況spinner是顯示于父元素居中位置

        };
        //foo為動畫的載體
        var target = document.getElementById('foo');
        //實例化之后開始轉(zhuǎn)圈
        var spinner = new Spinner(opts).spin(target);

    //進(jìn)度條的變化
    var arr = ['正在上傳Uploading','等待測試Pending','正在編譯Compiling','正在評測Running','測試通過Accepted'];
    var colors = ['black', '#bbb', '#FC8A15', '#4FC1E9', 'rgb(39, 194, 76)'];
    var progress = document.getElementById('progress');
    var status = document.getElementById('status');
    for (var i = 0; i < 5; i++){
        (function (j){
            setTimeout(function (){
                progress.style.width = 20 * (j + 1) + '%';
                progress.innerHTML = 20 * (j + 1) + '%';
                status.innerHTML = arr[j];
                status.style.color = colors[j];
            }, 1000 * j);
        })(i);
    }

    //5s后停止旋轉(zhuǎn)
    setTimeout(function (){
        spinner.stop();  //轉(zhuǎn)圈停止
    }, 5000);
} 

這里只是一個模擬,具體的改變要根據(jù)后臺傳來的狀態(tài)而定。

三. 提交代碼記錄的餅狀圖分布

運行截圖:

這里寫圖片描述

這里用了一個很有名的插件,chart.js,可以引用cdn,也可以去github下載,cdn:https://cdn.bootcss.com/Chart.js/2.6.0/Chart.min.js
github下載鏈接:https://github.com/chartjs/Chart.js

代碼示例:

var ctx = document.getElementById("canvas").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'pie',
    data: {
        labels: ["submit-failed", "pending", "judging", "accepted", "ComplieError", "RuntimeError"],
        datasets: [{
            label: '# of Votes',
            data: [12, 8, 3, 5, 2, 3],
            backgroundColor: [
                '#BE3144',
                '#bbb',
                '#4797B1',
                'rgb(39, 194, 76)',
                '#FC8A15',
                '#FF847C'
            ],
            borderWidth: 1
        }]
    },
    options: {
        
    }
});

具體的選項運行一下就很明白了,建議大家去看英文文檔,很多中文的文檔都過時了,不然肯定不能正確運行,英文文檔鏈接:http://www.chartjs.org/


以上是自己在項目中所用到的插件,大大減小了代碼的編寫難度,這也是第一次在項目中用別人寫好的插件,確實寫得很棒,向?qū)懖寮拇笈V戮?。在上面的陳述中都附有鏈接,希望對有需要的同學(xué)會有幫助,畢竟尋找更改還是很費功夫的。

備注:這是一個完整的項目,本人負(fù)責(zé)的是前端界面部分,后臺的業(yè)務(wù)邏輯,以及判題部分都很全,另外項目已經(jīng)上傳至github,歡迎大家fork和start。項目鏈接:https://github.com/shiyi1996/OJ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容