胡秀梅 章宇琦 吳迪 吳海峰
【摘 要】本文基于spring+ struts2+ Hibernate框架,設(shè)計(jì)實(shí)現(xiàn)了一套用于高??荚嚨呐抛到y(tǒng),以替代目前考試過(guò)程中的人工排座。該系統(tǒng)具有自動(dòng)、快速、穩(wěn)定的特點(diǎn),既避免了當(dāng)前人工排座過(guò)程中由人工操作失誤而引起的各類問(wèn)題,又大大減輕了教務(wù)工作者的工作量,提高了高校信息化水平。
【關(guān)鍵詞】Java Web;考試;排座
中圖分類號(hào): TP391.13 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 2095-2457(2018)12-0120-003
DOI:10.19694/j.cnki.issn2095-2457.2018.12.052
0 引言
考試是高校教學(xué)過(guò)程中不可或缺的一環(huán),每學(xué)期末在考試前教務(wù)工作人員都要結(jié)合當(dāng)前班級(jí)、科目、教室使用情況進(jìn)行考試座位的編排。以筆者所在學(xué)校為例,全校有超過(guò)200個(gè)班級(jí),按每個(gè)班級(jí)考10門課程計(jì)算,需要安排的場(chǎng)次就超過(guò)2000次。由此可見(jiàn)該項(xiàng)工作需要耗費(fèi)大量的人力和時(shí)間。
目前有一些學(xué)者對(duì)考試的自動(dòng)排座展開(kāi)了研究。婁清[1]利用VBA在Excel中開(kāi)發(fā)了普通高中的考試排座系統(tǒng),給出了詳細(xì)的模塊設(shè)計(jì)和代碼參考;李正慧[2]簡(jiǎn)要的從排課系統(tǒng)數(shù)據(jù)庫(kù)中關(guān)鍵性數(shù)據(jù)表的設(shè)計(jì)和排課界面功能的實(shí)現(xiàn)等方面介紹了整個(gè)排課數(shù)據(jù)庫(kù)的設(shè)計(jì)思路;周玉芬[3]等針對(duì)高??荚嚨奶攸c(diǎn),用VC++編寫了一個(gè)考場(chǎng)隨機(jī)排座系統(tǒng),實(shí)現(xiàn)了考場(chǎng)人員座次的隨機(jī)排序、顯示和打印等功能;徐欣[4]等利用Microsoft Visual FoxPro6.0開(kāi)發(fā)了一套考試隨機(jī)排位系統(tǒng),實(shí)現(xiàn)了考場(chǎng)的分配、學(xué)生座位的隨機(jī)排座、考試時(shí)間、場(chǎng)次安排、打印考試座位表等功能,并進(jìn)行了測(cè)試和應(yīng)用。
由以上調(diào)研可以看出,考試的排座問(wèn)題是每個(gè)學(xué)校都面臨的重要問(wèn)題,如何使其自動(dòng)化實(shí)現(xiàn)已經(jīng)得到了學(xué)者們的關(guān)注,并產(chǎn)生了一些相關(guān)研究成果。然而當(dāng)前對(duì)排座系統(tǒng)的研究和應(yīng)用還不夠深入和全面,沒(méi)有與高??荚嚢才澎`活性高、變化性大的特點(diǎn)相結(jié)合,研發(fā)的系統(tǒng)也主要以本地測(cè)試或者普通桌面軟件為主,無(wú)法適用于多人集中辦公的場(chǎng)景。
針對(duì)這個(gè)現(xiàn)狀,我們利用目前主流的Spring+Struts2+Hibernate三層框架技術(shù),采取面向?qū)ο蟮乃枷耄Y(jié)合MVC模式實(shí)現(xiàn)了一套適用于高??荚嚨淖詣?dòng)排座系統(tǒng)。
1 關(guān)鍵技術(shù)
1.1 MySQL數(shù)據(jù)庫(kù)
MySQL是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的 SQL 語(yǔ)言是用于訪問(wèn)數(shù)據(jù)庫(kù)的最常用標(biāo)準(zhǔn)化語(yǔ)言。
1.2 三層框架
Spring框架
Spring是一個(gè)輕量級(jí)控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。Spring框架是由于軟件開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開(kāi)發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合性角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。
Struts2框架
Struts2是一個(gè)基于MVC設(shè)計(jì)模式的Web應(yīng)用框架,它本質(zhì)上相當(dāng)于一個(gè)servlet,在MVC設(shè)計(jì)模式中,Struts2作為控制器(Controller)來(lái)建立模型與視圖的數(shù)據(jù)交互。Struts 2以WebWork為核心,采用攔截器的機(jī)制來(lái)處理用戶的請(qǐng)求,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開(kāi),所以Struts 2可以理解為WebWork的更新產(chǎn)品。
Hibernate框架
Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架,hibernate可以自動(dòng)生成SQL語(yǔ)句,自動(dòng)執(zhí)行。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用。
2 設(shè)計(jì)與實(shí)現(xiàn)
本系統(tǒng)分為三大模塊,即超級(jí)管理員、教務(wù)處和輔導(dǎo)員。超級(jí)管理員管理學(xué)院表、班級(jí)表、課程表、教室詳情表、用戶表。對(duì)這些表中的數(shù)據(jù)具有增加、修改、刪除、查看的權(quán)限。這些表都是屬于學(xué)校固定信息。同時(shí)還有對(duì)教務(wù)處、輔導(dǎo)員的權(quán)限的配置功能。教務(wù)處管理時(shí)間表、考試安排表。主要功能為對(duì)考試時(shí)間的安排,對(duì)全校班級(jí)對(duì)應(yīng)課程考試安排的增、刪、改、查。輔導(dǎo)員可以查看考試安排表,安排考試排座。
整個(gè)系統(tǒng)結(jié)構(gòu)如圖1 所示。
2.1 數(shù)據(jù)庫(kù)表的設(shè)計(jì)
如圖2為系統(tǒng)的數(shù)據(jù)庫(kù)表設(shè)計(jì)結(jié)構(gòu)圖。每一個(gè)方塊為一個(gè)表結(jié)構(gòu),方塊上面一層為表名,下面為表的字段。表與表之間的連線代表表之間的關(guān)系。
表關(guān)系介紹:
(1)學(xué)院表關(guān)聯(lián)班級(jí)表,有了學(xué)院才會(huì)有班級(jí),為一對(duì)多的關(guān)系;
(2)考試信息表關(guān)聯(lián)班級(jí)表、考試時(shí)間地點(diǎn)表、課程表,而考試時(shí)間地點(diǎn)表是課程和班級(jí)表聯(lián)合主鍵生成,所以班級(jí)與課程是這兩者表的主要部分,構(gòu)成上面的四角關(guān)系;
(3)班級(jí)課程表則是課程表與班級(jí)表映射出來(lái)的一張表,因?yàn)閮烧邽槎鄬?duì)多的關(guān)系;
(4)用戶表是一張單獨(dú)的表;
(5)考試時(shí)間地點(diǎn)表則從教室表獲取教室信息。
表主要字段介紹:
(1)教室詳情表中的座位詳情:(n1*m1+n2*m2+n3*m3),其中n代表有幾排,m表示每排有幾個(gè)座位,其中m =k1+k2+k3,代表每隔k個(gè)有一個(gè)過(guò)道;
(2)用戶表中的標(biāo)志位:1代表超級(jí)管理員,2代表教務(wù)處,3代表輔導(dǎo)員;
(3)排座表的設(shè)計(jì):學(xué)院、班級(jí)、課程、教室、人數(shù)、座次表。座次表在數(shù)據(jù)庫(kù)中以字符串的形式顯示,字符串中的書寫以鍵值對(duì)的形式書寫。例如:“01=學(xué)生A ,02=學(xué)生B…”。
(2)排座算法
智能排座算法是該系統(tǒng)的核心,該算法利用后端的動(dòng)態(tài)數(shù)據(jù),排出最優(yōu)化的座位方案,算法包含沖突檢測(cè)功能。算法流程如圖3所示。
上述算法思路清晰,結(jié)構(gòu)較為簡(jiǎn)單,實(shí)現(xiàn)起來(lái)比較容易,其大致流程為:
第一步,系統(tǒng)讀取后端數(shù)據(jù)庫(kù)的考試計(jì)劃、教室信息、班級(jí)信息和課程信息,并將這些數(shù)據(jù)加載到內(nèi)存;
第二步,將考試計(jì)劃按照班級(jí)人數(shù)從小到大順序排列,教室容納人數(shù)按照從小到大順序排列,先安排人數(shù)少的班級(jí),再安排人數(shù)多的班級(jí)。
第三步,遍歷考試計(jì)劃中的每一項(xiàng),找到合理的教室,記錄并鎖定該時(shí)間段的對(duì)應(yīng)教室使用,防止出現(xiàn)一教室多用。
第四步,將排好的每一項(xiàng)考試座次表寫入到Excel文件并存儲(chǔ),供后期各學(xué)院打印下載。
(3)主要代碼
系統(tǒng)的核心代碼及相關(guān)注釋如下所示。
//班級(jí)的dao 層
StudentClassDao dao;
public void setDao(StudentClassDao dao) {
this.dao = dao;
}
//教室的dao 層
ClassroomDao dao;
public void setDao(ClassroomDao dao) {
this.dao = dao;
}
//排座功能的實(shí)現(xiàn),兩個(gè)參數(shù),一個(gè)是班級(jí)對(duì)象,一個(gè)是教室對(duì)象
public void arraySets(StudentClass studentC,Classroom classroom){
//查詢數(shù)據(jù)庫(kù),獲取班級(jí)人數(shù)
StudentClass studentC2=dao.queryStudentClassById(studentC.id);
Integer studentClassNum=studentC2.getNum();
//查詢數(shù)據(jù)庫(kù),獲取教室容量
Classroom classroom2=dao.queryClassroomById(classroom.id);
Integer roomNum=classroom2.getNum();
//定義一個(gè)數(shù)組,數(shù)組的長(zhǎng)度為班級(jí)人數(shù),此數(shù)組作為班級(jí)學(xué)生,進(jìn)行編號(hào)
int sR[]=new int[studentClassNum];
for (int i = 0; i < sR.length; i++) {
sR[i]=i+1;
}
//定義一個(gè)數(shù)組,數(shù)組的長(zhǎng)度為教室容量,此數(shù)組做為教室座位號(hào),進(jìn)行編號(hào)
int cR[] = new int[roomNum];
for (int i = 0; i < cR.length; i++) {
cR[i]=i+1;
}
Random random = new Random();
//定義一個(gè)字符串?dāng)?shù)組,用來(lái)存放教室與學(xué)生的對(duì)應(yīng)關(guān)系,長(zhǎng)度為學(xué)生數(shù)量
String[] classToStu=new String[studentClassNum];
//遍歷教室
for (int i = 0,j=0; i < sR.length && j //產(chǎn)生一個(gè)隨機(jī)編號(hào),編號(hào)不大于學(xué)生最大編號(hào) int z = random.nextInt(studentClassNum); for (int k = 0; k < sR.length; k++) { if(z==sR[k]){ classToStu[j]=i+":"+z; sR[k]=0; }else{ //是參數(shù)回歸,也就是重新這一次操作 i=i-2; j=j-1; //跳出for循環(huán) break; }}}} 3 結(jié)果測(cè)試 經(jīng)過(guò)測(cè)試,系統(tǒng)可以正常運(yùn)行,部分測(cè)試頁(yè)面截圖如下。 4 結(jié)語(yǔ) 本系統(tǒng)是根據(jù)高校教務(wù)管理人員的需求,結(jié)合高校學(xué)生信息管理的特點(diǎn)開(kāi)發(fā)的,整個(gè)系統(tǒng)具有良好的實(shí)用性和可擴(kuò)充性,已經(jīng)考試應(yīng)用于考試安排中,能滿足院系環(huán)境下的考試管理需求。后續(xù)研究將從界面的美觀性、功能的完整性等方面加以改進(jìn),提高系統(tǒng)易用性和普適性,更好的服務(wù)于高校信息化工作。 圖4 系統(tǒng)主界面 圖5 座次表 【參考文獻(xiàn)】 [1]婁青.利用VBA在Excel中開(kāi)發(fā)普通高中考試排座系[J].中國(guó)教育信息化,2012. [2]李正慧.排課系統(tǒng)數(shù)據(jù)表的設(shè)計(jì)與功能的實(shí)現(xiàn)[J].數(shù)字技術(shù)與應(yīng)用,2011. [3]周玉芬,杜猛,宋明慧.使用VC++開(kāi)發(fā)考場(chǎng)隨機(jī)排座系統(tǒng)[J].電腦編程技巧與維護(hù),2008. [4]徐欣,陸陽(yáng),金紅.考試排位系統(tǒng)[J].電子科技大學(xué)學(xué)報(bào), 2003.