鐘愛青
(廣東省機(jī)械高級(jí)技工學(xué)校,廣州 510450)
基于手機(jī)的圖書共享系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
鐘愛青
(廣東省機(jī)械高級(jí)技工學(xué)校,廣州 510450)
設(shè)計(jì)與實(shí)現(xiàn)一個(gè)手機(jī)圖書共享系統(tǒng),便于學(xué)校師生圖書共享,用戶通過(guò)手機(jī)將自己不用的圖書共享出去,另外的用戶通過(guò)手機(jī)App查找自己附近位置的圖書并聯(lián)系圖書持有人借書,實(shí)現(xiàn)圖書資源共享。該系統(tǒng)基于移動(dòng)互聯(lián)網(wǎng)實(shí)現(xiàn)方案,分為服務(wù)器端,手機(jī)端、業(yè)務(wù)邏輯集中在服務(wù)器端,手機(jī)端作為顯示媒介,服務(wù)器端實(shí)現(xiàn)基于集群的負(fù)載均衡以及分布式緩存,保證系統(tǒng)具有高可用性、高可靠性以及高性能。
共享圖書;移動(dòng)互聯(lián)網(wǎng);手機(jī)App
目前,圖書越來(lái)越貴,而大部分學(xué)生看完之后就不會(huì)再看,最后是當(dāng)成了廢紙賣掉或者扔掉,造成了資源的極大浪費(fèi),而有的學(xué)生卻因?yàn)橘Y金不夠而看不到想要的書;而智能手機(jī)的迅速普及及手機(jī)App迅速發(fā)展,為兩者的結(jié)合互補(bǔ)提供了渠道。學(xué)生可以利用移動(dòng)設(shè)備實(shí)現(xiàn)書本的流通,為學(xué)生在工作生活中提供一個(gè)最高效的共享平臺(tái)。
目標(biāo):搭建結(jié)構(gòu)清晰、功能簡(jiǎn)單、內(nèi)容簡(jiǎn)要、界面美觀的手機(jī)圖書共享系統(tǒng)。
用戶可以把自己的紙質(zhì)書或者電子書和別人一起分享,分享越多信用分越高,同時(shí)可以指定借書費(fèi)用,對(duì)于貴重的書可以收取一定的費(fèi)用。用戶可以查到朋友或附近的人共享出來(lái)的圖書以及讀什么類型的圖書,互相借閱。用戶可以加入相同興趣的讀書群,和朋友一起討論圖書內(nèi)容,交流心得。用戶可以邀請(qǐng)朋友加入共享圖書,只要加入的人越來(lái)越多,那么大家就可以擁有一個(gè)巨大的免費(fèi)圖書館。用戶可以通過(guò)掃描ISBN條形碼,一鍵共享自己的圖書。
LBS應(yīng)用包含了海量的地理位置信息,對(duì)海量地理信息的查詢、處理、分析是LBS應(yīng)用最基本最主要的技術(shù)問(wèn)題。
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)主要設(shè)計(jì)應(yīng)用于企業(yè)系統(tǒng),對(duì)于海量數(shù)據(jù)處理在性能與方便性上效果并不好。而隨著Google發(fā)表了專門用于大數(shù)據(jù)處理的非關(guān)系型數(shù)據(jù)庫(kù)BigTable的設(shè)計(jì),市場(chǎng)上出現(xiàn)了許多優(yōu)秀的直接支持地理位置操作的非關(guān)系型數(shù)據(jù)庫(kù) (也就是NoSQL數(shù)據(jù)庫(kù)),經(jīng)過(guò)多年的發(fā)展,它們已經(jīng)具有了很高的性能及操作方便性,其中的佼佼者就是MongoDB。
對(duì)于基于位置信息的應(yīng)用,關(guān)鍵功能是用戶可以查找基于某個(gè)位置一定范圍內(nèi)的信息查詢,這樣的需求我們可以采用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)技術(shù),也可以采用先進(jìn)的非關(guān)系型數(shù)據(jù)庫(kù)技術(shù)。
以關(guān)系型數(shù)據(jù)庫(kù)MySQL為實(shí)現(xiàn)例子,我們只需要寫一條SQL就可以實(shí)現(xiàn):
但是該SQL使用了大量的函數(shù)計(jì)算,每條SQL的計(jì)算量都會(huì)非常大,也不能很好的利用數(shù)據(jù)庫(kù)緩存,在海量數(shù)據(jù)應(yīng)用中,性能將會(huì)非常的差,對(duì)于用戶是非常糟糕的體驗(yàn)。
而MongoDB在設(shè)計(jì)時(shí)就已經(jīng)考慮到大數(shù)據(jù)及地理位置處理的特點(diǎn),所以MongoDB在底層上就支持大數(shù)據(jù)查詢分析,支持地理位置索引,在底層API內(nèi)置了用于地理位置的查詢及距離計(jì)算;同時(shí),作為非關(guān)系型數(shù)據(jù)庫(kù),MongoDB還擁有高性能,支持復(fù)雜查詢,支持完全索引,支持集合存取等特性,即使不應(yīng)用于地理位置處理,也可以用于大型的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)。
以MongoDB為例子,我們要實(shí)現(xiàn)上面的功能,只需要調(diào)用MongoDB的一個(gè)內(nèi)置命令就可以得到我們想要的結(jié)果:
db.runCommand(command)是一個(gè)工具方法,用于執(zhí)行數(shù)據(jù)庫(kù)的命令,command表示數(shù)據(jù)庫(kù)的一個(gè)命令,在我們的例子中,command就是 {geoNear:"books", near:[113.360137,23.161534],num:100},表示查詢?cè)赱113.360137,23.161534]位置的最多100本圖書。返回結(jié)果是一個(gè)數(shù)據(jù)集,包含了圖書信息等,默認(rèn)按距離由近到遠(yuǎn)排序。因?yàn)間eoNear是MongoDB內(nèi)置于用于地理位置處理的函數(shù),在性能上已經(jīng)做了優(yōu)化,所以該查詢效率非常高,在大型應(yīng)用下也有非常好的效果。
MongoDB還有很多其他功能用于支持地理位置信息處理,如geointersect,geowithin,near等。
例子1,查詢指定位置的圖書,并按距離排序:
有兩個(gè)命令可以用:$near或$nearSphere,兩個(gè)命令的操作方法一樣,需要傳入指定的地理空間坐標(biāo),返回坐標(biāo)范圍內(nèi)的圖書,不同的是$nearSphere返回的范圍是球面,而$near是正方形。
操作如下:
該結(jié)果表示返回坐標(biāo)[113.360137,23.161534]附近的100個(gè)圖書信息,然后按照距離從近到遠(yuǎn)排序。如果不指定返回?cái)?shù)量,默認(rèn)返回100條信息,如果要指定數(shù)量,則使用limit條件指定。如:
也可以指定查詢的空間最大距離 ,使用條件$maxDistance指定,如:
> db.books.find ({'coordinate':{$near:[113.360137, 23.161534],$maxDistance:30}})
例子1,查詢指定位置的圖書,并按距離排序,并顯示距離:
我們可以使用例子1的結(jié)果然后再計(jì)算距離,但是需要計(jì)算多一次,如果用$geoNear查詢則可以一次返回結(jié)果,$geoNear與$near功能更強(qiáng)大,提供了更多的參數(shù),也返回了更多的信息。如:
該方法返回的結(jié)果包含了更多的詳細(xì)信息,如時(shí)間、數(shù)量、距離等,例如results中的dis,它表示了與目標(biāo)坐標(biāo)的距離。
與一般的企業(yè)系統(tǒng)一樣,手機(jī)App也遵循通用的軟件設(shè)計(jì)原則,如最基本的三層架構(gòu)設(shè)計(jì)原則:數(shù)據(jù)層、業(yè)務(wù)層、展示層,分別代表了對(duì)數(shù)據(jù)的不同處理方式:數(shù)據(jù)存儲(chǔ),數(shù)據(jù)加工,數(shù)據(jù)顯示。數(shù)據(jù)層是最核心的一層,因?yàn)樗菙?shù)據(jù)存取的地方,是整個(gè)系統(tǒng)的核心資產(chǎn),是連接底層數(shù)據(jù)庫(kù)與業(yè)務(wù)層的渠道;業(yè)務(wù)層是系統(tǒng)的邏輯,將數(shù)據(jù)層取得的數(shù)據(jù)按照用戶期望的邏輯加工處理,然后提交給展示層顯示;展示層是直接面對(duì)用戶的地方,它將業(yè)務(wù)層加工好的數(shù)據(jù)展示在用戶界面上,展示層的質(zhì)量代表了整個(gè)系統(tǒng)的質(zhì)量。
(1)數(shù)據(jù)層
數(shù)據(jù)層是數(shù)據(jù)存取的地方,主要任務(wù)就是與關(guān)系型數(shù)據(jù)庫(kù)或者NoSQL數(shù)據(jù)庫(kù)或者文件服務(wù)器打交道,保存用戶提交的數(shù)據(jù)或文件,返回用戶請(qǐng)求的數(shù)據(jù)或文件給業(yè)務(wù)層,考慮到用戶的請(qǐng)求量非常巨大,而大部分?jǐn)?shù)據(jù)庫(kù)處理能力有限,所以加上緩存模塊非常有必要。數(shù)據(jù)庫(kù)數(shù)據(jù)是存放于硬盤,而緩存一般存放于內(nèi)存中,因?yàn)閮?nèi)存讀寫速度遠(yuǎn)遠(yuǎn)快于硬盤,當(dāng)前內(nèi)存也已經(jīng)相當(dāng)便宜,所以使用內(nèi)存作為緩存模塊非常適合。如下圖1:
圖1 總體架構(gòu)圖
業(yè)務(wù)層向數(shù)據(jù)層請(qǐng)求數(shù)據(jù)時(shí),數(shù)據(jù)層首先將請(qǐng)求的參數(shù)轉(zhuǎn)成一個(gè)關(guān)鍵字,然后根據(jù)關(guān)鍵字去緩存模塊中查找數(shù)據(jù),如果命中(即查到),則返回緩存的數(shù)據(jù)給用戶,如果沒有命中,則去數(shù)據(jù)庫(kù)抓取數(shù)據(jù),并將結(jié)果數(shù)據(jù)作為值,請(qǐng)求參數(shù)作為關(guān)鍵字存入緩存模塊中,然后返回結(jié)果數(shù)據(jù)給用戶。當(dāng)然,并不是所有數(shù)據(jù)都要緩存,緩存只適用于很少變動(dòng)的數(shù)據(jù),對(duì)于經(jīng)常變動(dòng)的數(shù)據(jù),緩存并沒有效果,還會(huì)因?yàn)閷懭刖彺娴拇螖?shù)增多給系統(tǒng)造成新的負(fù)擔(dān),不同的緩存數(shù)據(jù)可以設(shè)置不同的緩存有效期,基本不變的數(shù)據(jù)的緩存期可以設(shè)置長(zhǎng)一些,變動(dòng)相對(duì)頻繁的則可以設(shè)置短一些。
(2)業(yè)務(wù)層
業(yè)務(wù)層體現(xiàn)了系統(tǒng)的邏輯,它將數(shù)據(jù)層取得的數(shù)據(jù)按照用戶期望的邏輯加工處理,然后提交給展示層顯示給用戶。業(yè)務(wù)層一般以接口的方式暴露給展示層調(diào)用,由接口以HTTP/HTTPS的方式在網(wǎng)絡(luò)中暴露出來(lái),所以業(yè)務(wù)層需要考慮到安全的設(shè)置,確保接口的調(diào)用只能由已經(jīng)認(rèn)證的請(qǐng)求者調(diào)用。
(3)展示層
展示層也就是我們通常所說(shuō)的UI,由于它直接面對(duì)用戶,一個(gè)UI的質(zhì)量一定程度上代表了App的質(zhì)量,一個(gè)好的UI會(huì)吸引用戶使用,相反,一個(gè)界面難看,操作不友好的UI,用戶基本不會(huì)用。展示層調(diào)用業(yè)務(wù)層的接口,包括請(qǐng)求數(shù)據(jù)與保存數(shù)據(jù)。它是整個(gè)App展最復(fù)雜的一層,要考慮界面的美觀,操作的友好性,手機(jī)與平板的界面布局,不同屏幕大小的適配等。展示層調(diào)用業(yè)務(wù)層的接口必須是異步回調(diào),不能使用UI主線程,因?yàn)榫W(wǎng)絡(luò)等不同原因,獲取或保存數(shù)據(jù)可能是一個(gè)比較耗時(shí)的操作,如果用線程同步的方式,必然會(huì)阻塞UI主線程,也就是我們常見的界面卡死問(wèn)題。展示層還需要考慮網(wǎng)絡(luò)狀態(tài),根據(jù)網(wǎng)絡(luò)狀態(tài)采用不同的處理方式。如果用戶請(qǐng)求數(shù)據(jù)時(shí),網(wǎng)絡(luò)已經(jīng)不可用,則需要向用戶提示網(wǎng)絡(luò)不可用,如果在展示層有做數(shù)據(jù)緩存,則可以用之前緩存的數(shù)據(jù)展示給用戶;保存數(shù)據(jù)時(shí)也一樣,可以提示網(wǎng)絡(luò)不可用,數(shù)據(jù)不會(huì)保存,或者先將數(shù)據(jù)保存到手機(jī)緩存上,等網(wǎng)絡(luò)可用時(shí),再提交數(shù)據(jù)到業(yè)務(wù)層保存。
如圖2所示,系統(tǒng)包括前端App和服務(wù)器端Web服務(wù)兩個(gè)部分,App主要用iOS,Web服務(wù)用RESTful WebService框架。
圖2 系統(tǒng)開發(fā)框架
iOS開發(fā)需要使用蘋果公司提供的Xcode開發(fā)工具及SDK,同時(shí)還需要在蘋果開發(fā)者網(wǎng)站開通開發(fā)者帳號(hào)。使用Xcode工具及Object-C語(yǔ)言就可以調(diào)用SDK提供的各種UI控件及API。
RESTfulWebService是一種輕量級(jí)的網(wǎng)絡(luò)服務(wù)開發(fā)框架,它完全基于HTTP協(xié)議實(shí)現(xiàn),不需要額外的傳輸協(xié)議,還可以利用緩存來(lái)提高速度,在性能、效率和易用性上都優(yōu)于其他網(wǎng)絡(luò)服務(wù)。RESTfulWebService是基于URL的,一個(gè)URL代表了一個(gè)資源,對(duì)URL的調(diào)用即是對(duì)業(yè)務(wù)層接口的調(diào)用。返回結(jié)果一般有純文本,JSON,XML,通常用的是JSON,因?yàn)橄啾扔赬ML,JSON有體積小的優(yōu)點(diǎn),相比于純文本,JSON是一個(gè)格式化文本,可以更好地讀寫。
表1 書本信息
表3 書本預(yù)約信息
表2 書本圖片
表4 用戶信息
表5 用戶書本記錄
表6 用戶信用記錄
下面圖3-圖8為各個(gè)頁(yè)面效果圖。
圖3首頁(yè)效果圖
圖4 出借頁(yè)面
圖5 圖書信息頁(yè)面
圖6 借書頁(yè)面
圖7 搜索頁(yè)面
圖8 信用頁(yè)面
[1]徐凱.跨終端Web.電子工業(yè)出版社,2014.
[2](美)奎文(Cravens,J.),巴特福德(Burtoft,J.).HTML5敏捷實(shí)踐.電子工業(yè)出版社,2013.
Design and Im p lementation of a Book Sharing App Based on Phone
ZHONG Ai-qing
(Guangdong Machinery Technician College,Guangzhou 510450)
Design and implements a book sharing App which aims to share books between students or teachers.Users can share the book they don't need any more with the App easily,other users can find the book with LBS search function in the App and borrow the book with few steps.The system is based on themobile Internet,and includes server sidemodule,mobile App module.Server side serves as business center and mobile App serves as user interface.Server sidemodule implementswith load balance cluster and distributed cache and with abilities of high availability,high reliability aswell as high performance
鐘愛青(1984-),女,本科,中級(jí)職稱,研究方向?yàn)橛?jì)算機(jī)科學(xué)與技術(shù)
2017-01-17
2017-05-01
1007-1423(2017)13-0071-06
10.3969/j.issn.1007-1423.2017.13.017
Book Sharing;Mobile Internet;Phone App