版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 第一章 網(wǎng)吧計費管理系統(tǒng)</p><p> 學習目標:能使用Java集成開發(fā)環(huán)境,運用Swing設計圖形界面,運用JDBC訪問數(shù)據(jù)庫,掌握事件處理編程,了解簡單兩層C/S項目的開發(fā)及簡單面向對象程序的設計過程,發(fā)展基本的團隊協(xié)作開發(fā)能力。</p><p> 學習寄語:雖然本項目并不是一個商業(yè)項目,其產(chǎn)品也不能用來賺錢,但從中你可以學到實際開發(fā)中的許多經(jīng)驗和技巧,獲
2、得一種“學有所用”、“學有所得”的成就感,同時贏得老師和同學(同事)對你的格外尊重。在此項目的學習中,你不但是個學生,還是一個職業(yè)人,將與同事一起盡全力完成你所要做的工作,并再次驗證“天道酬勤”的真理。我們的信念是:“不拋棄,不放棄”。你的改變和收獲是老師真誠的期待。</p><p><b> 1.1 背景介紹</b></p><p> 1.1.1 業(yè)務背景<
3、;/p><p> “海之星”網(wǎng)吧,是一個小型網(wǎng)吧,以前是人工記帳,現(xiàn)需要開發(fā)一個簡單的網(wǎng)吧計費管理系統(tǒng)。原人工管理的主要過程如下:客戶在門口服務臺,出示上機卡,若是新客戶則先發(fā)新卡;管理員先查詢是否有空機器,若有則根據(jù)上機卡號查到該卡對應的記錄(賬簿),若有余額(〉5元),則分配一個空閑的機器號給客戶,客戶根據(jù)機器號對號入座,管理員記下客戶卡號、上機機器號、上機時間。客戶下機要到門口的服務臺,請求下機,管理員根據(jù)當
4、前時間、上機時間及費率計算出本次上機費用,并記錄,同時將費用從卡余額中扣除,若費用不夠則需充值。原手工系統(tǒng)主要有如下缺點:1 手工記帳,管理員工作量大,且易出錯;2 超時超費使用不能及時發(fā)現(xiàn)。因此需要開發(fā)一個簡易計費管理軟件,取代人工記帳方式,由軟件統(tǒng)一管理記錄上下機、計費、上機卡、機器情況,提供簡單統(tǒng)計功能,超時超費提醒功能等。</p><p> 1.1.2 技術背景</p><p>
5、 本系統(tǒng)要求使用java技術開發(fā),使用數(shù)據(jù)庫(如ACCESS,SQLServer)保存數(shù)據(jù),集成開發(fā)環(huán)境可使用支持可視化GUI界面設計的主流工具(如eclipse\ant bean\jbuilder)。開發(fā)者應有java程序設計語言、SWING基本GUI組件、文件使用、JDBC存取數(shù)據(jù)庫、使用一種集成開發(fā)工具的基本知識和技能。系統(tǒng)采用兩層C/S體系結構,C端負責通過GUI與管理員交互、處理業(yè)務邏輯及存取數(shù)據(jù)庫,S端主要是數(shù)據(jù)庫系統(tǒng)。系
6、統(tǒng)分析設計主要采用面向對象的分析設計方法。</p><p> 友情提示:對項目有了一個最基本的認識后,是不是立即準備大干一場?是否要問一問值不值得干?能不能干?商業(yè)項目一般可以從經(jīng)濟性、技術性、法律社會等方面進行可行性分析,但本項目作為一個學習型項目顯然無利可圖、技術也欠缺(事實上技術正是要學習的東西)、好在項目是合法的。那是否繼續(xù)?當然!因為本項目的目標不是在合法的前提下獲取最大利潤,而是習得知識和技能,只要
7、你愿意,就可以繼續(xù)進一步了解“網(wǎng)吧計費管理系統(tǒng)”,Let’s go!</p><p><b> 1.2 需求分析</b></p><p> 1.2.1功能需求分析</p><p> 系統(tǒng)需求分析的主要任務是從用戶角度考察系統(tǒng)應具有哪些功能及非功能性需求,對于網(wǎng)吧計費管理系統(tǒng),用戶主要是指系統(tǒng)管理員,系統(tǒng)的主要功能是:登錄、上機、下機、卡
8、管理(發(fā)卡、刪卡、充值、查詢)、機器管理(添加機器、刪除機器、查詢狀態(tài)、修改狀態(tài)),統(tǒng)計功能(日、月費用統(tǒng)計),口令管理(添加用戶、刪除用戶、修改口令),參數(shù)設置(時段費率),使用幫助。主要使用流程是:管理員登錄,根據(jù)客戶請求上機,根據(jù)客戶請求下機。主要功能的用例(use case)描述如下:</p><p><b> 一 上機</b></p><p> 1 管理
9、員輸入空閑機器號,上網(wǎng)人輸入口令、卡號,請求上機。</p><p> 2 系統(tǒng)驗證卡號,檢查卡中余額,卡狀態(tài)</p><p> 3系統(tǒng)獲取當前系統(tǒng)時間作為上機開始時間</p><p> 4 系統(tǒng)修改該機器的使用標志為“在用”,卡標志為“在用”。</p><p> 5 系統(tǒng)記錄上機信息(卡號、機器號、上機時間)</p>&
10、lt;p> 6 系統(tǒng)提示上機成功</p><p> 若1中無空閑機器又請求上機的,系統(tǒng)提示“沒用空閑機器”,</p><p> 2中卡驗證未通過,提示“無此卡號”,余額不足,提示“余額不足”,卡狀態(tài)為“在用”,則提示“不能一卡多用”。</p><p><b> 二 下機</b></p><p> 1 管理
11、員選擇被使用的機器號,請求下機</p><p> 2 系統(tǒng)獲取系統(tǒng)當前時間作為下機時間;</p><p><b> 3 系統(tǒng)計算費用;</b></p><p> 4 系統(tǒng)顯示應繳費用</p><p> 5 系統(tǒng)記錄下機時間和此次費用;</p><p> 6 系統(tǒng)從卡中扣費,修改卡狀態(tài)為“
12、空閑”;</p><p> 7 系統(tǒng)修改該機器的狀態(tài)為“空閑”;</p><p> 8系統(tǒng)顯示本次上機記錄信息,提示下機成功</p><p><b> 三 登錄</b></p><p> 1 管理員輸入用戶名和密碼,請求進入系統(tǒng)</p><p> 2 系統(tǒng)驗證用戶名和密碼</p&g
13、t;<p><b> 3 系統(tǒng)顯示主界面</b></p><p> 若一次驗證不通過,則提示再輸入一次,仍不通過則系統(tǒng)退出。</p><p><b> 四 卡維護</b></p><p> 卡有三種狀態(tài):停用、空閑、在用。</p><p><b> 發(fā)新卡:<
14、/b></p><p> 1 管理員輸入卡號(保證卡號唯一)</p><p> 2 管理員輸入卡初始金額</p><p> 3 上網(wǎng)人輸入用戶名、口令</p><p> 4 管理員請求添加新卡</p><p> 5 系統(tǒng)保存卡號、金額、用戶名和密碼,狀態(tài)為“空閑”</p><p>
15、; 6 系統(tǒng)提示添卡成功,顯示卡號及金額,以便核對。</p><p> 7管理員將系統(tǒng)生成的有卡號、用戶名的紙卡給上網(wǎng)人。</p><p><b> 充值:</b></p><p><b> 1 管理員輸入卡號</b></p><p> 2 系統(tǒng)顯示該卡信息(卡號、用戶名、余額、狀態(tài))&l
16、t;/p><p> 3 管理員核對后,輸入充值金額</p><p> 4 系統(tǒng)計算并保存該卡總金額</p><p> 5 系統(tǒng)顯示充值后的卡信息(卡號、用戶名、余額、狀態(tài))。</p><p><b> 查詢卡信息:</b></p><p> 1 管理員輸入卡號或請求察看所有卡信息</p
17、><p> 2 系統(tǒng)查詢卡信息(卡號、用戶名、余額)并顯示</p><p><b> 刪除卡:</b></p><p><b> 1管理員輸入卡號</b></p><p> 2 系統(tǒng)查詢卡余額及狀態(tài)</p><p> 3 若余額已結清且狀態(tài)為“空閑”,則將該卡信息刪除&
18、lt;/p><p> 4 系統(tǒng)提示刪除成功</p><p> 若有余額或“在用”則不能刪除</p><p><b> 五 機器維護</b></p><p> 機器有三種狀態(tài):停用、空閑、在用。</p><p><b> 添加機器:</b></p><
19、p> 1 管理員輸入機器號,請求添加</p><p> 2 系統(tǒng)驗證機器號是否重復</p><p> 3 系統(tǒng)添加機器記錄信息(機器號、狀態(tài)為“空閑”)</p><p> 4 系統(tǒng)提示添加成功</p><p><b> 刪除機器:</b></p><p> 1 管理員輸入機器號,
20、請求刪除</p><p> 2 系統(tǒng)刪除相應機器信息</p><p> 3 系統(tǒng)提示刪除成功</p><p><b> 查詢機器狀態(tài):</b></p><p> 1管理員輸入機器號或請求察看所有機器信息</p><p> 2 系統(tǒng)查詢并顯示機器信息(機器號和狀態(tài))并顯示</p>
21、;<p><b> 六 管理員口令管理</b></p><p><b> 添加用戶</b></p><p> 1 管理員輸入用戶名、密碼和確認密碼,請求添加</p><p> 2 系統(tǒng)驗證用戶是否是新用戶,兩次輸入的密碼是否相同</p><p> 3 系統(tǒng)添加用戶、密碼信息&
22、lt;/p><p> 4 系統(tǒng)提示添加成功</p><p><b> 刪除用戶</b></p><p> 1 管理員輸入用戶名、密碼</p><p> 2 系統(tǒng)驗證用戶名、密碼是否正確</p><p> 3 系統(tǒng)刪除用戶名、密碼記錄</p><p> 4 系統(tǒng)提示刪
23、除成功</p><p><b> 修改密碼</b></p><p> 1管理員輸入用戶名、密碼,請求修改密碼</p><p> 2 系統(tǒng)驗證用戶名、密碼是否正確</p><p> 3 管理員輸入新密碼、及確認密碼</p><p><b> 4 系統(tǒng)保存新密碼</b>
24、</p><p> 5 系統(tǒng)提示修改成功</p><p><b> 七 統(tǒng)計管理</b></p><p> 1 管理員輸入起始時間(年、月、日),結束時間,請求按日、月、年匯總</p><p> 2 系統(tǒng)查詢上網(wǎng)記錄,計算、統(tǒng)計出時間段的總費用、人次、總上機時間等信息。</p><p&g
25、t; 3 系統(tǒng)顯示上述信息</p><p><b> 八 參數(shù)管理</b></p><p><b> 時段費率設置:</b></p><p> 0 系統(tǒng)顯示當前設置</p><p> 1 管理員設置時間段(時、分)及對應的費率,請求保存</p><p><b
26、> 2 系統(tǒng)保存設置</b></p><p> 3 系統(tǒng)提示保存成功</p><p> 超時報警定時器間隔設置</p><p><b> 九 超時超費報警</b></p><p> 1 設置定時器為周期觸發(fā)方式,觸發(fā)間隔由參數(shù)獲得,默認為30分鐘</p><p> 2
27、 定時器到時,系統(tǒng)查詢當前正在上機的記錄,計算其上機時間及費用,計算其卡中余額是否低于最低費用。</p><p> 3 系統(tǒng)提示已超費卡號、機器號,及超的費用</p><p> 本系統(tǒng)除了功能性需求,還有易用性、可靠性、安全性等要求,可以在實現(xiàn)上述功能性需求的基礎上,進一步實現(xiàn)完善非功能性要求。</p><p> 友情提示:本文使用“用例”法分析功能性需求,屬
28、于面向對象分析(OOA)法,其實質(zhì)就是從用戶角度,通過觀察、與用戶交談等方式,記錄下用戶希望如何使用系統(tǒng),系統(tǒng)相應需要實現(xiàn)哪些功能。分析用戶需求一般由系統(tǒng)分析人員完成,其核心能力是熟練掌握業(yè)務領域的知識和溝通的技巧,需求分析的最大難點在于需求的可變性,最令開發(fā)人員氣餒的莫過于辛苦設計實現(xiàn)了一個功能,用戶突然說不需要這個功能了,另一個常見的問題是隱蔽性的需求(行業(yè)慣例、日常規(guī)則)常被用戶和分析人員忽略。不同的需求對于客戶而言重要性是不同的
29、,一般需要對需求劃分優(yōu)先級,優(yōu)先級高的優(yōu)先設計實現(xiàn)。你能否從上述一到九大用例描述中找出哪些用例是高優(yōu)先級的?</p><p> 1.2.2 業(yè)務對象分析</p><p> 根據(jù)上面的主要用例描述,可以分析出系統(tǒng)的主要業(yè)務對象,它是設計階段核心類圖的基礎(不一定一一對應),這些對象必須實際存在,其行為和屬性應與問題領域相關:</p><p> 1 上網(wǎng)卡: 主要
30、維護上網(wǎng)卡的相關信息??ㄌ?、密碼、余額、卡用戶名、卡狀態(tài)(在用、空閑、停用) </p><p> 2 機器:主要維護上網(wǎng)吧計算機的相關信息。機器號、使用標志(在用、停用、空閑)、備注</p><p> 3 費用記錄:記錄每次上機的信息。記錄編號、卡號、機器號、開始上機時間,下機時間、費用 </p><p> 4 費率記錄:起始時間、終止時間,
31、費率</p><p> 5 管理員: 利用1—4完成各種業(yè)務操作。</p><p> 1.2.3 驗收測試要求</p><p> 用戶要求開發(fā)產(chǎn)品,產(chǎn)品開發(fā)完成后,需要交付用戶驗收,驗收要求常常是合同中的重要組成部分,這是一個必經(jīng)的環(huán)節(jié),主要思路是按照用戶使用的過程測試系統(tǒng),越頻繁使用的功能越要多測試。本系統(tǒng)功能性需求驗收測試的基本要求如下:</p>
32、;<p><b> 前置條件:</b></p><p> 1 除口令表有初始用戶名和密碼外,各庫表為空。</p><p> 2 程序安裝配置正確,能正常啟動運行。</p><p><b> 一 初始化數(shù)據(jù)</b></p><p> 1 啟動程序,進入“卡維護”,選“發(fā)新卡”,
33、輸入一條數(shù)據(jù)記錄,退出,進入“信息瀏覽”,查看記錄是否已被正確加入;退出“信息瀏覽”,再進入“發(fā)新卡”,連續(xù)發(fā)3張卡,其中有張卡余額為0;再進入“信息瀏覽”,查看記錄是否已被正確加入。</p><p> 2 同理按1 ,添加機器。</p><p> 3 進入“費率維護”,設置費率。</p><p><b> 二 功能測試</b></
34、p><p> 1 上下機測試。進入“上機”,觀察上機界面,有無可用機器,按說明操作上機,連續(xù)上機3次,第一次正確輸入,第二次輸入不存在的卡號,第三次輸入錯誤口令;進入“下機”界面,看有無正確的上機,連續(xù)下機兩次。觀察輸出信息界面,看內(nèi)容是否正確(金額、卡號,時間,費用)。已下機器是否已被同步從上機下拉表中清除。再進入“上機”,比對可選空閑機器是否正確,輸入已上機用戶的卡號,觀察結果;輸入卡金額不足的卡號,觀察結果;
35、不輸入任何值,直接按確認的結果。</p><p> 2 統(tǒng)計測試,進入“統(tǒng)計”功能,按日,月,年查詢統(tǒng)計,與庫中實際數(shù)據(jù)比對,不同日、月、年分別查2次</p><p> 3進入“卡維護”,進入“卡充值“,輸入余額不足卡號,給卡充值,進入“信息瀏覽”,查看卡充值是否正確,并以此卡號上機;再進入“卡維護”的“信息瀏覽”,查看記錄;然后選“刪除卡”,連續(xù)刪2張卡,應不能刪除在線卡,并能標識出
36、卡余額,以便清帳;進入“信息瀏覽”,查看記錄是否已被正確刪除。正在上機的不能被刪除。選“修改密碼”,輸入正確的用戶名、口令,修改成新口令;進入“信息瀏覽”,查看口令是否已更改;進入“上機”,以新口令上機。</p><p> 4 同3測試“機器維護”中的刪除機器功能,應不能刪除在線機器</p><p> 5 測試“費率維護”,退出程序,重啟動,進入“費率維護”,修改費率,上下機,觀察費用
37、計算結果。</p><p> 6 測試超時報警功能:發(fā)一張新卡,初始額剛達到最低標準,以此卡上機,為縮短超時等待時間,可設置定時器間隔為1分鐘,等待2分鐘,看系統(tǒng)是否能正確報警。</p><p> 7 測試幫助功能。按照幫助說明使用系統(tǒng),驗證幫助說明的正確性。</p><p> 友情提示:測試是保證程序質(zhì)量的基本手段,一般可分為單元測試、集成測試、系統(tǒng)測試、驗
38、收測試,其中驗收測試一般由用戶在真實的運行環(huán)境下測試系統(tǒng),是用戶確認系統(tǒng)符合要求的關鍵環(huán)節(jié),你開發(fā)的系統(tǒng)必須通過上述最基本的驗收測試。并不是整個系統(tǒng)完成后才可以進行上述測試,完成相應模塊后就可以有針對性地測試,驗收測試的內(nèi)容經(jīng)過分解后是單元測試、集成測試、系統(tǒng)測試的基本依據(jù),測試工作并不是從編碼時才開始的,在需求分析階段就已展開(如根據(jù)用例提出驗收測試要求)。有的IT公司內(nèi)部的質(zhì)量部門在產(chǎn)品正式交付用戶前,也會做類似的測試,以保證用戶驗
39、收時一次通過。</p><p><b> 1.3 系統(tǒng)設計</b></p><p> 1.3.1 總體設計</p><p><b> 一 系統(tǒng)體系結構</b></p><p> 一般要確定系統(tǒng)的體系結構,主要模塊,系統(tǒng)運行環(huán)境(如操作系統(tǒng)、數(shù)據(jù)庫),開發(fā)平臺及語言。本系統(tǒng)主要運行在windo
40、ws系列平臺上,數(shù)據(jù)庫使用ACCESS,使用eclipse開發(fā)系統(tǒng)。采用兩層C/S體系結構。系統(tǒng)體系結構圖如下圖所示:</p><p><b> 圖1 系統(tǒng)體系結構</b></p><p> 客戶端分3層,圖形界面層(采用java的SWING設計)負責與用戶交互,業(yè)務邏輯層則根據(jù)用戶的請求執(zhí)行各種功能(如上、下機等),數(shù)據(jù)訪問層主要根據(jù)業(yè)務邏輯層的請求通過JDBC
41、/SQL存取數(shù)據(jù)庫。數(shù)據(jù)庫使用ACCESS,可根據(jù)情況使用其他數(shù)據(jù)庫(如SQL Server),客戶端基本不做修改,僅有的少量修改也只在數(shù)據(jù)訪問層。客戶端與服務端在物理上可以運行在一臺機器上,也可以分別運行在不同機器上。</p><p> 二 系統(tǒng)功能模塊及主要類</p><p> 系統(tǒng)的主要功能模塊如圖2所示:</p><p><b> 圖2 系統(tǒng)
42、模塊圖</b></p><p> 可據(jù)此設計菜單,劃分模塊。</p><p><b> 系統(tǒng)主要類圖如下:</b></p><p><b> 圖 3</b></p><p> 總類圖的畫法基本遵循視圖層、業(yè)務邏輯層、數(shù)據(jù)模型及數(shù)據(jù)庫訪問層的自上而下的順序,其中視圖層中的視圖因為較
43、多未畫出,主要的業(yè)務邏輯控制類是BusinessManager,用戶的上下機請求,通過界面的事件機制,在事件處理程序中會調(diào)用BusinessManager中的方法,然后再調(diào)用xDAO類方法,在xDAO類中一般先通過DBConnection獲取連接,再通過JDBC/SQL訪問數(shù)據(jù)庫。Card\Computer\Record\Manager類是“值對象”,主要是存放相應的屬性,方法也是setX\getX類方法,“值對象”常作為參數(shù)在各種方法
44、中傳遞。</p><p><b> 三 經(jīng)驗共享</b></p><p> 1 客戶端基本采用三層結構(視圖View、控制Controller、模型Mode),層與層間耦合性較小,提高了整體的可擴展性、可重用及抗變動能力。缺點是要求預先設計好,對設計水平要求高,不過一旦形成模式,養(yǎng)成習慣,能“照葫蘆畫瓢”,也是提高設計水平的捷徑。</p><p
45、> 2 使用xDAO類將業(yè)務邏輯和數(shù)據(jù)庫訪問隔離,只要xDAO對上提供的接口不變,以后數(shù)據(jù)庫存取代碼發(fā)生改變也不會影響上層代碼(如業(yè)務邏輯層)。接口中的參數(shù)主要是“值對象”,這樣即使Card\Computer\Record\Manager類中的屬性發(fā)生改變,由于“值對象”的封裝,對接口的影響也不大,缺點是如果“值對象”本身很大,而又只用到其中很少的屬性,則對性能和內(nèi)存浪費較大。與此對應,比較一般的設計是在事件處理代碼中就實現(xiàn)業(yè)務
46、邏輯(如驗證、計算、上下機)、</p><p> 獲取數(shù)據(jù)庫連接并通過JDBC訪問數(shù)據(jù)庫,這樣做的好處是實現(xiàn)較容易、符合一般過程性思維(常用于初始的或原型系統(tǒng)的開發(fā)中),缺點是代碼一旦需要修改,則改動較多、且容易出錯,代碼重用性差。</p><p> 3 使用DBConnection類統(tǒng)一完成連接的獲取和釋放,好處是連接部分代碼可重復使用,如果連接參數(shù)(如連到不同的數(shù)據(jù)庫)改動,只需更
47、改DBConnection類中的相關參數(shù)屬性(當然更好的做法是將這些連接參數(shù)放在配置文件中,這樣可以只修改配置文件,無需修改程序),另外還可以為了提高性能擴展成“連接池”,同時對使用它的xDAO類沒有影響。</p><p> 友情提示:如果你不能理解上述描述,也不必擔心,按照你的直覺去開發(fā)系統(tǒng),如果你一帆風順,那么你肯定是這方面的天才,如果遇到各種問題,上述的文字可供參考,同學之間可以互相交流,老師也樂意為你效
48、勞,勤思、善問、實干是快速提高水平的不二法門。</p><p> 1.3.2 詳細設計</p><p> 詳細設計主要是關注模塊一級的設計,一般有界面,核心算法及處理流程,數(shù)據(jù)庫表(表、屬性及表間關系)的設計。由于模塊較多,下面選擇幾個典型模塊分析設計,其中“經(jīng)驗共享”,揭示難點的同時,也介紹了相應的解決方法及設計經(jīng)驗。</p><p> 1.3.2.1 數(shù)據(jù)
49、庫設計</p><p> 數(shù)據(jù)庫設計主要是根據(jù)分析和概要設計中發(fā)現(xiàn)的對象和類,確定哪些對象需要持久保存,然后將對象屬性及對象間關系轉化成關系表。經(jīng)過分析Card、Computer、Record、Manger需要保存在數(shù)據(jù)庫中,將Config參數(shù)配置信息保存在文件中。其中Card、Computer、Record的關系如下圖所示:</p><p> 圖 持久對象屬性及關系圖</
50、p><p> 一條Record記錄必有對應的一個Card及一臺Computer,對于未用機器及卡,則沒有對應的記錄。將其轉換為關系表時,關鍵是在Record中設置CARDID,COMPUTERID作為外鍵指向Card和Computer。共設計出四張表:</p><p><b> 1.CARD 表</b></p><p> 2.COMPUTER
51、 表</p><p> 3.RECORD 表</p><p> 4. Manager 表</p><p> 經(jīng)驗共享:數(shù)據(jù)庫設計一般相對獨立,采用的主要方法是將對象模型轉化為數(shù)據(jù)庫關系模型,也可以采用傳統(tǒng)的設計出E-R圖,再定關系表的方法。即使是簡單數(shù)據(jù)庫的設計若從實用角度出發(fā)也需要考慮多方面的問題。首先基本的是確定有哪幾張表,表間關系,然后是表中的字段,比較
52、麻煩的是確定字段的約束(主鍵、非空等),字段數(shù)據(jù)類型,范式的調(diào)整等,因為此時會考慮到存儲空間、性能、易編程、數(shù)據(jù)質(zhì)量等方面的因素。</p><p> 如定義“用戶名”字段要有多大,就需要在存儲空間節(jié)省和適應性間權衡,定義的較小,遇到長名字的情況,程序不能適應;定義的過大,對于大多數(shù)情況可能又會浪費存儲空間,一般寧愿定義的大些,以空間換取適應性。</p><p> 再比如確定哪些字段為“
53、非空”,從編程角度看必須保證“非空”字段有值,這會增加驗證“非空”字段程序的代碼量,對用戶的約束也加強,有些值要求用戶必須輸入,如口令就不能為空。但若允許字段可以為“空”,如機器狀態(tài)字段,則機器的當前狀態(tài)就可能難以確定,影響數(shù)據(jù)質(zhì)量。一個基本的方向是“約束”多,則編程的代碼量會變大,性能會下降,但數(shù)據(jù)的質(zhì)量會得到提高。在Record表中“下機時間”和“上機費用”沒有定義為“非空”,是因為上機時這兩項不能確定,只能填寫部分上機記錄信息。&
54、lt;/p><p> 一般數(shù)據(jù)庫表結構的變動對于程序的影響較大,在程序設計上可通過xDAO類盡量消減變動的影響,在實現(xiàn)階段應避免對數(shù)據(jù)庫結構大的改動。</p><p> 1.3.2.2 上機模塊設計</p><p><b> 一 界面設計</b></p><p> 界面設計主要是根據(jù)功能要求構建界面,界面中的每個元素
55、均應有其作用,以支持功能的實現(xiàn),界面設計還要考慮到界面風格的一致、符合一般window應用GUI的規(guī)范。設計應簡潔實用,避免在細節(jié)上(如字體、顏色)耗費時間。上機模塊參考界面如圖4所示:</p><p><b> 圖4 參考界面</b></p><p><b> 二 上機流程</b></p><p><b>
56、 1 初始化</b></p><p><b> (1) 顯示界面</b></p><p><b> ?。?)獲取空閑機器</b></p><p> ?。?) 將空閑機器號加入下拉列表</p><p><b> 2 上機處理過程:</b></p>
57、<p> (1)驗證機器號、卡號、密碼是否為空</p><p> ?。?)根據(jù)卡號、密碼獲取卡對象</p><p> ?。?) 若卡對象為空則說明卡號或密碼錯,給出提示“卡號或密碼錯”,要求重輸</p><p> ?。?)判斷卡狀態(tài),若卡正在使用則給出提示“不能一卡多用”</p><p> ?。?)計算卡中余額,若低于設定值,則提
58、示“余額不足”</p><p> ?。?)修改卡狀態(tài)為在用,修改機器狀態(tài)為在用,獲取上機時間,將上機時間、機器號、卡號保存到記錄對象,再通過RecordDAO在庫中添加一條新上網(wǎng)記錄。</p><p><b> ?。?)提示上網(wǎng)成功</b></p><p><b> 三 經(jīng)驗共享</b></p><p
59、> 1 上機處理中的第6步要在一個完整的“事務”中完成,對卡、記錄、機器數(shù)據(jù)的更改添加要保證要么全部更改成功,要么都不更改,以保證數(shù)據(jù)的一致性。</p><p> 2 費用計算是按時段計算的,需要考慮跨時段費用如何計算,另外為了降低復雜性,可規(guī)定時段只能為三段,時間精確到分,費用精確到角。</p><p> 3 記錄ID如何保證唯一且自動增長。基本有兩種:一是編程控制,插入新記
60、錄前獲取當前最大記錄號,通過select max(id) from record,加1后,將ID及其它信息寫入,若有多用戶訪問該表,則上述過程要放在一個“事務”中。二是利用關系數(shù)據(jù)庫提供的“自增字段”特性,將ID設置成“自增字段”,由數(shù)據(jù)庫負責每添加一條記錄就將ID加1。</p><p> 1.3.2.3 下機模塊設計</p><p><b> 一 界面設計</b>
61、;</p><p> 下機模塊主要根據(jù)用戶請求(報出卡號/機器號),管理員根據(jù)卡號/機器號執(zhí)行下機操作,參考界面如圖5所示,大的文本空白文本框用于顯示下機記錄信息。當然還有其它的設計方式,如顯示當前上機的所有記錄信息,選中其中一條執(zhí)行下機操作。</p><p> 圖 5 下機模塊界面</p><p><b> 二 下機流程</b><
62、/p><p> 1 管理員輸入機器號或卡號,請求下機</p><p> 2 系統(tǒng)獲取機器號,據(jù)機器號獲取相應記錄對象,要處理機器號錯誤的情況</p><p> 3 系統(tǒng)根據(jù)記錄對象獲取該記錄對應的卡對象</p><p> 4 系統(tǒng)計算費用,并比較卡對象余額,若不夠則提示“余額不足”,并顯示余額</p><p>
63、5 系統(tǒng)從卡中扣費,修改卡狀態(tài)為“空閑”; 系統(tǒng)修改該機器的狀態(tài)為“空閑”;系統(tǒng)更新記錄信息(下機時間、費用)。</p><p> 6 系統(tǒng)顯示本次上網(wǎng)完整的記錄(Record)信息及卡余額,并提示下機成功</p><p> 注: 下機處理4中修改三表的操作應作為一個“事務”完成。</p><p> 1.3.2.4 發(fā)新卡模塊設計</p><
64、;p><b> 一 界面設計</b></p><p> 發(fā)卡需要輸入卡號、用戶名、密碼、金額,參考界面如下圖所示。界面設計布局應簡潔一致,從用戶友好性出發(fā),提供了輸入提示,增加了“確認密碼”,以提醒用戶記住密碼,輸入的密碼用*號顯示以提高安全性。雖然有了提示但在代碼中仍需對輸入進行驗證,如金額不能為負值,以避免誤輸及惡意輸入。當然從口令強度考慮,要求密碼只輸入數(shù)字和字母又是不妥的,
65、相反可提示用戶輸入特殊字符及輸入的最小字符數(shù)。所以此界面雖簡單,但已涉及到界面的視覺風格、用戶友好性、安全性考慮。</p><p><b> 圖 發(fā)卡界面</b></p><p><b> 二 發(fā)卡流程</b></p><p> 1 系統(tǒng)從界面獲取所有信息,依次判斷是否為空</p><p>
66、 2 判斷金額是否大于0</p><p> 3 判斷密碼和確認密碼是否一致,</p><p> 4 判斷密碼和用戶名是否在最小及最大長度之間</p><p> 5 判斷卡號是否有效(唯一)</p><p> 6 生成Card對象,請求CardDao向Card表中添加一條新記錄。</p><p> 7 提示卡
67、添加成功,并顯示卡號和金額</p><p><b> 三 經(jīng)驗共享</b></p><p> 1 輸入數(shù)據(jù)的驗證是難點,驗證輸入數(shù)據(jù)是保證程序可靠性的重要措施,例如:若不限制用戶或口令長度在相應數(shù)據(jù)庫表字段設定的范圍內(nèi),一旦將超長的用戶名寫入數(shù)據(jù)庫則會產(chǎn)生數(shù)據(jù)被截斷或數(shù)據(jù)庫異常,而這完全可以在用戶輸入時予以控制。驗證輸入數(shù)據(jù)的難點之一在于在驗證的代碼量和限制大多數(shù)
68、常見錯誤間取得平衡,過多地驗證代碼無疑會增加編碼量和難度,但沒有驗證或很少驗證又使程序可靠性太差而難以實用。但也有一些常規(guī)經(jīng)驗可循,如是否限定字符數(shù)據(jù)的長度,驗證是否為空、數(shù)字數(shù)據(jù)是否在范圍內(nèi)等,有些輸入控件提供了限定輸入長度等功能,應該充分利用以減少編碼量。</p><p> 一般驗證可遵循如下策略:輸入前提示如何輸入,輸入后驗證,驗證不通過則再提示(如通過對話框)。輸入驗證的時機:可以在輸入一項后立即驗證該
69、項輸入是否合法,也可以全部輸完后再逐項驗證,某項若驗證不通過,除給出提示,從用戶友好性角度,還可以將焦點定位到出錯項(缺點是代碼復雜性增加)。驗證通過后的數(shù)據(jù)在程序內(nèi)部傳遞時,一般無需重復驗證。</p><p> 2 卡號的獲取。最基本的方式由管理員手工編號并保證卡號的唯一性,但卡一旦多了,這會成為管理員的負擔,因此,可以由系統(tǒng)自動編號,如規(guī)定卡號從1依次遞增編號,這樣卡號就無需輸入??稍诿看卧黾有驴〞r,從卡表
70、中獲取最大ID,加1后作為新增卡的卡號。也可以獲取當前時間轉化成字符串作為ID,一般時間不會重復,可保證ID唯一,優(yōu)點是生成ID無需訪問數(shù)據(jù)庫,還可以代表發(fā)卡時間。</p><p><b> 刪除卡模塊設計</b></p><p><b> 一 界面設計</b></p><p> 刪除卡參考界面如下圖所示:</
71、p><p><b> 圖 刪除卡界面</b></p><p><b> 二 刪除卡流程</b></p><p><b> 1管理員輸入卡號</b></p><p> 2 系統(tǒng)根據(jù)卡號,請求CardDAO查詢有無該卡</p><p> 3 若返回的卡
72、對象存在,則執(zhí)行下一步,否則提示“卡號錯誤”,要求重輸。</p><p> 4 系統(tǒng)從Card查詢卡狀態(tài)</p><p> 5 若為“在用”,則提示“不能刪除在用卡”</p><p> 6 查詢余額,若有則對話框提示“請結清余額”</p><p> 7 若余額已結清且狀態(tài)為“空閑”,則將該卡信息刪除</p><p&
73、gt;<b> 8系統(tǒng)提示刪除成功</b></p><p><b> 三 經(jīng)驗共享</b></p><p> 1 如何刪除卡:一種是真刪,卡記錄信息從數(shù)據(jù)庫中永久刪除,采用delete from where 語句,此時還要注意,由于Record中有指向Card表的外鍵,刪除涉及到“級連刪除”這一概念,即在Record中包含該卡號的記錄是否要
74、一起刪除。一般不允許“級連刪除”,因為Record中記錄是統(tǒng)計費用的基本依據(jù),刪除后會使統(tǒng)計數(shù)據(jù)失真。還有一種是假刪,即標注卡狀態(tài)信息為“停用”,只需用update語句更改其狀態(tài)即可,這樣做好處是:一是可以完整保留已發(fā)卡信息,二是易于重新恢復已刪卡。壞處是:若有大量卡(數(shù)以十萬計)長期不用,會占用數(shù)據(jù)庫空間,影響訪問卡表的性能。</p><p> 2 一般數(shù)據(jù)庫中數(shù)據(jù)刪除后難以恢復,同時難以避免因為意外導致的數(shù)
75、據(jù)損壞,因此重要數(shù)據(jù)的保存?zhèn)浞荼夭豢缮?,本系統(tǒng)沒有要求做數(shù)據(jù)備份功能,因為數(shù)據(jù)庫管理工具一般會提供相應功能,只是要求用戶會使用數(shù)據(jù)庫管理工具,所以從方便用戶使用考慮,程序本身提供備份(手動或定期自動備份)功能也是必要的。</p><p><b> 1.4 系統(tǒng)實現(xiàn)</b></p><p> 系統(tǒng)實現(xiàn)主要運用集成開發(fā)環(huán)境、Java、數(shù)據(jù)庫工具根據(jù)設計制做出實際的界面
76、,編寫代碼,生成數(shù)據(jù)庫表,進行測試,這也是初級程序員所要完成的主要任務,在此列出部分典型代碼,僅供參考。</p><p> 1.4.1 數(shù)據(jù)庫訪問</p><p> 對數(shù)據(jù)庫的基本操作是:增、刪、改、查,數(shù)據(jù)庫連接的建立、關閉,其中的難點是訪問數(shù)據(jù)庫的異常處理和參數(shù)化SQL,現(xiàn)舉例如下:</p><p> 1 獲取連接的代碼:</p><p
77、> private static final String DRIVER_CLASS =</p><p> "sun.jdbc.odbc.JdbcOdbcDriver"; //定義驅動類</p><p> private static final String DATASOURCE = "jdbc:odbc:NetBarDataSource&qu
78、ot;; //定義ODBC數(shù)據(jù)源</p><p> public static Connection getConnction() {</p><p> Connection dbConnection = null;</p><p><b> try {</b></p><p> Class.forName(D
79、RIVER_CLASS);</p><p> dbConnection = DriverManager.getConnection(DATASOURCE);</p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p><b> }</b&
80、gt;</p><p> return dbConnection;</p><p><b> }</b></p><p> 該代碼針對JdbcOdbcDriver驅動,ODBC源名為NetBarDataSource,未支持口令驗證。 </p><p><b> 查詢代碼:</b></p
81、><p> 下面是根據(jù)用戶名和口令驗證卡是否有效的代碼,需要注意的是查詢參數(shù)值需要加單引號‘’:</p><p><b> /**</b></p><p> * judge card is valid or not.</p><p> * @param card Card</p><p>
82、* @return boolean</p><p><b> */</b></p><p> public boolean isValid( Card card) {</p><p> boolean isValid = false;</p><p> Connection dbConnection = nul
83、l;</p><p> PreparedStatement pStatement = null;</p><p> ResultSet res = null;</p><p><b> try {</b></p><p> dbConnection = ConnectionManager.getConnction
84、();</p><p> // 構建查詢SQL語句</p><p> String strSql = "select * from card where id='" + card.getId()</p><p> + "' and password ='" + card.getPassword()
85、 + "'";</p><p> if (dbConnection != null) {</p><p> System.out.println(dbConnection != null);</p><p><b> }</b></p><p><b> //查詢操作<
86、/b></p><p> pStatement = dbConnection.prepareStatement(strSql);</p><p> res = pStatement.executeQuery();//執(zhí)行SQL語句,并返回結果</p><p> if (res.next()) { //若res有記錄說明卡存在</p>
87、<p> isValid = true;</p><p><b> }</b></p><p> } catch (SQLException sqlE) {</p><p> sqlE.printStackTrace();</p><p> } finally {</p><p&g
88、t; ConnectionManager.closeResultSet(res);//關閉結果集</p><p> ConnectionManager.closeStatement(pStatement); ConnectionManager.closeConnection(dbConnection); //關閉連接</p><p><b> }</b>
89、;</p><p> return isValid;</p><p><b> }</b></p><p><b> 更新代碼</b></p><p> 下面是更新機器狀態(tài)的代碼,其中SQL語句中,“id =(?)”是動態(tài)參數(shù),具體值設置在pStatement.setString(1, co
90、mputer.getId())</p><p><b> /**</b></p><p> * record the computer have used.</p><p> * @param computer Computer</p><p><b> */</b></p>
91、<p> public void updateOnUse( Computer computer) {</p><p> Connection dbConnection = null;</p><p> PreparedStatement pStatement = null;</p><p><b> try {</b><
92、;/p><p> String strSql =</p><p> "update computer set Status =1 where id =(?) ; ";</p><p> pStatement = dbConnection.prepareStatement(strSql);</p><p> pState
93、ment.setString(1, computer.getId()); //設置機器號id參數(shù)</p><p> pStatement.executeUpdate();</p><p> } catch (SQLException sqlE) {</p><p> sqlE.printStackTrace();</p><p> }
94、 finally {</p><p> ConnectionManager.closeStatement(pStatement);</p><p> ConnectionManager.closeConnection(dbConnection);</p><p><b> }</b></p><p><b&g
95、t; }</b></p><p> 1.4.2 下機模塊</p><p> 在BusinessManager類中有一doCheckOut()方法是實現(xiàn)下機過程的關鍵。</p><p><b> /**</b></p><p> * do check out business.</p>
96、<p> * @param rec Record,已有機器號值</p><p> * @return ComsumeDisplayInfo含有上機記錄、對應卡記錄</p><p><b> */</b></p><p> public static ComsumeDisplayInfo doCheckOut( Record r
97、ec) {</p><p> RecordDAO dao = new RecordDAO();</p><p> //獲取包含了下機記錄及對應卡信息的ComsumeDisplayInfo</p><p> ComsumeDisplayInfo result = dao.getStopCompouterRelationInfo(rec);</p>
98、<p> Record record = result.getRecord();</p><p> Card card = result.getCard();</p><p> //計算本次上機的費用</p><p> int fee = calFee(record.getBeginTime(), record.getEndTime());<
99、/p><p> record.setFee(fee);</p><p><b> //計算余額</b></p><p> int balance = card.getBalance() - fee;</p><p> card.setId(record.getCardId());</p><p&g
100、t; card.setBalance(balance);</p><p> //將數(shù)據(jù)寫入數(shù)據(jù)庫</p><p> RecordDAO dao2 = new RecordDAO();</p><p> dao2.doCheckOutDB(record, card);</p><p> //返回含有上機記錄、CARD記錄的Comsum
101、eDisplayInfo,供界面顯示下機結果</p><p> result.setRecord(record);</p><p> result.setCard(card);</p><p> return result;</p><p><b> }</b></p><p> 1.4
102、.3 上機模塊</p><p> 處理請求上機的部分代碼如下,主要有界面數(shù)據(jù)(機器號、密碼、卡用戶號)驗證代碼;卡有效性、余額可用性驗證。</p><p><b> /**</b></p><p> * deal business about click confirm button.</p><p> * @p
103、aram e ActionEvent</p><p><b> */</b></p><p> void confirmButton_actionPerformed(ActionEvent e) {</p><p> String cardId="";</p><p> String pass
104、wordtemp = "";</p><p> String computerId ="";</p><p> //獲取機器號,并去掉空格</p><p> cardId = cardIdTextField.getText().trim();</p><p><b> //獲取密碼&l
105、t;/b></p><p> for(int i=0;i<passwordFiled.getPassword().length;i++){</p><p> passwordtemp += passwordFiled.getPassword()[i];</p><p><b> }</b></p><p&g
106、t;<b> //獲取機器號</b></p><p> computerId = computerIdCombox.getSelectedItem().toString();</p><p> //判斷機器號是否為空,未填或只有空格 </p><p> if(computerId==null || computerId.trim()
107、.length()==0){</p><p> JOptionPane.showMessageDialog(this,"請選擇機器號!","警告",</p><p> JOptionPane.WARNING_MESSAGE ,null );</p><p><b> return ;</b><
108、/p><p><b> }</b></p><p> /判斷卡號是否為空,未填或只有空格</p><p> if(cardId==null || cardId.length()==0){</p><p> JOptionPane.showMessageDialog(this,"請輸入卡號!",&q
109、uot;警告",</p><p> JOptionPane.WARNING_MESSAGE ,null );</p><p><b> return ;</b></p><p><b> }</b></p><p> if(passwordtemp==null || passwor
110、dtemp.length()==0){</p><p> JOptionPane.showMessageDialog(this,"請輸入密碼!","警告",</p><p> JOptionPane.WARNING_MESSAGE ,null );</p><p><b> return ;</b>
111、</p><p><b> }</b></p><p> //生成卡對象,并設置卡用戶名、口令、上機時間</p><p> Card card = new Card();</p><p> card.setId(cardId);</p><p> card.setPassword(pas
112、swordtemp);</p><p> Record record = new Record();</p><p> record.setCardId(cardId);</p><p> record.setComputerId(computerId);</p><p> record.setBeginTime(dispalyNow
113、Time);</p><p> //生成機器對象,更新機器狀態(tài)時用</p><p> Computer computer = new Computer();</p><p> computer.setId(computerId);</p><p> //驗證卡是否有效、余額是否夠,符合要求后調(diào)doCheckIn實際處理上機業(yè)務<
114、/p><p> if(BusinessManager.cardIsValid(card)){</p><p> if(BusinessManager.cardHaveBalance(card)){</p><p> BusinessManager.doCheckIn(record,computer);</p><p><b>
115、}else{</b></p><p> JOptionPane.showMessageDialog(this,"卡余額不足,請充值!","警告", JOptionPane.WARNING_MESSAGE ,null );</p><p><b> r
116、eturn ;</b></p><p><b> }</b></p><p><b> }else{</b></p><p> JOptionPane.showMessageDialog(this,"卡號或者密碼不對!","警告",</p><p
117、> JOptionPane.WARNING_MESSAGE ,null );</p><p> System.out.println("卡號或者密碼不對");</p><p><b> return;</b></p><p><b> }</b></p><p>
118、 1.4.4 幫助模塊</p><p> 在實現(xiàn)幫助功能時,編碼上沒有難點,基本上是一個簡單的帶滾動條的只讀文本瀏覽器,難在幫助文件的內(nèi)容如何寫?幫助文件是指導用戶如何操作系統(tǒng)的,內(nèi)容應正確,語言應對客戶簡明易懂,最好輔以圖形說明。做到這兩點并不容易,內(nèi)容正確要求寫幫助的人對系統(tǒng)的功能非常熟悉,簡明易懂則充分體現(xiàn)出作者的文字功底。建議參考類似“記事本”(winodws主菜單-〉所有程序-〉附件-〉記事本)這樣的
119、程序,看它們的幫助是如何寫的。</p><p> 友情提示:客戶會根據(jù)幫助說明來使用系統(tǒng),系統(tǒng)功能正確,但因為幫助說明錯誤導致的問題甚至官司比比皆是,所以在通過基本的驗收測試后,老師會按照你寫的幫助來使用系統(tǒng),進而測試幫助文檔的正確性。</p><p><b> 1.5 小結</b></p><p> 經(jīng)過日夜奮戰(zhàn),終于做出了系統(tǒng),通過了
120、驗收和答辯,雖然有點難熬,但終于熬過來了,是不是可以松一口氣或是慶祝一下?請不要忘記老師對你的期待,期待你的改變和收獲,做一件事情和沒做這件事情結果都一樣將是我們共同的失敗,請寫下你所做的工作,發(fā)現(xiàn)了哪些問題?如何解決的?有哪些經(jīng)驗和教訓?不應局限于技術,只要是與項目相關的屬于自己的思考和想法都可以寫下來,請牢記,你的意見(教學內(nèi)容、教學方式方法、考核方式、解決問題的方式等方面)是對老師最好的獎勵,經(jīng)過深思熟慮的寶貴意見還將是你在本項目
121、中最終取勝的法寶。</p><p><b> 1.6 展望</b></p><p> 本系統(tǒng)是一個簡單的網(wǎng)吧計費管理系統(tǒng),無論在功能上還是使用方式上,與現(xiàn)實中的網(wǎng)吧管理系統(tǒng)相比仍有較大差距,但本系統(tǒng)可進一步擴展成實用的系統(tǒng),并且大部分代碼(業(yè)務邏輯、數(shù)據(jù)庫及存取部分)可以重用。其中從技術角度看實際的系統(tǒng)一般是一個由多客戶端(上網(wǎng)機)、單服務器(管理員機)及數(shù)據(jù)庫構
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)吧收費管理系統(tǒng)畢業(yè)設計
- 畢業(yè)設計--《網(wǎng)吧收費系統(tǒng)》
- 畢業(yè)設計--《網(wǎng)吧收費系統(tǒng)》
- vb畢業(yè)設計--《網(wǎng)吧收費系統(tǒng)》
- 畢業(yè)設計---網(wǎng)吧管理系統(tǒng)
- 網(wǎng)吧管理系統(tǒng)畢業(yè)設計
- 畢業(yè)設計---網(wǎng)吧計費管理系統(tǒng)
- 門診收費管理系統(tǒng)畢業(yè)設計
- 畢業(yè)設計---網(wǎng)吧組網(wǎng)與管理
- java圖書管理系統(tǒng)畢業(yè)設計
- 畢業(yè)設計---基于java用戶管理系統(tǒng)
- 學校用電收費管理系統(tǒng)畢業(yè)設計
- java學生管理系統(tǒng)畢業(yè)設計論文
- java家政服務管理系統(tǒng)畢業(yè)設計
- java畢業(yè)設計學藉管理系統(tǒng)
- 門診收費管理系統(tǒng)畢業(yè)設計畢業(yè)論文
- 基于java的餐飲管理系統(tǒng)畢業(yè)設計
- [java畢設]java圖書管理系統(tǒng)畢業(yè)設計+源碼
- java藥品管理系統(tǒng)設計-畢業(yè)設計(論文)
- 畢業(yè)設計---收費站智能管理系統(tǒng)
評論
0/150
提交評論