倪紅軍,李 豪,朱 瑤
(南京師范大學(xué)泰州學(xué)院,江蘇 泰州 225300)
隨著應(yīng)用型人才培養(yǎng)的需要,應(yīng)用型本科大學(xué)的實(shí)踐課占比越來越高,從而為實(shí)驗(yàn)室的管理也帶來了一些問題,其中實(shí)驗(yàn)室的安全教育問題尤為突出。目前大多數(shù)高校的實(shí)驗(yàn)室安全教育和考試平臺采用傳統(tǒng)的PC端Web網(wǎng)站,但是隨著移動互聯(lián)網(wǎng)技術(shù)的發(fā)展,傳統(tǒng)的PC端Web網(wǎng)站需要向移動終端遷移。雖然傳統(tǒng)的Web網(wǎng)站能夠在移動終端的瀏覽器上打開,但是也存在兩個方面的缺陷:
(1)由于屏幕尺寸、設(shè)計(jì)風(fēng)格、網(wǎng)頁內(nèi)容展現(xiàn)等兼容性的問題,使移動終端用戶體驗(yàn)不佳;
(2)實(shí)驗(yàn)室安全教育和考試必須在在線狀態(tài)下才能進(jìn)入系統(tǒng)完成,學(xué)生集中在線容易造成系統(tǒng)過載,受時間和空間的限制[1-4]。
針對目前基于Web平臺的實(shí)驗(yàn)室安全教育考試系統(tǒng)的缺陷,設(shè)計(jì)開發(fā)一個基于移動終端的實(shí)驗(yàn)室安全教育考試系統(tǒng)具有重要的理論意義和應(yīng)用價值。
實(shí)驗(yàn)室安全教育考試系統(tǒng)包括4個功能模塊,即登錄模塊、學(xué)習(xí)模塊、考試模塊和回看模塊。
(1)登錄模塊:學(xué)生輸入學(xué)號、密碼并從學(xué)習(xí)模式、測試模式或回看模式中選擇一種操作模式后,系統(tǒng)會根據(jù)學(xué)號判斷學(xué)生的專業(yè)類別,然后從題庫中選擇符合學(xué)生專業(yè)類別的實(shí)驗(yàn)室安全教育考試題庫。
(2)學(xué)習(xí)模塊:顯示對應(yīng)專業(yè)題庫中的題目和標(biāo)準(zhǔn)答案,以便學(xué)生在這個模塊中學(xué)習(xí)與本專業(yè)相關(guān)的實(shí)驗(yàn)室安全知識。
(3)考試模塊:從對應(yīng)專業(yè)的題庫中隨機(jī)抽取50道題(其中35道判斷題、15道選擇題)組成實(shí)驗(yàn)室安全考試試卷,學(xué)生在30分鐘內(nèi)完成后可即時判斷正誤,并保存考試時間、考生答案和考試成績。每一位學(xué)生可以考3次,以最高分為最終成績上傳校園網(wǎng)服務(wù)器。
(4)回看模塊:學(xué)生可以查看每次考試試卷的試題、考生答案和標(biāo)準(zhǔn)答案,以便學(xué)生對做錯的題目反復(fù)學(xué)習(xí),從而更好地掌握實(shí)驗(yàn)室安全知識。
不同學(xué)科或?qū)I(yè)的實(shí)驗(yàn)室對實(shí)驗(yàn)室安全教育和考核的內(nèi)容一般不可能完全相同,所以在設(shè)計(jì)安全知識題庫時,要根據(jù)學(xué)校的實(shí)際情況進(jìn)行分類[5-8]。以南京師范大學(xué)泰州學(xué)院實(shí)驗(yàn)室安全教育考試內(nèi)容為例,全校的實(shí)驗(yàn)室安全教育內(nèi)容可以分為4類,即面向公共計(jì)算機(jī)實(shí)驗(yàn)室、文科類實(shí)驗(yàn)室、經(jīng)管類實(shí)驗(yàn)室和音體美藝術(shù)類實(shí)驗(yàn)室的通識類安全知識,面向電子信息類實(shí)驗(yàn)室的電子信息類安全知識,面向電力能源類實(shí)驗(yàn)室的電力能源類安全知識,面向化學(xué)生物工程類實(shí)驗(yàn)室的化生類安全知識。通識類安全知識題庫內(nèi)容主要涉及防火防盜安全、用電用水安全等常規(guī)安全管理,由資產(chǎn)與實(shí)驗(yàn)室管理處負(fù)責(zé);電子信息類、電力能源類和化學(xué)生物類安全知識涉及內(nèi)容具有較強(qiáng)的專業(yè)性,題庫分別由信息工程學(xué)院、電力學(xué)院和化學(xué)與生物工程學(xué)院負(fù)責(zé)。
目前,使用最多的移動終端采用的是Google公司的Android平臺,下面以Android平臺為例介紹移動終端的實(shí)驗(yàn)室安全教育考試系統(tǒng)的實(shí)現(xiàn)過程。
該系統(tǒng)采用了Android系統(tǒng)為開發(fā)者提供的一個輕量級數(shù)據(jù)庫——SQLite。由于SQLite是進(jìn)程內(nèi)的數(shù)據(jù)庫引擎,因此不存在數(shù)據(jù)庫的客戶端和服務(wù)器端。使用時一般只需要附帶上它的一個動態(tài)庫,就可以使用它的全部功能,而且其運(yùn)算速度快、占用資源少,很適合在移動終端設(shè)備上使用[9-10]。SQLite采用動態(tài)數(shù)據(jù)類型,使用時會根據(jù)存入的具體值自動判斷其數(shù)據(jù)類型,通常包含NULL、INTEGER(整數(shù))、REAL(浮點(diǎn)數(shù))、TEXT(字符串文本)和BLOB(二進(jìn)制對象)五種數(shù)據(jù)類型。
2.1.1 數(shù)據(jù)庫設(shè)計(jì)
SQLite通過文件來保存數(shù)據(jù)庫,一個文件就是一個數(shù)據(jù)庫,一個數(shù)據(jù)庫可以包含多個表。為了便于維護(hù)和管理數(shù)據(jù)庫文件,應(yīng)用程序的數(shù)據(jù)庫文件通常保存在移動終端設(shè)備的外部存儲器上。當(dāng)?shù)谝淮芜\(yùn)行考試系統(tǒng)時會自動連接網(wǎng)絡(luò)下載數(shù)據(jù)庫文件并保存到外部存儲器的指定位置[11-13]。該系統(tǒng)的數(shù)據(jù)庫school.db包含學(xué)生信息表stud(表結(jié)構(gòu)如表1所示)和題庫表tiku(表結(jié)構(gòu)如表2所示)。
表2 題庫信息表(tiku)結(jié)構(gòu)
2.1.2 數(shù)據(jù)庫連接
Android系統(tǒng)提供了創(chuàng)建和使用SQLite數(shù)據(jù)庫的API,這些API被封裝在SQLiteDatabase類中,該類中提供了數(shù)據(jù)庫操作的常用方法。下面的代碼表示打開移動終端設(shè)備外部存儲器中DB文件夾中的school.db數(shù)據(jù)庫文件,數(shù)據(jù)庫打開后,就可以使用SQLiteDatabase類中增、刪、改、查等方法對數(shù)據(jù)庫文件進(jìn)行操作。
String sdpath=Environment.getExternalStorageDirectory().toString();
String filename=sdpath+File.separator+"DB"+File.separator+"school.db";
SQLiteDatabase sqLiteDatabase=SQLiteDatabase.openOrCreateDatabase(filename,null);
登錄模塊的界面如圖1所示。界面采用RelativeLayout布局方式,在布局文件的最上部和最下部都使用了ImageView組件顯示圖片,中間使用了2個EditText組件分別用于輸入學(xué)生的學(xué)號和密碼,使用了1個Spinner組件用于選擇操作模式,使用了2個Button組件用于登錄和退出。
圖1 登錄界面
當(dāng)?shù)卿浗缑孢\(yùn)行后就應(yīng)該加載Spinner組件中的內(nèi)容(學(xué)習(xí)模式、考試模式和回看模式),并實(shí)現(xiàn)單擊選擇登錄模式事件,即在登錄模塊的Activity中用如下代碼實(shí)現(xiàn):
private SpinnerspinnerMode;
private String[] modes=new String[]{“學(xué)習(xí)模式”,“考試模式”,“回看模式”};
privateint modeId=0;//0-學(xué)習(xí)模式,1-考試模式,2-回看模式
ArrayAdapter
spinnerMode.setAdapter(modeArray);
spinnerMode.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public voidonItemSelected(AdapterView> parent,View view,int position,long id) {
modeId=position;//操作模式
}
});
當(dāng)單擊“登錄”按鈕后,首先對輸入的學(xué)號和密碼進(jìn)行正確性判斷,同時根據(jù)學(xué)號檢索出該學(xué)生的所屬院系。如果輸入的學(xué)號和密碼正確,就根據(jù)選擇的登錄模式啟動相應(yīng)Activity,并將學(xué)號和所屬院系通過Intent傳遞給對應(yīng)的Activity,以便對應(yīng)Activity啟動時加載對應(yīng)類別的題庫?!暗卿洝卑粹o的單擊監(jiān)聽事件關(guān)鍵代碼如下:
Cursor cursor=sqLiteDatabase.query(“stud”,new String[]{“stunumber”,“stupwd”,“studep”},“stunumber=? and stupwd=?”,new String[]{username, usepwd},null,null,null);
if(cursor.getCount()>0) {//用戶名和密碼正確
Intent intent=new Intent();
switch (modeId) {
case 0://學(xué)習(xí)模式
intent=new Intent(MainActivity.this, StudyActivity.class);
……;//將學(xué)號、所屬院系通過intent傳遞給學(xué)習(xí)模式Activity
MainActivity.this.startActivity(intent);
break;
case 1://考試模式
……
case2://回看模式
……
}else {//用戶名或密碼不正確
……//給出錯誤提示信息
}
考試模式界面如圖2所示。
圖2 考試模塊界面
進(jìn)入考試模式后屏幕的顯示模式設(shè)置為橫屏顯示效果,即修改配置文件AndroidManifest.xml,代碼如下:
2.3.1 組 卷
考試模式啟動時就需要打開數(shù)據(jù)庫文件,同時根據(jù)登錄模塊傳遞來的所屬院系(studep)從題庫表(tiku)中查詢出所有符合條件的判斷題和選擇題,并保存到對應(yīng)的Cursor中;然后從對應(yīng)的Cursor中分別篩選出35道判斷題和15道選擇題的試題編號保存的ArrayList中組成該學(xué)生的考試試卷,其關(guān)鍵代碼如下:
jcursor=sqLiteDatabase.query("tiku",new String[]{“tino”,“ticontent”,“titype”,“ti1”,“ti2”,“ti3”,“ti4”,“tianswer”,“ticlassid”},“titype=? and ticlassid=?”,new String[]{‘0’,studep},null,null,null);//判斷題
for (int i=0;i<35;i++) {//生成35道判斷題
int index=(int) (0+Math.random()*cursor.getCount());
while (indexAL.contains(index)) {//取不重復(fù)的試題編號
index=(int) (0+Math.random()* cursor.getCount());
}
indexAL.add(index);//試題編號
answerAL.add(“”);//存放標(biāo)準(zhǔn)答案
userAL.add(“”);//存放考生答案
}
……//15道單選題實(shí)現(xiàn)代碼類似
2.3.2 顯示題目
由于做完一道題后可能會繼續(xù)顯示下一道題目,也可能會向前翻看做過的題目,所以該系統(tǒng)在實(shí)現(xiàn)題目顯示功能時定義了一個showTimu(Cursor cursor,int index)方法,根據(jù)傳遞的題型和索引號顯示題目內(nèi)容和選項(xiàng)。其關(guān)鍵代碼如下:
voidshowTimu(Cursor cursor,int index) {
cursor.moveToPosition(index);
tvTimut.setText((showIndex+1)+“、”+cursor.getString(1)); //題目內(nèi)容
tv1t.setText(“A.”+cursor.getString(3)); //選項(xiàng)A
……//選項(xiàng)B、C、D實(shí)現(xiàn)代碼類似
Stringtvanswer=cursor.getString(7); //答案
answerAL.set(showIndex,tvanswer);//將標(biāo)準(zhǔn)答案添加到answerAL的showIndex位置
}
當(dāng)考生單擊圖2中所示的A、B等選項(xiàng)時會調(diào)用showTimu()方法顯示下一道題相關(guān)內(nèi)容,并將當(dāng)前單擊的選項(xiàng)保存到存放考生答案的ArrayList(userAL)中;當(dāng)考生單擊“重做前一題”按鈕時會調(diào)用showTimu()方法顯示前面一道題相關(guān)內(nèi)容。
2.3.3 試卷評分
考試時間一到或者單擊“提交試卷”按鈕后,考試界面上的試題選項(xiàng)全部禁用,并將學(xué)生作答的答案與試卷的標(biāo)準(zhǔn)答案逐一比對。如果答案相同,則計(jì)2分,并保存學(xué)生學(xué)號、本次考試試卷的試題編號、標(biāo)準(zhǔn)答案、考生答案和考試時間。其關(guān)鍵代碼如下:
tv1t.setEnabled(false);//一旦交卷,選項(xiàng)A禁止使用
……//選項(xiàng)B、C、D禁止使用代碼類似
int score=0;
for (int i=0;i if(userAL.get(i).toString().length()!=0&& answerAL.get(i).equals(userAL.get(i))) score=score+2; } Toast.makeText(TestActivity.this,“你的得分為:”+score,Toast.LENGTH_SHORT).show(); ContentValues values=new ContentValues(); values.put(“testids”,indexAL.toString());//試題編號 ……//標(biāo)準(zhǔn)答案、考生答案、當(dāng)前時間、分類實(shí)現(xiàn)代碼等類似 String whereClause=“stunumber=?”;//更新條件以登錄的學(xué)號為依據(jù) String[]whereArgs={studnumber};//登錄界面通過Intent傳遞來的學(xué)號 sqLiteDatabase.update(“stud”,values,whereClause,whereArgs); 學(xué)習(xí)模式界面如圖3所示,學(xué)習(xí)模式界面啟動時根據(jù)登錄模塊傳遞來的所屬院系(studep)從題庫表(tiku)中查詢出所有符合條件的試題并保存到對應(yīng)的Cursor中,然后將試題內(nèi)容、選項(xiàng)和標(biāo)準(zhǔn)答案顯示在對應(yīng)位置,通過“向前學(xué)習(xí)”、“向后學(xué)習(xí)”按鈕實(shí)現(xiàn)顯示前一道題目和后一道題目。 圖3 學(xué)習(xí)模塊界面 回看模式界面如圖4所示,回看界面啟動時根據(jù)登錄模塊傳遞來的學(xué)號從學(xué)生信息表(stud)查詢該學(xué)生的試卷信息,也就是該學(xué)生的試卷題目索引號、標(biāo)準(zhǔn)答案和考生答案;同時將tiku表中的所有題目信息保存在Cursor中,然后通過單擊“向前查看”和“向后查看”按鈕將試卷題目索引號對應(yīng)的題目內(nèi)容、選項(xiàng)、標(biāo)準(zhǔn)答案和考生答案顯示到對應(yīng)的組件上。 圖4 回看模塊界面 隨著移動應(yīng)用開發(fā)技術(shù)的發(fā)展,應(yīng)用于移動終端設(shè)備的移動App為實(shí)驗(yàn)室的安全教育和考試工作開辟了一個新的途徑和新的思路。學(xué)生在進(jìn)入實(shí)驗(yàn)室之前通過移動終端進(jìn)行必要的實(shí)驗(yàn)室安全知識學(xué)習(xí)和考試,可以進(jìn)一步提高他們的安全防范意識,極大地減少實(shí)驗(yàn)室管理過程中人為因素的安全隱患[14-15]。在移動互聯(lián)網(wǎng)技術(shù)的支持下,開發(fā)的基于Android平臺的實(shí)驗(yàn)室安全教育考試系統(tǒng),可以讓學(xué)生通過移動終端隨時隨地進(jìn)行學(xué)習(xí)和考試,一方面大大提高了學(xué)習(xí)效率,另一方面可以從根本上預(yù)防和減少實(shí)驗(yàn)室安全事故的發(fā)生。2.4 其他模塊的實(shí)現(xiàn)
3 結(jié)束語