基于LAMP平臺(tái)的中學(xué)學(xué)生成績(jī)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
基于LAMP平臺(tái)的中學(xué)學(xué)生成績(jī)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)摘 要:成績(jī)管理作為中學(xué)教務(wù)管理的主要任務(wù),其自動(dòng)化的實(shí)現(xiàn)將對(duì)中學(xué)信息化建設(shè)有極大推動(dòng)作用。本系統(tǒng)考慮到基層中學(xué)的實(shí)際情況,基于LAMP平臺(tái)對(duì)系統(tǒng)各功能模塊進(jìn)行設(shè)計(jì),使用PHP結(jié)合MysQL數(shù)據(jù)庫(kù),建立用戶身份驗(yàn)證機(jī)制,實(shí)現(xiàn)成績(jī)錄入、修改和查詢等成績(jī)管理基本功能。著重設(shè)計(jì)了成績(jī)分析功能,實(shí)現(xiàn)對(duì)班級(jí)整體成績(jī)的分析,能快速統(tǒng)計(jì)并顯示各分?jǐn)?shù)段學(xué)生名單,并以直觀的條形圖形式展示總體成績(jī)情況。針對(duì)個(gè)人成績(jī)分析,系統(tǒng)利用PHP動(dòng)態(tài)生成圖像技術(shù)生成學(xué)生個(gè)人成績(jī)波動(dòng)折線圖,對(duì)學(xué)生個(gè)人某一學(xué)科多次考試成績(jī)進(jìn)行縱向比較。系統(tǒng)能有效幫助教師或?qū)W生根據(jù)成績(jī)數(shù)據(jù)調(diào)整教學(xué)方法或?qū)W習(xí)方法。運(yùn)行結(jié)果表明,系統(tǒng)穩(wěn)定、安全、可靠,基本實(shí)現(xiàn)預(yù)先設(shè)計(jì)的功能。關(guān)鍵詞:成績(jī)管理 PHP MySQL 數(shù)據(jù)分析 教學(xué)輔助1 引言辦公自動(dòng)化在信息時(shí)代已成為必然趨勢(shì),近幾年隨著硬件成本降低,個(gè)人計(jì)算機(jī)普及,使得越來越多基層中學(xué)有條件由傳統(tǒng)手工辦公方式轉(zhuǎn)為電子自動(dòng)化辦公的新方式。教務(wù)管理是學(xué)校日常管理的重要組成部分,據(jù)筆者調(diào)研發(fā)現(xiàn),學(xué)生成績(jī)管理是中學(xué)教務(wù)管理的主要任務(wù),成績(jī)管理自動(dòng)化能使教務(wù)管理工作更加高效,方便各職能部門協(xié)同作業(yè)1,加快校園信息化建設(shè)步伐;能更加準(zhǔn)確、科學(xué)的反映學(xué)生學(xué)習(xí)情況,為學(xué)校課程的調(diào)整和設(shè)置提供有效數(shù)據(jù);能讓基層中學(xué)教師更方便管理和分析學(xué)生成績(jī);能讓學(xué)生通過查看分析圖表更直觀了解自己成績(jī)的變化情況。Excel等數(shù)據(jù)管理分析軟件能為中學(xué)成績(jī)管理提供較好的解決方案。但處于由手工到自動(dòng)化的轉(zhuǎn)型期的很多基層中學(xué)教師,由于計(jì)算機(jī)基礎(chǔ)較差,未能使用Excel在數(shù)據(jù)管理分析方面出色的功能。而Excel等軟件由于桌面軟件固有的局限性,不方便學(xué)校對(duì)學(xué)生成績(jī)進(jìn)行統(tǒng)一管理。當(dāng)前,全國(guó)各高校基本上都有自己的教務(wù)管理軟件,為學(xué)校統(tǒng)一管理學(xué)生成績(jī)提供有效的解決方案。如筆者所在的陜西師范大學(xué)所使用的由某軟件公司開發(fā)的教務(wù)管理系統(tǒng),該系統(tǒng)由校方向軟件公司定制,由專業(yè)團(tuán)隊(duì)負(fù)責(zé)開發(fā)并維護(hù)。系統(tǒng)基于B/S架構(gòu),有豐富的教務(wù)管理功能,實(shí)現(xiàn)了高校適用的選課管理、學(xué)分管理、成績(jī)管理等功能。但高校所使用的教務(wù)管理軟件相對(duì)基層中學(xué)而言成本太高,又因系統(tǒng)過于龐大導(dǎo)致維護(hù)工作量大,而一般基層中學(xué)地處偏遠(yuǎn),沒有專業(yè)人員負(fù)責(zé)維護(hù)。另一方面,這類系統(tǒng)所實(shí)現(xiàn)的功能如選課管理等在當(dāng)前中學(xué)并不需要,中學(xué)教務(wù)管理的主要任務(wù)是成績(jī)管理,高校的教務(wù)管理系統(tǒng)普遍沒有對(duì)成績(jī)管理和分析功能進(jìn)行深入研究。一些硬件設(shè)施條件較好的中學(xué)已經(jīng)部署教務(wù)管理相關(guān)軟件,這類系統(tǒng)軟件大多由當(dāng)?shù)匾?guī)模較小的軟件公司開發(fā),沒有遵循基本的軟件工程方法,隨意堆積代碼,以最快的開發(fā)方式(無論系統(tǒng)設(shè)計(jì)是否符合規(guī)范)低價(jià)格出售給基層中學(xué)使用,有數(shù)據(jù)安全隱患2,可能會(huì)導(dǎo)致不可預(yù)知的、難以維護(hù)的錯(cuò)誤。在成績(jī)分析方面這類系統(tǒng)沒有實(shí)現(xiàn)或沒有做深入研究,只有成績(jī)錄入、修改等基本功能,未對(duì)學(xué)生成績(jī)數(shù)據(jù)進(jìn)行挖掘研究3,不能實(shí)現(xiàn)對(duì)學(xué)生成績(jī)進(jìn)行科學(xué)分析后,以科學(xué)的數(shù)據(jù)幫助教師改進(jìn)教學(xué)方法,幫助學(xué)生改進(jìn)學(xué)習(xí)方法。本系統(tǒng)基于LAMP平臺(tái),即使用Apache作為Web服務(wù)器,在Linux環(huán)境下,以MysQL為后臺(tái)數(shù)據(jù)庫(kù)支持,以PHP為后臺(tái)腳本語言,嚴(yán)格遵從軟件工程開發(fā)方法,為中學(xué)學(xué)生成績(jī)管理提出有針對(duì)性的解決方案。系統(tǒng)基于B/S架構(gòu),可多地域任意時(shí)間段訪問,方便學(xué)校和教師統(tǒng)一管理成績(jī)。對(duì)系統(tǒng)界面進(jìn)行優(yōu)化,加強(qiáng)人機(jī)交互,方便計(jì)算機(jī)水平較低的教師使用。因LAMP平臺(tái)開源技術(shù)4特點(diǎn),系統(tǒng)具有開發(fā)成本及硬件成本低、穩(wěn)定可靠、跨平臺(tái)等特點(diǎn)。使用功能模塊化設(shè)計(jì),后期維護(hù)方便,有良好的可擴(kuò)展性,可作為中學(xué)教務(wù)管理系統(tǒng)的子系統(tǒng)5。系統(tǒng)實(shí)現(xiàn)了有安全訪問控制6的用戶身份驗(yàn)證機(jī)制,分為教師管理后臺(tái)和學(xué)生瀏覽前臺(tái)界面。在實(shí)現(xiàn)基本的成績(jī)錄入、修改和查詢等基本功能的前提下,對(duì)成績(jī)分析模塊進(jìn)行了深入研究,實(shí)現(xiàn)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)并動(dòng)態(tài)生成相應(yīng)成績(jī)分析圖表,一方面能直觀反映整體成績(jī)情況,另一方面能以圖表的方式更直觀的反映各個(gè)學(xué)生的個(gè)人成績(jī)波動(dòng)情況7。2 系統(tǒng)開發(fā)的關(guān)鍵技術(shù) 2.1 LAMP平臺(tái)LAMP是Linux+Apache+MySQL+PHP網(wǎng)站架構(gòu)的通用縮寫,是目前國(guó)際流行的Web框架,該框架包括:Linux操作系統(tǒng),Apache網(wǎng)絡(luò)服務(wù)器,MySQL數(shù)據(jù)庫(kù),PHP后臺(tái)腳本編程語言,框架所有組成產(chǎn)品均是開源軟件。與微軟的.NET架構(gòu)相比,LAMP具有通用、跨平臺(tái)、高性能、低價(jià)格等優(yōu)勢(shì),與Java/J2EE架構(gòu)相比,LAMP具有Web資源豐富、輕量、快速開發(fā)等特點(diǎn),因此無論是從性能、質(zhì)量還是開發(fā)成本上考慮,LAMP平臺(tái)都是實(shí)現(xiàn)中學(xué)學(xué)生成績(jī)管理系統(tǒng)的首選8,以下對(duì)該平臺(tái)各個(gè)組成部分作簡(jiǎn)要介紹。(1)GPL版權(quán)聲明:GPL授權(quán)是開源技術(shù)得以發(fā)展壯大的原因之一,LAMP平臺(tái)的組成軟件幾乎都使用GPL版權(quán)聲明。GPL全稱為General Public License,即通用公共許可證,有GPL版權(quán)聲明的軟件即是通常所說的“自由軟件”,GPL的創(chuàng)立者史托曼(Richard Mathew Stallman)對(duì)“自由”的定義是:用戶可以自由執(zhí)行、復(fù)制、再發(fā)行、學(xué)習(xí)、修改與強(qiáng)化自由軟件。正是因?yàn)檫@一開放精神,使得遍布世界各地的工程師們組成一個(gè)技術(shù)力量雄厚的“虛擬團(tuán)隊(duì)”,不斷對(duì)自由軟件源碼查找漏洞進(jìn)一步完善,使得自由軟件具有安全性好、執(zhí)行效率高等顯著特點(diǎn)。當(dāng)然,并不是任何自由軟件都是完全免費(fèi),事實(shí)上自由軟件是可以銷售的,只是不能僅僅銷售軟件,還需搭配相應(yīng)的售后服務(wù)。如目前有很多Linux開發(fā)商在銷售各種Linux發(fā)行版,但他們不能僅僅銷售Linux系統(tǒng),還需給用戶提供特定的技術(shù)升級(jí)服務(wù)。(2)Linux:Linux是類Unix開源系統(tǒng),內(nèi)核原型是由托瓦茲(Linus Torvalds)于1991年基于GPL版權(quán)聲明發(fā)布。由于使用GPL授權(quán),自Linux發(fā)行以來很多優(yōu)秀工程師不斷對(duì)其核心進(jìn)行改善,對(duì)硬件的兼容性比Unix系統(tǒng)好,且很好繼承了Unix系統(tǒng)良好性能,使Linux擁有很高的穩(wěn)定性、完全性,是當(dāng)前眾多企業(yè)搭建Web站點(diǎn)服務(wù)器的首選平臺(tái)。Linux有很多發(fā)行版本,本系統(tǒng)所選用的CentOS(Community Enterprise Operating System)是Linux發(fā)行版之一,CentOS源代碼與著名的商業(yè)Linux系統(tǒng)RHEL(Red Hat Enterprise Linux)相同,擁有與RHEL相當(dāng)?shù)母叻€(wěn)定性。RHEL、SUSE LE等Linux企業(yè)版,提供的后期升級(jí)服務(wù)均是收費(fèi),無法免費(fèi)在線升級(jí),而CentOS是由開源社區(qū)開發(fā),免費(fèi)提供升級(jí)服務(wù),因此成績(jī)管理系統(tǒng)用CentOS替代RHEL做服務(wù)器。(3)Apache:Apache是目前世界使用最多的Web服務(wù)器,使用率超過60%。它是自由軟件,開發(fā)人員可以根據(jù)自己的需要對(duì)相關(guān)模塊進(jìn)行改寫,有良好的可擴(kuò)展性。另外,Apache可以兼容Linux和Windows等主流平臺(tái),以其輕量、運(yùn)行速度快和穩(wěn)定9-10等特點(diǎn)深受Web開發(fā)人員喜愛。(4)MySQL:MySQL是使用GPL授權(quán)的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),兼容Windows和Linux系統(tǒng)。在GPL許可下,可以免費(fèi)使用,在商業(yè)許可下,其費(fèi)用也很少。相比于價(jià)格昂貴的Mircrosoft SQL Server、Orcal等關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),MySQL大大減少了系統(tǒng)成本,而它擁有高性能、可跨平臺(tái)、使用和管理方便、運(yùn)行速度快、安全可靠性高等優(yōu)點(diǎn),可以高效地存儲(chǔ)、搜索、排序和檢索數(shù)據(jù)11。本系統(tǒng)使用MySQL作后臺(tái)數(shù)據(jù)庫(kù)支持軟件,在降低系統(tǒng)成本的同時(shí),能方便、高效的對(duì)學(xué)生成績(jī)數(shù)據(jù)進(jìn)行管理和分析12。(5)PHP:PHP是服務(wù)器端解釋腳本編程語言,是開放源代碼的自由軟件,專門為Web開發(fā)設(shè)計(jì),是目前最流行的Web編程腳本語言之一,與JSP、ASP、ASP.NET相比具有簡(jiǎn)易性、高安全性、開發(fā)速度快和執(zhí)行靈活等優(yōu)點(diǎn)13。由于PHP是自由軟件,其網(wǎng)絡(luò)資源豐富,基于PHP的開發(fā)框架14眾多,如較為成熟的Smarty,Yii和Zend Framework等。本系統(tǒng)的實(shí)現(xiàn)主要使用PHP作為后臺(tái)腳本編寫語言,結(jié)合MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)了成績(jī)管理和分析等相關(guān)功能15。2.2 框架與布局系統(tǒng)嚴(yán)格遵循軟件工程方法,使用分層設(shè)計(jì)16,保證系統(tǒng)安全性,方便系統(tǒng)維護(hù)及擴(kuò)展。頁面布局全部采用DIV+CSS技術(shù),便于系統(tǒng)重構(gòu)。2.2.1 系統(tǒng)框架為了使開發(fā)更加高效,系統(tǒng)安全穩(wěn)定,后期維護(hù)簡(jiǎn)單、方便,系統(tǒng)綜合采用多種分層技術(shù)構(gòu)造框架。在目錄結(jié)構(gòu)上,按照組件、邏輯、內(nèi)容和源代碼庫(kù)將目錄分成多個(gè)部分,目錄結(jié)構(gòu)圖如圖1所示。整個(gè)系統(tǒng)包含于SRMS目錄,其它組件存放于SRMS的子目錄。公共可訪問的文件如系統(tǒng)登錄首頁login.php等頁面存放在pulic_files目錄,另外,在public_files專門下創(chuàng)建css、img和js分別存放樣式代碼、系統(tǒng)使用的圖像及Javascript文件。lib文件存放系統(tǒng)運(yùn)行過程中會(huì)調(diào)用的庫(kù)文件,sql是使用SQL語句操作數(shù)據(jù)庫(kù)的相關(guān)文件。圖 1 系統(tǒng)目錄結(jié)構(gòu)Fig.1 Systems Directory Structure除了目錄結(jié)構(gòu)分層設(shè)計(jì)外,代碼也使用了代碼分解技術(shù)。將各個(gè)功能模塊的代碼分解,構(gòu)造相關(guān)函數(shù),再通過函數(shù)調(diào)用實(shí)現(xiàn)相關(guān)功能。這樣避免了單段代碼過長(zhǎng),使代碼容易閱讀,易于理解,方便代碼重用,避免重復(fù)編寫大量代碼,提高系統(tǒng)開發(fā)速度。系統(tǒng)在實(shí)現(xiàn)過程中多處使用該技術(shù)。例如,在系統(tǒng)中多處需要連接數(shù)據(jù)庫(kù),可以在lib目錄下創(chuàng)建專門連接數(shù)據(jù)庫(kù)的函數(shù)db_fns.php,代碼如下:<?php/*數(shù)據(jù)庫(kù)連接函數(shù)*/function db_connect() $result = new mysqli(localhost, srmsuser, 120587, srms); if (!$result) throw new Exception(連接數(shù)據(jù)庫(kù)失?。?; else return $result; ?>該函數(shù)能拋出錯(cuò)誤信息,在需要連接數(shù)據(jù)庫(kù)的頁面使用require_once(db_fns.php);包含該函數(shù),再使用$conn = db_connect();便能取得數(shù)據(jù)庫(kù)連接句柄。為了更加便于函數(shù)調(diào)用,把常用的函數(shù)全部包含于functions.php文件,如下所示:<?php/*系統(tǒng)包含文件的集合,包括一些常用函數(shù)容器,方便統(tǒng)一調(diào)用*/require_once(output.php); /以HTML形式格式化輸出的函數(shù)require_once(data_valid_fns.php);/確認(rèn)用戶輸入數(shù)據(jù)有效的函數(shù)require_once(user_auth_fns.php); /用戶身份驗(yàn)證相關(guān)函數(shù)require_once(db_fns.php); /數(shù)據(jù)庫(kù)連接函數(shù)require_once(teacher/teacher.php);/教師后臺(tái)管理界面require_once(student/student.php);/學(xué)生瀏覽界面?>在其它頁面只需寫一行代碼:require_once(functions.php);就能實(shí)現(xiàn)在頁面中調(diào)用特定函數(shù)。在設(shè)計(jì)系統(tǒng)框架時(shí)還使用了邏輯和內(nèi)容分離技術(shù),即PHP與HTML分離。將邏輯從內(nèi)容分離、內(nèi)容從外觀分離可以使系統(tǒng)更易于長(zhǎng)期使用和維護(hù)。系統(tǒng)把常用的顯示內(nèi)容的HTML代碼存放于output.php文件里,其中代碼類似于下面代碼:<?php/主體盒子的前部分function do_html_main_header() ?><div id=main><?php/主體盒子的后部分function do_html_main_footer() ?> </div><?php?>在需要輸出內(nèi)容的頁面以如下代碼所示的方式直接調(diào)用函數(shù)即可:<?php do_html_header1();/顯示頁面頭部信息do_html_main_header();/主體的頭部do_text($e->getMessage(); /獲取錯(cuò)誤信息do_html_url(./public_files/login.php, 重新登錄); /創(chuàng)建超鏈接do_html_url(./public_files/register_form.php, 注冊(cè));do_html_main_footer(); /主體內(nèi)容結(jié)束do_html_footer1();/顯示頁面頁腳信息?>2.2.2 用DIV+CSS布局頁面?zhèn)鹘y(tǒng)的網(wǎng)頁布局方式一般采用表格,但層疊樣式表CSS出現(xiàn)后,以其在Web頁面外觀控制上的優(yōu)越性能迅速取代了傳統(tǒng)的布局方式,目前幾乎所有站點(diǎn)都使用CSS布局頁面。使用CSS技術(shù)能將內(nèi)容和外觀分離,使得開發(fā)人員可以更加專注于后臺(tái)內(nèi)容開發(fā),外觀由專門負(fù)責(zé)界面設(shè)計(jì)的前端設(shè)計(jì)師設(shè)計(jì),這有利于系統(tǒng)的邏輯和內(nèi)容研發(fā),而由專業(yè)界面設(shè)計(jì)人員負(fù)責(zé)外觀,人機(jī)交互會(huì)更好。即便如這個(gè)系統(tǒng)一樣開發(fā)和布局都由一個(gè)人完成,也容易系統(tǒng)的后期維護(hù)和長(zhǎng)期使用。在布局頁面時(shí)使用HTML的塊元素div配合CSS使用,還能達(dá)到傳統(tǒng)表格無法完成的效果。本系統(tǒng)專門建立存放CSS文件的目錄,在目錄下為不同頁面的布局創(chuàng)建不同的布局文件。如系統(tǒng)登錄首頁的布局文件為login.css,在login.php頁面的頭部標(biāo)簽<head></head>里加上一行代碼:<link href="./css/login.css" rel="stylesheet" type="text/css" />即可配合使用login.css文件定義的布局。系統(tǒng)利用CSS,使首頁的登錄框于頁面居中,如圖2所示。圖 2 系統(tǒng)登錄首頁界面Fig.2 Systems Login Page該頁面能在瀏覽器窗口大小調(diào)動(dòng)情況下始終居中,實(shí)現(xiàn)該功能的主要CSS代碼如下:#login_form width:280px; height:170px; position:absolute;/*隨著瀏覽器大小的改變,頁面始終居中*/ left:50%; top:50%; margin-left:-140px; margin-top:-85px;3 系統(tǒng)設(shè)計(jì)在確定系統(tǒng)框架及頁面布局使用的技術(shù)后,對(duì)系統(tǒng)進(jìn)行總體設(shè)計(jì)。本系統(tǒng)設(shè)計(jì)分為兩個(gè)部分:系統(tǒng)功能模塊設(shè)計(jì)和數(shù)據(jù)庫(kù)設(shè)計(jì)。它們?cè)谙到y(tǒng)流程圖(圖3)框架下進(jìn)行設(shè)計(jì)。圖 3 系統(tǒng)流程圖Fig.3 Systems Flowchart3.1 系統(tǒng)功能模塊設(shè)計(jì)使用模塊化設(shè)計(jì),按功能將系統(tǒng)分為幾個(gè)模塊分別進(jìn)行編碼,各模塊編碼實(shí)現(xiàn)后再整合調(diào)試,提高代碼重用,使系統(tǒng)邏輯更為清晰,便于后期維護(hù)和功能擴(kuò)展。系統(tǒng)最主要的兩個(gè)模塊分別是教師管理后臺(tái)和學(xué)生可瀏覽的前臺(tái)。這兩個(gè)模塊均使用HTML的frame框架布局,利用用戶身份驗(yàn)證機(jī)制為特定用戶顯示個(gè)性化界面,模塊與模塊之間存在相互調(diào)用關(guān)系。3.1.1 前臺(tái)功能模塊系統(tǒng)前臺(tái)包括系統(tǒng)登錄首頁、用戶注冊(cè)、重置密碼、修改密碼及錯(cuò)誤提示頁面,這些頁面都使用DIV+CSS控制外觀,除登錄頁面單獨(dú)使用login.css進(jìn)行布局外,其它頁面都通過給各自的div塊元素定義不同的id或class來使用同一個(gè)CSS文件layout.css進(jìn)行布局,便于維護(hù)。還通過命名相同的class,共用某個(gè)樣式,使界面風(fēng)格統(tǒng)一,減少編寫CSS樣式代碼工作量。前臺(tái)功能模塊中最重要的是學(xué)生用戶可以瀏覽的成績(jī)管理模塊。該模塊的框架如圖4所示:圖 4 學(xué)生界面框架Fig.4 The Frame of Students Page學(xué)生從首頁登錄系統(tǒng),由身份識(shí)別系統(tǒng)對(duì)學(xué)生的身份屬性進(jìn)行識(shí)別,系統(tǒng)自動(dòng)導(dǎo)向?qū)W生界面。學(xué)生界面由兩大模塊及大模塊下的相關(guān)小模塊組成。用戶識(shí)別模塊可識(shí)別學(xué)生身份,針對(duì)不同的學(xué)生顯示與“歡迎陳建康同學(xué)”相類似的個(gè)性化信息,該模塊還將集成注銷登錄及修改密碼功能。成績(jī)管理模塊有查詢成績(jī)功能和分析成績(jī)功能。在查詢功能中,學(xué)生用戶可按學(xué)科快速查詢?cè)搶W(xué)科總體成績(jī)。在分析成績(jī)功能中,學(xué)生可按學(xué)科和考試時(shí)間查看班級(jí)整體成績(jī)分析情況,包括平均分、各分?jǐn)?shù)段人數(shù)及該分?jǐn)?shù)段學(xué)生名單,能通過圖表直觀查看分析結(jié)果。通過整體分析功能進(jìn)行成績(jī)橫向比較,讓學(xué)生了解自己當(dāng)次考試成績(jī)?cè)诎嗉?jí)的位置,及時(shí)調(diào)整自己的學(xué)習(xí)計(jì)劃和心態(tài)。另外,作為本系統(tǒng)最重要的功能,學(xué)生可通過分析成績(jī)模塊中的個(gè)人分析功能對(duì)自己某學(xué)科的成績(jī)進(jìn)行縱向比較,通過查看系統(tǒng)自動(dòng)生成的有數(shù)據(jù)描點(diǎn)的折線圖了解自己幾次考試成績(jī)的波動(dòng)情況,以數(shù)據(jù)為依據(jù),聯(lián)系學(xué)生生活實(shí)際,分析自己在某一時(shí)間段內(nèi)成績(jī)上升或下滑的具體原因,為保持一個(gè)良好的學(xué)習(xí)狀態(tài)制定周詳?shù)膶W(xué)習(xí)計(jì)劃。3.1.2 后臺(tái)功能模塊教師管理后臺(tái)模塊與學(xué)生的前臺(tái)界面相類似,在系統(tǒng)開發(fā)時(shí)通過代碼復(fù)用及函數(shù)調(diào)用實(shí)現(xiàn)相同功能。教師管理后臺(tái)模塊的框架圖如圖5所示:圖 5 教師管理后臺(tái)框架Fig.5 The Teacher Admin Frame系統(tǒng)對(duì)教師身份進(jìn)行識(shí)別后,將在用戶識(shí)別模塊顯示“歡迎盧俊嶺老師”一類個(gè)性化信息。其它模塊功能與學(xué)生前臺(tái)界面相似。在教師管理后臺(tái)模塊中,主要增加了錄入成績(jī)和修改成績(jī)功能。只允許教師從后臺(tái)對(duì)成績(jī)進(jìn)行錄入和修改操作,學(xué)生沒有修改成績(jī)的權(quán)限,這保證了系統(tǒng)的可靠性。在錄入成績(jī)模塊中,教師能夠非常直觀的、簡(jiǎn)便的按照學(xué)科及考試月份對(duì)全班學(xué)習(xí)成績(jī)進(jìn)行錄入工作,錄入成功后系統(tǒng)立即返回錄入結(jié)果,如果發(fā)現(xiàn)有錄入錯(cuò)誤,使用修改成績(jī)功能修改。在修改成績(jī)模塊中,同樣按照學(xué)科及相應(yīng)考試月份進(jìn)行修改,修改時(shí),系統(tǒng)可顯示成績(jī)修改前的數(shù)據(jù),方便修改,修改成功后立即返回修改后的成績(jī)表。教師通過使用教師管理后臺(tái),能便捷的對(duì)學(xué)生成績(jī)進(jìn)行錄入、修改和查詢等基本管理。系統(tǒng)還能幫助教師實(shí)現(xiàn)對(duì)學(xué)生成績(jī)的分析。通過對(duì)本班整體成績(jī)的分析,了解各個(gè)分?jǐn)?shù)段的人數(shù),針對(duì)不同分?jǐn)?shù)段的學(xué)生采取不同的指導(dǎo)方式,以求取得更好的成績(jī)。對(duì)比多次考試平均分,了解教師在某段時(shí)間教學(xué)上的狀態(tài),以科學(xué)的數(shù)據(jù)指導(dǎo)自己教學(xué)方法的改進(jìn)。另外,還可通過分析學(xué)生個(gè)人成績(jī)波動(dòng)情況,對(duì)個(gè)別學(xué)生進(jìn)行有針對(duì)性的指導(dǎo)。3.2 數(shù)據(jù)庫(kù)設(shè)計(jì)系統(tǒng)中所使用的數(shù)據(jù)全部使用數(shù)據(jù)庫(kù)存儲(chǔ),方便統(tǒng)一管理數(shù)據(jù),結(jié)合PHP和MysQL數(shù)據(jù)庫(kù),可以實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行分析。系統(tǒng)以功能為驅(qū)動(dòng),遵行數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范,對(duì)該系統(tǒng)需要使用的教師和學(xué)生數(shù)據(jù)建模,系統(tǒng)的分析各個(gè)數(shù)據(jù)之間的關(guān)系,避免數(shù)據(jù)庫(kù)保存冗余數(shù)據(jù),為每個(gè)表選擇有意義的主鍵。最后構(gòu)造的數(shù)據(jù)庫(kù)模型圖如圖6所示:圖 6 SRMS數(shù)據(jù)庫(kù)模型Fig.6 SRMS Database Moduel在SRMS數(shù)據(jù)庫(kù)里創(chuàng)建如模型所示的7張數(shù)據(jù)表。teacher和student表分別記錄教師和學(xué)生的id(學(xué)號(hào)或工號(hào))、名字、密碼和email,兩張數(shù)據(jù)表的結(jié)構(gòu)如圖7所示。用id字段作為表的主鍵,id,name,passwd和email的值均不能缺省,如果允許缺省可能會(huì)導(dǎo)致數(shù)據(jù)冗余,因?yàn)橹挥袑W(xué)號(hào)沒有學(xué)生姓名或只有教師名字沒有別的相關(guān)信息這種情況是不允許存在。圖7 student和teacher表結(jié)構(gòu)Fig.7 The Structure of Student and Teachers Database Tableyw、sx、yy、wl、hx分別存放學(xué)生語文、數(shù)學(xué)、英語、物理、化學(xué)成績(jī)數(shù)據(jù)。為了把更多精力放在分析功能的設(shè)計(jì)上,系統(tǒng)僅以5個(gè)學(xué)科4次考試成績(jī)這個(gè)簡(jiǎn)單的模型作為系統(tǒng)開發(fā)的測(cè)試數(shù)據(jù),作為測(cè)試模型,該方法是可行的。這5個(gè)表的結(jié)構(gòu)如圖8所示,sid是學(xué)生學(xué)號(hào),是其所處關(guān)系的外鍵,當(dāng)查詢數(shù)據(jù)時(shí),可利用外鍵,引用student表的數(shù)據(jù),達(dá)到同時(shí)顯示學(xué)生學(xué)號(hào)、姓名和成績(jī)目的,避免了空間的浪費(fèi)。記錄成績(jī)的字段皆設(shè)置為float浮點(diǎn)型數(shù)據(jù),以中學(xué)實(shí)際成績(jī)?yōu)橐罁?jù),設(shè)置為5位有效數(shù)字,精確到小數(shù)后兩位,在教師錄入數(shù)據(jù)時(shí),對(duì)錄入數(shù)據(jù)的最大值做限定。圖 8 成績(jī)表結(jié)構(gòu)Fig.8 The Structure of Scores Database Table4 系統(tǒng)功能模塊的實(shí)現(xiàn)系統(tǒng)所有功能模塊以成績(jī)管理模塊為核心,為提供安全、穩(wěn)定、方便可用、可維護(hù)性好的成績(jī)管理模塊而進(jìn)行設(shè)計(jì)并實(shí)現(xiàn)。4.1 成績(jī)管理模塊的實(shí)現(xiàn)成績(jī)管理模塊是本系統(tǒng)的核心,該模塊的實(shí)現(xiàn)分為成績(jī)的錄入、修改和查詢基本操作部分及對(duì)成績(jī)分析功能的深度研發(fā)部分。模塊的實(shí)現(xiàn)主要是利用PHP腳本語言結(jié)合MySQL對(duì)數(shù)據(jù)進(jìn)行查詢和分析。此外,對(duì)該模塊使用界面優(yōu)化技術(shù),使教師和學(xué)生更容易使用本系統(tǒng)。4.1.1 成績(jī)管理的基本操作成績(jī)管理的基本操作分為錄入、修改和查詢3個(gè)部分,在教師管理后臺(tái)可使用全部功能,學(xué)生界面去掉錄入、修改成績(jī)功能,查詢功能為教師管理后臺(tái)和學(xué)生前臺(tái)界面所共用。(1)錄入成績(jī):錄入成績(jī)需按學(xué)科和考試月份進(jìn)行錄入,通過表單傳遞學(xué)科和月份信息,創(chuàng)建insert_form.php文件作為學(xué)科和月份信息選擇頁面,主要代碼如下:<form action="insert.php" method="post" target="showPage"><center>請(qǐng)選擇學(xué)科:<select name="course"><option value="yw">語文</option><option value="sx">數(shù)學(xué)</option><option value="yy">英語</option>(接下一頁)<option value="wl">物理</option><option value="hx">化學(xué)</option></select>請(qǐng)選擇考試月份:<select name="month"><option value="ks1">1月份</option><option value="ks2">2月份</option><option value="ks3">3月份</option></select><input type="submit" value="開始錄入"></center></form>頁面顯示結(jié)果如圖9所示:圖9 成績(jī)錄入選擇表單Fig.9 The Select Form of Insert Score Page點(diǎn)擊“開始錄入”后,表單將以post方式向insert.php頁面?zhèn)鬟fcourse和month相對(duì)應(yīng)的值。在insert.php頁面中,使用:$course = $_POSTcourse;$month = $_POSTmonth;從全局?jǐn)?shù)組$_POST里接受數(shù)據(jù),并分別創(chuàng)建短變量名$course和$month,便于程序中其它地方使用。在insert.php頁面中,首先使用require_once(./db_fns.php);包含數(shù)據(jù)庫(kù)連接函數(shù),在頁面中以$conn = db_connect();實(shí)例化php的mysqli類,創(chuàng)建到數(shù)據(jù)庫(kù)的連接。成績(jī)的錄入以表格形式(見圖10)顯示錄入框,該系統(tǒng)在創(chuàng)建這類表格時(shí)大量使用了動(dòng)態(tài)顯示表格技術(shù),根據(jù)數(shù)據(jù)庫(kù)記錄的實(shí)際數(shù)據(jù)顯示表格的行數(shù)。實(shí)現(xiàn)這一功能的主要代碼如下:$conn = db_connect();$result = $conn->query("select * from student order by id asc");<?phpwhile ($stu = $result->fetch_object() ?><tr><td> <input type="hidden" name="sid" value="<?php echo $stu->id;?>" /> <?php echo $stu->id;?></td><td><input type="hidden" /><?php echo $stu->name;?></td><td><input type="text" name="result" maxlength="3" size="16" /></td></tr><?php?>圖10 成績(jī)錄入表格Fig.10 The Table of Insert Score Page循環(huán)條件里的$result->fetch_object()在每次循環(huán)時(shí)以給$stu賦值,在每個(gè)循環(huán)體里使用對(duì)象屬性值生成特定的表格行。另外,在表單中還設(shè)置一些<input>標(biāo)簽的type設(shè)置為“hidden”以隱藏的方式向insert.php頁面?zhèn)髦担瑥亩乖谇岸巳鐖D10的頁面中并沒有看到使用hidden的input元素,但能夠向指定頁面?zhèn)鬟f數(shù)據(jù)。insert.php頁面僅僅完成成績(jī)數(shù)據(jù)收集工作,真正往數(shù)據(jù)庫(kù)里寫入數(shù)據(jù)的操作是在insert_fns.php,主要的代碼如下:if ($month = "ks1") $sql = "insert into ".$course." (sid,".$month.") values "/構(gòu)造插入SQL語句for ($i=0;$i<$count;$i+) if($sid$i!= and $result$i!= ) $sql .= "(".$sid$i.", ".$result$i."),"$rows+;/去掉原$sql后的","符號(hào),query()里最后不能有“,”if ($rows>0) $sql = substr($sql,0,strlen($sql)-1);$conn->query($sql);當(dāng)選擇的月份是1月份時(shí)會(huì)執(zhí)行上述代碼,使用for循環(huán)創(chuàng)建SQL查詢語句,使用insert關(guān)鍵字把學(xué)生成績(jī)插入到數(shù)據(jù)庫(kù)中。該技術(shù)結(jié)合循環(huán)實(shí)現(xiàn)批量查詢數(shù)據(jù),這一技術(shù)在本系統(tǒng)其它地方也多次使用,能利用數(shù)組及程序控制,實(shí)現(xiàn)批量向數(shù)據(jù)庫(kù)錄入數(shù)據(jù)。導(dǎo)入完數(shù)據(jù)后,使用select語句,立即返回錄入結(jié)果。(2)修改成績(jī):修改成績(jī)的實(shí)現(xiàn)方法與錄入成績(jī)大致類似,使用SQL里的update關(guān)鍵字對(duì)數(shù)據(jù)進(jìn)行修改。從update_form.php頁面選擇需要修改的學(xué)科及考試月份,使用表單的post方式向update.php頁面?zhèn)鬟fcourse和month兩個(gè)變量信息,update.php根據(jù)變量的不同,自動(dòng)生成相應(yīng)行數(shù)的成績(jī)修改表格,最后再由update_fns.php更新數(shù)據(jù)庫(kù)中相應(yīng)數(shù)據(jù)表的數(shù)據(jù),并返回修改后的成績(jī)。在生成修改成績(jī)輸入表時(shí),update.php使用了一個(gè)關(guān)鍵技術(shù),使得教師可以看到未修改前的成績(jī),如圖11所示:圖11 修改成績(jī)表格Fig.11 The Table of Update Score Page該技術(shù)實(shí)現(xiàn)的關(guān)鍵代碼如下:<td><input type="text" name="result" value="<?php echo $rows->ks1; ?>"/></td>使input元素有默認(rèn)值,即當(dāng)教師進(jìn)行修改時(shí),表格會(huì)顯示數(shù)據(jù)庫(kù)中記錄的原來的成績(jī)值,當(dāng)往表單元素input重新賦值時(shí),新值會(huì)更新到數(shù)據(jù)庫(kù)中,這大大方便了教師進(jìn)行成績(jī)的修改。(3)查詢成績(jī):成績(jī)錄入和修改的實(shí)現(xiàn)已經(jīng)涉及成績(jī)查詢功能,查詢功能的實(shí)現(xiàn)較為簡(jiǎn)單,單獨(dú)以功能模塊的形式來完成該功能其一是為了便于教師更快速的查詢到相應(yīng)成績(jī),其二是學(xué)生前臺(tái)可以通過查詢的方式查看成績(jī)。無論是教師管理后臺(tái)還是學(xué)生的前臺(tái),默認(rèn)的顯示頁面就是查詢功能,如圖12所示。圖12 系統(tǒng)默認(rèn)顯示界面Fig.12 The Default Display Interface4.1.2 成績(jī)分析成績(jī)分析是成績(jī)管理模塊的核心,分為整體分析和個(gè)人分析兩部分。系統(tǒng)使用PHP調(diào)用MySQL中的成績(jī)數(shù)據(jù),分別對(duì)班級(jí)總體成績(jī)情況和各個(gè)學(xué)生的成績(jī)波動(dòng)情況進(jìn)行了分析,并將所獲取的數(shù)據(jù)動(dòng)態(tài)生成圖表,直觀明了的表現(xiàn)整體及個(gè)人的成績(jī)水平,以方便快捷的方式為教師改進(jìn)教學(xué)方法和學(xué)生調(diào)整學(xué)習(xí)計(jì)劃提供科學(xué)的數(shù)據(jù)。(1)整體分析:整體分析是以班級(jí)為研究對(duì)象,按學(xué)科按考試月份分析。如圖13所示,在顯示各分?jǐn)?shù)段學(xué)生名單的同時(shí),整體分析功能還列出了班級(jí)該學(xué)科當(dāng)次考試總體成績(jī)情況表。分?jǐn)?shù)段劃分為不及格(小于60分)、60以上、70以上、80以上、90以上共5個(gè)分?jǐn)?shù)段,在選定學(xué)科及考試月份情況下,系統(tǒng)自動(dòng)顯示5個(gè)分?jǐn)?shù)段學(xué)生名單,便于教師查看處在某一分?jǐn)?shù)段的學(xué)生群體,對(duì)不同分?jǐn)?shù)段的學(xué)生群體根據(jù)實(shí)際情況作有針對(duì)性的輔導(dǎo)和幫助。學(xué)生也可通過該功能了解與自己同處一分?jǐn)?shù)段的同學(xué)都是哪些,比自己成績(jī)更出色的還有哪些同學(xué),找準(zhǔn)自己在班級(jí)里成績(jī)水平的位置,通過與那些相對(duì)自己處在更高分?jǐn)?shù)段的同學(xué)對(duì)比,評(píng)估自己成績(jī)應(yīng)該能夠達(dá)到的高度,進(jìn)而調(diào)整學(xué)習(xí)計(jì)劃,實(shí)現(xiàn)自己的預(yù)期目標(biāo)。此外,系統(tǒng)還通過自動(dòng)生成總體成績(jī)情況表,列出平均分及各分?jǐn)?shù)段學(xué)生人數(shù),讓教師和學(xué)生更易把握該學(xué)科當(dāng)次考試的總體情況,該情況分析表還可以選擇以如圖14所示的條形圖方式顯示,這個(gè)條形圖比表格更直觀的反應(yīng)了各分?jǐn)?shù)段人數(shù)所占的比例。圖13 整體分析圖Fig.13 The Overalls Analysis Chart圖14 總體情況條形圖Fig.14 The Overalls Bar Chart整體分析功能的實(shí)現(xiàn)重用了部分成績(jī)管理的基本操作模塊里的功能,學(xué)科和考試月份的選擇功能與基礎(chǔ)操作部分相似,都是利用表單向服務(wù)器傳遞數(shù)據(jù)。整體分析的具體實(shí)現(xiàn)在all_analyse.php頁面完成。首先創(chuàng)建相應(yīng)的SQL查詢語句,從數(shù)據(jù)庫(kù)中獲取對(duì)應(yīng)分?jǐn)?shù)段的學(xué)生名單,如取得某學(xué)科1月份考試成績(jī)大于等于80的學(xué)生名單的主要代碼如下:$conn = db_connect();$sql = "select id , name , ".$month." from student , ".$course." where student.id = ".$course.".sidand ".$course.".".$month." >= 80 order by ".$month." desc" ; $result = $conn->query($sql);在這段代碼中,創(chuàng)建SQL查詢語句時(shí)使用外鍵關(guān)聯(lián)兩個(gè)數(shù)據(jù)表,從student表和選定的學(xué)科course對(duì)應(yīng)的表中獲取數(shù)據(jù),在查詢數(shù)據(jù)時(shí)使用相關(guān)SQL子句獲取特定條件的數(shù)據(jù),如and ".$course.".".$month." >= 80使所獲取的成績(jī)數(shù)據(jù)必須大于或等于80。然后還需對(duì)所獲取的數(shù)據(jù)進(jìn)行排序,order by ".$month." desc表示結(jié)果以成績(jī)值的大小遞減排序。最后,以表格的形式動(dòng)態(tài)顯示數(shù)據(jù)來顯示最終結(jié)果,效果如圖15所示。其它分?jǐn)?shù)段實(shí)現(xiàn)的方法與此類似。圖15 在某一分?jǐn)?shù)段學(xué)生名單Fig.15 List of Students in A Fraction of The Segment另外,在使用SQL語句查詢數(shù)據(jù)并獲得特定分?jǐn)?shù)段的名單后,可調(diào)用數(shù)據(jù)對(duì)象$result的num_rows成員獲取當(dāng)前分?jǐn)?shù)段的記錄行數(shù),即學(xué)生總數(shù)。如使用$totalNum = $result->num_rows;把符合條件的學(xué)生總數(shù)記錄在變量$totalNum中,然后把所有統(tǒng)計(jì)出來的各分?jǐn)?shù)段人數(shù)據(jù)制作成如圖16所示的表格。圖16 總體情況表格Fig.16 Overall Form點(diǎn)擊圖16中的“查看圖表”,可顯示如圖14所示的條形圖,該條形圖是由PHP創(chuàng)建的動(dòng)態(tài)圖像,相關(guān)技術(shù)實(shí)現(xiàn)見個(gè)人分析功能。(2)個(gè)人分析:個(gè)人分析功能是以學(xué)生個(gè)人為研究對(duì)象,對(duì)其在某學(xué)科多次考試成績(jī)的波動(dòng)情況進(jìn)行分析。使用整體分析功能可以實(shí)現(xiàn)對(duì)學(xué)生個(gè)人成績(jī)?cè)诎嗉?jí)中位置的橫向比較,但整體分析未能反應(yīng)個(gè)人成績(jī)的波動(dòng)情況,不利于掌握學(xué)生個(gè)人學(xué)習(xí)狀態(tài)的變化。個(gè)人分析功能利用GD2函數(shù)庫(kù)與數(shù)據(jù)庫(kù),動(dòng)態(tài)繪制反應(yīng)學(xué)生個(gè)人多次考試成績(jī)波動(dòng)情況的折線圖,如圖17所示。圖17 學(xué)生成績(jī)波動(dòng)折線圖Fig.17 The Line of Student Chievement學(xué)生成績(jī)波動(dòng)圖能根據(jù)學(xué)生的不同,動(dòng)態(tài)生成以學(xué)生自己名字命名的圖表標(biāo)題,并將該學(xué)生在幾次考試的成績(jī)作為圖像有關(guān)坐標(biāo)的數(shù)據(jù),最終繪制成折線圖。實(shí)現(xiàn)該功能,首先連接數(shù)據(jù)庫(kù),獲取學(xué)生的成績(jī)數(shù)據(jù)并以數(shù)組變量$ks存放,主要代碼如下:$conn = db_connect();$sql = "select id, name, ks1, ks2, ks3 from student,".$course." where student.id = ".$course.".sid and student.id = ".$id.""$result = $conn->query($sql);$rows = $result->fetch_row();$stuNam = $rows1; /獲得學(xué)生姓名$ks = $rows2;/1月份考試成績(jī)$ks = $rows3;/2月份考試成績(jī)$ks = $rows4;/3月份考試成績(jī)$ks = $rows5;/3月份考試成績(jī)?nèi)〉脭?shù)據(jù)后,將進(jìn)行繪制圖像步驟。在實(shí)際繪圖之前,提倡先預(yù)定義在繪圖過程中需要經(jīng)常使用的參數(shù),如圖形尺寸、字體和顏色值等,這方便后期調(diào)整和修改,使用有意義的變量名,能夠使代碼更容易閱讀。在準(zhǔn)備工作做完后,使用$im = imagecreatetruecolor($width, $height);創(chuàng)建一個(gè)圖像標(biāo)識(shí)符,利用GD2圖像函數(shù)繪制圖像時(shí)必須有一個(gè)圖像標(biāo)識(shí)符。接著可以開始繪制圖像的框架:/繪制有背景顏色的畫布-給指定大小的矩形填充顏色imagefilledrectangle($im, 0, 0, $width, $height, $bg_color);/給畫布繪制外邊框imagerectangle($im, 0,0, $width-1, $height-1, $line_color); /繪制Y軸imageline($im, $x, $y, $x, $height-$bottom_margin, $line_color);/繪制X軸imageline($im, $x, $height-$bottom_margin, $width-$right_margin, $height-$bottom_margin, $line_color);/繪制圖表標(biāo)題$title = $stuNam."成績(jī)變化表"/取得文字外面的虛框。這一步主要是為了準(zhǔn)確定位標(biāo)題的位置$title_dimensions = imagettfbbox($title_size, 0, $font, $title); $title_length = $title_dimensions2 - $title_dimensions0;$title_x = ($width - $title_length) / 2;/X軸居中$title_y = $y / 2 + 10;/Y軸居中imagettftext($im, $title_size, 0, $title_x, $title_y, $text_color, $font, $title);/把X軸的標(biāo)識(shí)寫入X軸末端靠下位置$title_x = "月份" /X軸標(biāo)識(shí)imagettftext($im, $main_size, 0, $width-$right_margin, $height-($bottom_margin/2), $text_color, $font, $title_x);/把Y軸的標(biāo)識(shí)寫入Y軸頂端偏左位置$title_y = "成績(jī)"/Y軸標(biāo)識(shí)/起始坐標(biāo)要對(duì)照?qǐng)D形慢慢調(diào),/$left_margin/2 $y是基本的值,所加減的數(shù)字只是為了更加美觀、合理imagettftext($im, $main_size, 0, $left_margin/2 +10, $y-18, $text_color, $font, $title_y);以上主要完成了繪制畫布外邊框、坐標(biāo)軸和相關(guān)標(biāo)題,至此圖像的大致輪廓已經(jīng)繪制完畢。為了所繪制的折線圖更容易閱讀,表現(xiàn)更為細(xì)致,系統(tǒng)為圖像繪制了網(wǎng)格,標(biāo)出在坐標(biāo)軸上坐標(biāo)的值。在該圖像的繪制過程中,最重要的是部分是折線圖的繪制,主要代碼如下:$y_length = ($height-$bottom_margin) - $y;/Y軸的總長(zhǎng)度for ($i=1; $i<4; $i+) /設(shè)置前一點(diǎn)的Y坐標(biāo)值$y_begin = $height-$bottom_margin - ($ks$i-1*$y_length)/100; /設(shè)置后一點(diǎn)的Y坐標(biāo)值 $y_end = $height-$bottom_margin - ($ks$i*$y_length)/100; imageline($im, $x + ($i-1)*200, $y_begin, $x + $i*200, $y_end, $zhexian_color); imagettftext($im, $small_size, 0, $x+($i-1)*200 + 5, $y_begin - 5, $miaodian_color, $font, $ks$i-1); /補(bǔ)上最后一個(gè)描點(diǎn),因?yàn)檠h(huán)里沒有實(shí)現(xiàn)$i = 4;$y_begin = $height-$bottom_margin - ($ks$i-1*$y_length)/100;imagettftext($im, $small_size, 0, $x+($i-1)*200 + 5, $y_begin - 5, $miaodian_color, $font, $ks$i-1);根據(jù)圖像的尺寸及位置計(jì)算出坐標(biāo)軸原點(diǎn)的位置,再根據(jù)成績(jī)占滿分100分的比例與在圖像中每一點(diǎn)縱坐標(biāo)占總長(zhǎng)度$y的比例相等這一原理,計(jì)算得出的數(shù)據(jù)點(diǎn)的縱坐標(biāo),橫坐標(biāo)以當(dāng)次成績(jī)所對(duì)應(yīng)的月份為數(shù)據(jù)。然后以該點(diǎn)為線段的起始坐標(biāo),以下一次考試成績(jī)數(shù)據(jù)點(diǎn)作為線段的終止坐標(biāo),結(jié)合循環(huán),便能繪制出折線圖,在循環(huán)里還實(shí)現(xiàn)了在數(shù)據(jù)點(diǎn)的右上方動(dòng)態(tài)打印相對(duì)應(yīng)的成績(jī)值,便于查看圖表時(shí)理解數(shù)據(jù)。通過折線圖,學(xué)生個(gè)人能清楚的看到自己成績(jī)的變化情況,結(jié)合生活實(shí)際,分析成績(jī)上升或下降的原因,總結(jié)成績(jī)上升時(shí)段自己的學(xué)習(xí)方法,以及導(dǎo)致自己成績(jī)下降時(shí)的原因,綜合得出個(gè)人提高成績(jī)的有效途徑,及時(shí)調(diào)整個(gè)人的學(xué)習(xí)計(jì)劃和狀態(tài)。教師也可以通過該功能了解學(xué)生成績(jī),及時(shí)關(guān)心到成績(jī)波動(dòng)較大的學(xué)生,幫助學(xué)生找出成績(jī)不正常波動(dòng)的原因。個(gè)人分析功能無論對(duì)學(xué)生還是老師,都是有益的幫助。4.1.3 界面優(yōu)化為使系統(tǒng)便于使用及美觀,在實(shí)現(xiàn)成績(jī)管理各模塊過程中結(jié)合CSS對(duì)界面進(jìn)行優(yōu)化,例如在功能選擇窗口,對(duì)功能選擇菜單進(jìn)行了優(yōu)化,正常情況下功能選擇菜單如圖18所示,而當(dāng)把鼠標(biāo)移動(dòng)到某一菜單上面時(shí),字體顏色變成藍(lán)色,并有向右下方輕微下沉的效果,顯示如圖19所示。圖19 已選擇菜單Fig.19 The Menu is Selected圖18 未選擇菜單Fig.18 The Menu is Not Selected該優(yōu)化的效果使用CSS中的偽類元素:hover來控制當(dāng)鼠標(biāo)放置到a標(biāo)簽上的樣式實(shí)現(xiàn):a:hover position:relative;top:1px;left:1px;color:blue;在系統(tǒng)的其它模塊也使用了該技術(shù),使系統(tǒng)美觀的同時(shí)給用戶一些提示,便于使用。4.2 系統(tǒng)的安全性能安全、穩(wěn)定的運(yùn)行是WEB應(yīng)用程序的基本要求,同時(shí)也是非常復(fù)雜的工程,本文討論的安全性僅包括兩個(gè)方面:系統(tǒng)服務(wù)器環(huán)境和數(shù)據(jù)的安全性,其它方面的安全性考慮已超出本文的討論范圍。4.2.1 用戶身份驗(yàn)證機(jī)制和個(gè)性化設(shè)置為防止非法用戶入侵本系統(tǒng),導(dǎo)致系統(tǒng)功能的不正常運(yùn)行,系統(tǒng)建立了較為嚴(yán)格的用戶身份驗(yàn)證機(jī)制,針對(duì)不同身份的用戶,系統(tǒng)能進(jìn)行識(shí)別,把用戶導(dǎo)向教師后臺(tái)管理界面或?qū)W生界面。另外,考慮用戶未注冊(cè)或忘記密碼的情況,系統(tǒng)提供注冊(cè)新用戶及密碼重置功能,保證了系統(tǒng)的安全運(yùn)行和完整性。圖20 系統(tǒng)登錄頁面Fig.20 System Login Page用戶在如圖20所示的登錄界面輸入相關(guān)信息并提出登錄請(qǐng)求后,系統(tǒng)利用login()函數(shù)對(duì)用戶信息進(jìn)行匹配,如果數(shù)據(jù)庫(kù)中有該用戶名,并且密碼相匹配,登錄成功,否則登錄失敗,系統(tǒng)給出如圖21所示提示頁面:圖21 登錄出錯(cuò)提示頁面Fig.21 Login Error Message PageLogin()函數(shù)的實(shí)現(xiàn)代碼如下:function login($identity, $username, $passwd) $conn = db_connect();$db_table = identity($identity); / 檢查用戶名和密碼是否匹配 $result = $conn->query("select * from ".$db_table." where name=".$username." and passwd = sha1(".$passwd.")"); if ($result->num_rows>0) return true; else throw new Exception(用戶名或密碼不正確,請(qǐng)重新登錄); 在驗(yàn)證用戶密碼時(shí),為提高數(shù)據(jù)的安全性,使用PHP內(nèi)置sha1()函數(shù),該函數(shù)使用哈希算法對(duì)指定字符串生成固定長(zhǎng)度的字符串,該字符串無法使用軟件破解。用戶注冊(cè)時(shí)使用sha1()函數(shù)生成密碼字符串存儲(chǔ)于數(shù)據(jù)庫(kù)中,用戶登錄驗(yàn)證時(shí)先將用戶輸入的密碼利用sha1()函數(shù)再次生成密碼字符串與數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行匹配。如果登錄成功,使用會(huì)話控制技術(shù),用$_SESSIONvalid_user = $username;為該用戶注冊(cè)一個(gè)會(huì)話變量,利用這個(gè)會(huì)話變量對(duì)用戶進(jìn)行個(gè)性化設(shè)置,在系統(tǒng)的用戶識(shí)別模塊中顯示個(gè)人登錄信息,如圖22所示:圖22 個(gè)性化信息Fig.22 Personalized Information同樣利用會(huì)話控制技術(shù),在系統(tǒng)的其它界面中使用check_valid_user()函數(shù)檢查用戶是否登錄,函數(shù)原型如下:function check_valid_user() if (isset($_SESSIONvalid_user) else / 沒有登錄 do_html_header1(錯(cuò)誤); do_html_main(你還未登錄, ./public_files/login.php, 重新登錄); do_html_footer1(); exit; 在這個(gè)用戶身份驗(yàn)證機(jī)制下,系統(tǒng)能保證為不同用戶顯示不同界面的同時(shí),避免非法用戶使用系統(tǒng)。此外,如果出現(xiàn)用戶忘記密碼的情況,系統(tǒng)提供重置密碼功能,解決的方法是根據(jù)用戶提供的用戶名及對(duì)應(yīng)的身份在數(shù)據(jù)庫(kù)中進(jìn)行匹配,如果用戶確實(shí)已經(jīng)存在,那么利用隨機(jī)函數(shù)生成新的密碼字符串,并調(diào)用mail()函數(shù)通過用戶注冊(cè)時(shí)登記的郵箱通知用戶。實(shí)現(xiàn)的主要代碼如下:function notify_password($identity, $username, $password) $conn = db_connect();/連接數(shù)據(jù)庫(kù)$db_table = identity($identity);/判斷身份$query = "select email from ".$db_table." where name=".$username."" $result = $conn->query($query); if (!$result) throw new Exception(沒有找到E-mail地址。); else if ($result->num_rows = 0) throw new Exception(用戶未注冊(cè)。); else $row = $result->fetch_object();/返回當(dāng)前行 $email = $row->email; $from = "From: 學(xué)生成績(jī)管理系統(tǒng)-陳建康畢業(yè)設(shè)計(jì)作品 admin rn"