張振華,田鑫華,師凱旋,趙麗,白永紅
(晉中學(xué)院信息技術(shù)與工程學(xué)院,晉中030619)
數(shù)控機(jī)床在運(yùn)行中會(huì)產(chǎn)生各種“疑難雜癥”,不及時(shí)排錯(cuò)會(huì)影響生產(chǎn),甚至造成事故。如果能查清故障位置和故障的原因,就能及時(shí)地進(jìn)行維修?;ヂ?lián)網(wǎng)上的網(wǎng)站及論壇等存在大量的有價(jià)值的信息,通過(guò)對(duì)其相關(guān)數(shù)據(jù)進(jìn)行采集挖掘,可以獲取相應(yīng)設(shè)備發(fā)生故障的原因和維修解決的方式,形成知識(shí)數(shù)據(jù)庫(kù),這樣能幫助機(jī)床工作人員快速診斷排查故障,保障生產(chǎn)及安全。
項(xiàng)目整體采用了C/S(客戶端/服務(wù)器)架構(gòu)。
項(xiàng)目客戶端應(yīng)用App 的開(kāi)發(fā)采用了Apicloud[1](使用HTML+JavaScript+CSS 移動(dòng)端快速開(kāi)發(fā)工具)。
項(xiàng)目服務(wù)端應(yīng)用開(kāi)發(fā)采用了Django 框架[2]。Django是基于MVC 構(gòu)建的框架,MVC(Model View Controler)是一個(gè)設(shè)計(jì)模式,它強(qiáng)制性的使應(yīng)用程序的輸入、處理和輸出分開(kāi),M 是指數(shù)據(jù)模型,V 是指用戶界面,C 則是控制器。使用MVC 的目的是將M 和V 的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。C目的是確保M 和V 的同步,一旦M 改變,V 應(yīng)該同步更新。Django 中包括模型(Model)、模板(Template)和視圖(Views),對(duì)應(yīng)于MVC 中的模型、視圖、控制器,故稱為MTV 模式。
在本項(xiàng)目的開(kāi)發(fā)中,沒(méi)有使用MTV 模式中的模板(Template),服務(wù)器只返回?cái)?shù)據(jù),數(shù)據(jù)的渲染在客戶端,項(xiàng)目架構(gòu)如圖1 所示。
圖1 項(xiàng)目架構(gòu)圖
系統(tǒng)功能如圖2 所示。
圖2 系統(tǒng)功能圖
(1)故障檢索
用戶可根據(jù)廠商、型號(hào)、錯(cuò)誤碼或關(guān)鍵字從數(shù)據(jù)庫(kù)中獲取相關(guān)問(wèn)題解決方案,還可以對(duì)解決方案進(jìn)行點(diǎn)贊或者收藏,如果用戶對(duì)搜索結(jié)果不滿意,可重新獲取。
(2)熱門問(wèn)題排行
向用戶展示點(diǎn)贊個(gè)數(shù)較多的解決方案列表。
(3)新聞資訊
展示給用戶最新的機(jī)床行業(yè)類資訊。
(4)我的收藏
展示用戶收藏的問(wèn)題解決方案。
(5)瀏覽記錄
展示給用戶的瀏覽記錄。
服務(wù)器端采用Nginx+uWSGI+Django 部署方案,Nginx 是一個(gè)優(yōu)秀的Web 服務(wù)軟件,還可以作為反向代理和負(fù)載均衡,以及緩存服務(wù)或使用。uWSGI 是一個(gè)Web 服務(wù)器,它實(shí)現(xiàn)了WSGI 協(xié)議、uWSGI、HTTP 等協(xié)議。WSGI 是一種Web 服務(wù)器網(wǎng)關(guān)接口。它是一個(gè)Web 服務(wù)器(如Nginx、uWSGI 等服務(wù)器)與Web 應(yīng)用(如用Django 框架寫的程序)通信的一種規(guī)范。
使用Django 框架編寫機(jī)床檢索應(yīng)用程序,安裝uWSGI,使用命令uwsgi--http :8000--chdir=/path/to/project --home=/path/to/env--module project.wsgi 在本地8000 端口運(yùn)行Django Web 應(yīng)用。然后配置Nginx監(jiān)聽(tīng)8000 端口,并且配置項(xiàng)目靜態(tài)文件,實(shí)現(xiàn)項(xiàng)目的布署。
客戶端使用Apicloud 開(kāi)發(fā)工具,使用HTML+CSS+JavaScript 并結(jié)合Apicloud 官方提供的調(diào)用Android 原生能力的API,實(shí)現(xiàn)客戶端的設(shè)計(jì)及與服務(wù)器端的通信。
數(shù)據(jù)庫(kù)端使用關(guān)系型數(shù)據(jù)庫(kù)MySQL[3],通過(guò)Navi?cat 客戶端對(duì)其進(jìn)行可視化操作。數(shù)據(jù)來(lái)源主來(lái)源自網(wǎng)上的機(jī)床網(wǎng)站、百度知道、搜狗問(wèn)答等獲取新聞資訊以及錯(cuò)誤信息和解決方案,利用requests(強(qiáng)大的http請(qǐng)求庫(kù))、aiohttp(異步HTTP 請(qǐng)求庫(kù))、asyncio、pyquery(HTML、XML 頁(yè)面解析庫(kù)),re(正則)等庫(kù)對(duì)網(wǎng)站進(jìn)行抓取并處理存入MySQL 數(shù)據(jù)庫(kù)中。
2.4.1 數(shù)據(jù)獲取流程圖
圖3 數(shù)據(jù)獲取流程圖
2.4.2 數(shù)據(jù)獲取方式
(1)機(jī)床問(wèn)題
●來(lái)源:百度知道、搜狗問(wèn)問(wèn)
●定時(shí)爬取
利用關(guān)鍵字“機(jī)床報(bào)警”,“機(jī)床警報(bào)”,“機(jī)床錯(cuò)誤”,“機(jī)床顯示”等獲取百度知道、搜狗問(wèn)問(wèn)的問(wèn)題列表,獲取其中的有用信息并存入數(shù)據(jù)庫(kù)中。
使用Python 定時(shí)執(zhí)行庫(kù)apscheduler 實(shí)現(xiàn)每天固定時(shí)間爬取問(wèn)題并存入數(shù)據(jù)庫(kù)。
●動(dòng)態(tài)爬取
當(dāng)用戶對(duì)結(jié)果不滿意時(shí),從百度知道、搜狗問(wèn)問(wèn)動(dòng)態(tài)獲取信息,并返回給用戶。
(2)視野文章
●來(lái)源:數(shù)據(jù)機(jī)床市場(chǎng)網(wǎng)
●定時(shí)爬取
使用Python 定時(shí)執(zhí)行庫(kù)apscheduler 實(shí)現(xiàn)每天固定時(shí)間爬取問(wèn)題并存入數(shù)據(jù)庫(kù)。
(3)代理IP
●用途
當(dāng)爬蟲速度過(guò)快,觸發(fā)網(wǎng)站反爬機(jī)制時(shí),使用代理IP 可以恢復(fù)爬取。
●來(lái)源
各大代理網(wǎng)站獲取。
●定時(shí)更新
使用Python 定時(shí)執(zhí)行庫(kù)apscheduler 實(shí)現(xiàn)固定時(shí)間間隔更新IP 并存入數(shù)據(jù)庫(kù)。
●實(shí)時(shí)監(jiān)測(cè)
當(dāng)IP 數(shù)量小于一定數(shù)目時(shí),從代理網(wǎng)站中獲取IP并存入數(shù)據(jù)庫(kù)。
項(xiàng)目采用C/S 架構(gòu),由客戶端發(fā)送請(qǐng)求給服務(wù)器,服務(wù)器將數(shù)據(jù)返回給客戶端進(jìn)行渲染。服務(wù)器主要進(jìn)行數(shù)據(jù)及邏輯處理,客戶端主要負(fù)責(zé)數(shù)據(jù)的頁(yè)面展示,如圖4 所示。
圖4 項(xiàng)目處理邏輯
(1)客戶端使用HTML+CSS 設(shè)計(jì)與功能[4]相對(duì)應(yīng)的頁(yè)面,然后使用JavaScript[5]編寫事件處理函數(shù),用來(lái)處理相應(yīng)的用戶事件。當(dāng)用戶觸發(fā)某個(gè)事件時(shí),如果需要與服務(wù)器進(jìn)行交互,將由JavaScript 請(qǐng)求函數(shù)向服務(wù)器發(fā)送HTTP 請(qǐng)求。
(2)Django 應(yīng)用中的urls.py 用于將功能接口與具體的邏輯處理函數(shù)相關(guān)聯(lián),views.py 用于具體的邏輯處理,models.py 用于定義數(shù)據(jù)模型。當(dāng)服務(wù)器接收到客戶端發(fā)來(lái)的HTTP 請(qǐng)求時(shí),將會(huì)執(zhí)行urls.py 中對(duì)應(yīng)的邏輯處理函數(shù),用來(lái)通過(guò)模型讀寫數(shù)據(jù)庫(kù)或者讀寫媒體文件和讀取靜態(tài)文件。最后將處理結(jié)果通過(guò)Re?sponse 對(duì)象返回給客戶端。
(3)客戶端接收到服務(wù)器的響應(yīng)后,由JavaScript函數(shù)對(duì)數(shù)據(jù)進(jìn)行渲染,然后在頁(yè)面上呈現(xiàn)給用戶。
依賴此過(guò)程,完成客戶端與服務(wù)器的交互。
(1)客戶端使用Apicloud 開(kāi)發(fā)工具,運(yùn)用HTML+CSS 設(shè)計(jì)搜索頁(yè)、解決方案列表頁(yè)和解決方案詳情頁(yè),并運(yùn)用JavaScript 編寫相應(yīng)的頁(yè)面跳轉(zhuǎn)及事件處理函數(shù)。當(dāng)用戶輸入錯(cuò)誤碼(關(guān)鍵字)并點(diǎn)擊確定按鈕時(shí),觸發(fā)點(diǎn)擊事件,執(zhí)行相應(yīng)的JavaScript 函數(shù)。JavaScript函數(shù)調(diào)用AJAX(局部刷新)技術(shù),將廠商、型號(hào)、錯(cuò)誤碼(關(guān)鍵字)、email(用戶唯一標(biāo)識(shí)符)、本地登錄狀態(tài)及要訪問(wèn)的接口(answers)以HTTP POST 方式發(fā)送給服務(wù)器。
(2)服務(wù)器接收到客戶端的請(qǐng)求,從urls.py[6-7]中找到接口與其對(duì)應(yīng)的處理函數(shù)(views.answers),從而調(diào)用views.py 中answers 函數(shù),從request 對(duì)象中獲取客戶端的請(qǐng)求參數(shù),然后調(diào)用model.objects. filter(TI?TLE__icontains = code).values('id','TITLE','CONTENT','TIME','AGREE','VIEWS')從數(shù)據(jù)庫(kù)中調(diào)取標(biāo)題包含錯(cuò)誤碼(關(guān)鍵字)的解決方案。如果解決方案回答過(guò)長(zhǎng)則將其做截?cái)嗵幚恚绻脩粢训卿?,則調(diào)用model.objects.filter(QUES_ID = answer_id).filter(USER_ID = email).count()判斷用戶是否已經(jīng)對(duì)解決方案進(jìn)行了點(diǎn)贊或者收藏操作,進(jìn)行相應(yīng)的狀態(tài)標(biāo)識(shí)。最終將獲取到的數(shù)據(jù)轉(zhuǎn)化為JSON 數(shù)據(jù)格式通過(guò)HttpResponse 對(duì)象將其返回給客戶端。
(3)客戶端接收到服務(wù)器的響應(yīng)后,判斷響應(yīng)的長(zhǎng)度是否為0,如果為0,則提示用戶“沒(méi)有更多信息”,如果長(zhǎng)度不為0,則使用模板引擎doT.js 對(duì)響應(yīng)內(nèi)容進(jìn)行渲染展示,最終將解決方案以列表形式呈現(xiàn)給用戶。若用戶對(duì)搜索結(jié)果不滿意,則可以再進(jìn)行一次重新搜索,服務(wù)器將從網(wǎng)絡(luò)中重新獲取一次數(shù)據(jù),而不是從數(shù)據(jù)庫(kù)中調(diào)用,如果用戶對(duì)新的搜索內(nèi)容進(jìn)行了點(diǎn)贊或收藏,則將其存入數(shù)據(jù)庫(kù)中。
系統(tǒng)主要功能的測(cè)試如圖5-圖8 所示。圖5 是當(dāng)用戶輸入錯(cuò)誤碼(關(guān)鍵字)搜索后的展示圖,圖6 是app首頁(yè)的熱門問(wèn)題效果展示圖,圖7 是新聞資訊頁(yè)的效果展示圖,圖8 是在用戶登錄的情況下的我的收藏頁(yè)效果展示圖。
圖5 故障檢索
圖6 熱門問(wèn)題展示
圖7 新聞資訊
圖8 我的收藏
此App 的開(kāi)發(fā)基于客戶/服務(wù)器開(kāi)發(fā)模式,服務(wù)器基于MVC 架構(gòu)開(kāi)發(fā),實(shí)現(xiàn)了用戶信息管理、故障檢索、新聞資訊展示等功能模塊的開(kāi)發(fā),希望在此基礎(chǔ)上可以開(kāi)發(fā)出更完善的可多平臺(tái)使用的機(jī)床故障檢測(cè)平臺(tái)。