陳瑞志 王培錦 胡瑞鑫 鄭浩榮 林文麒 劉永鵬
摘 ?要: 針對(duì)農(nóng)村旅游市場(chǎng)需求,研究了基于MUI框架的農(nóng)村旅游應(yīng)用程序的設(shè)計(jì)與實(shí)現(xiàn)。重點(diǎn)介紹了基于用戶的旅游信息過(guò)濾算法,以推薦用戶感興趣的旅游信息,并通過(guò)python編程實(shí)現(xiàn)。最后,描述了軟件實(shí)現(xiàn)的全過(guò)程。
關(guān)鍵詞:?MUI框架;旅游APP;推薦算法
中圖分類(lèi)號(hào): TP311.52????文獻(xiàn)標(biāo)識(shí)碼:?A????DOI:10.3969/j.issn.1003-6970.2019.09.005
本文著錄格式:陳瑞志,王培錦,胡瑞鑫,等. 基于MUI框架鄉(xiāng)村旅游APP的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件,2019,40(9):23-26
Design and Implementation of App For Rural Tourism Based on MUI Framework
CHEN Rui-zhi, WANG Pei-jin, HU Rui-xin, ZHENG Hao-rong, LIN Wen-qi, LIU Yong-peng
(Cunjin college of Guangdong ocean university,?Zhanjiang Guangdong 524094)
【Abstract】: Aiming at the market demand of rural tourism, this paper studies the design and implementation of rural tourism App based on MUI framework. Emphasis is laid on the user-based filtering algorithm to recommend tourism information that may be of interest to users, which is implemented by Python programming. Finally, the whole process of software implementation is described.
【Key words】: MUI frameworv; Tourism APP; Recommendation algorithm
“互聯(lián)網(wǎng)+”時(shí)代的到來(lái),各種功能各異,內(nèi)容豐富的手機(jī)APP得到開(kāi)發(fā)和應(yīng)用,正在滿足人們對(duì)工作、學(xué)習(xí)、生活、娛樂(lè)等各方面的需求。近年來(lái)我國(guó)推行一系列發(fā)展鄉(xiāng)村旅游的政策,積極開(kāi)發(fā)農(nóng)漁林產(chǎn)業(yè)的旅游功能,把鄉(xiāng)野生態(tài)休閑、自然旅游觀光、傳統(tǒng)民俗民樂(lè)文化、民族特色、紅色革命歷史背景、鄉(xiāng)村勞作體驗(yàn)等,打造形式多樣、特色鮮明的鄉(xiāng)村旅休閑項(xiàng)目[1]。據(jù)相關(guān)統(tǒng)計(jì)2017年中國(guó)鄉(xiāng)村旅游達(dá)25億人次,鄉(xiāng)村旅游已成為新時(shí)代鄉(xiāng)村經(jīng)濟(jì)發(fā)展新的增長(zhǎng)點(diǎn)[2]。鄉(xiāng)村旅游高速信息化和隨時(shí)隨地獲取旅游相關(guān)資訊等,已經(jīng)成為自助游者的迫切需求,所以基于Android平臺(tái)的鄉(xiāng)村旅游APP的開(kāi)發(fā)有了日益廣泛的使用環(huán)境[4],智慧旅游成為研究熱點(diǎn)[5-12]。比如文獻(xiàn)[5]從智能醫(yī)療管理方面,研究基于Android軟件設(shè)計(jì)方案;文獻(xiàn)[6]中描述了利用Android移動(dòng)設(shè)備管理系統(tǒng),實(shí)現(xiàn)對(duì)相機(jī)、藍(lán)牙、WIFI、惡意應(yīng)用等可能造成敏感數(shù)據(jù)泄露的設(shè)備功能的管控;文獻(xiàn)[9]中描述了構(gòu)建基于三層架構(gòu)模式的智慧旅游系統(tǒng)設(shè)計(jì)體系;王艷軍等[12]研究面向服務(wù)架構(gòu)的智慧旅游系統(tǒng)建設(shè)方法。
當(dāng)前的出行旅游APP的服務(wù)范圍都是局限于出名的景點(diǎn),對(duì)于一些不太出名,但是景色秀麗、空氣清新、人流量少的鄉(xiāng)村卻是鮮無(wú)人知。本文主要針對(duì)鄉(xiāng)村旅游景點(diǎn),開(kāi)發(fā)一款鄉(xiāng)村旅游APP,讓驢友們能夠通過(guò)該平臺(tái),得到更及時(shí)的鄉(xiāng)村旅游資訊,感受當(dāng)?shù)氐娘L(fēng)土人情;也讓更多的鄉(xiāng)村景點(diǎn)呈現(xiàn)在大家的視野;幫助當(dāng)?shù)厝罕姼玫乩米陨淼乩韮?yōu)勢(shì)脫貧,該APP地圖將景點(diǎn)和周邊的資源進(jìn)行關(guān)聯(lián),方便游客全身心的體驗(yàn)度假的樂(lè)趣;還能夠?qū)包c(diǎn)旅游人數(shù)進(jìn)行統(tǒng)計(jì)分析,對(duì)旅游人數(shù)過(guò)多的景點(diǎn)預(yù)警提醒,保護(hù)旅游體驗(yàn)和生態(tài)環(huán)境,做到循環(huán)生態(tài)旅游。
通過(guò)調(diào)研分析發(fā)現(xiàn)人們旅游費(fèi)用成本,時(shí)間精力消耗,景點(diǎn)環(huán)境、舒適性、便利性等,是旅行者重要考慮的影響因素。通過(guò)城市周邊的鄉(xiāng)村旅游為用戶提供價(jià)廉、優(yōu)質(zhì)的郊區(qū)農(nóng)村旅游項(xiàng)目,讓旅游者悠閑享受優(yōu)美的田園風(fēng)光的同時(shí),可以參加采摘園、爬山、釣魚(yú)、民宿、農(nóng)家樂(lè)、年例等鄉(xiāng)村生活體驗(yàn)。
另外,鄉(xiāng)村旅游應(yīng)注重保護(hù)、傳承和弘揚(yáng)鄉(xiāng)村文化、民俗、非物質(zhì)文化遺產(chǎn)、特色美食等,以更加豐富的鄉(xiāng)村旅游產(chǎn)品和更加優(yōu)美的旅游環(huán)境,讓旅游者體驗(yàn)鄉(xiāng)村文化,瀏覽山川等自然美景,體驗(yàn)鄉(xiāng)村生活。
因此,設(shè)計(jì)實(shí)現(xiàn)一款城市周邊旅游觀光,體驗(yàn)農(nóng)漁林自然風(fēng)光、減少城市生活壓力的返樸歸真的鄉(xiāng)野生活的APP,既能導(dǎo)航、預(yù)定住宿、飲食、景點(diǎn)推薦等,又能預(yù)定當(dāng)?shù)鼐G色有機(jī)農(nóng)產(chǎn)品,享受綠色健康、價(jià)格低廉的當(dāng)?shù)爻浴⒆?、行、玩、?lè)等集于一體的良好服務(wù)。
根據(jù)前面需求分析,設(shè)計(jì)了一款相應(yīng)的應(yīng)用軟件,下面主要從功能設(shè)計(jì)、UI設(shè)計(jì)、數(shù)據(jù)庫(kù)設(shè)計(jì)等方面來(lái)描述其設(shè)計(jì)的過(guò)程。
2.1主要功能設(shè)計(jì)
用戶提供購(gòu)買(mǎi)特產(chǎn),查看旅游攻略,瀏覽商品,民宿預(yù)定,購(gòu)物車(chē)和在線訂票等功能。用戶操作功能包括以下內(nèi)容:修改自身信息、查看訂單、購(gòu)買(mǎi)、訂單管理、留言反饋等功能。具體功能如下:
個(gè)人中心:包括用戶注冊(cè)、登錄、查看訂單、個(gè)人信息維護(hù)、聯(lián)系客服等功能。
特色購(gòu)物:當(dāng)?shù)靥禺a(chǎn)信息瀏覽、查詢、購(gòu)買(mǎi)等,包括特色農(nóng)產(chǎn)品采購(gòu)、新鮮蔬果采摘等信息的推薦及提交訂單等。
當(dāng)?shù)孛朗常好朗惩扑]、名店推薦、美食攻略、美食點(diǎn)評(píng)等相關(guān)功能。
景點(diǎn)游玩:景點(diǎn)查詢及推薦、門(mén)票信息查詢及購(gòu)買(mǎi)、旅行攻略信息分享等功能。
民宿客棧:民宿信息瀏覽、查詢、旅游信息推薦、點(diǎn)評(píng)等功能。
主題游:旅游線路規(guī)劃、制定、推薦以及百度地圖關(guān)聯(lián)等功能。推薦旅游景點(diǎn)信息使用景點(diǎn)推薦算法實(shí)現(xiàn)。
2.2基于用戶的協(xié)同旅游信息過(guò)濾算法
數(shù)據(jù)源來(lái)自Scrapy框架爬蟲(chóng),從網(wǎng)絡(luò)上爬取鄉(xiāng)村旅游信息保存到MySql數(shù)據(jù)庫(kù)中,以Django搭建的網(wǎng)站作為載體,利用REST fromwork開(kāi)發(fā)API接口,通過(guò)ORM映射獲取數(shù)據(jù)庫(kù)數(shù)據(jù)對(duì)象,應(yīng)用基于用戶的協(xié)同過(guò)濾算法,分析推薦用戶與其他用戶的興趣愛(ài)好,過(guò)濾不相關(guān)的用戶,篩選出與推薦用戶相似度較高的用戶集合,分別計(jì)算集合中推薦用戶沒(méi)旅游過(guò)的景點(diǎn)的期望評(píng)分,最后通過(guò)對(duì)評(píng)分排序進(jìn)行個(gè)性化推薦。
共同興趣愛(ài)好的旅游者,可以理解為用戶之間喜好的相似度,事實(shí)上在用戶基數(shù)比較大的情況下,要給某個(gè)用戶推薦[5],可以先用余弦相似度、歐氏距離或皮爾遜相關(guān)系數(shù)去量化該相似度,然后篩選出相似度大于闕值的集合,對(duì)集合的每個(gè)相似度與評(píng)分等參數(shù)做期望計(jì)算,取平均期望最高的前n個(gè)物品推薦給該用戶,如計(jì)算公式(1)所示。
皮爾遜相關(guān)系數(shù)公式:
皮爾遜系數(shù)主要用于度量?jī)蓚€(gè)變量之間的相關(guān)(線性),根據(jù)統(tǒng)計(jì)學(xué)的定義,皮爾遜相關(guān)系數(shù)等于協(xié)方差和標(biāo)準(zhǔn)差的商,取值在[-1,1]之間,等于零表示不相關(guān),一般認(rèn)為大于0.1具有線性相關(guān)性,采用皮爾遜相關(guān)系數(shù)來(lái)衡量用戶的相似度。算法流程如圖1所示。
2.2.1??推薦模塊設(shè)計(jì)
功能描述:推薦模塊主要由排行榜和推薦功能兩個(gè)部分組成,排行榜解決推薦系統(tǒng)啟動(dòng)之初的冷啟動(dòng)問(wèn)題,為推薦功能做鋪墊,推薦則是最終達(dá)到的目標(biāo),向用戶提供個(gè)性化推薦。
運(yùn)行流程:在排行榜頁(yè)面或首頁(yè)顯示評(píng)分靠前的旅游景點(diǎn),引導(dǎo)用戶進(jìn)入詳細(xì)頁(yè)面進(jìn)行收藏和評(píng)分。通過(guò)分析與被推薦用戶有關(guān)聯(lián)的用戶收藏和評(píng)分?jǐn)?shù)據(jù),向用戶進(jìn)行個(gè)性化推薦,流程如圖2所示。
2.2.2??推薦模塊實(shí)現(xiàn)
推薦功能算法依賴收藏、景點(diǎn)的位置、特色、美食、交通等以及評(píng)分、排行榜等因素[9],排行榜是通過(guò)從旅游評(píng)價(jià)信息中評(píng)分最高的前n個(gè)旅游景點(diǎn),進(jìn)行倒序排序。推薦部分使用基于用戶的協(xié)同過(guò)濾算法,篩選出評(píng)分大于某個(gè)分?jǐn)?shù),并且收藏過(guò)的旅游信息記錄,生成透視表,再用皮爾遜相關(guān)系數(shù)公式去計(jì)算其相似度,把相似度高的用戶數(shù)據(jù)進(jìn)行旅游景點(diǎn)評(píng)分的期望計(jì)算,最后按降序推薦給用戶。
算法實(shí)現(xiàn)過(guò)程和關(guān)鍵代碼:
第一步,獲取用戶評(píng)分?jǐn)?shù)據(jù),轉(zhuǎn)換成相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。
data = Score.objects.values('s_uid','s_bid','score')?#獲取數(shù)據(jù)
list = []
#篩選出評(píng)分>6.0并收藏的記錄
for obj in data:
length=len(Bmark.objects.filter(m_uid=obj.get?('s_uid'), ??m_bid=obj.get('s_bid')))
if length > 0 and obj.get('score') > 6.0:
list.append(obj)
ratings = pd.DataFrame(list) #轉(zhuǎn)成dataframe
ratings_pivot = ratings.pivot(index='s_uid',?columns='s_bid',values='score') ?#形成一個(gè)
第二步,對(duì)數(shù)據(jù)進(jìn)行求相關(guān)性系數(shù)計(jì)算,過(guò)濾行列都為空的數(shù)據(jù),即過(guò)濾不相關(guān)的數(shù)據(jù)。
corr = ratings_pivot.T.corr(min_periods=max/2)
corr_clean = corr.dropna(how='all') #過(guò)濾行,全為NaN的數(shù)據(jù)。
corr_clean = corr_clean.dropna(axis=1, how='all') #過(guò)濾列
第三步,篩選出與推薦用戶有關(guān)聯(lián)的用戶(系數(shù)大于0.1)。
gift = ratings_pivot.ix[uid]
gift = gift[gift.isnull()] ?# 現(xiàn)在?gift 是一個(gè)全空的序列
corr_uid = corr_clean[str(uid)].drop(str(uid)) ?# 推薦用戶與其他用戶的相關(guān)系數(shù)?Series,不包含自身
corr_uid = corr_uid[corr_uid > 0.1].dropna() ?# 篩選相關(guān)系數(shù)大于0.1的用戶
第四步,從這些用戶中篩選出推薦用戶沒(méi)瀏覽過(guò)旅游景點(diǎn),用它們的相關(guān)系數(shù)對(duì)每個(gè)旅游景點(diǎn)評(píng)分進(jìn)行計(jì)算,得出平均期望分?jǐn)?shù),將這些分?jǐn)?shù)按降序排列推薦給用戶。
for jd in gift.index: ?# 遍歷所有沒(méi)瀏覽過(guò)的旅游信息
pre = []
for other in corr_uid.index.astype(np.int64): # 遍歷相關(guān)系數(shù)大于?0.1 的用戶
if not np.isnan(ratings_pivot.ix[other, jd]):
pre.append((ratings_pivot.ix[other,jd], corr_clean[str(uid)][str(other)]))
if pre:
gift[jd] = sum([value * weight for value, weight in pre]) / sum([pair[1] for pair in pre])
bids =gift.dropna().sort_values(ascending=False)?[:10]#將gift 非空元素按降序排列[4]
2.3手機(jī)APP端UI設(shè)計(jì)
手機(jī)APP分六大模塊:個(gè)人中心、特色購(gòu)物、當(dāng)?shù)孛朗?、景點(diǎn)游玩、民宿客棧和主題游。將鄉(xiāng)村旅游景點(diǎn)及其服務(wù)資源做成一條龍的服務(wù):吃、住、行、游、購(gòu)、娛等旅游行業(yè)的六個(gè)核心?;贛UI前端框架,最接近原生APP的高性能框架,界面風(fēng)格也接近安卓原生APP,人機(jī)交互強(qiáng),運(yùn)行起來(lái)比較流暢。
首頁(yè)使用幻燈片加六宮格的樣式,每一個(gè)宮格對(duì)應(yīng)一個(gè)功能,幻燈片一張圖片包含一個(gè)商品信息,如圖3所示,根據(jù)用戶權(quán)限,使用的功能會(huì)有所不同,顯示內(nèi)容也會(huì)有所不同,比如普通游客不能下訂單,旅行項(xiàng)目查詢和訂單頁(yè)面如圖4-5所示。每個(gè)功能以卡片的形式展現(xiàn)出來(lái),再加入相應(yīng)的UI控件,點(diǎn)擊按鈕觸發(fā)事件,執(zhí)行事件代碼比如跳轉(zhuǎn)至對(duì)應(yīng)子頁(yè)面或修改當(dāng)前信息。使用Ajax技術(shù)讓前臺(tái)與后臺(tái)信息交互,向服務(wù)器發(fā)送請(qǐng)求并且響應(yīng)操
作信息,而且Ajax可以跨平臺(tái)使用,方便開(kāi)發(fā)者開(kāi)發(fā),減少開(kāi)發(fā)消耗的時(shí)間,降低代碼模塊間的耦合度,提高代碼的復(fù)用性。
2.4數(shù)據(jù)庫(kù)設(shè)計(jì)
使用MySql數(shù)據(jù)庫(kù),結(jié)合jsp和servlet開(kāi)發(fā)后臺(tái)系統(tǒng),后臺(tái)同時(shí)處理多個(gè)用戶請(qǐng)求,數(shù)據(jù)量較大,查詢內(nèi)容多,對(duì)數(shù)據(jù)庫(kù)壓力較大,通過(guò)使用地址池緩沖,限制線程數(shù)量,有效控制數(shù)據(jù)庫(kù)過(guò)載壓力,性能可以得到保證,可以及時(shí)響應(yīng)信息。
本文設(shè)計(jì)的鄉(xiāng)村旅游app,基于MUI前端框架的旅游app的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程,讓用戶在使用軟件時(shí)可以體驗(yàn)到原生APP的感覺(jué),而且開(kāi)發(fā)員也可以一套源碼在多個(gè)終端運(yùn)行,開(kāi)發(fā)成本低,APP開(kāi)發(fā)周期時(shí)間短,更新便捷,跨平臺(tái),兼容性強(qiáng)等優(yōu)勢(shì)可以讓本APP在各平臺(tái)廣泛的應(yīng)用。
參考文獻(xiàn)