呂維廣,申浩如,孫定蜜,楊延仁,胡正南,黎諜,饒肖
摘要:通過對(duì)云南省教育扶貧階段性成果進(jìn)行分析,確定數(shù)據(jù)、名言、模范、地圖、政策、學(xué)術(shù)6個(gè)典型展示維度,采用前后端分離開發(fā)模式和增量軟件開發(fā)模型,基于Vue、ECharts、Maven、MySQL工具,設(shè)計(jì)開發(fā)該信息可視化系統(tǒng)。將云南省教育扶貧積累的異構(gòu)、多源、空間相關(guān)數(shù)據(jù)進(jìn)行表征,以數(shù)字化動(dòng)態(tài)交互形式展現(xiàn)出來,為云南省教育精準(zhǔn)扶貧提供直觀的可視化分析手段,形成窗口宣傳效應(yīng)。
關(guān)鍵詞:云南?。唤逃鲐?;可視化系統(tǒng);Vue;ECharts
中圖分類號(hào):TP311.52? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)32-0034-04
1 概述
教育扶貧是贏得中國(guó)脫貧攻堅(jiān)全面勝利的重要一役。由于云南省的地理復(fù)雜性和民族多樣性,使云南教育扶貧更具挑戰(zhàn)性。本文基于數(shù)據(jù)統(tǒng)計(jì)原理,綜合使用Vue、ECharts、Maven等工具對(duì)云南省相關(guān)教育扶貧數(shù)據(jù)進(jìn)行可視化表征,從地理空間和非地理空間維度直觀展現(xiàn)這些海量、異構(gòu)、多源數(shù)據(jù),為政府職能部門、教育行政主管部門、學(xué)術(shù)研究群體提供有價(jià)值的可視化結(jié)果,助推云南省教育扶貧精準(zhǔn)施策,實(shí)現(xiàn)貧困人口“脫真貧、真脫貧”[1]的愿景。
2 云南省教育扶貧可視化系統(tǒng)總體設(shè)計(jì)
2.1 系統(tǒng)架構(gòu)設(shè)計(jì)
教育扶貧可視化系統(tǒng)采用B/S體系結(jié)構(gòu),前端使用Vue框架,它是一個(gè)擴(kuò)展性和復(fù)用性較強(qiáng)的輕量級(jí)漸進(jìn)式JavaScript框架,基于數(shù)據(jù)驅(qū)動(dòng)、交互展示和視圖組件化構(gòu)建前端頁面[2]。后端服務(wù)程序使用Maven項(xiàng)目管理工具創(chuàng)建,自動(dòng)管理依賴包和版本配置,通過IDEA一鍵發(fā)布調(diào)試,大幅降低包的版本依賴問題[3]。最終將負(fù)責(zé)業(yè)務(wù)邏輯的后端工程打包通過阿里云Tomcat服務(wù)器發(fā)布。
前后端數(shù)據(jù)交互使用axios進(jìn)行異步請(qǐng)求同步化處理,減輕后端數(shù)據(jù)處理壓力[4]。前后端分離開發(fā),前端代碼由阿里云的對(duì)象存儲(chǔ)OSS服務(wù)托管,降低服務(wù)器帶寬壓力[5]。此外,為解決前后端分離開發(fā)導(dǎo)致的跨域請(qǐng)求問題,項(xiàng)目使用Filter過濾器對(duì)請(qǐng)求進(jìn)行過濾處理[6]。底層數(shù)據(jù)存管采用MySQL數(shù)據(jù)庫。系統(tǒng)架構(gòu)如圖1所示。
系統(tǒng)選用增量軟件開發(fā)模型。原因有三:1)開發(fā)時(shí)人員可靈活分配,能在較短時(shí)間內(nèi)向甲方提交部分可操作產(chǎn)品,有效解決了參與系統(tǒng)開發(fā)的學(xué)生成員因?qū)W業(yè)導(dǎo)致頻繁換人的客觀實(shí)際。2)采用“分而治之”思想,把問題分解成可控的子模塊,先完成需求穩(wěn)定的核心構(gòu)件,避免團(tuán)隊(duì)因長(zhǎng)時(shí)間需求任務(wù)而感到沮喪。3)增量模型并非一步跨到未來,讓開發(fā)者逐步適應(yīng)全棧開發(fā)技術(shù),符合在校學(xué)生軟件開發(fā)訓(xùn)練的普遍規(guī)律。
系統(tǒng)架構(gòu)設(shè)計(jì)必須注意:1)增量開發(fā)模型最大特點(diǎn)是具有較好的擴(kuò)展性,在開發(fā)過程中必須注意接口定義。2)由于系統(tǒng)各個(gè)模塊之間耦合度較低,導(dǎo)致代碼的審查難度增加,容易出現(xiàn)代碼冗余情況,所以必須定義好一個(gè)可行的開發(fā)過程。3)由于各個(gè)組件是逐步并入軟件體系架構(gòu)中,系統(tǒng)內(nèi)核是十分關(guān)鍵的部分,內(nèi)核不精簡(jiǎn)將會(huì)使增量模型退化成邊做邊改模型[7]。
項(xiàng)目開發(fā)中的依賴庫如表1所示。
2.2 功能模塊設(shè)計(jì)
系統(tǒng)有6個(gè)模塊:教育扶貧里程碑、每日扶貧金句、教育扶貧先鋒模范、地圖可視化綜合交互展示、教育扶貧政策方針、教育扶貧學(xué)術(shù)研究。根據(jù)不同數(shù)據(jù)屬性將這些數(shù)據(jù)分別通過柱狀圖、曲線圖、堆疊圖、矢量地圖、輪播圖、主題詞云等多種可視化形式進(jìn)行表征,詳見表2。
2.3 后臺(tái)數(shù)據(jù)庫設(shè)計(jì)
后端資源通過MySQL存儲(chǔ),使用JDBC連接池工具進(jìn)行數(shù)據(jù)庫連接管理,優(yōu)點(diǎn)是無須手動(dòng)管理數(shù)據(jù)庫連接對(duì)象,按需取用,使用結(jié)束釋放回連接池即可,避免數(shù)據(jù)庫未被釋放帶來的風(fēng)險(xiǎn)。根據(jù)系統(tǒng)功能描述,設(shè)計(jì)數(shù)據(jù)庫表,其中下劃線字段為表主鍵:
1)城市:city (ID, 城市名, 所屬縣名, 扶貧舉措)。進(jìn)庫記錄88條。
2)金句:famous_remarks (ID, 發(fā)布時(shí)間, 內(nèi)容, 發(fā)言人) 。進(jìn)庫記錄12條。
3)人物:people (ID, 姓名, 身份、事跡簡(jiǎn)介) 。進(jìn)庫記錄27條。
4)政策:policy (ID, 政策名稱, 發(fā)布機(jī)構(gòu), 官方URL) 。進(jìn)庫記錄42條。
5)詞云:word_cloud (ID, 關(guān)鍵詞, 引用次數(shù)) 。進(jìn)庫記錄1000條。
3 云南省教育扶貧可視化系統(tǒng)核心功能實(shí)現(xiàn)
3.1 系統(tǒng)界面
圖2給出了云南省教育扶貧可視化系統(tǒng)界面設(shè)計(jì),界面以深紅主調(diào)為背景,嵌入了省會(huì)昆明市的傳統(tǒng)地標(biāo)“金馬碧雞”牌坊和新建地標(biāo)高度407米的“春之眼”,以及滇西重鎮(zhèn)大理市的蒼山元素,寓意近年云南省扶貧取得的豐碩成果。
3.2 圖文信息展示模塊
教育扶貧里程碑、每日扶貧金句、教育扶貧模范這三個(gè)模塊主要使用Element UI組件劃分頁面框架,并利用CSS渲染文字,同時(shí)還使用JavaScript結(jié)合@keyframes實(shí)現(xiàn)圖片和文字的滾動(dòng)播放效果。
3.3 基于ECharts和地理信息標(biāo)注的可視化模塊
針對(duì)項(xiàng)目開發(fā)難度較大的地圖綜合展示模塊,該模塊采用ECharts的map類型地圖圖表,將具有空間地理特征的信息可視表征。首先,地圖繪制是通過阿里云提供的數(shù)據(jù)可視化平臺(tái)http://datav.aliyun.com獲取云南省地理數(shù)據(jù)結(jié)構(gòu)編碼JSON文件,在渲染前將文件通過GET或POST方法獲得地理結(jié)構(gòu)數(shù)據(jù),之后使用echarts.registerMap('yunnan', geoJson)方法注冊(cè)地圖,然后對(duì)地圖進(jìn)行相關(guān)配置。在配置項(xiàng)中,data是該圖表渲染數(shù)據(jù)的接口,其中包括城市名和權(quán)值(決定地圖塊著色深淺),渲染時(shí)可根據(jù)城市名和權(quán)值進(jìn)行自動(dòng)關(guān)聯(lián),權(quán)值越高的城市區(qū)域顯示顏色越深。城市顏色渲染梯度是通過配置視覺映射組件visualMap控制。代碼如下:
geo:{ //地理坐標(biāo)系組件,支持地理坐標(biāo)上繪制散點(diǎn)、線集
type:'map', //指定圖表類型為地圖
map:'yunnan', //自定義擴(kuò)展圖表類型,參數(shù)使用注冊(cè)時(shí)的變量名
roam:true, //關(guān)閉移動(dòng)漫游
zoom:1.2, //設(shè)置初始化地圖縮放比例
selectedMode:false, //設(shè)為不可移動(dòng)地圖
data:mapData, //地圖渲染數(shù)據(jù)包括:mapData{[name:城市名,value:權(quán)值]}
label: {
show: false, //不顯示標(biāo)簽
fontSize: '50px' //設(shè)置標(biāo)簽顯示字體大小
},
}
visualMap: [{ //視覺映射組件配置
bottom: '45%', //組件離容器底部位置
left:'5%', //組件離容器左邊位置
text: ['High', 'Low'], //兩端的文字
realtime: true, //拖拽時(shí)實(shí)時(shí)更新渲染
calculable: true, //顯示拖拽手柄,手柄能拖拽調(diào)整選中范圍
}]
同時(shí)在地圖上標(biāo)注“州市”散點(diǎn)圖,在上述geo地理坐標(biāo)系統(tǒng)進(jìn)行疊加渲染,配置時(shí)data是散點(diǎn)圖渲染的數(shù)據(jù)接口,數(shù)據(jù)結(jié)構(gòu)包括必選項(xiàng)散點(diǎn)geo坐標(biāo)位置和附加描述信息項(xiàng),并指明該散點(diǎn)圖是基于何種坐標(biāo)系渲染。默認(rèn)情況下鼠標(biāo)移動(dòng)到散點(diǎn)上浮動(dòng)提示框只顯示諸如經(jīng)緯度和地名等默認(rèn)信息,如要顯示指定描述信息需通過配置浮動(dòng)提示框tooltip實(shí)現(xiàn),如要實(shí)現(xiàn)根據(jù)點(diǎn)擊對(duì)象判斷顯示指定信息,則需配置formatter。formatter既可接收一段靜態(tài)html格式代碼也可接收一個(gè)匿名函數(shù)function(param),函數(shù)被調(diào)用時(shí)傳入?yún)?shù)param標(biāo)識(shí)了被點(diǎn)擊的唯一元素,即被點(diǎn)擊元素類型和對(duì)應(yīng)geo坐標(biāo)及附加描述信息,通過對(duì)點(diǎn)元素的判斷來選擇顯示內(nèi)容,代碼如下:
series: [ //散點(diǎn)圖配置
{
data: scatterdata, //散點(diǎn)坐標(biāo)數(shù)據(jù)data:[“value”:[經(jīng)度,緯度],”name”:”地名”,”text”:”描述信息”]
type: 'scatter', //設(shè)置圖表類型為散點(diǎn)圖
coordinateSystem:'geo', //設(shè)置散點(diǎn)使用的坐標(biāo)系統(tǒng)
symbolSize: 20, //散點(diǎn)大小
color:'red' //散點(diǎn)顏色
}
]
tooltip:{ //浮動(dòng)提示框配置
show:true,
backgroundColor: "rgba(203,203,203,0.8)", //設(shè)置背景圖片RGBA格式
borderWidth: 0, //邊框?qū)挾仍O(shè)置1
borderColor: "aqua", //設(shè)置邊框顏色
padding:0, //邊框?qū)挾?/p>
textStyle:{ //配置提示框文本格式
fontSize:'40px',
color:'rgba(254,255,86)'
},
triggger:'item', //觸發(fā)類型
formatter:function(param){ //函數(shù)方式返回提示框信息
return '
}
}
}
由于地圖和今昔對(duì)比圖展示于同一“
”標(biāo)簽中,在ECharts作圖時(shí)需將兩圖配置信息寫入配置數(shù)組。同時(shí)兩張圖表均按用戶交互需求通過POST方法從服務(wù)器動(dòng)態(tài)更新數(shù)據(jù),這使得配置項(xiàng)中的數(shù)據(jù)部分不會(huì)被固定,而是留下一個(gè)數(shù)據(jù)接口,隨用戶點(diǎn)擊動(dòng)態(tài)調(diào)用,并同步刷新圖表Vue地圖組件。同理,今昔校園對(duì)比照片也跟隨用戶點(diǎn)擊動(dòng)態(tài)從服務(wù)器拉取圖片,通過監(jiān)聽click事件向服務(wù)器發(fā)送POST請(qǐng)求報(bào)文刷新圖片。代碼如下:mapChart.on('click', function (params) { //監(jiān)聽點(diǎn)擊事件
if(params.componentSubType=='map'){ //判斷是否點(diǎn)擊了地圖組件
City(params.name).then(data => { //通過axios獲取數(shù)據(jù)
var testdata=[] //設(shè)置空變量
for(var i in data){ //遍歷數(shù)據(jù)
testdata.push(data[i]) //在空變量中填充要渲染的數(shù)據(jù)
}
citydata.value=testdata //把最新數(shù)據(jù)同步給數(shù)據(jù)接口
})
landname.value=params.name //同步點(diǎn)擊的州市名
//根據(jù)點(diǎn)擊的州市名用require方法獲取對(duì)應(yīng)今夕對(duì)比圖片
imgland1.value =require('@/assets/land/'+params.name+'1.jpg')
imgland2.value =require('@/assets/land/'+params.name+'2.jpg')
}
})
教育扶貧政策方針模塊通過詞云展示相關(guān)政策的關(guān)鍵詞,該模塊利用第三方工具圖悅詞頻分析軟件對(duì)所遴選的教育政策進(jìn)行詞頻分析,使用Python對(duì)數(shù)據(jù)進(jìn)行清洗上傳數(shù)據(jù)庫。在設(shè)置ECharts詞云配置項(xiàng)時(shí)應(yīng)注意不僅要導(dǎo)入echarts插件還應(yīng)導(dǎo)入echarts_wordcloud依賴插件。詞云不同于其他模塊的配置,不僅需要配置data數(shù)據(jù)接口,data數(shù)據(jù)結(jié)構(gòu)包括關(guān)鍵詞和引用次數(shù),還要傳入蒙版圖片數(shù)據(jù)maskImage,用于限定詞云的邊界輪廓。蒙版圖片需選擇一張黑白圖,轉(zhuǎn)化為base64編碼字符串,本項(xiàng)目選用一張中國(guó)地圖作為邊界輪廓。代碼如下:
var maskImage = new Image(); //創(chuàng)建一個(gè)Image類型對(duì)象
maskImage.src = image //將邊界輪廓的base64編碼字符串賦值給maskImage的src屬性
series: [{ //詞云圖配置項(xiàng)
type: 'wordCloud', //指定圖表類型為詞云
gridSize: 1, //設(shè)置文字間隔
shape: 'circle', //設(shè)置詞云形狀
sizeRange: [12, 55], //設(shè)置文字字號(hào)范圍
maskImage: maskImage, //渲染圖形的Image對(duì)象
textStyle: {
fontSize: '50px', //字體大小
color: function () { //設(shè)置文本顏色,采用隨機(jī)生成色
return 'rgb(' + [
Math.round(Math.random() * 255),
Math.round(Math.random() * 150),
Math.round(Math.random() * 150)
].join(',') + ')'
}
}
3.4 基于CNKI的學(xué)術(shù)文獻(xiàn)可視化模塊
在CNKI文獻(xiàn)數(shù)據(jù)庫以“篇名=教育扶貧”O(jiān)R“主題=教育扶貧”為關(guān)鍵詞進(jìn)行檢索,期刊來源為CSSCI和北大核心,查詢年限為2021年12月31日前,共搜索有效學(xué)術(shù)文獻(xiàn)947篇。使用ECharts曲線圖、柱狀圖、餅圖工具對(duì)年發(fā)文量、主/次要主題分布TOP10、文獻(xiàn)來源分布TOP10、學(xué)科領(lǐng)域分布TOP10、作者及單位分布TOP8繪制統(tǒng)計(jì)圖表。
3.5 系統(tǒng)實(shí)現(xiàn)相關(guān)問題
由于界面容納元素較多,各元素之間又相互關(guān)聯(lián)和復(fù)用,為簡(jiǎn)化開發(fā)流程、提高代碼復(fù)用率,在開發(fā)過程中使用Vue路由功能將各個(gè)元素單獨(dú)編程,最終由Home路由集中管理、組織這些組件。另外,官網(wǎng)[8]暫未給出在Vue中使用ECharts的方案,這與使用原生JavaScript開發(fā)有較大區(qū)別,但Vue代碼源自JavaScript,只要遵循JavaScript的語法規(guī)則便能解決大部分問題。
目前,整個(gè)項(xiàng)目側(cè)重前端框架實(shí)現(xiàn),主要使用Vue2接口標(biāo)準(zhǔn)以及部分Vue3標(biāo)準(zhǔn),接下來擬使用Vue3標(biāo)準(zhǔn),以簡(jiǎn)化編程難度,提升項(xiàng)目性能。后端開發(fā)仍有較大提升空間,擬使用微服務(wù)架構(gòu),增強(qiáng)后端的可維護(hù)性和可擴(kuò)展性。此外,現(xiàn)階段數(shù)據(jù)采集實(shí)現(xiàn)過程是人工搜集后通過腳本半自動(dòng)存儲(chǔ)到數(shù)據(jù)庫,擬采用爬蟲從互聯(lián)網(wǎng)上爬取數(shù)據(jù)自動(dòng)存儲(chǔ)到數(shù)據(jù)庫。
4 結(jié)束語
本文采用B/S結(jié)構(gòu),構(gòu)建了一個(gè)前后端分離的信息可視化系統(tǒng),前端使用Vue框架,后端使用Maven項(xiàng)目,并通過MySQL實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)與管理。該系統(tǒng)是云南省教育扶貧數(shù)字化表達(dá)的優(yōu)勢(shì)載體,一方面為相關(guān)部門提供決策依據(jù),另一方面為社會(huì)公眾及時(shí)了解教育扶貧現(xiàn)狀提供信息展示,從而增強(qiáng)公眾對(duì)推進(jìn)教育
公平性建設(shè)的信心和自覺參與教育扶貧的意愿。下一步將與云南省教育廳規(guī)劃辦進(jìn)一步合作,采集各地建檔立卡貧困學(xué)生數(shù)據(jù),進(jìn)行去隱私化操作,結(jié)合各
州市教育資源配置數(shù)據(jù),如學(xué)校硬件設(shè)施、師資隊(duì)伍、學(xué)生輟學(xué)率等,進(jìn)一步優(yōu)化迭代可視化設(shè)計(jì)方案,推出內(nèi)容維度更豐富的云南教育扶貧可視化項(xiàng)目。
參考文獻(xiàn):
[1] 習(xí)近平.決勝全面建成小康社會(huì) 奪取新時(shí)代中國(guó)特色社會(huì)主義偉大勝利[R].北京:中國(guó)共產(chǎn)黨第十九次全國(guó)代表大會(huì),2017.
[2] Vue工作團(tuán)隊(duì).Vue.js簡(jiǎn)介[EB/OL].[2022-03-20].https://cn.vuejs.org/guide/introduction.html#api-styles.
[3] The Apache Software Foundation. Apache Maven Project[EB/OL].[2022-03-20].https://maven.apache.org/what-is-maven.html.
[4] 百度百科.Web數(shù)據(jù)交互方式[EB/OL]. [2022-03-20].https://baike.baidu.com/item/axios/56933453?fr=aladdin.
[5] 阿里云幫助中心.什么是對(duì)象存儲(chǔ)OSS[EB/OL]. [2022-03-20].https://help.aliyun.com/document_detail/31817.html.
[6] runoob.Filter、FilterChain、FilterConfig介紹[EB/OL]. [2022-03-20].https://www.runoob.com/w3cnote/filter-filterchain-filterconfig-intro.html.
[7] 百度百科.邊做邊改模型[EB/OL]. [2022-03-20].https://baike.baidu.com/item/%E8%BE%B9%E5%81%9A%E8%BE%B9%E6%94%B9%E6%A8%A1%E5%9E%8B/1861054?fr=aladdin
[8] The Apache Software Foundation. Apache ECharts[EB/OL].[2022-03-20].https://echarts.apache.org/zh/index.html.
【通聯(lián)編輯:謝媛媛】