李雪婷,楊 抒
(1.新疆農(nóng)業(yè)大學(xué)計(jì)算機(jī)與信息工程學(xué)院,新疆烏魯木齊 830000;2.成都大學(xué) 計(jì)算機(jī)學(xué)院,四川 成都 610106)
在“互聯(lián)網(wǎng)+”的新形態(tài)下,智能移動(dòng)終端飛速發(fā)展,信息技術(shù)已經(jīng)徹底改變了傳統(tǒng)的經(jīng)濟(jì)和金融市場(chǎng)結(jié)構(gòu),利用互聯(lián)網(wǎng)購(gòu)物逐漸成為一種重要的消費(fèi)方式。不同電商網(wǎng)站之間的競(jìng)爭(zhēng)日趨激烈,網(wǎng)上拍賣是電子商務(wù)的重要組成部分[1-3]。網(wǎng)上拍賣對(duì)于交易者來(lái)說(shuō),最為明顯的優(yōu)勢(shì)就是可以突破時(shí)間及場(chǎng)所等自然因素的限制[4]。同時(shí),拍賣者只要擁有想要拍賣的物品,可以隨時(shí)隨地地放在網(wǎng)站上進(jìn)行拍賣,買家也可以購(gòu)買世界各地的拍品,相比于傳統(tǒng)拍賣,簡(jiǎn)化了競(jìng)拍規(guī)則,獲得了用戶的喜愛[5]。但僅僅使用網(wǎng)頁(yè)端的線上拍賣平臺(tái)很難真正提升用戶參與拍賣的便捷性。隨著移動(dòng)互聯(lián)網(wǎng)的迅速發(fā)展,越來(lái)越多的拍賣活動(dòng)都以移動(dòng)端APP 的方式進(jìn)行。層出不窮的競(jìng)拍APP 主要針對(duì)藝術(shù)品及工藝品進(jìn)行拍賣。大型活體動(dòng)物的競(jìng)拍多以線下專業(yè)拍賣會(huì)的方式進(jìn)行。新疆是我國(guó)傳統(tǒng)馬業(yè)強(qiáng)區(qū),全區(qū)馬存欄量居全國(guó)第一[6]。伴隨著經(jīng)濟(jì)發(fā)展和社會(huì)需求的變化,新疆馬產(chǎn)業(yè)呈現(xiàn)出明顯的發(fā)展優(yōu)勢(shì)和巨大的發(fā)展?jié)摿Α橥七M(jìn)中國(guó)現(xiàn)代馬業(yè)發(fā)展,促進(jìn)國(guó)際交流合作,各方力量都在發(fā)揮積極的作用[7]。在此基礎(chǔ)上,文中提出了一款能夠在IOS 端及Android 端運(yùn)行的馬匹競(jìng)拍APP。利用移動(dòng)端APP 用戶群體龐大、功能強(qiáng)大等特點(diǎn),提升用戶參與競(jìng)拍的便捷性與積極性,進(jìn)而增加參與同場(chǎng)競(jìng)拍人數(shù),降低流拍率,并能夠高效、及時(shí)地?cái)U(kuò)散馬匹信息,提高馬匹競(jìng)拍信息化水平,促進(jìn)相關(guān)產(chǎn)業(yè)的發(fā)展。
通過(guò)實(shí)地調(diào)研并結(jié)合實(shí)際情況及競(jìng)拍業(yè)務(wù)邏輯的基本需求,利用應(yīng)用程序的簡(jiǎn)單易用、適應(yīng)移動(dòng)設(shè)備等特點(diǎn),設(shè)計(jì)了馬匹競(jìng)拍APP 功能結(jié)構(gòu),如圖1所示。
圖1 功能結(jié)構(gòu)圖
由圖1 可見,馬匹競(jìng)拍APP 由即將競(jìng)拍、正在競(jìng)拍及競(jìng)拍結(jié)束馬匹信息展示模塊、馬匹競(jìng)拍模塊、訂單管理模塊、保證金管理模塊及用戶管理模塊組成。利用應(yīng)用已實(shí)現(xiàn)的功能,可將即將競(jìng)拍馬匹、正在競(jìng)拍馬匹及競(jìng)拍結(jié)束馬匹的相關(guān)信息展示給用戶。競(jìng)拍成功的用戶可查看訂單詳細(xì)信息,競(jìng)拍失敗的用戶可查看參與競(jìng)拍時(shí)交納保證金的當(dāng)前狀態(tài)。當(dāng)前馬匹競(jìng)拍APP 的功能設(shè)計(jì)能夠滿足用戶隨時(shí)隨地參與馬匹競(jìng)拍的需求。
在開發(fā)Web 應(yīng)用過(guò)程中,分為前后端不分離和前后端分離兩種應(yīng)用模式。前后端不分離是在前端請(qǐng)求動(dòng)態(tài)頁(yè)面時(shí),把數(shù)據(jù)渲染成模版返回給前端,前端的效果由后端決定。這種模式耦合度較高,代碼管理難度較大,應(yīng)用維護(hù)麻煩。隨著APP 的發(fā)展,在實(shí)際生產(chǎn)應(yīng)用中APP 只需要從后端獲取一份單純的數(shù)據(jù)。當(dāng)需要開發(fā)相同業(yè)務(wù)的網(wǎng)站和APP 時(shí),如果不使用前后端分離模式,則后端代碼需要分別為移動(dòng)端和網(wǎng)頁(yè)端進(jìn)行開發(fā),增加了工作量。在前后端分離模式中前端工程師負(fù)責(zé)前端頁(yè)面的設(shè)計(jì)及開發(fā),后端工程師負(fù)責(zé)數(shù)據(jù)庫(kù)的設(shè)計(jì)、接口的開發(fā)及后臺(tái)的管理。將前后端有效區(qū)分開來(lái),極大地提高了開發(fā)效率。前后端分離模式中如需新增功能模塊,只需在后端增加相應(yīng)接口即可,較好地解決了前后端不分離模式中耦合度較高的問(wèn)題。除此之外,只要前端代碼遵循后端接口的調(diào)用規(guī)則,一套后端代碼可以支持多種前端應(yīng)用程序,極大地降低了開發(fā)成本[8]。馬匹競(jìng)拍APP 采用前后端分離的應(yīng)用模式,前端負(fù)責(zé)馬匹競(jìng)拍APP 界面的渲染,后端返回前端所需要的數(shù)據(jù),不用再控制前端的效果。后端開發(fā)的每個(gè)視圖都稱為一個(gè)接口,前端需通過(guò)調(diào)用接口來(lái)對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查。選取這種模式不僅可以解決網(wǎng)頁(yè)端和移動(dòng)端的數(shù)據(jù)同步問(wèn)題,還可以方便數(shù)據(jù)的管理,提升軟件的可維護(hù)性。軟件架構(gòu)設(shè)計(jì)如圖2 所示。
圖2 軟件架構(gòu)設(shè)計(jì)圖
1.3.1 應(yīng)用開發(fā)
這款應(yīng)用的開發(fā)框架選用Flutter,開發(fā)語(yǔ)言選用Dart,開發(fā)工具選用Android Studio。相比其他跨平臺(tái)框架,F(xiàn)lutter 框架的簡(jiǎn)單性使其能夠快速運(yùn)行。它的可定制性和可擴(kuò)展性使其保持簡(jiǎn)單的同時(shí)擁有強(qiáng)大的功能。
1.3.2 服務(wù)器開發(fā)
隨著前后端分離模式在應(yīng)用開發(fā)中逐漸增多,服務(wù)器端的開發(fā)技術(shù)也層出不窮。這款應(yīng)用服務(wù)器端的開發(fā)框架選用Django Rest Framework,開發(fā)語(yǔ)言選用Python,開發(fā)工具選用PyCharm。在編寫接口時(shí)其內(nèi)部幫開發(fā)人員提供了豐富的類視圖及很多方便的組件,通過(guò)配置開發(fā)人員可以完成的序列化、分頁(yè)、權(quán)限設(shè)置等操作,極大地提高了編程效率。
1.3.3 數(shù)據(jù)庫(kù)開發(fā)
Postgre SQL 作為一個(gè)功能強(qiáng)大的開源數(shù)據(jù)庫(kù)[9]。支持多種語(yǔ)言編程,擁有世界上最豐富的數(shù)據(jù)類型支持,因此選用Postgre SQL 作為這款應(yīng)用的數(shù)據(jù)庫(kù)。
Flutter是谷歌發(fā)布的一款跨平臺(tái)開源的UI框架[10]。Flutter 不僅可以快速在IOS 和Android 上構(gòu)建高質(zhì)量的原生用戶界面,還支持MAC OS、Windows、Linux 平臺(tái)開發(fā),并且是未來(lái)新操作系統(tǒng)Fuchsia 默認(rèn)的開發(fā)套件[11]。Flutter 提供了豐富的組件、接口,可以與現(xiàn)有的代碼一起工作,使得APP 能夠在每一個(gè)終端快速上線。
Django Rest Framework 是一款強(qiáng)大且靈活的構(gòu)建網(wǎng)頁(yè)API 的工具,可用最少的代碼快速構(gòu)建出一套可靠的API,簡(jiǎn)稱DRF。DRF 最核心的模塊是Model、Serializer、View、Authentication、Permissions[12]。Django Rest Framework 具有對(duì)開發(fā)人員友好的網(wǎng)絡(luò)通用接口,具備權(quán)限管理、序列化等模塊,同時(shí)支持ORM 和非ORM 數(shù)據(jù)源。采用功能性視圖即可自定義所有通用接口,有強(qiáng)大的社區(qū)支持且應(yīng)用廣泛[13]。
Dart 是一種靜態(tài)類型的安全語(yǔ)言。相比Java Script 弱類型語(yǔ)言來(lái)說(shuō),Dart 支持靜態(tài)類型檢測(cè),在編譯階段可以獲得更多編輯器提示詞,可以在編譯前發(fā)現(xiàn)部分類型的錯(cuò)誤,排除潛在問(wèn)題,極大增強(qiáng)了程序的可維護(hù)性[14]。
Python 是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言[15]。其應(yīng)用范圍很廣,支持多種數(shù)據(jù)類型,擁有強(qiáng)大的第三方開源庫(kù)[16]。由于它的多功能性,Python 已經(jīng)成為最流行的編程語(yǔ)言之一[17]。
數(shù)據(jù)庫(kù)的設(shè)計(jì)是根據(jù)軟件的需求設(shè)計(jì)出能夠?qū)?shù)據(jù)資源進(jìn)行統(tǒng)一管理,從而實(shí)現(xiàn)軟件功能的基礎(chǔ)設(shè)計(jì)[18]。根據(jù)馬匹競(jìng)拍的業(yè)務(wù)邏輯、數(shù)據(jù)庫(kù)的完整性及安全性等特征,設(shè)計(jì)出符合實(shí)際的馬匹關(guān)聯(lián)表,為服務(wù)端的實(shí)現(xiàn)奠定了基礎(chǔ)。馬匹競(jìng)拍APP 數(shù)據(jù)庫(kù)內(nèi)含有競(jìng)拍首頁(yè)輪播圖表、馬匹信息表、競(jìng)拍詳情表、競(jìng)拍表、訂單詳情表、買家訂單表及支付信息表等數(shù)據(jù)庫(kù)表,如表1 所示。
表1 馬匹競(jìng)拍App數(shù)據(jù)庫(kù)組織結(jié)構(gòu)圖
由表1 可知,競(jìng)拍首頁(yè)輪播圖表存儲(chǔ)馬匹競(jìng)拍APP 首頁(yè)展示的輪播圖;馬匹信息表存儲(chǔ)馬匹的具體信息,如RFID 號(hào)、護(hù)照號(hào)、馬名、馬主、品種等數(shù)據(jù);競(jìng)拍表存儲(chǔ)馬匹競(jìng)拍的相關(guān)信息,如起拍價(jià)、起止時(shí)間、加價(jià)幅度、延時(shí)周期等數(shù)據(jù);競(jìng)拍詳情表存儲(chǔ)競(jìng)拍者、競(jìng)拍狀態(tài)、競(jìng)拍信息、競(jìng)拍價(jià)格、競(jìng)拍時(shí)間等數(shù)據(jù);買家訂單表存儲(chǔ)訂單編號(hào)、競(jìng)拍人、保證金、成交價(jià)及傭金等數(shù)據(jù);訂單詳情表存儲(chǔ)訂單的數(shù)量及單價(jià)等數(shù)據(jù);支付信息表存儲(chǔ)支付用戶、支付類型、支付單標(biāo)題、支付單總金額及支付狀態(tài)等數(shù)據(jù),其關(guān)系如圖3 所示。
圖3 數(shù)據(jù)庫(kù)表關(guān)系
由于文中設(shè)計(jì)選用的開發(fā)模式為前后端分離模式,完成了后端數(shù)據(jù)庫(kù)的開發(fā)后,建立數(shù)據(jù)庫(kù)與前端的鏈接便成為該設(shè)計(jì)的重點(diǎn)之一。為了能夠高效地開發(fā)API,提升與服務(wù)器的聯(lián)動(dòng)性,在開發(fā)設(shè)計(jì)API時(shí)遵守如下Restful 規(guī)范。
1)域名的編寫:由于該設(shè)計(jì)開發(fā)的API 分類明確,不會(huì)進(jìn)一步的擴(kuò)張,所以將API部署在主域名下。
2)協(xié)議的選?。菏褂肏TTPS 協(xié)議。
3)版本的控制:將API 的版本號(hào)放入U(xiǎn)RL,通過(guò)版本號(hào)來(lái)區(qū)分不同版本的接口,不同版本放在不同接口下,以此來(lái)提高系統(tǒng)信息的兼容性。
4)API 的命名:路徑使用名詞加負(fù)數(shù)。
5)返回?cái)?shù)據(jù)的格式:Json。
6)信息的過(guò)濾:通過(guò)對(duì)參數(shù)的控制,指定返回記錄的數(shù)量、返回記錄的開始位置、返回頁(yè)數(shù)及每頁(yè)的記錄數(shù)、返回結(jié)果排序的屬性以及排序順序和篩選條件,可以較好地解決記錄數(shù)量大的問(wèn)題,減緩服務(wù)器的壓力。
7)數(shù)據(jù)操作類型的控制:沒有按照Restful 規(guī)范寫接口時(shí),對(duì)數(shù)據(jù)的元操作CRUD(Create、Read、Update、Delete)分別要對(duì)應(yīng)寫出4 類接口來(lái)滿足數(shù)據(jù)的請(qǐng)求。Restful 規(guī)范中,規(guī)定的請(qǐng)求方式與元操作CRUD 對(duì)應(yīng)。GET 請(qǐng)求方式可實(shí)現(xiàn)資源的獲取,POST 請(qǐng)求方式可實(shí)現(xiàn)資源的新增,PUT 請(qǐng)求方式可實(shí)現(xiàn)資源的更新,PATCH 請(qǐng)求方式可對(duì)資源進(jìn)行部分更新,DELETE 請(qǐng)求方式可對(duì)資源進(jìn)行刪除。其中,GET 請(qǐng)求方式及POST 請(qǐng)求方式則可調(diào)用同一類接口。PUT 請(qǐng)求方式、PATCH 請(qǐng)求方式及DELETE 請(qǐng)求方式均需要根據(jù)數(shù)據(jù)庫(kù)表的主鍵來(lái)更新,則需要傳遞主鍵,可寫一類接口滿足數(shù)據(jù)的調(diào)用。按照Restful 規(guī)范寫接口時(shí)只需要兩類接口即可滿足需求,數(shù)據(jù)的獲取只需根據(jù)請(qǐng)求方式來(lái)控制即可。
以馬匹競(jìng)拍詳情頁(yè)數(shù)據(jù)接口為例,闡述該APP接口的開發(fā)過(guò)程如下:
1)獲取完成數(shù)據(jù)庫(kù)遷移操作的數(shù)據(jù)庫(kù)表,從而獲取數(shù)據(jù)模型類。
2)將數(shù)據(jù)模型類進(jìn)行序列化與反序列化。創(chuàng)建ProductSerializer 類、DetailsSerializer 類并繼承ModelSerializer 類,以實(shí)現(xiàn)Auction 表的序列化。由于product 字段是Auction 表的一個(gè)外鍵,因此需要先將Product 表進(jìn)行序列化。在序列化Product 表時(shí)首先指定序列化模型的類Product,然后指定序列化模型類的屬性,將要序列化的屬性選擇性的賦值給“fields”,此處“'__all__'”是將Product 表的所有屬性都進(jìn)行序列化。Product 表序列化后再將Product Serializer 類在DetailsSerializer 類中進(jìn)行調(diào)用。將Product 字段進(jìn)行序列化,從而完成Auction 表的序列化。代碼如下:
3)視圖類的編寫。定義DetailsSerializerView 類并繼承ModelViewSet 類,獲取要序列化的Auction 表的所有對(duì)象,指定要使用的序列化類DetailsSerializer,則可實(shí)現(xiàn)對(duì)數(shù)據(jù)的增、刪、改、查。除此之外,定義的get_queryset 函數(shù),還可根據(jù)id 獲取單條記錄,實(shí)現(xiàn)數(shù)據(jù)的查詢。代碼如下:
5)將接口的Django app在setting.py中進(jìn)行注冊(cè)。
通過(guò)上述操作,即可完成馬匹競(jìng)拍詳情頁(yè)數(shù)據(jù)接口的開發(fā)。啟動(dòng)服務(wù)器即可在Django Rest Framework 為開發(fā)人員提供的Web 可視化界面中查看接口返回的Json 數(shù)據(jù),并且可對(duì)數(shù)據(jù)進(jìn)行獲取、創(chuàng)建、更新及刪除操作。
3.3.1 馬匹信息展示模塊
待拍賣、拍賣中及拍賣完成的馬匹信息展示模塊的設(shè)計(jì)能夠使用戶快速、及時(shí)、準(zhǔn)確地了解拍賣馬匹及拍賣完成馬匹的所有詳細(xì)競(jìng)拍信息。將競(jìng)拍馬匹的芯片號(hào)、馬匹名稱、身高、體長(zhǎng)、胸圍、管圍、出生年月、品種、烙號(hào)等信息簡(jiǎn)明扼要地呈現(xiàn)在用戶眼前,用戶可根據(jù)個(gè)人意愿參與競(jìng)拍。
3.3.2 馬匹競(jìng)拍功能模塊
該模塊對(duì)競(jìng)拍時(shí)間段、起拍價(jià)、加價(jià)幅度、傭金金額、延時(shí)周期、保留價(jià)進(jìn)行了設(shè)置,用于對(duì)馬匹競(jìng)拍業(yè)務(wù)功能的實(shí)現(xiàn)。用戶可點(diǎn)擊正在拍賣詳情展示界面的“競(jìng)拍”按鈕,簽訂競(jìng)拍協(xié)議,交納參與競(jìng)拍的保證金參與競(jìng)拍。參與競(jìng)拍的用戶可在規(guī)定時(shí)間內(nèi)根據(jù)個(gè)人意愿按規(guī)定的加價(jià)幅度或加價(jià)幅度的倍數(shù)進(jìn)行競(jìng)拍。當(dāng)競(jìng)拍成功后,保證金則作為付款金額及平臺(tái)服務(wù)費(fèi)的一部分,用戶支付尾款即可完成這次競(jìng)拍。當(dāng)競(jìng)拍失敗后,保證金會(huì)退還給用戶,結(jié)束這次競(jìng)拍。具體競(jìng)拍業(yè)務(wù)流程如圖4所示。
圖4 競(jìng)拍業(yè)務(wù)流程
3.3.3 保證金管理功能模塊
在該模塊中對(duì)馬匹競(jìng)拍保證金進(jìn)行了管理,用戶可查看保證金的當(dāng)前狀態(tài)。競(jìng)拍成功之后保證金狀態(tài)會(huì)顯示為扣除狀態(tài),競(jìng)拍結(jié)算金額由競(jìng)拍金額減去保證金金額得出,并在訂單詳情頁(yè)中顯示。競(jìng)拍失敗的用戶可以查看保證金的退還狀態(tài)。
3.3.4 訂單管理功能模塊
該模塊實(shí)現(xiàn)了競(jìng)拍成功訂單的生成、訂單的顯示及個(gè)人訂單的管理功能。方便用戶對(duì)個(gè)人訂單的查看及管理。
3.3.5 用戶管理功能模塊
該模塊實(shí)現(xiàn)了用戶個(gè)人信息的設(shè)置及個(gè)人信息的展示。用戶可以修改個(gè)人賬戶的基本信息,如密碼、收貨地址、聯(lián)系方式等,還可對(duì)用戶收藏的馬匹信息及競(jìng)拍成功后訂單的待付款、待發(fā)貨、待收貨、待評(píng)價(jià)等信息進(jìn)行查看。除此之外,該模塊的所有信息都與網(wǎng)頁(yè)端的賬戶保持同步,用戶可以對(duì)自己的個(gè)人信息進(jìn)行便捷管理。
該應(yīng)用實(shí)現(xiàn)的主要功能包括馬匹信息展示、馬匹競(jìng)拍、保證金管理、訂單管理以及用戶管理。應(yīng)用的主要功能界面如圖5~8 所示。
圖5 首頁(yè)
圖6 競(jìng)拍詳情頁(yè)
圖7 我的競(jìng)拍頁(yè)
圖8 個(gè)人中心頁(yè)
在對(duì)馬匹競(jìng)拍業(yè)務(wù)邏輯充分調(diào)研的基礎(chǔ)上完成需求分析,根據(jù)需求分析確定基于移動(dòng)端馬匹競(jìng)拍APP 的設(shè)計(jì)方案。根據(jù)新疆維吾爾自治區(qū)大力發(fā)展馬產(chǎn)業(yè)的現(xiàn)狀,完成了一款易擴(kuò)展、易維護(hù)的IOS 端及Android 端馬匹競(jìng)拍應(yīng)用。相較于新疆昭蘇西域馬業(yè)傳統(tǒng)馬匹競(jìng)拍模式,用戶不再需要前往拍賣會(huì)場(chǎng),受到時(shí)間、地域的局限,改善了傳統(tǒng)競(jìng)拍模式中存在的弊端,為交易雙方在馬匹競(jìng)拍過(guò)程中提供了很大程度上的便利,大大提升了競(jìng)拍效率,提高了人們對(duì)馬匹競(jìng)拍的關(guān)注度,滿足了人們的需求。