燕 妮,李岳松,郭史進,劉浩宇
(中國礦業(yè)大學(xué)(北京)機電與信息工程學(xué)院,北京100089)
閱讀是人類進步的階梯,在新時代倡導(dǎo)全民閱讀,建設(shè)書香社會已經(jīng)成為一項必不可少的文化戰(zhàn)略。隨著近些年高校不斷擴招,教學(xué)需求不斷增長以及社會呼吁環(huán)保理念,新舊二手書的循環(huán)利用已經(jīng)迫在眉睫?;诖?,本次課題基于Python的Flask框架和爬蟲技術(shù)手段,開發(fā)了一款公益性質(zhì)的書本循環(huán)平臺,為供需雙方搭載了聯(lián)系的紐帶,學(xué)生們可以把閑置圖書上傳到這個平臺,也可以在平臺構(gòu)建自己的心愿書單。此次課題讓空閑的書本循環(huán)再利用,改善了資源的浪費情況,培養(yǎng)了學(xué)生們勤儉環(huán)保的優(yōu)秀美德。
書本循環(huán)平臺的用戶主要分為三大類,包括管理員、登錄用戶和游客。書本循環(huán)平臺主要實現(xiàn)了以下功能:登錄功能、書本總覽功能、詳情信息展示功能、贈送清單功能、心愿單功能。登錄功能包括注冊、登錄和注銷;書本總覽功能在首頁展示了一部分圖書;詳情信息展示功能可以查看到本書的作者、出版年月日和書本簡介等信息并另一側(cè)推送相關(guān)書目。贈送清單功能展示了用戶可以贈送的書本清單,本平臺區(qū)別于其他平臺的地方是不需要拍照上傳等復(fù)雜工序,而是采用搜索書名或者ISBN編號實現(xiàn)快速錄入贈送清單,極大提升了用戶的體驗;心愿單功能可以列出用戶想獲得的書本信息,同樣采取搜索方式,點亮?xí)鞠路降男坌木涂商砑又列脑盖鍐巍.?dāng)用戶訪問平臺時可以選擇注冊登錄或者游客身份,游客身份只能看到首頁展示的書目總覽及登錄后可查看自己的可贈送清單和心愿單。系統(tǒng)總用例圖如圖1所示。
圖1 總用例圖
1.2.1 書本循環(huán)平臺的概要設(shè)計
前后端都使用經(jīng)典的MVC設(shè)計模式[1]。MVC模式分離了視圖層和模型層,并通過控制層相連接。View層主要負(fù)責(zé)后臺數(shù)據(jù)的輸出、頁面的呈現(xiàn)和人機交互工作。Controller層用來處理系統(tǒng)業(yè)務(wù),翻譯用戶輸入的信息,并按照用戶輸入生成操作模型傳送給Model層,以此滿足用戶需求。Model層負(fù)責(zé)管理行為和數(shù)據(jù),行為表示更新來自Controller的狀態(tài),數(shù)據(jù)與數(shù)據(jù)庫相連接,根據(jù)請求加載后臺數(shù)據(jù),完成業(yè)務(wù)邏輯,對頁面進行渲染。
本課題設(shè)計的MVC書本循環(huán)平臺工程目錄結(jié)構(gòu)圖如圖2所示。
圖2 書本循環(huán)平臺工程目錄結(jié)構(gòu)圖
common文件包括libs和models文件,存放公共使用的函數(shù)和類[2];config文件是整個工程不同環(huán)境的配置文件,例如基礎(chǔ)配置、本地配置和生產(chǎn)環(huán)境配置;controllers文件內(nèi)放置用戶登錄和書目信息管理代碼;interceptors是對運行過程中異常處理的編寫;jobs文件夾主要存放爬蟲代碼,包括定時爬蟲和保存從html中獲得的信息;static文件是靜態(tài)文件,包括前端所需的CSS、JS等文件;templates是模板存放文件夾;application對全局變量類管理;manager是入口文件,啟動整個工程;requirement.txt說明這個工程所用到的庫,方便后期維護和管理;www文件是路由核心文件。本MVC框架符合Web開發(fā)的需求和特點,它對項目進行了合理分工,保證各個模塊同時啟動,互不影響,開發(fā)效率顯著提高,節(jié)約了人力和時間成本。在開發(fā)Web項目時,使用MVC框架便于后期運營和維護,方便系統(tǒng)化管理項目[3]。
1.2.2 書本循環(huán)平臺的數(shù)據(jù)庫設(shè)計
數(shù)據(jù)庫設(shè)計是后端管理必不可少的一步,好的數(shù)據(jù)庫設(shè)計在特定的應(yīng)用環(huán)境里可以起到事半功倍的效果。將有效的數(shù)據(jù)存儲到數(shù)據(jù)庫中,以此滿足用戶的各項需求。本次課題采用Mysql數(shù)據(jù)庫服務(wù)和navicat可視化工具,主要設(shè)計了兩個表單:登錄注冊功能需要的user表單和書目管理所用到的book表單。登錄注冊模塊的數(shù)據(jù)庫設(shè)計,表名為user。字段包括id序號主鍵、nickname昵稱、login_name登錄用戶名、login_pwd登錄用戶密碼、login_salt登錄密碼隨機字符串、status狀態(tài)(0:無效,1:有效)、updated_time最后一次更新時間、creatd_time插入時間。
書目管理系列用到的數(shù)據(jù)庫如表1所示,表名為book。
表1 書目管理系統(tǒng)的數(shù)據(jù)庫
書本循環(huán)平臺的整體框架[4]如圖3所示。
圖3 書本循環(huán)平臺整體架構(gòu)圖
Python計算機編程語言自20世紀(jì)90年代誕生以來,憑借其簡潔、規(guī)范、可讀性強已經(jīng)被廣泛運用于腳本編寫和Web開發(fā)等領(lǐng)域[5],Python語言既支持面向?qū)ο缶幊桃仓С置嫦蜻^程編程,它不僅有豐富的準(zhǔn)庫還擁有很多第三方庫,這使得開發(fā)人員使用Python可以便捷地解決系列融合問題,使互聯(lián)網(wǎng)產(chǎn)品易于維護和迭代。本次課題主要的編譯器是Pycharm,其自帶的調(diào)試功能、自動整理代碼格式、歷史提交回滾等功能幫助開發(fā)人員提高了開發(fā)效率。開發(fā)框架選擇的是Flask框架,是一個輕量級Web開發(fā)框架,功能強大且兼容其他庫來實現(xiàn)開發(fā)需求,它靈活且可擴展性強[6],Werkzeug和模板引擎Jinja是Flask的核心應(yīng)用。先將Flask實例化,接受一個name參數(shù),用戶在瀏覽器前端做出指令,發(fā)送HTTP請求,將請求傳送回服務(wù)器,F(xiàn)lask用werkzeug做出路由分發(fā),為每個Url找到對應(yīng)的視圖函數(shù),接著Flask調(diào)用視圖函數(shù)進行相應(yīng)操作,再將響應(yīng)結(jié)果返回客戶端,并將數(shù)據(jù)渲染到頁面上,以此完成一次程序運行。
Nginx是輕量級Web服務(wù)器,適用于高并發(fā)連接且內(nèi)存消耗少,可供跨平臺多個開發(fā)系統(tǒng)使用[7],是本次課題服務(wù)器選擇方面的不二法門。由于windows系統(tǒng)不支持uwsgi插件,因此需要tornado插件來配合部署高并發(fā)架構(gòu)。在Flask框架中,路由的設(shè)置需使用route屬性,這種方式是默認(rèn)使用get請求,如果需要post請求則需要在列表容器methods中特別設(shè)定。當(dāng)項目較大時,需要的視圖函數(shù)會很多,此時需要使用藍圖Blueprint來區(qū)分模塊,這樣也有利于后期的代碼維護。
前端部分采用bootstrap前端開發(fā)框架,可使前端開發(fā)更加迅速簡單。toC比較注重交互,前端采用bootstrap響應(yīng)式布局,以及骨架圖初始化呈現(xiàn)未加載數(shù)據(jù)頁面,響應(yīng)式布局對頁面縮放拖拽特性友好,頁面應(yīng)該有能力去自動響應(yīng)用戶的設(shè)備環(huán)境,同時會考慮一些不同瀏覽器之間的兼容性。另一方面使用模版引擎渲染技術(shù),利用正則表達式分解出普通字符串和模板標(biāo)識符,將模版表達式替換為瀏覽器語言表達式,模版引擎將數(shù)據(jù)和頁面分離,可以通過變量更新頁面,提高代碼復(fù)用擴展能力,并且可以在頁面中寫入一些具體邏輯,方便渲染。網(wǎng)頁調(diào)試工具可以采用chrome插件類產(chǎn)品,可以發(fā)送所有類型請求的postman進行接口測試工作。
書籍清單主要依靠爬蟲技術(shù)和正則表達式獲得。一只爬蟲可以從目標(biāo)網(wǎng)頁的html中提取開發(fā)者的需求內(nèi)容,以及和網(wǎng)頁進行交互。本次課題使用的是BeautifulSoup庫,用來解析html,但在代碼編寫時要注意查看源碼的編碼方式,加以解碼[8]。之后將爬到的數(shù)據(jù)按標(biāo)準(zhǔn)化格式傳遞給model業(yè)務(wù)邏輯層,邏輯層使用正則表達式和第三方庫對數(shù)據(jù)進行清洗與封裝,并存儲到數(shù)據(jù)庫中。設(shè)計好的數(shù)據(jù)庫將用于存儲用戶的賬號密碼,并使用md5加密[9]保護用戶的隱私性。書單查詢、修改和新增等操作也是基于數(shù)據(jù)庫進行的。
登錄模塊主要分為注冊和登錄兩部分,點擊注冊按鈕會跳轉(zhuǎn)到注冊頁面,用戶輸入信息會判斷其完整度和格式標(biāo)準(zhǔn)度,給用戶相應(yīng)的反饋,如圖4所示。
圖4 注冊模態(tài)框
書籍總覽和書本詳情信息數(shù)據(jù)來源:通過封裝的Hook函數(shù)以及Ngnix定時任務(wù),從一些開放式網(wǎng)站定時爬取最新的數(shù)據(jù),并將其存放到數(shù)據(jù)庫中。整體頁面通過模板引擎渲染,當(dāng)用戶訪問不同頁面時,瀏覽器會根據(jù)請求發(fā)送信息到Nginx服務(wù)器,并發(fā)訪問視圖函數(shù),將需求信息呈現(xiàn)出來。效果如圖5所示。
圖5 書籍詳情展示效果圖
本文基于Python的Flask框架,結(jié)合爬蟲技術(shù)設(shè)計了一款書籍循環(huán)平臺,該平臺設(shè)計美觀大方,交互靈活且人性化,代碼段內(nèi)聚性高耦合性低且可讀性強,便于后期維護,同時巧妙利用瀏覽器的cookie機制,改善服務(wù)器的負(fù)荷壓力,提高頁面響應(yīng)性能。平臺旨在實現(xiàn)書籍再利用,有效緩解了高校書籍浪費現(xiàn)象,為推動節(jié)約型環(huán)保社會奉獻了一份力量。