hustoj 是個GPL開源的OJ,其提供了docker形式的安裝方式。php
爲執行方便,選擇使用aliyun提供的docker鏡像來加速安裝。css
docker pull registry.cn-shanghai.aliyuncs.com/shiningrise/hustoj
docker run -d -it --name hustoj -p 9900:80 --privileged registry.cn-shanghai.aliyuncs.com/shiningrise/hustoj:latest
9900 是物理機針對docker image 80端口的映射。html
訪問本機以下地址便可開始使用 hustoj前端
http://127.0.0.1:9900
python
https://github.com/zhblue/freeproblemset/
提供了免費的題庫下載,若是以爲不夠用,
還能夠去 http://tk.hustoj.com/ 做者提供的付費網站下載更多。mysql
docker由於每次啓動都是全新,爲持久化,能夠掛載一個本地目錄給docker image。git
標準執行方式 docker run -d -it \ -v /data/docker/docker-wxy/data:/data \ --privileged \ --name hustoj \ -p 80:80 shiningrise/hustoj:latest docker測試安裝 docker run -d -it --name hustoj -p 80:80 --privileged shiningrise/hustoj:latest 僅安裝C++版本 docker run -d -it --name hustoj -p 80:80 --privileged shiningrise/hustoj:cpp
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f111112222333 registry.cn-shanghai.aliyuncs.com/shiningrise/hustoj:latest "/usr/local/bin/dock…" About an hour ago Up About an hour 0.0.0.0:9900->80/tcp hustoj docker exec -it f111112222333 bash ## f111112222333 是當前docker 映像執行的實例id
進去以後能夠經過 mysql 執行數據庫操做等。github
https://blog.csdn.net/yybird_/article/details/46050023golang
python默認即支持,但,有一些詭異的小地方。web
默認執行py是使用py3
須要在開頭註釋寫個 # python2
才行
主要judge_client會讀取源碼,經過以下語句判斷py是何種版本:
void run_solution(int & lang, char * work_dir, int & time_lmt, int & usedtime, int & mem_lmt) { nice(19); int py2=execute_cmd("/bin/grep 'python2' Main.py"); // now the user is "judger" chdir(work_dir); .... if(!py2){ execl("/python2", "/python2", "Main.py", (char *) NULL); }else{ execl("/python3", "/python3", "Main.py", (char *) NULL); }
To be done
hustoj 的模塊拆分很清晰:
爲方便理解源碼,也方便本身使用搭建的oj,引入一個小任務,去除晃眼的公告。
看到公告,第一反應是,先用chrome開發工具臺找到飄來飄去的元素ID。它叫 <marquee>
。
搜下源碼,看到在 contest-header.php
裏面有涉及。
直接注掉 $view_marquee_msg
相關部分。
<?php // php-comment // $view_marquee_msg=file_get_contents($OJ_SAE?"saestor://web/msg.txt":"./admin/msg.txt"); ?> <!-- html <div id=broadcast> <marquee id=broadcast scrollamount=1 direction=up scrolldelay=250 onMouseOver='this.stop()' onMouseOut='this.start()';> <?php echo $view_marquee_msg?> </marquee> </div> -->
點擊頁面,依然沒搞定。
再找,發現 template/bs3/js.php
裏面纔是真正生成消息元素的部分。
<?php if(file_exists("./admin/msg.txt")) $view_marquee_msg=file_get_contents($OJ_SAE?"saestor://web/msg.txt":"./admin/msg.txt"); if(file_exists("../admin/msg.txt")) $view_marquee_msg=file_get_contents($OJ_SAE?"saestor://web/msg.txt":"../admin/msg.txt"); ?> <script> $(document).ready(function(){ var msg="<marquee style='margin-top:10px' id=broadcast direction='up' scrollamount=3 scrolldelay=50 onMouseOver='this.stop()'"+ " onMouseOut='this.start()' class=toprow>"+<?php echo json_encode($view_marquee_msg); ?>+"</marquee>"; $(".jumbotron").prepend(msg); $("form").append("<div id='csrf' />"); $("#csrf").load("<?php echo $path_fix?>csrf.php"); $("body").append("<div id=footer class=center >GPLv2 licensed by <a href='https://github.com/zhblue/hustoj' >HUSTOJ</a> "+(new Date()).getFullYear()+" </div>"); $("body").append("<div class=center > <img src='http://hustoj.com/wx.jpg' width='96px'><img src='http://hustoj.com/alipay.png' width='96px'><br> 歡迎關注微信公衆號onlinejudge</div>"); }); ///// .... 省略 </script>
將上面的php和js都給注掉,搞定。
php 部分爲方便理解,大概能夠拆分以下2個模塊:
爲方便自定義,同時穿插了一套簡單的主題模塊。
即,全部的css、js等前端相關,都使用了以下幾個模板來嵌套。
而php則經過主要的配置文件 include/db_info.inc.php
來指導工做。