Java 課程設計:LWZ - Online Judge學生端(選題介紹)


團隊介紹

團隊名稱:PTA 是真滴牛!!!

組員 職務 負責模塊 博客連接
林智凱 組長 程序邏輯設計、用戶服務器、裁判機服務器、數據庫設計、部分客戶端代碼 裁判機部分
數據庫設計部分
鄭夢露 組員 學生客戶端與存儲介質交互 課程設計-個人博客
吳海波 組員 學生客戶端GUI GUI部分

項目介紹

功能簡介

本組的選題是 Online Judge (在線判題)系統,是一種在編程競賽中用來測試參賽程序的在線系統,也可以用於平時練習,例如我們熟悉的 PTA 系統就是優秀的 OJ 平台。本次課程設計主要完成 OJ 平台的學生客戶端,首先學生需要先登錄系統,然后加入班級。在已加入的班級里有老師分配好的題目集,學生可以挑選判斷題、選擇題、編程題和主觀題進行作答。學生完成題目並提交之后,本項目還提供了裁判機進行判題,可以對學生的答案進行批改(主觀題由老師在教師端批改),並且將批改結果匯總到存儲介質中。本程序還提供了站內短信系統,供學生和學生,學生和老師之間的私信,進一步優化體驗。值得提出的是,由於 OJ 平台本身的復雜性和時間、精力、人力所限,本次課程設計只是基本實現了 OJ 平台學生端的基本功能。
參考項目:無(自主設計研發)

功能架構圖

學生客戶端

裁判機服務器

登錄系統

站內短信系統

Gitee 倉庫

烏漆WhiteMoon / LWZ-Online Judge

前期調研

客戶端以PTA和課堂派為例,首先是登錄部分,至少應當包含登入注冊兩個界面。

課堂派登入后可以查看自己的班級

點擊進入班級后,課堂派可以選擇查看班級作業。而我們的系統則是應當顯示相對應班級的所有題集

查看題集時題集可分為結束和可開始,相對應的學生可以選擇查看已做未做題集。

選擇未做題集,進入題集后,分別選擇不同題型進行作答。

選擇題界面(可多題展示作答),應包含題干和選項。

判斷題界面(可多題展示作答),應包含題干和選項。

編程題界面(單題展示作答),應包含題干,測試樣例:測試輸入和測試輸出,以及作答窗口,同時提交之后裁判機馬上就可以出分。


主觀題界面(單題展示作答),應包含題干,和作答窗口。

模塊功能實現

裁判機服務器

詳情見博客:Java 課程設計:LWZ - Online Judge學生端(裁判機部分)

數據庫設計

詳情見博客:Java 課程設計:LWZ - Online Judge學生端(數據庫設計部分)

客戶端 GUI 部分

詳情見博客:JAVA課程設計:LWZ-Online Judge學生端(GUI部分)

客戶端數據庫操作

詳情見博客:課程設計-個人博客

登錄系統

詳情見博客:Java 程序設計——登錄系統

站內短信系統

詳情見博客:Java 程序設計——站內短信系統

運行效果

登錄界面。

主菜單。

班級選擇。

題目集選擇。

題目集菜單。

選擇題作答。

判斷題作答。

編程題作答並提交。

主觀題作答。

站內短信寫信部分。

站內短信查看收件箱、發件箱。

用戶設置界面。

課設總結

實現 Online Judge 的程序邏輯很復雜,對數據庫的依賴極大,我們一共使用了 11 張表才能支持 Online Judge 的基本功能。這次課設最大的難度在於理清思路,首先組長設計功能並思考實現方式就花了很多時間,並且還要把思路傳達給各個組員,所以我們組需要頻繁地開會,經常在騰訊會議待好幾個小時。原計划想開發學生端和老師端,但是由於學生端的工作量巨大,多次開會修改目標后選擇將精力集中在學生端的開發,最后終於可以支持基本的功能。但是由於 Online Judge 本身的復雜性,例如 PTA 是專業的項目組來研發的,只靠 3 人組完成難度太大。很多設想的功能例如程序沙箱、教師管理、管理員賬號管理的功能都可以單獨作為課設題,希望該程序可以有學弟或學妹繼續完善。由於該程序工作量太大,課設鞏固了全體組員的 Java 基礎和進階知識,大幅度加強了編碼能力,並且培養的集體榮譽感,本次課設寫了 81 個文件,git 提交了共 170 次,沒有默契的配合和全體組員的努力是完不成的。

未來展望

