1. 項目的完整設計方案
1.1 系統總體架構
本項目的設計,放棄了C/S系統,而是采用B/S系統,即瀏覽器/服務器系統。之所以采用B/S的體系結構,主要考慮到系統的方便性,用戶無需安裝客戶端即可使用該系統,這樣給本系統的用戶減少了很多不必要的麻煩,而且方便對系統進行更新維護。使用的框架主要是Mybatis+Spring+SpringMVC框架,即當今較為流行的SSM框架,SSM框架基於MVC模型。MVC模型的結構包括Model模型層,View視圖層,Controller控制層。在線答題平台的架構主要分為6個層次,包括前端UI、展示層、業務層、數據層、數據庫和運行環境,如下圖為系統的系統架構圖:
1.2 運行環境和技術選型說明
本系統搭建時選用時選用Java作為開發語言,采用SSM框架,前端我們暫定html+css+JavaScript開發,后續使用什么框架待定。同時,本項目的一個重難點是分布式獨立靶機的搭建,因為CTF中的web方向與PWN方向的答題環節需要搭建在在線環境中,每個用戶要去答題,則需要生成一個獨立的在線環境,各用戶之間的操作不會影響到別人的在線環境,用戶最終要從在線環境中抽絲剝繭找到最終的答案即flag,這就需要到了分布式獨立靶機,
本項目決定使用Docker技術進行分布式獨立靶機的搭建。如下圖所示,docker比傳統虛擬機更加輕便,傳統虛擬機啟動耗時為分鍾級別,而Docker容器啟動僅為秒級別,這極大的提高了用戶體驗。且每個容器相互隔離,每個容器都有自己的文件系統,容器之間進程不會相互影響,能夠給不同的用戶提供不同的環境,使得相互之間的操作互不干擾。Docker實現了“一次構建、隨處運行”,因此我們可以將用戶所需的靶機環境封裝進入一個鏡像,當發出靶機構建請求時,便會構建該鏡像的實例即容器,進而成功搭建靶機環境。
綜上,本項目各項技術與工具選擇如下:
-
-
- Java采用Jdk1.8版本
- 開發工具選擇IntelliJ IDEA 2020.3 x64
- 數據庫選擇使用mysql5.7版本
- 服務器暫選用阿里雲服務器,2G內存 1核 硬盤40G 的輕量應用服務器,公網IP為106.15.248.81:8000
- 服務器搭載鏡像版本為Ubuntu 20.04
- 采用Docker技術搭建分布式動態獨立靶機
-
因為本系統采用B/S系統,因此用戶通過web瀏覽器便可使用我們的系統。
1.3 用戶接口API
本系統采用B/S架構,系統提供給普通用戶的接口WEB API如下圖所示:
系統提供給管理員的接口WEB API如下圖所示:
2. 概念原型的不同視圖
2.1 依賴視圖
本系統采用MVC框架,下圖展現了軟件模塊之間的依賴關系與MVC模型的邏輯流。
2.2 執行視圖(流程圖展示)
2.2.1 用戶登錄注冊流程圖
2.2.2 用戶答題流程圖(左)與積分兌換流程圖(右)
2.2.3 加入戰隊流程圖(左)與組隊比賽流程圖(右)
2.3 部署視圖
-
-
- 項目部署於阿里雲服務器上,用戶可通過web瀏覽器(google,firefox等)訪問本項目的公網IP:106.15.248.81:8000。在阿里雲服務器80端口上部署apache2服務。
- 在阿里雲服務器8000端口上進行Docker環境的搭建,用戶可通過向8000端口發出靶機搭建請求,Docker會自動搭建獨立式分布靶機環境。
- 同時服務器與本地數據庫進行連接,將網站與用戶相關數據存入本地數據庫。
-
2.4 工作分配視圖
3. 項目的數據庫設計
3.1.數據庫的概念數據模型(E-R圖)
3.2.數據庫的物理數據模型(僅給出關鍵數據庫設計)
用戶信息(user)表
屬性名 |
類型 |
是否可為空 |
描述 |
user_id |
integer |
N |
用戶編號 |
username |
varchar |
N |
用戶名 |
nickname |
varchar |
N |
昵稱 |
password |
varchar |
N |
密碼 |
sex |
varchar |
Y |
性別 |
|
varchar |
Y |
郵箱 |
telephone |
varchar |
Y |
手機號 |
school |
varchar |
Y |
學校 |
introduction |
varchar |
Y |
個人簡介 |
user_points |
integer |
N |
用戶積分 |
solved_problems |
integer |
N |
解題數 |
user_images |
varchar |
N |
用戶頭像 |
team_id |
integer |
Y |
隊伍編號 |
題目(problem)表
屬性名 |
類型 |
是否可為空 |
描述 |
problem_id |
integer |
N |
題目編號 |
problem_titile |
varchar |
N |
題目標題 |
difficulty |
integer |
N |
難度系數 |
problem_description |
varchar |
N |
題目描述 |
problem_scene |
varchar |
Y |
題目場景 |
problem_appendix |
varchar |
Y |
題目附件 |
problem_answer |
varchar |
N |
題目答案 |
problem_points |
varchar |
N |
題目積分 |
problem_type_id |
integer |
N |
題目類型編號 |
problem_area |
varchar |
N |
題目區域類型 |
用戶答案(user_answer)表
屬性名 |
類型 |
是否可為空 |
描述 |
answer_id |
integer |
N |
用戶答案編號 |
user_id |
integer |
N |
用戶編號 |
problem_id |
integer |
N |
題目編號 |
answer_content |
varchar |
N |
答案內容 |
answer_time |
time |
N |
解題時間 |
競賽(contest)表
屬性名 |
類型 |
是否可為空 |
描述 |
contest_id |
integer |
N |
競賽編號 |
contest_title |
varchar |
N |
競賽主題 |
sponsor |
varvhar |
N |
主辦方 |
start_time |
time |
N |
競賽開始時間 |
end_time |
time |
N |
競賽結束時間 |
contest_introduction |
varchar |
Y |
競賽介紹 |
team_nums |
integer |
N |
參賽隊伍數 |
隊伍(team)表
屬性名 |
類型 |
是否可為空 |
描述 |
team_id |
integer |
N |
隊伍編號 |
team_name |
varchar |
N |
戰隊名稱 |
leader_id |
integer |
N |
隊長id |
team_nums |
integer |
N |
戰隊人數 |
team_points |
integer |
N |
戰隊積分 |
team_create_time |
time |
N |
戰隊創建時間 |
商城商品(goods)表
屬性名 |
類型 |
是否可為空 |
描述 |
goods_id |
integer |
N |
商品編號 |
goods_name |
varchar |
N |
商品名 |
goods_points |
integer |
N |
商品所需積分 |
goods_stock |
integer |
N |
商品庫存 |
goods_offer |
varchar |
N |
商品提供方 |
題解(explanation)表
屬性名 |
類型 |
是否可為空 |
描述 |
explanation_id |
integer |
N |
題解編號 |
explanation_content |
varchar |
N |
題解內容 |
problems_id |
integer |
N |
題目編號 |
user_id |
integer |
N |
發布者編號 |
explanation_time |
varchar |
N |
發布時間 |
4.項目的實現視圖
項目源代碼的目錄文件結構如下圖所示:
項目名稱為ctfplatform,main目錄向下細分為如下幾個目錄:
java.cn.ctf(存放后端代碼)
-
-
- controller:存放控制層代碼,控制器與前端進行交互,進行請求參數的響應與處理。
- dao:存放持久層代碼,與數據庫進行交互。
- domain:存放實體類的代碼。
- service:用於處理業務邏輯。
- test:測試代碼。
- utils:存放一些工具類與算法類的實現代碼。
-
webapp(存放前端代碼)
-
-
- css:存放css樣式文件。
- images:存放需要的image等圖片文件。
- js:存放JavaScript代碼。
- pages:存放頁面html文件。
- web.xml:進行前端與后端的交互。
-
resources(存放配置文件)
External Libraries目錄:存放依賴包。
5. 系統概念原型的核心工作機制
普通用戶:
- 普通用戶可以注冊賬號,注冊成功后進行登錄
- 用戶可以查看題庫的題目,根據興趣選擇某個題目進行答題,輸入最終的結果查看正確與否。
- 用戶可以進一步的查看該題目的相關題解或者在題目下方評論區發表自己的意見。若用戶有更好的題解,用戶可以發布自己的題解。
- 若用戶欣賞某個題目或者題解,可以進行收藏與點贊。
- 用戶回答對了題目可以獲得題目對應的積分,用戶可以去商城中利用積分兌換商品。
- 用戶可以查看自己的收藏列表,查看自己收藏的題目。
- 用戶還有自己的個人中心,其中可以查看答題記錄,已答的題目數目,個人積分等。
- 用戶也可以上傳題目,管理員審核通過后,便可以上線題目。
- 另外本平台提供Rank榜單,根據答題數目與積分進行排序,用戶可以查看排行榜。
管理員:
- 管理員用戶主要對一些東西進行審核,管理員可以進行題目的管理,進行增刪改查。
- 對題解進行管理,發布正確的題解。
- 審核評論區,刪除不正當發言。
- 管理員也可以發布公告,告知一些重要的事情。
- 商品若有更新,管理員也可以對商城進行更新。
- 管理員也可查看注冊用戶信息。