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