客戶端

  1. 由於這次課設只是實現了學生端,導致很多功能我們有所設想但是沒有時間和精力實現。例如老師出題和編輯題庫、老師創建班級並發放任務、老師查看同學成績並導出等功能,由於沒有教師端的實現這些功能還無法展示。
  2. 其次學生端我們也只是做到了基本還原,但是很多細節方面並沒有優化到極致。例如編程題顯示測試樣例、編程題判題后顯示測試點信息、學生查看作答過的試卷、用戶完全注銷(將所有該用戶的數據在所有表中刪除)等功能。這些功能無疑需要繼續投入更多的時間和精力,甚至是組成一個專門的項目組才能完成。更為理想的是,利用 WEB 編程技術完成這個選題,因為 WEB 編程的靈活性更強,也更方便用戶的使用。
  3. 圖形界面加入圖片、樣式等對現有界面進行美化經過分析,
  4. 未來考慮在圖形界面中加入圖片、音樂、樣式等對現有界面進行美化,並使用 css 代替 fxml 獲得得更加美觀且新穎的界面,同時使用 css 可以更好的實現對組件的控制。

服務器

  1. 由於沒有在學習寫課設,使得利用局域網進行調試變得困難,因此都是在一台機器上模仿網絡互聯。因此后續的想法是部署雲服務器,並且利用域名解析的方式放到網上,當然如果結合 WEB 編程會更好。
  2. 裁判機此次編寫在 Windows 系統上,但是 Linux 系統具有更優越的性能和安全性,更適合作為服務器。因此后續希望學習 Linux 系統配置服務器的技術,把程序部署在 Linux 系統上。
  3. 為了避免存儲用戶答卷的復雜性,本次程序設計並沒有存儲用戶選擇題和判斷題的作答,編程題也沒有實現按照測試點按點給分,這些都需要有更好的數據庫設計才能實現。因此希望學習數據庫的原理、設計技術,盡可能更優化地規划表,並且利用數據庫技術使得各個表之間可以借助數據庫本身的功能優化,在此基礎上設法讓數據庫運行效率更高。
  4. 編程題判題的沙箱實現,也就是說裁判機只能執行用戶的代碼,但是並不能阻止用戶代碼的行為。例如讀寫服務器文件、發起 Socket、修改系統屬性和變量、訪問系統內存甚至直接奪權,如果沒有沙箱對程序進行監控和阻止非法操作,則會對服務器造成嚴重的損害,滋生大量的安全問題。這方面就需要學習更多的網絡安全和軟硬件安全知識實現沙箱,不過現階段可以實現功能較為簡單的偽沙箱,也就是用“黑名單”機制對敏感的、惡意的代碼進行掃描。
  5. 目前裁判機僅支持 C 語言的判題,后續希望可以實現更多語言的判題。C++ 和 Java 這類可編譯的語言是比較簡單的,繼續用 CMD 執行即可,但是例如 Python 和 PHP 這類腳本語言不需要編譯,進行測試點注入就需要采用不同的策略。不過相比其他優化點,這個點主要是需要花時間做實驗來驗證,還不怎么需要學習某種技術。
  6. 注意到 PTA 平台可以獲取程序執行的內存占用情況和使用時間,但是在調研期間我並沒有找到合適的解法。目前的設想是想辦法利用 Java 提供的 API 訪問任務管理器之類管理進程的功能,獲取程序的執行時間和內存開銷。或者考慮用其他例如 Python 等更為靈活的語言或者 C 語言這類更底層的語言,編寫可以獲取這些信息的程序,然后再用 Java 進行調用。
  7. 代碼查重方面是最可惜的,因為我數據結構的課設對代碼查重問題有較為深刻的了解,也和當時的指導老師研究過查重算法的優化方式,但是這次課設的核心在 OJ 的實現而非查重,因此我只用了字符串結構處理算法進行查重。未來希望學習下用 Java 建多叉樹,使用我之前研究的基於最大公共子樹優化的代碼相似度檢測算法進行檢測,並且用自適應算法提供閾值參考。
  8. 這次數據庫連接池和日志框架應用得比較倉促,都只是停留在可以運行的層面上。對於數據庫連接池打算部署一些數據庫框架,例如 C3P0 連接池和 Druid 連接池提供更加安全而優化的連接池。對於日志框架的應用,打算詳細研究下 Log4j 框架,注意到該框架的配置文件有很多學問,希望能夠對這個框架深入了解。
  9. 對於一些異常情況沒有很好的抵抗機制,例如用戶提交的代碼雖然沒有安全問題,但是是個死循環,這樣就會導致服務器永遠等待程序執行完成。目前的設想是使用多線程技術,另一個線程監控執行 CMD 命令的線程進行監控,如果等待一段時間沒有停止就強行結束運行。或者是想辦法給執行 CMD 命令的程序設置參數,讓執行時間受限於設置的參數,或者是啟用沙箱來控制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM