方黨豫,高賢強(qiáng)
(塔里木大學(xué)信息工程學(xué)院,阿拉爾 843300)
農(nóng)業(yè)數(shù)據(jù)采集是農(nóng)業(yè)研究工作開展的載體,雖然目前在智慧農(nóng)業(yè)生產(chǎn)中,已經(jīng)大量應(yīng)用了溫濕度傳感器、pH值傳感器、光照強(qiáng)度傳感器和二氧化碳濃度傳感器等傳感器,并構(gòu)建了感知層、網(wǎng)絡(luò)層與應(yīng)用層,實(shí)現(xiàn)了以上數(shù)據(jù)的精確采集與自動(dòng)上傳云端[1],但是農(nóng)業(yè)數(shù)據(jù)采集往往具有數(shù)據(jù)繁雜、數(shù)據(jù)量大、采集地點(diǎn)分散等特點(diǎn),傳感器采集數(shù)據(jù)主要適用于精細(xì)化生產(chǎn)過程,具有數(shù)據(jù)輻射范圍小、數(shù)據(jù)類型固定、鋪設(shè)成本高等特點(diǎn),對于林業(yè)資源、農(nóng)業(yè)人文資源與生物資源等并不適用[2-3]。
隨著智能手機(jī)的普及,為農(nóng)業(yè)科研人員的數(shù)據(jù)采集方式提供了新思路。本系統(tǒng)基于NoSQL 數(shù)據(jù)庫MongoDB,依托其特性,旨在輔助農(nóng)業(yè)科研人員根據(jù)自身所需的數(shù)據(jù)庫結(jié)構(gòu),在系統(tǒng)PC端快速構(gòu)建數(shù)據(jù)采集任務(wù),通過手機(jī)共同協(xié)作錄入數(shù)據(jù),大大降低了科研人員的工作量和勞動(dòng)強(qiáng)度,提高了科研人員共同協(xié)作的效率。并提供了數(shù)據(jù)管理的基礎(chǔ)功能,可導(dǎo)出數(shù)據(jù)為后續(xù)的科研工作做準(zhǔn)備。
本系統(tǒng)使用前后端分離的開發(fā)模式,開發(fā)架構(gòu)由傳統(tǒng)的MVC 模式(Model-View-Controller)變成了MVVM(View-ViewModel-Model)模式。前后端分離的開發(fā)模式與傳統(tǒng)模式相比,可以提升開發(fā)效率、增強(qiáng)代碼可維護(hù)性與提升系統(tǒng)整體穩(wěn)定性等[4]。系統(tǒng)前端使用Vue.js 框架快速構(gòu)建用戶界面,使用Element-UI 美化PC 端頁面,使用Vant 美化移動(dòng)端頁面;數(shù)據(jù)庫使用MongoDB 存儲(chǔ)采集的農(nóng)業(yè)數(shù)據(jù),使用MySQL 存儲(chǔ)用戶信息與MongoDB 數(shù)據(jù)庫的文檔結(jié)構(gòu),以輔助對MongoDB的存儲(chǔ)開發(fā);系統(tǒng)后端使用Spring Boot 框架簡化環(huán)境搭建與開發(fā)流程,使用MyBatis 作為對MySQL 操作的ORM 框架;使用消息隊(duì)列RocketMQ 作為中間件,實(shí)現(xiàn)異步發(fā)送手機(jī)短信功能;使用docker 容器打包部署前后端系統(tǒng),部署服務(wù)器選用阿里云服務(wù)器ECS。系統(tǒng)環(huán)境如表1所示。
表1 系統(tǒng)環(huán)境
1.2.1 MongoDB
MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的文檔數(shù)據(jù)庫產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的,其具有操作起來比較簡單和容易、支持豐富的查詢表達(dá)式與數(shù)據(jù)存儲(chǔ)豐富多樣化等優(yōu)點(diǎn)[5]。本系統(tǒng)之所以選用MongoDB 作為存儲(chǔ)數(shù)據(jù)庫,是因其支持疏松的數(shù)據(jù)結(jié)構(gòu),將關(guān)系型數(shù)據(jù)庫中“行”的概念轉(zhuǎn)換為“文檔”,并使用Json 格式存儲(chǔ),無固定模式限定,可以為不同的農(nóng)業(yè)數(shù)據(jù)采集任務(wù)提供個(gè)性化的字段定義,使得數(shù)據(jù)模型具備靈活多變的能力[6]。如圖1 所示,直觀展示了MongoDB 與傳統(tǒng)關(guān)系型數(shù)據(jù)庫的存儲(chǔ)結(jié)構(gòu)區(qū)別[7]。
圖1 關(guān)系型數(shù)據(jù)庫與文檔數(shù)據(jù)庫MongoDB存儲(chǔ)區(qū)別
1.2.2 Vue
Vue 是時(shí)下較為流行的漸進(jìn)式JavaScript 框架,其只關(guān)注視圖層,采用自底向上增量開發(fā)的設(shè)計(jì),目標(biāo)是通過盡可能簡單的API 實(shí)現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件[8]。Vue 還有豐富的UI 組件庫,支持獨(dú)立開發(fā),解決當(dāng)前前端應(yīng)用開發(fā)組件不豐富的問題,幫助快速構(gòu)建前端頁面[9]。
1.2.3 Spring Boot
Spring Boot 通過簡化配置來進(jìn)一步簡化了Spring 應(yīng)用的整個(gè)搭建和開發(fā)過程,讓構(gòu)建Java Web 應(yīng)用不再配置繁瑣的xml 文件,并且其本身集成了大量的依賴,例如其集成了tomcat,可打包成jar包,開箱即用[10]。
根據(jù)使用用戶類型劃分,本系統(tǒng)將用戶使用需求劃分為數(shù)據(jù)采集負(fù)責(zé)人使用需求與數(shù)據(jù)采集人使用需求。總體流程為負(fù)責(zé)人根據(jù)采集的數(shù)據(jù)字段構(gòu)建數(shù)據(jù)采集任務(wù),下發(fā)給數(shù)據(jù)采集員,其根據(jù)任務(wù)需求錄入采集的數(shù)據(jù),項(xiàng)目負(fù)責(zé)人管理采集到的數(shù)據(jù),并且可以導(dǎo)出數(shù)據(jù)進(jìn)行進(jìn)一步的分析。如圖2 所示,展示了根據(jù)功能需求構(gòu)建的系統(tǒng)使用流程。
圖2 系統(tǒng)使用流程
農(nóng)業(yè)數(shù)據(jù)采集任務(wù)負(fù)責(zé)人端的需求主要包括以下內(nèi)容:
(1)采集任務(wù)構(gòu)建。采集任務(wù)構(gòu)建是整個(gè)任務(wù)采集的基礎(chǔ),負(fù)責(zé)人根據(jù)對采集的數(shù)據(jù)需求來自定義數(shù)據(jù)結(jié)構(gòu)的字段,并可設(shè)置字段的類型與校驗(yàn)規(guī)則來保證數(shù)據(jù)的可靠性。
(2)數(shù)據(jù)采集人員管理。負(fù)責(zé)人可以生產(chǎn)數(shù)據(jù)采集人員的賬戶ID 與密碼,錄入其個(gè)人信息,并分發(fā)給數(shù)據(jù)采集人員,還可以對數(shù)據(jù)采集人員進(jìn)行分組,以方便不同采集任務(wù)的下發(fā)。
(3)采集任務(wù)下發(fā)。采集任務(wù)構(gòu)建完成后,負(fù)責(zé)人可以通過短信、釘釘提醒等功能,下發(fā)給數(shù)據(jù)采集人員。
(4)農(nóng)業(yè)數(shù)據(jù)管理與導(dǎo)出。負(fù)責(zé)人可以對采集的數(shù)據(jù)進(jìn)行增加、修改、刪除與查詢操作,并可導(dǎo)出xlsx、csv 等格式的文件,使用MATLAB 等專業(yè)軟件進(jìn)行數(shù)據(jù)分析。
農(nóng)業(yè)數(shù)據(jù)采集員端的需求主要包括以下內(nèi)容:
(1)數(shù)據(jù)錄入。數(shù)據(jù)采集人員根據(jù)接收到的任務(wù)需求,錄入自己采集到的數(shù)據(jù),并可連續(xù)錄入,并上傳云端,傳入MongoDB數(shù)據(jù)庫。
(2)數(shù)據(jù)共享。數(shù)據(jù)采集人員可以看到其他采集人員上傳的數(shù)據(jù)與采集情況,以便進(jìn)行溝通交流。
2.2.1 模塊設(shè)計(jì)
根據(jù)對系統(tǒng)的需求分析,系統(tǒng)的總體模塊設(shè)計(jì)主要包含數(shù)據(jù)采集任務(wù)負(fù)責(zé)人模塊與數(shù)據(jù)采集員模塊。系統(tǒng)模塊設(shè)計(jì)如圖3所示。
圖3 系統(tǒng)模塊
負(fù)責(zé)人任務(wù)構(gòu)建與下發(fā)模塊和數(shù)據(jù)采集員數(shù)據(jù)錄入模塊是整個(gè)系統(tǒng)的核心,這兩個(gè)模塊是相互聯(lián)系的。負(fù)責(zé)人根據(jù)自身所需,依據(jù)采集數(shù)據(jù)字段、任務(wù)時(shí)間、采集地點(diǎn)等生成數(shù)據(jù)采集任務(wù),根據(jù)事先對數(shù)據(jù)采集員的分組,選擇對應(yīng)的分組下發(fā)數(shù)據(jù)采集任務(wù),并可通過任務(wù)通知功能提醒數(shù)據(jù)采集員;數(shù)據(jù)采集員接收任務(wù)后,打開手機(jī)端頁面錄入數(shù)據(jù)完成數(shù)據(jù)采集任務(wù)。具體流程如圖4所示。
圖4 采集任務(wù)構(gòu)建與錄入流程
2.2.2 架構(gòu)設(shè)計(jì)
系統(tǒng)使用前后端分離開發(fā),使用前后端分離開之后,前端通過Ajax 請求獲取后端數(shù)據(jù)進(jìn)行頁面的渲染。采用分層開發(fā),實(shí)現(xiàn)了高內(nèi)聚低耦合的系統(tǒng)架構(gòu)[11]。便于二次開發(fā)與提高系統(tǒng)的穩(wěn)定性。系統(tǒng)架構(gòu)如圖5所示。
圖5 系統(tǒng)架構(gòu)
2.2.3 數(shù)據(jù)庫設(shè)計(jì)
本系統(tǒng)選用NoSQL 數(shù)據(jù)庫MongoDB 作為存儲(chǔ)的數(shù)據(jù)庫。但是NoSQL 不能完全替代傳統(tǒng)的關(guān)系型數(shù)據(jù)庫[12],因此本系統(tǒng)仍然使用MySQL 以輔助MongoDB的存儲(chǔ)。
根據(jù)對系統(tǒng)的模塊設(shè)計(jì),在MySQL 中建立四張表,各表的詳細(xì)信息如表2 所示。使用InnoDB為存儲(chǔ)引擎。在sys_user 表中建立user_id 字段,將四張表關(guān)聯(lián)起來。
表2 MySQL表設(shè)計(jì)
對于存儲(chǔ)采集數(shù)據(jù)的MongoDB 數(shù)據(jù)庫,其并沒有預(yù)定義的數(shù)據(jù)結(jié)構(gòu),在系統(tǒng)使用過程中,用戶根據(jù)需求動(dòng)態(tài)生成數(shù)據(jù)模式,一個(gè)調(diào)查任務(wù)創(chuàng)建一個(gè)集合,集合中的文檔信息使用JSON 格式存儲(chǔ)。例如需要進(jìn)行蘋果品種的調(diào)查,則可以構(gòu)建如下JSON 格式數(shù)據(jù):{"_id":"","品種名":"","品種拉丁名":"","樣本類型":"","所屬樹種":"","地理數(shù)據(jù)":{"海拔":"","緯度":"","經(jīng)度":""},"生境信息":"","植物學(xué)信息":{"植株情況":"","植物學(xué)特征":"","果實(shí)性狀":"","生物學(xué)習(xí)性":""},"品種評(píng)價(jià)":""}。
完成系統(tǒng)模塊、系統(tǒng)架構(gòu)與數(shù)據(jù)庫的設(shè)計(jì)之后,使用Vue 與Spring Boot 對系統(tǒng)的前后端功能進(jìn)行實(shí)現(xiàn)。
農(nóng)業(yè)數(shù)據(jù)采集負(fù)責(zé)人通過瀏覽器注冊登錄農(nóng)業(yè)數(shù)據(jù)采集系統(tǒng),打開數(shù)據(jù)采集員管理頁面,添加數(shù)據(jù)采集員信息,使用AJAX 向后端API 發(fā)送post 請求,向數(shù)據(jù)庫中添加數(shù)據(jù)并向使用信息服務(wù)發(fā)送給。打開任務(wù)構(gòu)建頁面,根據(jù)數(shù)據(jù)采集任務(wù)需求構(gòu)建采集字段,將數(shù)據(jù)采集字段結(jié)構(gòu)存入MySQL 中,根據(jù)需求選擇下發(fā)任務(wù)的分組,通過信息服務(wù)提醒數(shù)據(jù)采集員。如圖6,為該過程的時(shí)序圖。
圖6 任務(wù)構(gòu)建下發(fā)時(shí)序圖
數(shù)據(jù)采集員通過信息服務(wù)接收到數(shù)據(jù)采集任務(wù)后,即可通過手機(jī)登錄采集系統(tǒng)查看任務(wù)的具體內(nèi)容。登錄系統(tǒng)后,進(jìn)入數(shù)據(jù)錄入頁時(shí),頁面將會(huì)按照存儲(chǔ)在MySQL 中任務(wù)數(shù)據(jù)字段結(jié)構(gòu)來進(jìn)行渲染,錄入數(shù)據(jù)后,提交到服務(wù)端,存入MongoDB 數(shù)據(jù)庫中,數(shù)據(jù)采集負(fù)責(zé)人通過PC 端則可看到實(shí)時(shí)采集的數(shù)據(jù)并進(jìn)行管理。圖7 顯示了實(shí)際的流程。
圖7 數(shù)據(jù)流通流程
本文基于NoSQL 數(shù)據(jù)庫,使用Vue 與Spring Boot 構(gòu)建前后端系統(tǒng),對業(yè)務(wù)需求進(jìn)行了充分調(diào)查與分析,對系統(tǒng)模塊、系統(tǒng)架構(gòu)與數(shù)據(jù)庫結(jié)構(gòu)、采集任務(wù)構(gòu)建與下發(fā)、任務(wù)提醒,數(shù)據(jù)錄入與檢驗(yàn)等關(guān)鍵技術(shù)進(jìn)行設(shè)計(jì)與實(shí)現(xiàn),研發(fā)了農(nóng)業(yè)數(shù)據(jù)采集任務(wù)分發(fā)系統(tǒng)。
考慮農(nóng)業(yè)數(shù)據(jù)采集的實(shí)際應(yīng)用場景,利用MongoDB 的特性,使用戶可以根據(jù)自身需求自定義數(shù)據(jù)模型,實(shí)現(xiàn)對農(nóng)業(yè)數(shù)據(jù)采集任務(wù)的構(gòu)建、下發(fā)、錄入、管理與導(dǎo)出。
經(jīng)過實(shí)踐表明,通過該系統(tǒng)的使用,簡化了農(nóng)業(yè)數(shù)據(jù)采集與數(shù)據(jù)管理的流程,極大方便了農(nóng)業(yè)從業(yè)人員的工作,讓農(nóng)業(yè)從業(yè)人員更專注于對數(shù)據(jù)的分析與處理。本文設(shè)計(jì)的系統(tǒng)雖然達(dá)到了預(yù)期的目標(biāo),但是在對農(nóng)業(yè)數(shù)據(jù)的管理與分析上仍有待提高。下一步準(zhǔn)備在前端引入數(shù)據(jù)可視化組件,并支持已有數(shù)據(jù)導(dǎo)入合并,豐富系統(tǒng)功能。