方媛,詹鳳,馬多春
(馬鞍山學院 經濟與管理學院,安徽 馬鞍山 243100)
居民出行調查是進行城市或農村交通規劃、配套設施規劃的重要參考依據。方便高效低成本的采集真實精準的調查數據是一項重要工作,也是一項重要研究內容,數據樣本規模和質量直接關系到后續的數據建模分析。傳統的居民出行調查方式一般通過居委會或者志愿者上門發放紙質問卷調查的方式,這種方式需使用大量的社會資源,成本高,且存在調查效率低下,獲取數據樣本有限,數據質量不高、人工整理數據容易出錯等明顯不足。在移動互聯網技術高速發展的今天,使用移動應用來獲取居民出行調查數據變得可能。但是使用獨立APP 的方式推廣使用難度過大,使用微信小程序是一個很好的選擇,無須單獨下載安裝應用,人人都有微信,通過微信小程序填寫問卷的方式可大大減少人力、物力、時間成本支出,同時充分利用手機定位結合地圖技術,數據質量大大提升,高質量的數據為后續數據特征處理及分析提供有效支持,成為目前主要的調查方式。
居民出行調查系統分為前端小程序和后端管理系統。前端小程序是面向調查對象所設計的頁面,調查對象只需通過掃描二維碼即可進入小程序頁面,進行問卷題目的展示和回答,回答完成后提交問卷,此次調查結束。填寫問卷的頁面如圖1所示。

圖1 居民出行調查小程序
后端管理系統是對完成一次調查所需的功能及數據的管理控制及維護,包含題庫管理、調查活動管理、組卷管理、問卷數據、數據分析與可視化、系統管理六大模塊,系統總體功能結構如圖2所示。

圖2 居民出行調查系統功能結構
該模塊是對居民出行問卷的題目進行管理維護,根據調查方設計的問卷題目進行錄入維護,也可為調查方提供歷史調查題目參考。題庫的類型為選擇題、判斷題、和主觀題。為了調查的便捷性,原則上不出現主觀題,必須有主觀題的時候,盡可能少。
該模塊對每次的調查活動進行管理維護。當需要調查時,在此模塊增加一個調查活動,并設定調查活動名稱、此次調查的目的、人群等信息,并設定調查活動的開始時間和結束時間、區域范圍等配置信息。活動的開始時間和結束時間是指根據調查方指定的調查時間范圍來設定小程序可工作的時間范圍,超過時間,用戶打開小程序時,應該提示“本次調查活動已結束”。區域范圍是指根據調查方指定的本次調查地理位置范圍,如經度、緯度在什么范圍,用戶進入小程序后,可通過獲取手機定位數據判斷用戶是否在調查范圍,不在區域范圍給出友好提示并退出小程序,在該范圍的可以進行問卷填寫。
此模塊根據題庫生成某次調查活動的實際問卷,包括選取的題庫中的哪些題目,題目的分類,題目的序號、是否必答等。
該模塊可分頁展示此次調查所采集到的數據。對數據提供綜合查詢、數據導出功能,以便后續利用數據進行高級的多維度數據處理和分析。
本模塊可對調查的進展情況進行實時數據統計,并用柱狀圖、餅圖、散點圖、熱力圖等可視化圖形輸出展示。如日活人數,當前采集的數據量,每日采集數據量對比,每日中不同時段數據采集量對比,每道題不同選項分布圖,區域調查對象分布熱力圖等基礎統計分析結果。更個性化的數據分析可使用本系統導出數據功能后使用專業工具或者編寫Python 程序處理。
系統管理包括用戶管理、角色管理、權限管理、功能管理、系統日志等功能。用戶管理是對使用本系統的所有用戶進行管理,包括增加、修改、凍結用戶、分配角色功能。權限管理是將系統中所有的功能操作權限進行統一管理。一個角色是不同的權限組合,一個用戶可具備多個角色,即具有這些角色對應權限的總和。操作日志記錄本系統的所有對數據變動的操作記錄。服務。該平臺總體架構如圖3所示。

圖3 系統總體架構
基于上述架構的居民出行調查系統的后端采用主流的編程語言Java 語言開發,基于Spring boot 框架搭建項目,采用典型的J2EE 三層架構,將整個業務分為表現層、業務邏輯層和數據訪問層。表現層就是Web頁面,在本項目中使用Vue.js 引擎渲染頁面,業務邏輯層是對數據層的操作,對數據業務邏輯處理,在本項目中由service 組件提供;而數據持久層的任務是將經過業務處理的數據存儲到數據庫中去,在本項目中由Mybatis 組件提供數據持久化。整個項目采用MVC 設計模式,分別是模型層、視圖層、和控制層,通過模型層與視圖層的分離,實現各層之間的松耦合,減少層與層之間的依賴,提高代碼復用性和擴展性,有利于項目開發的標準化,也便于程序開發人員明確分工,專注于各層的開發,各層之間通過接口調用完成業務功能。
問卷小程序運行在用戶微信本地,這是一個基于瀏覽器內核完全重構的內置解析器,針對性做了優化,并使用微信自定義的標記語言wxml 和樣式文件wxss,提升了微信小程序的性能,小程序架構如圖4所示。

