王訔杰, 覃海煥, 袁 露, 楊志和, 袁 倩
(1. 上海電機(jī)學(xué)院 電子信息學(xué)院, 上海 201306; 2. 上海大學(xué) 機(jī)電工程與自動(dòng)化學(xué)院, 上海 200072)
日常生活中圖書使用后會(huì)閑置或當(dāng)廢品處理,造成資源的巨大浪費(fèi),而圖書共享可有效解決此問題。目前的閑置書籍共享主要通過搭建共享平臺(tái)使閑置的紙質(zhì)圖書得以交換和捐贈(zèng),促進(jìn)資源的流動(dòng)和共享,主要包括如下共享模式:
(1) 捐書換書線下活動(dòng)模式。有些社區(qū)會(huì)不定期組織居民進(jìn)行圖書交換或捐贈(zèng)活動(dòng),如“北京換書大集”邀請(qǐng)多家出版社提供新書免費(fèi)交換,邀請(qǐng)多位文化名人持簽名圖書參與交換,市民將閑置書刊遞交到首都圖書館或區(qū)縣圖書館換取相應(yīng)的書刊交換券進(jìn)行交換[1]。此類線下活動(dòng)操作簡(jiǎn)便,易于開展,但是活動(dòng)范圍有限,成本費(fèi)用高,效果甚微。有些圖書館在館內(nèi)開辟一個(gè)區(qū)域,在固定的服務(wù)時(shí)間,依托圖書館龐大的讀者群體按照設(shè)定的規(guī)則進(jìn)行圖書的交換和捐贈(zèng),如廣東各類公共圖書館的省捐贈(zèng)換書中心[2],以及東莞市圖書館、深圳圖書館、肇慶市圖書館等捐贈(zèng)換書中心。
(2) 基于網(wǎng)絡(luò)的圖書交換模式。基于JSP的舊書交易系統(tǒng)[3]使用戶通過客戶端和交易平臺(tái)就位置、發(fā)布物品等進(jìn)行線上交流和線下交換,提高舊書籍的重復(fù)利用率,但只適用于小范圍區(qū)域內(nèi)的舊書交易。圖書漂流網(wǎng)利用網(wǎng)絡(luò)社區(qū)擴(kuò)大了圖書漂流的范圍[4],同一本書的共同讀者分享閱讀感受以增加閱讀樂趣,圖書的漂流具有隨機(jī)性和唯一性,主要在于分享閱讀,無法做到多本圖書的捐贈(zèng)和交換。
(3) 圖書收購租借模式。隨著“分享型經(jīng)濟(jì)”的流行和近幾年共享單車等成功商業(yè)模式的應(yīng)用,已有不少工作嘗試解決閑置圖書的共享問題。例如,李國(guó)朋[5]提出的以蒲公英模式為核心的123圖書館,通過1~3折價(jià)格收購本館會(huì)員的閑置圖書,將其出租給會(huì)員,實(shí)現(xiàn)社會(huì)閑置圖書的循環(huán)閱讀推廣;吳曉輝[6]提出的一種共享圖書漂流模式,即“為每一本圖書貼上專屬二維碼或配置二維碼書簽,通過新書銷售、二手書漂流、舊書回收3個(gè)層級(jí)的應(yīng)用,達(dá)到一個(gè)閉環(huán)式的共享體系”。
(4) 圖書捐贈(zèng)模式?,F(xiàn)有很多公益捐書活動(dòng),如公共圖書館的捐書模式,依托固定的服務(wù)群體,目標(biāo)客戶明確[7]。目前,我國(guó)高校圖書館畢業(yè)生捐書管理模式[8]主要有收入館藏、圖書漂流、圖書轉(zhuǎn)贈(zèng)、支援其他圖書館,一定程度上推進(jìn)了公益的進(jìn)展。
本文提出了一種自由等價(jià)交換-區(qū)域舊書湖網(wǎng)狀系統(tǒng)(以下簡(jiǎn)稱舊書湖網(wǎng)狀系統(tǒng)),嘗試通過互聯(lián)網(wǎng)技術(shù)和第三方介入方式構(gòu)建區(qū)域舊書湖網(wǎng)狀系統(tǒng),以每個(gè)城鎮(zhèn)為一個(gè)舊書湖區(qū)域,通過物流將區(qū)域連接,每個(gè)區(qū)域內(nèi)設(shè)置一個(gè)換書點(diǎn)負(fù)責(zé)書籍整理以及郵寄。用戶可以將自己的書籍信息發(fā)布或捐贈(zèng)到平臺(tái)上,平臺(tái)通過再包裝配送到用戶手中,實(shí)現(xiàn)有保障的等價(jià)換書、平等交易、可持續(xù)的捐贈(zèng)。
基于舊書湖網(wǎng)狀系統(tǒng)的換換書社,其模式如圖1所示。以城市為基本單位分割成多個(gè)舊書湖(通過采集數(shù)據(jù)進(jìn)行大數(shù)據(jù)分析來劃分舊書湖更加合理)。每個(gè)舊書湖內(nèi)設(shè)置一個(gè)換書點(diǎn)(該換書點(diǎn)可與傳統(tǒng)書店合作),通過快遞進(jìn)行書本運(yùn)輸,以此將舊書湖連成網(wǎng)狀。用戶通過平臺(tái)的平等換書規(guī)則在平臺(tái)內(nèi)進(jìn)行交換,平臺(tái)負(fù)責(zé)保證書籍的質(zhì)量,使用戶更快更省錢換到所需書籍。
舊書籍是一個(gè)很龐大的集合,不同書籍由于價(jià)值和應(yīng)用場(chǎng)景不同,交換存在不公平,需要進(jìn)行適當(dāng)?shù)姆诸愡_(dá)到交換率的最大化以及公平交易。在
圖1 換換書社換書模式
舊書湖網(wǎng)狀系統(tǒng)的基礎(chǔ)上提出了3種換書形式,分別是課本交換、課外書交換、愛心捐書。課本交換主要針對(duì)大學(xué)生,用戶可在軟件上下單進(jìn)行估價(jià)獲得虛擬幣,采用虛擬幣在軟件中選取所需書籍進(jìn)行交換。課外書交換不僅僅針對(duì)大學(xué)生,用戶在書籍發(fā)布時(shí)將其信息暫保存到換書點(diǎn),由平臺(tái)通過機(jī)器圖片識(shí)別和人工復(fù)查后,對(duì)書籍進(jìn)行估價(jià)支付虛擬幣。用戶在軟件中查詢所需書籍,根據(jù)實(shí)際情況支付等價(jià)的換換幣(部分跨區(qū)域支付一定運(yùn)費(fèi))。愛心捐書采用有償捐書形式,用戶通過平臺(tái)軟件將自己的愛心書籍捐獻(xiàn)換取虛擬幣,并以虛擬幣在軟件內(nèi)換取獎(jiǎng)勵(lì)和證書。這樣既能捐獻(xiàn)自己的愛心,又能使用戶得到物質(zhì)上的獎(jiǎng)勵(lì)。
為保證用戶能夠方便快速地搜索到所需書籍,該系統(tǒng)保存舊書湖的信息、書籍信息以及各舊書湖之間的物流運(yùn)費(fèi)(見圖2)。用戶進(jìn)行搜索時(shí),通過分割模糊匹配搜索算法獲取相關(guān)數(shù)據(jù)集,由GPS定位和逆地址分析獲取用戶所在舊書湖,使用Dijkstra算法求解弧權(quán)重非負(fù)的單源最短路問題[9]和高效的快速二分排序[10]得到最終結(jié)果。
圖2 區(qū)域換書湖網(wǎng)狀系統(tǒng)
該系統(tǒng)結(jié)構(gòu)是個(gè)三元組為
regionLakeNetSystem(regionLakes,relationships,Books)
具體用法和參數(shù)意義如下:
(1) regionLakes是一個(gè)五元組(id, city, locationX, locationY, exchangePoints(id, bookLists, status))。依據(jù)城市劃分的區(qū)域舊書湖集合,每個(gè)元組為一個(gè)舊書湖,以圓表示。元組中的元素:id為舊書湖編號(hào);city為舊書湖所在城市;locationX為舊書湖中心坐標(biāo)的經(jīng)度;locationY為舊書湖中心坐標(biāo)的緯度;exchangePoints為換書湖分站點(diǎn)。每個(gè)換書點(diǎn)由編號(hào)(id)、書籍列表(bookLists)和狀態(tài)(status)組成,其中bookLists的每個(gè)元組用于描述具體的二手書籍信息,status描述換書點(diǎn)的狀態(tài),可能的狀態(tài)包括:正在營(yíng)業(yè)、暫停營(yíng)業(yè)、歇業(yè)。×代表該區(qū)域湖內(nèi)沒有書籍。
(2) relationships是一個(gè)三元組(regionLake1, regionLake2, freight)表示區(qū)域舊書湖間的連線集合,且regionLake1(舊書湖1的id)和regionLake2(舊書湖2的id)之間有物流溝通,其物流運(yùn)費(fèi)為freight;若沒有運(yùn)費(fèi),則值freight為NULL。
(3) Books是一個(gè)五元組(id, name, description, price, lake),每一個(gè)元組表示一本書,以矩形表示。元組中的元素:id為書籍編號(hào);name為書籍的名稱;description為書籍的描述;price為書籍的價(jià)格;lake為書籍所在舊書湖的id。
設(shè)searchText為用戶輸入字符串,通過sql的模糊查詢和聯(lián)表查詢返回滿足條件的結(jié)果。程序代碼表示為
Select book.*regionLakes.*from book, regionLakes where book.lake=regionLakes.id and book.name LIKE ‘%searchText%
根據(jù)用戶地址在舊書湖網(wǎng)狀系統(tǒng)中搜索用戶所需書籍,且換書點(diǎn)距離用戶較近、花費(fèi)低,搜索算法為SearchBook。為提高用戶搜索交換書籍的效率,在該算法中采用Dijkstra算法思想對(duì)搜索排序進(jìn)行優(yōu)化。
通過數(shù)據(jù)篩選獲得searchLists進(jìn)行SearchBook(搜索算法)得到最終的結(jié)果distanceOrder。
首先獲取當(dāng)前searchLists集合中所有的不重復(fù)的舊書湖id,通過查詢r(jià)elationships,生成MapPrice(i,j),i表示舊書湖id為i,j表示舊書湖id為j,MapPrice[i][j]表示i與j之間的物流費(fèi)用,d[i]表示i到搜索點(diǎn)的物流費(fèi)用。偽代碼如下所示:
Algorithm SearchBook
Input:searchLists
Output:distanceOrder
Begin:
/*初始化數(shù)組d*/
foreachi∈n
d[i]=(i==0 ? 0:INF)
end for
foreachi∈n
intx,m=INF;
/*3.如果y沒有被加入集合,且d[y]是最小的,則把y加入集合且x=y*/
foreachy∈n
if(!v[y] &&d[y] <=m)
m=d[y],x=y;
end for
/*新的點(diǎn)加入集合(這是更新之后的新x)*/
v[x]=1;
/*更新x相鄰的點(diǎn)的d[i],實(shí)際上這里更新的是所有點(diǎn),但是與x未相鄰的MapPrice[x][y]值是無窮大,不可能被更新*/
foreachy∈n
d[y]=min(d[y],d[x]+MapPrice[x][y]);
end for
end for
returnd
end
舊書湖網(wǎng)狀系統(tǒng)隨著書籍信息、業(yè)務(wù)范圍的變化而不斷更新。當(dāng)舊書湖網(wǎng)狀系統(tǒng)中舊書湖編號(hào)為i的換書點(diǎn)中的書籍發(fā)生改變時(shí),如收到新的舊書籍或舊書籍被用戶以換換幣等價(jià)換取等,會(huì)修改相應(yīng)書籍的Books,更新書籍的舊書湖信息;當(dāng)業(yè)務(wù)拓展需要新增區(qū)域舊書湖時(shí),在相應(yīng)城市的區(qū)域舊書湖集合regionLakes中新增一個(gè)元組,描述該舊書湖的相關(guān)信息,將該舊書湖與現(xiàn)有舊書湖的物流路徑和運(yùn)費(fèi)信息增加到區(qū)域舊書湖的連線集合relationships中。
換換書社系統(tǒng)采用了B/S構(gòu)架,即Browser/Server(瀏覽器/服務(wù)器)結(jié)構(gòu),用戶提出的服務(wù)請(qǐng)求和服務(wù)器響應(yīng)都是通過標(biāo)準(zhǔn)的HTTP協(xié)議進(jìn)行的,在服務(wù)器內(nèi)部,書籍信息、訂單、用戶等都存放在數(shù)據(jù)庫中。整個(gè)網(wǎng)絡(luò)系統(tǒng)按“3層結(jié)構(gòu)”(數(shù)據(jù)層、核心層和應(yīng)用層)來構(gòu)架(見圖3)。
圖3 系統(tǒng)架構(gòu)及其功能
(1) 數(shù)據(jù)層。由于存儲(chǔ)數(shù)據(jù)量、訪問量大,要承受高并發(fā),mysql在高并發(fā)情況下的性能下降尤其嚴(yán)重。因此,數(shù)據(jù)庫采用MongoDB數(shù)據(jù)庫[11],MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,并且采用類似面向?qū)ο蟮牟樵冋Z句,存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型以及為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,對(duì)于Web開發(fā)最為合適。根據(jù)可靠性原則和開放與可擴(kuò)展性原則,以及統(tǒng)一和開發(fā)式標(biāo)準(zhǔn)化原則設(shè)計(jì)后臺(tái)數(shù)據(jù)庫。
(2) 核心層。NodeJS作為后端的框架,用于構(gòu)建快速、可擴(kuò)展的網(wǎng)絡(luò)應(yīng)用程序[12]。并且采用面向?qū)ο蠓治鲋械腢ML方式建模,主要包括3個(gè)服務(wù)模塊:書籍提交保存服務(wù)、書籍搜索服務(wù)和書籍訂單服務(wù)。由于用戶瀏覽量大,系統(tǒng)采用單一的主線程,雖然只有單個(gè)線程進(jìn)行業(yè)務(wù)處理(CPU運(yùn)算),但是開啟了其他專門線程進(jìn)行I/O操作,保證響應(yīng)速度快和穩(wěn)定性強(qiáng),同時(shí)NodeJS采用事件驅(qū)動(dòng),一旦監(jiān)聽到搜索服務(wù),調(diào)用sql查詢的回調(diào)函數(shù),使非阻塞I/O模型更加輕量和高效。
(3) 應(yīng)用層。本系統(tǒng)前端工程基于流程簡(jiǎn)化、低成本、快速開發(fā)、高性能等需求,主要選用到Vue.JS、vue-router、vuex、axios等關(guān)鍵組件[13],Vue.JS是支持組件化開發(fā),能夠快速完成復(fù)雜的應(yīng)用程序。根據(jù)應(yīng)用管理層有效的原有應(yīng)用系統(tǒng)分類標(biāo)準(zhǔn)將實(shí)際應(yīng)用系統(tǒng)分成兩個(gè)體系:前端和后臺(tái)管理。前端有4個(gè)模塊,分別是:換書模塊、租書模塊,捐書模塊,尋找書籍模塊。后臺(tái)管理有4個(gè)模塊,分別是:書籍管理模塊、訂單管理模塊、用戶管理模塊、消息管理模塊。
本系統(tǒng)采用前后端分離和極限編程的開發(fā)方式,系統(tǒng)網(wǎng)頁部署在apache服務(wù)器并通過axios與后端NodeJS進(jìn)行通信,實(shí)現(xiàn)真正的前后端解耦。前端采用兼容于主流瀏覽器的UI開發(fā)組件—MuseUI,提供封裝好的移動(dòng)端界面快速調(diào)用,實(shí)現(xiàn)換書單的信息公布,快速搜索書籍,提交捐書書單等等。后臺(tái)管理系統(tǒng)采用layui的通用型后臺(tái)管理模板系統(tǒng),達(dá)到極限編程的快速上線,后臺(tái)主要是用戶管理、書籍的信息管理、用戶反饋消息管理以及用戶換書和捐書的訂單管理。
本系統(tǒng)采用基于bootstrap UI設(shè)計(jì)風(fēng)格的APP設(shè)計(jì),簡(jiǎn)潔UI界面帶來更多的用戶體驗(yàn)[14]。扁平化風(fēng)格的主頁(見圖4)去掉了多余的透視、紋理,表現(xiàn)出軟件的外在表現(xiàn)形式和內(nèi)在展開形式[15],更加吸引用戶注意,并讓用戶掌控APP應(yīng)用軟件。
圖4 換書軟件首頁展示
本系統(tǒng)圍繞日常生活與學(xué)習(xí)展開,用戶操作簡(jiǎn)單便捷,引導(dǎo)和鼓勵(lì)公眾參與,并且在一定支持下能取得較好的發(fā)展,真正意義上實(shí)現(xiàn)服務(wù)于大眾以及降低書籍成本,提高資源回收再利用性。但服務(wù)規(guī)則和簡(jiǎn)單管理無法實(shí)現(xiàn)自助服務(wù),圖書的質(zhì)量取決于人工判斷,將獲取圖書的封面圖片,分析比對(duì)所述封面圖片與數(shù)據(jù)庫中的訓(xùn)練模型以評(píng)定所述圖書的殘缺等級(jí),來實(shí)現(xiàn)圖書質(zhì)量判別以及自助服務(wù)。