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