圖4 微信小程序技術架構
本系統從運行環境角度分為微信小程序端、PC 端和服務器端,總體采用B/S 和C/S 混合的架構。后端管理平臺運行在瀏覽器,服務器端統一為微信小程序和瀏覽器提供數據
居民出行調查一般需要在指定時間段內完成,所以該小程序具有時間段、用戶訪問量大的典型特征,如何解決短時大并發訪問是重點關注的問題。本小程序在架構上采用基于無服務器架構的云函數機制來實現大并發訪問。微信提供的云函數即在云端運行的一個Node.js 程序,一個功能即一個云函數,是一個可以獨立運行的單元,獨立部署,每個云函數分配一定的CPU 和內存計算資源,在云端使用docker 容器部署,易于伸縮,當用戶訪問量大的時候,可以啟動多個云函數實例,當用戶訪問量下降的時候,可以自動關閉某些不再活躍的實例,達到自動伸縮的目的,云函數按照使用量計費,不使用無須付費,真正實現了云計算按需付費。將小程序前端需要和服務交互的功能全部拆分成一個個獨立的小功能,每個功能做成一個云函數,由這些云函數的功能調用完成整個小程序和后端的交互功能,完成數據的持久化存儲。通過任務拆分分別設計部署云函數來實現業務解耦,若干的云函數構成一個分布式微服務系統架構。從根本上解決大并發訪問的問題。小程序云函數架構如圖5所示。

圖5 云函數架構
數據庫居民出行調查系統的核心,是數據持久化存儲的地方。數據庫設計(Database Design)是指對于給定的一個業務場景,構建最優的數據庫模式,建立數據庫并在其基礎至上開發應用系統,良好的數據庫設計能夠有效地存儲數據,滿足用戶的數據處理要求。包括數據庫概念結構設計、邏輯結構設計和物理結構設計。數據模型設計是系統開發的核心,數據庫的設計若不合理,會導致系統開發運維的難度增大,數據處理性能達不到要求,數據冗余程度高,數據的一致性得不到保障,導致軟件項目失敗、程序不可用。本項目數據庫的設計按照第三范式(3NF)要求,盡量減少冗余數據的產生,避免客戶端統計數據、數據分頁,在服務器端執行數據分頁、存儲過程計算,避免大表交叉運算,減少設計表外鏈接。
居民出行調查系統數據模型的設計重點是題庫數據模型、調查任務數據模型、組卷數據模型、用戶回答數據模型。題庫數據模型記錄題庫的編號、題目、題目類型、題目選項等信息。調查任務數據模型包括調查編號、調查名稱、起始日期、終止日期、題目數等信息。組卷數據模型是題庫與調查活動的關聯關系模型,包括調查編號、題目編號。調查數據模型存儲用戶的問卷答案,包括主鍵編號、用戶微信openid、題目編號、選項等。數據庫詳細設計模型如表1至表4所示。

表1 題庫數據模型

表2 調查活動數據模型

表3 組卷數據模型

表4 用戶問題選項模型
隨著移動互聯網技術的快速發展,移動應用在社會生活的各行各業得到了廣泛的應用,給各行各業注入了新的活力。小程序由于其具備的不用安裝、隨用隨走的特性相比APP 應用更得到廣大用戶青睞。在居民出行調查場景尤其適合于小程序,相比于傳統的調查方式而言基于微信平臺的居民出行調查小程序系統具有高效、方便、快捷、成本低的特點。用戶無須下載安裝APP 應用,同時也使得調查活動宣傳推廣變得更簡單,易于傳播,只需將小程序的二維碼推送給各居民小區、企業、學校群。通過微信小程序的調查可以在短時間內覆蓋大量人群,獲取第一手出行數據。結合手機定位和騰訊地圖API,可以獲得準確的位置信息,數據質量大幅提升,而且還能獲得傳統方式無法獲得的數據。高質量的原始數據經過簡單清洗后為后續的特征建模和數據分析提供堅實基礎。本文結合實際需求設計了基于微信平臺的居民出行調查小程序前端和后臺功能,詳細說明了后臺管理系統和小程序的架構設計,并給出了核心數據模型設計,可據此實現系統程序的開發。