版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、引言1.1開發(fā)背景成都理工大學(xué)金工實習(xí)基地實驗室情況簡介:本實驗室主要是機(jī)械相關(guān)專業(yè)及部分非機(jī)械專業(yè)學(xué)生進(jìn)行機(jī)械加工實習(xí)的場所,學(xué)生按提前的報名順序分組同時進(jìn)行機(jī)械加工實習(xí),加工完成后指導(dǎo)老師要根據(jù)學(xué)生的實際實習(xí)表現(xiàn)及學(xué)生此次完成的機(jī)械產(chǎn)品給予相應(yīng)的成績,并登記存儲以供以后處理。每位學(xué)生都各有一本本人機(jī)械實習(xí)成績的成績記錄手冊、該手冊由金工基地管理員統(tǒng)一管理,由相應(yīng)指導(dǎo)教師錄入分?jǐn)?shù)。這種方式只能應(yīng)用于同時實習(xí)學(xué)生人數(shù)不多時,若實習(xí)學(xué)生人數(shù)較多這種方法比較雜亂,且學(xué)生成績數(shù)據(jù)不易于長期保存和管理,也不易于后期的處理。本軟件開發(fā)的目的正是為改變這種現(xiàn)狀,從純?nèi)斯し绞睫D(zhuǎn)變?yōu)橛糜嬎銠C(jī)軟件來管理數(shù)據(jù),可
2、以方便指導(dǎo)老師將每天實習(xí)學(xué)生的實習(xí)成績輸入計算機(jī)進(jìn)行存儲,不用查找每位學(xué)生的成績記錄手冊,可以減輕指導(dǎo)老師的工作量,同時還可以應(yīng)用計算機(jī)在數(shù)據(jù)處理方面的優(yōu)勢方便快速的對數(shù)據(jù)進(jìn)行后期處理,例如:在每周或每學(xué)期結(jié)束時,實習(xí)主管要按學(xué)校的要求對本學(xué)期的學(xué)生成績數(shù)據(jù)進(jìn)行相應(yīng)處理,比如:(1).查詢沒有按時完成本學(xué)期實習(xí)的學(xué)生名單,(2).計算學(xué)生實習(xí)平均成績,(3).對本學(xué)期的實習(xí)情況進(jìn)行統(tǒng)計以對下學(xué)期教學(xué)進(jìn)行安排等。 每天實習(xí)的學(xué)生人數(shù)在100-200人次,即相應(yīng)每天有100-200人次的學(xué)生數(shù)據(jù)要輸入計算機(jī)儲存,每天會有不同的課程同時進(jìn)行,所以會有數(shù)位教師同時輸入學(xué)生實習(xí)成績,每學(xué)期的數(shù)據(jù)總量不是
3、很大,用計算機(jī)管理這些數(shù)據(jù)量會方便的多。1.2開發(fā)目標(biāo)金工實習(xí)基地的學(xué)生數(shù)據(jù)用人工的方法進(jìn)行處理比較繁雜,耗費了大量的人力和物力。為了改變這種現(xiàn)狀,我們必須開發(fā)一種既能夠滿足教師管理學(xué)生成績數(shù)據(jù),又能夠滿足學(xué)生在局域網(wǎng)上方便的選課的系統(tǒng)。 教師通過該系統(tǒng)安排金工實習(xí)的時間、地點和人數(shù),實習(xí)學(xué)生則通過局域網(wǎng)上教師公布的數(shù)據(jù)結(jié)合自己的時間選擇課程。實習(xí)完畢,教師通過學(xué)生實習(xí)的表現(xiàn)及完成的金工產(chǎn)品給予相應(yīng)的成績,并且將成績上傳到本系統(tǒng)中,實習(xí)學(xué)生通過登陸局域網(wǎng)查看成績。而管理員的職責(zé)是對教師、學(xué)生以及課程的數(shù)據(jù)進(jìn)行宏觀的管理。1.3項目提出的意義現(xiàn)在我國的大中專院校的學(xué)生成績管理水平普遍不高,有的還
4、停留在紙介質(zhì)基礎(chǔ)上,這種管理手段已不能適應(yīng)時代的發(fā)展,因為它浪費了了許多的人力和物力。在當(dāng)今信息時代這種傳統(tǒng)的管理方法必然被計算機(jī)為基礎(chǔ)的信息管理系統(tǒng)所代替。如果本系統(tǒng)能被學(xué)校所采用,將會改變以前靠手工管理學(xué)生成績的狀況,可以樹立良好的辦學(xué)形象,提高工作效率。1.4系統(tǒng)開發(fā)所需的技術(shù)準(zhǔn)備1.4.1硬件技術(shù)要求(1).處理器:Intel Pentium(R)4或更高(2).內(nèi)存:512MB(3).硬盤空間:80MB1.4.2軟件技術(shù)要求(1).操作系統(tǒng):Windows 2000/XP(2).數(shù)據(jù)庫:Microsoft office2000 Access1.4.3軟件結(jié)構(gòu)設(shè)計依照使用環(huán)境調(diào)查,可以
5、有以下兩種方案:(1).用Excel儲存數(shù)據(jù),所有學(xué)生成績數(shù)據(jù)由一臺計算機(jī)統(tǒng)一存儲,指導(dǎo)老師可以從不同計算機(jī)輸入學(xué)生實習(xí)成績,實習(xí)主管每學(xué)期所要進(jìn)行的后期數(shù)據(jù)處理可以拷貝代任一計算機(jī)上進(jìn)行,但是只能Excel軟件本身所具有的一些功能去完成管理即數(shù)據(jù)處理任務(wù),不能應(yīng)用以下方案中數(shù)據(jù)庫的一些優(yōu)異的數(shù)據(jù)處理功能,處理費事費時。(2).考慮到可能有幾位教師同時進(jìn)行數(shù)據(jù)輸入,自然設(shè)計成網(wǎng)絡(luò)數(shù)據(jù)庫,由統(tǒng)一的一臺計算機(jī)管理數(shù)據(jù),易于保證數(shù)據(jù)的一致性,每位指導(dǎo)教師可以在不同計算機(jī)上同時輸入成績數(shù)據(jù)而不會影響到其他指導(dǎo)教師,還可以為每位指導(dǎo)教師設(shè)置不同的帳戶并分配不同的用戶權(quán)限,這樣可以使不同的操作也有易于相應(yīng)
6、的管理防止出現(xiàn)混亂,實習(xí)主管學(xué)期末所要進(jìn)行的后期數(shù)據(jù)處理都可以依靠相應(yīng)處理軟件進(jìn)行,可以利用數(shù)據(jù)庫所提供的一些優(yōu)異的數(shù)據(jù)處理功能,方便數(shù)據(jù)處理降低后期數(shù)據(jù)處理工作難度。分析這兩種方案很容易知道各自的優(yōu)點與缺點,第二種方案明顯優(yōu)于第一種方案,可以滿足本軟件所要具有的功能并且很適合學(xué)校等非商業(yè)組織使用,所以本軟件采用設(shè)計第二種方案。1.4.4實際方案選擇1數(shù)據(jù)庫選擇在上述方案分析中我們已經(jīng)選擇了采用第二種方案。在選擇數(shù)據(jù)庫軟件時,我們應(yīng)該考慮到該數(shù)據(jù)庫應(yīng)該具有以下功能:存儲學(xué)生成績數(shù)據(jù),可以對已存儲在其中的數(shù)據(jù)進(jìn)行檢索查詢、更改、刪除等功能,而這些功能是所有數(shù)據(jù)庫都有的,例如:Oracle,Mic
7、rosoft SQL,MySQL,Microsoft Office2000 Access等,一些數(shù)據(jù)庫的高級功能在本系統(tǒng)中根本不需要,所以不用考慮一些企業(yè)級數(shù)據(jù)庫,同時考慮本軟件實際的運行條件以及成本,我認(rèn)為采用Microsoft Office2000 Access比較合理。選用此數(shù)據(jù)庫的原因有以下幾點:(1).它是完全網(wǎng)絡(luò)化的跨平臺型的數(shù)據(jù)庫系統(tǒng);(2).它是具有客戶端/服務(wù)器結(jié)構(gòu)體系的分布式數(shù)據(jù)庫管理系統(tǒng);(3).它是Microsoft Office 軟件中的一部分,一般說來,只要計算機(jī)裝了Office就都有Access,因此使用方便;(4).使用簡便、運行速度快、管理方便、安全可靠性強(qiáng)。
8、2系統(tǒng)開發(fā)工具的選擇系統(tǒng)窗口以及界面方面選擇HTML語言、Java語言,采用Microsoft自帶的ASP服務(wù)器腳本開發(fā)環(huán)境進(jìn)行開發(fā),其具有以下功能:(1).訪問服務(wù)器端的文件系統(tǒng);(2).連接數(shù)據(jù)庫并開發(fā)基于數(shù)據(jù)庫的應(yīng)用;(3).在應(yīng)用中嵌入Active X、COM組件和Java Applet作為開發(fā)工具的ASP是微軟于1996年11月推出的Web應(yīng)用程序開發(fā)技術(shù)。在微軟的文件中把ASP描述為:“一個服務(wù)器的腳本環(huán)境,在這里可以運行和生成動態(tài)的、交互的、高性能的Web服務(wù)器應(yīng)用程序?!睆倪@段描述可以看出,ASP既不是一種語言,也不是一種開發(fā)工具,而是一種技術(shù)框架。其主要功能是為生成動態(tài)的的交
9、互式的Web服務(wù)器應(yīng)用程序提供一種功能強(qiáng)大的技術(shù)或方法。ASP的主要特性是能夠把HTML、腳本、組件等有機(jī)的結(jié)合在一起,形成一個能夠在服務(wù)器上運行的應(yīng)用程序,并把按用戶要求專門制作的標(biāo)準(zhǔn)HTML頁面送給客戶端瀏覽器。ASP與我們通常在客戶端實現(xiàn)動態(tài)主頁的技術(shù)如Java Applet,Active X,Javascript等,不同的是ASP的命令腳本語言都是在服務(wù)器上解釋運行,執(zhí)行后的結(jié)果產(chǎn)生HTML頁面并送到瀏覽器。由于ASP是在服務(wù)器端解釋執(zhí)行的,開發(fā)者可以不必考慮瀏覽器是否支持ASP。同時,由于只是標(biāo)準(zhǔn)的HTML頁面送到瀏覽器,在瀏覽器上看不到ASP程序,因此可以防止程序被盜取,保護(hù)了開發(fā)
10、者的利益。隨著Internet的發(fā)展,信息的不斷增加和變化,網(wǎng)站維護(hù)人員不得不經(jīng)常修改他們的網(wǎng)頁,靜態(tài)Web站點的開發(fā)和維護(hù)變的越來越困難,特別是基于數(shù)據(jù)庫驅(qū)動的Web站點更是如此。由于靜態(tài)網(wǎng)頁不能與瀏覽者進(jìn)行有效的交互,使人們感到越來越乏味,所以開發(fā)動態(tài)網(wǎng)頁或動態(tài)內(nèi)容成了越來越多的站點所追求的目標(biāo)。而ASP技術(shù)無疑成為正確的選擇,它作為開發(fā)動態(tài)網(wǎng)頁的工具有如下特點:(1).它具有學(xué)習(xí)快、設(shè)計快的特點,開發(fā)者在較短的時間內(nèi)即可快速學(xué)會和快速設(shè)計出Web應(yīng)用程序。(2).ASP的源代碼在服務(wù)器端執(zhí)行,代碼保密性好。(3).集成于HTML中,無需編譯鏈接可直接執(zhí)行,使用文本編輯器如記事本即可設(shè)計。
11、(4).與瀏覽器無關(guān),用戶端只要使用常規(guī)可執(zhí)行HTML代碼的瀏覽器。(5).ASP是面向?qū)ο蟮?。ASP的工作過程為:ASP技術(shù)直接建立于微軟的Web服務(wù)器中,所有的微軟Web服務(wù)器都支持ASP。Web服務(wù)器會自動把ASP程序碼解釋為HTML格式的主頁內(nèi)容,再送到用戶端的瀏覽器顯示。作為開發(fā)語言之一的HTML是一種專為WWW 網(wǎng)頁顯示及瀏覽而設(shè)計的簡易標(biāo)記語言,目前是WWW 上制作網(wǎng)頁的標(biāo)準(zhǔn)語言格式。Tim BernersLee對HTML所下的定義是:“HTML是一種用以創(chuàng)造超文件的簡易資料格式,其所創(chuàng)造出來的文件可在不同的操作平臺間動”。由此可知,可移植性與簡易性是HTML的兩大特征。HTML
12、文件除了包含文字信息外,還可包括聲音、影像等多媒體信息,而HTML的超鏈接除了網(wǎng)頁內(nèi)的鏈接, 也包括網(wǎng)頁之間的鏈接。HTML的特點:(1).HTML的DTD設(shè)計主要是滿足網(wǎng)上顯示的需求。許多標(biāo)簽純粹是用來指定網(wǎng)頁的顯示細(xì)節(jié),例如:br是換行;hr是畫一條平行線;b表示粗體字。(2).HTML有內(nèi)建的樣式(style)。HTML希望直接使用SGML標(biāo)記來控制網(wǎng)頁顯示的樣式,即HTML不需要有分離的樣式表,這使得HTML更為簡單易用,但缺點是靈活性差, 同樣的文件內(nèi)容只能設(shè)定一種顯示樣式。(3).HTML引用SGML的標(biāo)記最簡化特征。這是為了盡量減少HTML 文件標(biāo)記的數(shù)量, 使HTML的標(biāo)記更簡
13、單,最明顯的例子是結(jié)束標(biāo)簽(endtag)的省略。結(jié)束標(biāo)簽的省略雖然使得HTML的標(biāo)記更為簡單,但也成為描述文件結(jié)構(gòu)時的限制,HTML文件中所有的段落標(biāo)記在地位上都是平行的,省略了結(jié)束標(biāo)簽就無法描述“段落中又有段落”的結(jié)構(gòu)。(4).HTML沒有采用SGML的超鏈接機(jī)制。HTML的超鏈接是利用標(biāo)簽的“href”屬性來指向Web上的任意文件,例如: 是一個外部鏈接是內(nèi)部鏈接而內(nèi)部鏈接的目標(biāo)點是利用標(biāo) 的“name”屬性來指定,例如:作為開發(fā)語言的Java具有以下特點:(1).簡單:容易編寫程序,不需要長時間的訓(xùn)練,而能滿足現(xiàn)代的需求。程序小型亦是簡單的一種特性,使得軟件體能夠在小型機(jī)器上執(zhí)行,基本
14、的解釋器約為40K,若加上基本的程序庫,約為215K。(2).面向?qū)ο蟮模好嫦驅(qū)ο蟮脑O(shè)計是一種重心在資料和接口的技巧,若以木頭為比喻,一個面向?qū)ο蟮哪绢^,它最主要的重點是即將要做的木椅子,其次才是所需要的工具;反之,一個以非面向?qū)ο蟮哪绢^,它所關(guān)心的只是工具,最近的既插既用亦是面向?qū)ο笤O(shè)計的重點。(3).分布式:Java有一個很周全的程序庫,且很容易地與HTTP和FTP等TCP/IP通訊協(xié)定相配合,Java應(yīng)用程序能在網(wǎng)絡(luò)上開啟及連接使用物件,就如同透過URLS連接使用一個本地文件系統(tǒng)。(4).健壯的:由Java所編寫出的程序能在多種情況下執(zhí)行而具有其穩(wěn)定性,Java 與C/C+最大不同點是J
15、ava有一個指針模型來排除內(nèi)存被覆蓋或毀損數(shù)據(jù)的可能性。(5).安全的:Java是被設(shè)計用于網(wǎng)絡(luò)及分布式的環(huán)境中,安全性自必是一個重要的考慮,Java擁有數(shù)個階層的互鎖保護(hù)措施,能有效的防止病毒的侵入和破壞行為的發(fā)生。(6).高效能的:Java位元碼迅速的能被轉(zhuǎn)換成機(jī)器碼,從位元碼到機(jī)器碼的效能幾乎與C與C+沒有區(qū)別。(7).動態(tài)的:Java比C或C+語言更具有動態(tài)性,更能適應(yīng)時刻在變的環(huán)境,Java不會因程序庫的更新,而必須重新編譯程序。1.5系統(tǒng)與數(shù)據(jù)庫的鏈接ASP(Active Server Pages)是Microsoft推出的一種用以取代通用網(wǎng)關(guān)接口的技術(shù),利用它不僅能夠產(chǎn)生動態(tài)的、
16、交互的、高性能的Web應(yīng)用程序,而且可以進(jìn)行復(fù)雜的數(shù)據(jù)庫操作Access數(shù)據(jù)庫隸屬于Microsoft Office家族,取得較為容易,且界面和Office家族相似,容易掌握和使用(1)OLEDB創(chuàng)建Access連接較好的創(chuàng)建對Access數(shù)據(jù)庫的連接的方法是使用原始OLEDB提供程序有2種面向Access的原始OLEDB提供程序它們是處理Access數(shù)據(jù)庫的不同版本下面例子說明怎樣用40版打開連接:注意:參數(shù)Data Source 提供通向Access數(shù)據(jù)庫的路徑(mdb文件)若不在連接字符串中提供所有連接信息,也可以將其保存在Data Link中(2)用ODBC 生成Access連接用OD
17、BC產(chǎn)生對Access數(shù)據(jù)庫的連接,有3種選擇可以把連接信息保存在Windows寄存器中、文件中或連接字符串中a.要把連接信息保存在Windows寄存器中,必須創(chuàng)建一個System DSN步驟如下: 啟動ODBC 數(shù)據(jù)資源管理器此程序位于Windows控制面板中,標(biāo)有ODBC Data Source 在ODBC數(shù)據(jù)資源管理器中選擇標(biāo)有System DSN的一項 單擊Add,選擇Access Driver,F(xiàn)inish 輸入一個數(shù)據(jù)資源名稱(如Access DSN)及對此連接的描述你可以選擇創(chuàng)建一個新的Access數(shù)據(jù)庫或選擇標(biāo)有Select的按鈕,在現(xiàn)存Access數(shù)據(jù)庫中選擇(注意,單擊Ad
18、vance,則提供幾個高級選項例如,可以對Access數(shù)據(jù)庫提供一個缺省的目錄或缺省的注冊名和密碼)單擊OK結(jié)束創(chuàng)建System DSN后,可以在位于同一臺計算機(jī)的任何ASP中使用它例如,下面的腳本用名為Access DSN 的System DNS打開一個Access數(shù)據(jù)庫連接:b. 創(chuàng)建File DSN 的過程與創(chuàng)建System DSN 過程相似要創(chuàng)建一個File DSN,啟動ODBC 數(shù)據(jù)資源管理器,選擇標(biāo)有File DSN的一項,擊Add,規(guī)定用來保存連接信息的文件名稱和地址剩下的步驟與創(chuàng)建System DSN 相同創(chuàng)建File DSN后,可用下面腳本打開對一個Access數(shù)據(jù)庫的連接c
19、. 若不希望創(chuàng)建System DSN 和File DSN,可以創(chuàng)建無DSN 連接,這必須在連接字符串中另外加入2個參數(shù):DRIVER 和DBQ:上述程序主要功能是驗證登陸數(shù)據(jù),如果未輸入登陸數(shù)據(jù),系統(tǒng)將報錯。5.3 管理員管理首頁源程序如下:function StopScroll()if(Timer!=null)clearTimeout(Timer)function showsubmenu(sid)Which El = eval(submenu + sid);if (whichEl.style.display = none)eval(submenu + sid + .style.display
20、=;);elseeval(submenu + sid + .style.display=none;);5.4學(xué)生選課界面學(xué)生通過登陸界面進(jìn)入系統(tǒng)后,和管理員登陸系統(tǒng)的界面類似,首先也是顯示學(xué)生所能做的功能導(dǎo)航鏈接。當(dāng)學(xué)生進(jìn)行選課操作的時候,首先顯示所能夠選擇的課程列表。為此,我們設(shè)計了顯示課程列表的界面。在該界面中,需要包括如下信息:課程號、課程名、成績、預(yù)選課程、所在系。還應(yīng)該提供對課程操作的入口,包括選課框,即所說的選課。源程序如下:sql1=select * from Stu where SId=&Session(StuID)&set rs1= server.createobject(a
21、dodb.recordset) rs1.open sql1,conn,1,3sql=select * from StuMark where SId=&Session(StuID)&set rs = server.createobject(adodb.recordset) rs.open sql,conn,1,3rs.pagesize = 2if rs.eof thenrs_total = 0elsers_total = rs.recordcountend ifdim pagenogetpageno = trim(request(pageno)if(getpageno = )thenpageno
22、 = 1elsepageno = getpagenoEnd ifif(not rs.eof)thenrs.absolutepage = pagenoend if(rs.eof)then else repeat_rows = 0 while(repeat_rows rs.pagesize) and (not rs.eof)Sql_2 = Select LName from Lesson Where ID =&trim(rs(CId)& Set rs_2 = conn.Execute(Sql_2)If(rs_2.Eof)Thentemp = 無Elsetemp = rs_2(LName)End I
23、fResponse.Write(Server.Htmlencode(temp)rs_2.CloseSet rs_2 = Nothing if rs(Remarks) then response.Write rs(Remarks) else response.Write(無)5.5教師登陸界面 教師登錄后進(jìn)入教師界面后,取得了所教班級和課程列表、取得了預(yù)選某課程的所有學(xué)生以及接收學(xué)生操作。因此根據(jù)這些功能的需要,我們逐一實現(xiàn)了這些功能。 教師查看班級和課程列表之后,教師就要查看每個班級對應(yīng)課程的所有學(xué)生,然后和管理員協(xié)商然后決定接收那些學(xué)生上課。 教師授課完畢后,根據(jù)實習(xí)學(xué)生的實際表現(xiàn),在系統(tǒng)中
24、給予學(xué)生以相應(yīng)的實習(xí)成績。源代碼如下:function aa(Dir)tt.doScroll(Dir);Timer=setTimeout(aa(+Dir+),100)/這里100為滾動速度function StopScroll()if(Timer!=null)clearTimeout(Timer)function showsubmenu(sid)whichEl = eval(submenu + sid);if (whichEl.style.display = none)eval(submenu + sid + .style.display=;);elseeval(submenu + sid +
25、 .style.display=none;);第六章、 結(jié)論通過對系統(tǒng)進(jìn)行反復(fù)的修改和測試,金工實習(xí)基地選課系統(tǒng)的主要功能得以成功實現(xiàn)。系統(tǒng)的成功實現(xiàn)說明:金工實習(xí)基地的教學(xué)工作完全可以通過計算機(jī)進(jìn)行處理,這必將推動金工實習(xí)基地的教學(xué)管理信息化的進(jìn)一步發(fā)展,對整個學(xué)校的教學(xué)管理工作將起到積極的示范作用。在整個系統(tǒng)的設(shè)計過程中,自己遇到了很多困難。當(dāng)拿到這個論題時,我決定用Visual C+作為系統(tǒng)程序的開發(fā)工具,用Microsoft SQL作為系統(tǒng)數(shù)據(jù)庫的開發(fā)工具,因為當(dāng)時對這兩個軟件的開發(fā)語言比較熟悉。但是在系統(tǒng)的開發(fā)過程中,我發(fā)現(xiàn)雖然Visual C+語法層次清晰、開發(fā)程序比較方便,但是與
26、網(wǎng)絡(luò)兼容性以及數(shù)據(jù)庫的接口問題處理起來比較復(fù)雜。因此,我改變了系統(tǒng)程序的開發(fā)工具,決定用和數(shù)據(jù)庫連接比較方便的Microsoft 自帶的技術(shù)框架ASP作為開發(fā)工具,其主要使用HTML語言和Java語言作為開發(fā)語言,而這兩種語言在網(wǎng)絡(luò)上有很好的兼容性??紤]到安裝軟件的煩瑣,我決定用Office 自帶的數(shù)據(jù)庫Access作為數(shù)據(jù)庫開發(fā)軟件,但是事實證明這個決定是明智的,數(shù)據(jù)庫Access與ASP也很容易鏈接和交互。當(dāng)然,一下子改變開發(fā)工具對于自己是個艱難的決定,因為自己已經(jīng)用前面的開發(fā)工具做了大量的工作。在這個過程中,指導(dǎo)教師朱江老師及時的糾正了我選用開發(fā)工具的錯誤,使自己迷途知返,才能順利的完成
27、整個畢業(yè)設(shè)計。致謝自己的論文終于可以提交了,看著近15000 字的論文,不禁可以輕松一下了。很感謝我的畢業(yè)設(shè)計得到了指導(dǎo)教師朱江老師的大力支持,也同時給了我悉心的指導(dǎo),使我全心完成本次論文。還有在論文制作過程中的到了周仲禮老師,王新莊老師等的諸多建議和熱情支持和關(guān)懷,鼓舞。在這里表示特別感謝。工科論文寫作是一個需要技術(shù)和邏輯的創(chuàng)作,所以感謝我的室友和研究生朋友以及外教Mary等為我論文寫作提供幫助和關(guān)心鼓勵,使我順利的寫完論文。也感謝每一個看到我的論文的老師和朋友,因為你們的閱讀使我的論文散發(fā)了生命力,由于時間關(guān)系和倉促,還希望得到各位智者的懇切批評與指點。參考書目(1)徐彤.ASP實戰(zhàn)錦囊.
28、機(jī)械工業(yè)出版社.2001(2)楊威.ASP3.0網(wǎng)絡(luò)開發(fā)技術(shù).人民郵電出版社.2000(3)李世杰.ASP網(wǎng)頁設(shè)計手冊.清華大學(xué)出版社.1999(4)趙莉.ASP3.0網(wǎng)站編程與實例演練.西安電子科技大學(xué)出版社.2000(5)董長虹.ASP動態(tài)網(wǎng)站建設(shè).國防工業(yè)出版社.2002(6)宣小剛.ASP數(shù)據(jù)庫系統(tǒng)開發(fā)實例導(dǎo)航.人民郵電出版社.2003(7)李春葆.Access數(shù)據(jù)庫程序設(shè)計.清華大學(xué)出版社.2005(8)范國平.Access 2000數(shù)據(jù)庫系統(tǒng)開發(fā)實例.人民郵電出版社.2002(9)張興庭.ASP信息管理系統(tǒng)開發(fā)實例導(dǎo)航.電子工業(yè)出版社.2004(10)彭澎.管理信息系統(tǒng).機(jī)械工業(yè)出
29、版社.2003(11)Richard Anderson .ASP 3.0.機(jī)械工業(yè)出版社.2001(12)Helen Feddema .精通Microsoft Access.清華大學(xué)出版社.2002附錄資料:不需要的可以自行刪除C語言中如何獲取時間?精度如何?1 使用time_t time( time_t * timer ) 精確到秒2 使用clock_t clock() 得到的是CPU時間精確到1/CLOCKS_PER_SEC秒3 計算時間差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精確
30、到毫秒5 如果使用MFC的CTime類,可以用CTime:GetCurrentTime() 精確到秒6 要獲取高精度時間,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)獲取系統(tǒng)的計數(shù)器的頻率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)獲取計數(shù)器的值然后用兩次計數(shù)器的差除以Frequency就得到時間。7 Multimedia Timer FunctionsThe following functions are used with mul
31、timedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime/*/用標(biāo)準(zhǔn)C實現(xiàn)獲取當(dāng)前系統(tǒng)時間的函數(shù)一.time()函數(shù)time(&rawtime)函數(shù)獲取當(dāng)前時間距1970年1月1日的秒數(shù),以秒計數(shù)單位,存于rawtime 中。#include time.hvoid main ()time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( 007The current
32、 date/time is: %s, asctime (timeinfo) );exit(0);=#include - 必須的時間函數(shù)頭文件time_t - 時間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long)struct tm - 時間結(jié)構(gòu),time.h 定義如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); - 獲取時間,以秒計,從19
33、70年1月一日起算,存于rawtimelocaltime ( &rawtime ); - 轉(zhuǎn)為當(dāng)?shù)貢r間,tm 時間結(jié)構(gòu)asctime ()- 轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時間格式:星期 月 日 時:分:秒 年二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動以后的毫秒級時間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。clock_t clock ( void );#includeclock_t t = clock();long sec = t / CLOCKS_PER_SEC;他是記錄時鐘周期的,實現(xiàn)看來不會很精確,需要試驗驗證;三.gettime(&t); 據(jù)說tc2.
34、0的time結(jié)構(gòu)含有毫秒信息#include#includeint main(void)struct time t;gettime(&t);printf(The current time is: -:d:d.dn,t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);return 0;time 是一個結(jié)構(gòu)體, 其中成員函數(shù) ti_hund 是毫秒。四.GetTickCount(),這個是windows里面常用來計算程序運行時間的函數(shù);DWORD dwStart = GetTickCount();/這里運行你的程序代碼DWORD dwEnd = GetTickCou
35、nt();則(dwEnd-dwStart)就是你的程序運行時間, 以毫秒為單位這個函數(shù)只精確到55ms,1個tick就是55ms。五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();/這里運行你的程序代碼DWORD dwEnd = timeGetTime();則(dwEnd-dwStart)就是你的程序運行時間, 以毫秒為單位雖然返回的值單位應(yīng)該是ms,但傳說精度只有10ms。=/*Unix#unix時間相關(guān),也是標(biāo)準(zhǔn)庫的/*1.timegm函數(shù)只是將struct tm結(jié)構(gòu)轉(zhuǎn)成t
36、ime_t結(jié)構(gòu),不使用時區(qū)信息;time_t timegm(struct tm *tm);2.mktime使用時區(qū)信息time_t mktime(struct tm *tm);timelocal 函數(shù)是GNU擴(kuò)展的與posix函數(shù)mktime相當(dāng)time_t timelocal (struct tm *tm);3.gmtime函數(shù)只是將time_t結(jié)構(gòu)轉(zhuǎn)成struct tm結(jié)構(gòu),不使用時區(qū)信息;struct tm * gmtime(const time_t *clock);4.localtime使用時區(qū)信息struct tm * localtime(const time_t *clock);1
37、.time獲取時間,stime設(shè)置時間time_t t;t = time(&t);2.stime其參數(shù)應(yīng)該是GMT時間,根據(jù)本地時區(qū)設(shè)置為本地時間;int stime(time_t *tp)3.UTC=true 表示采用夏時制;4.文件的修改時間等信息全部采用GMT時間存放,不同的系統(tǒng)在得到修改時間后通過localtime轉(zhuǎn)換成本地時間;5.設(shè)置時區(qū)推薦使用setup來設(shè)置;6.設(shè)置時區(qū)也可以先更變/etc/sysconfig/clock中的設(shè)置再將ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效time_t只能表示68年的范圍,即
38、mktime只能返回1970-2038這一段范圍的time_t看看你的系統(tǒng)是否有time_t64,它能表示更大的時間范圍/*windows#Window里面的一些不一樣的/*一.CTime () 類VC編程一般使用CTime類 獲得當(dāng)前日期和時間CTime t = GetCurrentTime();SYSTEMTIME 結(jié)構(gòu)包含毫秒信息typedef struct _SYSTEMTIME WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds
39、; SYSTEMTIME, *PSYSTEMTIME;SYSTEMTIME t1;GetSystemTime(&t1)CTime curTime(t1);WORD ms = t1.wMilliseconds;SYSTEMTIME sysTm;:GetLocalTime(&sysTm);在time.h中的_strtime() /只能在windows中用char t11;_strtime(t);puts(t);/*獲得當(dāng)前日期和時間CTime tm=CTime:GetCurrentTime();CString str=tm.Format(%Y-%m-%d);在VC中,我們可以借助CTime時間類,
40、獲取系統(tǒng)當(dāng)前日期,具體使用方法如下:CTime t = CTime:GetCurrentTime(); /獲取系統(tǒng)日期,存儲在t里面int d=t.GetDay(); /獲得當(dāng)前日期int y=t.GetYear(); /獲取當(dāng)前年份int m=t.GetMonth(); /獲取當(dāng)前月份int h=t.GetHour(); /獲取當(dāng)前為幾時int mm=t.GetMinute(); /獲取當(dāng)前分鐘int s=t.GetSecond(); /獲取當(dāng)前秒int w=t.GetDayOfWeek(); /獲取星期幾,注意1為星期天,7為星期六二.CTimeSpan類如果想計算兩段時間的差值,可以使用
41、CTimeSpan類,具體使用方法如下:CTime t1( 1999, 3, 19, 22, 15, 0 );CTime t = CTime:GetCurrentTime();CTimeSpan span=t-t1; /計算當(dāng)前系統(tǒng)時間與時間t1的間隔int iDay=span.GetDays(); /獲取這段時間間隔共有多少天int iHour=span.GetTotalHours(); /獲取總共有多少小時int iMin=span.GetTotalMinutes();/獲取總共有多少分鐘int iSec=span.GetTotalSeconds();/獲取總共有多少秒三._timeb()
42、函數(shù)_timeb定義在SYSTIMEB.H,有四個fieldsdstflagmillitmtimetimezonevoid _ftime( struct _timeb *timeptr );struct _timeb timebuffer;_ftime( &timebuffer );取當(dāng)前時間:文檔講可以到ms,有人測試,好象只能到16ms!四.設(shè)置計時器定義TIMER ID#define TIMERID_JISUANFANGSHI 2在適當(dāng)?shù)牡胤皆O(shè)置時鐘,需要開始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定時器的時候的時候銷毀掉時
43、鐘KillTimer(TIMERID_JISUANFANGSHI);對應(yīng)VC程序的消息映射void CJisuan:OnTimer(UINT nIDEvent)switch(nIDEvent)#如何設(shè)定當(dāng)前系統(tǒng)時間windowsSYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;m_myLocalTime.wHour=0;m_myLocalTime.wMinute=0;m_myLocalTime.wSec;m_myLocalTime.wMill
44、isec;lpSystemTime=&m_myLocalTime;if( SetLocalTime(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);SYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if( SetDate(lpSystemTime) ) /此處換成 SetS
45、ystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:HYPERLINK /khuang2008/archive/2008/12/09/3483274.aspx/khuang2008/archive/2008/12/09/3483274.aspx一種制作微秒級精度定時器的方法當(dāng)使用定時器時,在很多情況下只用到毫秒級的時間間隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個定時器后,在程序中通過處理由定時器發(fā)送到線程消息隊列中的WM_TIMER消息,而得到定時的效果(退
46、出程序時別忘了調(diào)用和SetTimer配對使用的KillTimer函數(shù))。二是利用GetTickCount函數(shù)可以返回自計算機(jī)啟動后的時間,通過兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來取得定時效果,此方式跟第一種方式一樣,精度也是毫秒級的。用這兩種方式取得的定時效果雖然在許多場合已經(jīng)滿足實際的要求,但由于它們的精度只有毫秒級的,而且在要求定時時間間隔小時,實際定時誤差大。下面介紹一種能取得高精度定時的方法。在一些計算機(jī)硬件系統(tǒng)中,包含有高精度運行計數(shù)器(high-resolution performance counter),利用它可以獲得高精度定時間隔,其精度與CPU的時鐘頻
47、率有關(guān)。采用這種方法的步驟如下:1、首先調(diào)用QueryPerformanceFrequency函數(shù)取得高精度運行計數(shù)器的頻率f。單位是每秒多少次(n/s),此數(shù)一般很大。2、在需要定時的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運行計數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過f換算成時間間隔,t=(n2-n1)/f。下面舉一個例子來演示這種方法的使用及它的精確度。在VC 6.0 下用MFC建立一個對話框工程,取名為HightTimer.在對話框面板中控件的布局如下圖:其中包含兩個靜態(tài)文本框,兩個編輯框和兩個按紐。上面和下面位置的編輯框的ID分別為IDC_E_TE
48、ST和IDC_E_ACTUAL,通過MFC ClassWizard添加的成員變量也分別對應(yīng)為DWORD m_dwTest和DWORD m_dwAct. “退出”按紐的ID為IDOK,“開始測試”按紐ID為IDC_B_TEST,用MFC ClassWizard添加此按紐的單擊消息處理函數(shù)如下:void CHightTimerDlg:OnBTest()/ TODO: Add your control notification handler code hereUpdateData(TRUE); /取輸入的測試時間值到與編輯框相關(guān)聯(lián)的成員變量m_dwTest中LARGE_INTEGER freque
49、nce;if(!QueryPerformanceFrequency( &frequence) /取高精度運行計數(shù)器的頻率,若硬件不支持則返回FALSEMessageBox(Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK);LARGE_INTEGER test, ret;test.QuadPart = frequence.QuadPart * m_dwTest / 1000000; /通過頻率換算微秒數(shù)到對應(yīng)的
50、數(shù)量(與CPU時鐘有關(guān)),1秒=1000000微秒ret = MySleep( test ); /調(diào)用此函數(shù)開始延時,返回實際花銷的數(shù)量m_dwAct = (DWORD)(1000000 * ret.QuadPart / frequence.QuadPart ); /換算到微秒數(shù)UpdateData(FALSE); /顯示到對話框面板其中上面調(diào)用的MySleep函數(shù)如下:LARGE_INTEGER CHightTimerDlg:MySleep(LARGE_INTEGER Interval)/ 功能:執(zhí)行實際的延時功能 / 參數(shù):Interval 參數(shù)為需要執(zhí)行的延時與時間有關(guān)的數(shù)量 / 返回值
51、:返回此函數(shù)執(zhí)行后實際所用的時間有關(guān)的數(shù)量 / LARGE_INTEGER privious, current, Elapse;QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart Interval.QuadPart )QueryPerformanceCounter( t );Elapse.QuadPart = current.QuadPart - privious.QuadPart;return Elapse;注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲
52、明。至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(奔騰366, 64M內(nèi)存)測試,當(dāng)測試時間超過3微秒時,準(zhǔn)確度已經(jīng)非常高了,此時機(jī)器執(zhí)行本身延時函數(shù)代碼的時間對需要延時的時間影響很小了。上面的函數(shù)由于演示測試的需要,沒有在函數(shù)級封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。BOOL MySleep(DWORD dwInterval)/ 功能:執(zhí)行微秒級的延時功能 / 參數(shù):Interval 參數(shù)為需要的延時數(shù)(單位:微秒) / 返回值:若計算機(jī)硬件不支持此功能,返回FALSE,若函數(shù)執(zhí)行成功,返回TRUE / BOOL bNormal = TRUE;LAR
53、GE_INTEGER frequence, privious, current, interval;if(!QueryPerformanceFrequency( &frequence):MessageBox(NULL, Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK); /或其它的提示信息return FALSE;interval.QuadPart = frequence.QuadPart * dwInter
54、val / 1000000;bNormal = bNormal & QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart interval.QuadPart )bNormal = bNormal & QueryPerformanceCounter( t );return bNormal;需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費的時間也很長,所以在需要幾個微秒的延時時,會影響精度。實際上,讀者在熟悉這種方法后,只要使用Query
55、PerformanceFrequency和QueryPerformanceCounter這兩個函數(shù)就能按實際需要寫出自己的延時代碼了。使用CPU時間戳進(jìn)行高精度計時對關(guān)注性能的程序開發(fā)人員而言,一個好的計時部件既是益友,也是良師。計時器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗的程序員手里可以盡快的確定程序的性能瓶頸,或者對不同的算法作出有說服力的性能比較。在Windows平臺下,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應(yīng)用場合而言還是太粗糙了。另一種是QueryPerformanceCount
56、計數(shù)器,隨系統(tǒng)的不同可以提供微秒級的計數(shù)。對于實時圖形處理、多媒體數(shù)據(jù)流處理、或者實時系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項基本功。本文要介紹的,是另一種直接利用Pentium CPU內(nèi)部時間戳進(jìn)行計時的高精度計時手段。以下討論主要得益于Windows圖形編程一書,第15頁17頁,有興趣的讀者可以直接參考該書。關(guān)于RDTSC指令的詳細(xì)討論,可以參考Intel產(chǎn)品手冊。本文僅僅作拋磚之用。在Intel Pentium以上級別的CPU中,有一個稱為“時間戳(Time Stamp)”的部件,它以64位無符號整型數(shù)的格
57、式,記錄了自CPU上電以來所經(jīng)過的時鐘周期數(shù)。由于目前的CPU主頻都非常高,因此這個部件可以達(dá)到納秒級的計時精度。這個精確性是上述兩種方法所無法比擬的。在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read Time Stamp Counter)來讀取這個時間戳的數(shù)字,并將其保存在EDX:EAX寄存器對中。由于EDX:EAX寄存器對恰好是Win32平臺下C+語言保存函數(shù)返回值的寄存器,所以我們可以把這條指令看成是一個普通的函數(shù)調(diào)用。像這樣:inline unsigned _int64 GetCycleCount() _asm RDTSC 但是不行,因為RDTSC不被C+的內(nèi)嵌匯
58、編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:inline unsigned _int64 GetCycleCount() _asm _emit 0 x0F _asm _emit 0 x31 以后在需要計數(shù)器的場合,可以像使用普通的Win32 API一樣,調(diào)用兩次GetCycleCount函數(shù),比較兩個返回值的差,像這樣: unsigned long t; t = (unsigned long)GetCycleCount(); /Do Something time-intensive . t -= (unsigned long)GetCycleC
59、ount(); Windows圖形編程第15頁編寫了一個類,把這個計數(shù)器封裝起來。有興趣的讀者可以去參考那個類的代碼。作者為了更精確的定時,做了一點小小的改進(jìn),把執(zhí)行RDTSC指令的時間,通過連續(xù)兩次調(diào)用GetCycleCount函數(shù)計算出來并保存了起來,以后每次計時結(jié)束后,都從實際得到的計數(shù)中減掉這一小段時間,以得到更準(zhǔn)確的計時數(shù)字。但我個人覺得這一點點改進(jìn)意義不大。在我的機(jī)器上實測,這條指令大概花掉了幾十到100多個周期,在Celeron 800MHz的機(jī)器上,這不過是十分之一微秒的時間。對大多數(shù)應(yīng)用來說,這點時間完全可以忽略不計;而對那些確實要精確到納秒數(shù)量級的應(yīng)用來說,這個補(bǔ)償也過于粗糙了。 這個方法的優(yōu)點是: 1.高精度??梢灾苯舆_(dá)到納秒級的計時精度(在1GHz的CPU上每個時鐘周期就是一納秒),這是其他計時方法所難以企及的。 2.成本低。timeGetTime 函數(shù)需要鏈接多媒體庫winmm.lib,QueryPerformance* 函數(shù)根據(jù)MSDN的說明,需要硬件的支持(雖然我還沒有見過不支持的機(jī)器)和KERNEL庫的支持,所以二者都只能在Windows平臺下使用(關(guān)于DOS平臺下的高精度計時問題,可以參考圖形程序開發(fā)人員指南,里面有關(guān)于控制定時器8
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化學(xué)教學(xué)中的問題導(dǎo)向教學(xué)設(shè)計
- 換填法課程設(shè)計
- 無氧呼吸的課程設(shè)計
- 幼兒項鏈創(chuàng)意畫課程設(shè)計
- 電力系統(tǒng)自動化電氣控制與PLC課程標(biāo)準(zhǔn)
- 廣東省深圳市鹽田區(qū)外國語學(xué)校2021-2022學(xué)年八年級下學(xué)期期末考試數(shù)學(xué)試題(解析版)
- NDM-1-inhibitor-2-生命科學(xué)試劑-MCE
- mPEG2000-CLS-mPEG2000-Cholesterol-生命科學(xué)試劑-MCE
- 2024年未出資股權(quán)轉(zhuǎn)讓及公司治理結(jié)構(gòu)優(yōu)化合同6篇
- 工程投資控制課程設(shè)計
- 供油管道專項施工方案
- 學(xué)校巡課查課記錄總結(jié)(13篇)
- 2023年高考地理浙江卷試題及答案
- 污水處理廠電氣工程通用技術(shù)要求
- 達(dá)克效應(yīng):需要警惕的48種錯誤思維
- who實驗室生物安全手冊
- 集體林權(quán)制度改革總結(jié)(優(yōu)選3篇)
- 可編程控制器課程設(shè)計報告可編程控制器課程設(shè)計報告八篇
- 2401危險化學(xué)品崗位安全生產(chǎn)操作規(guī)程編寫導(dǎo)則
- 年度供應(yīng)商審核計劃表
- 不便的便利店
評論
0/150
提交評論