李雪婷,楊 抒
(1.新疆農業大學計算機與信息工程學院,新疆烏魯木齊 830000;2.成都大學 計算機學院,四川 成都 610106)
在“互聯網+”的新形態下,智能移動終端飛速發展,信息技術已經徹底改變了傳統的經濟和金融市場結構,利用互聯網購物逐漸成為一種重要的消費方式。不同電商網站之間的競爭日趨激烈,網上拍賣是電子商務的重要組成部分[1-3]。網上拍賣對于交易者來說,最為明顯的優勢就是可以突破時間及場所等自然因素的限制[4]。同時,拍賣者只要擁有想要拍賣的物品,可以隨時隨地地放在網站上進行拍賣,買家也可以購買世界各地的拍品,相比于傳統拍賣,簡化了競拍規則,獲得了用戶的喜愛[5]。但僅僅使用網頁端的線上拍賣平臺很難真正提升用戶參與拍賣的便捷性。隨著移動互聯網的迅速發展,越來越多的拍賣活動都以移動端APP 的方式進行。層出不窮的競拍APP 主要針對藝術品及工藝品進行拍賣。大型活體動物的競拍多以線下專業拍賣會的方式進行。新疆是我國傳統馬業強區,全區馬存欄量居全國第一[6]。伴隨著經濟發展和社會需求的變化,新疆馬產業呈現出明顯的發展優勢和巨大的發展潛力。為推進中國現代馬業發展,促進國際交流合作,各方力量都在發揮積極的作用[7]。在此基礎上,文中提出了一款能夠在IOS 端及Android 端運行的馬匹競拍APP。利用移動端APP 用戶群體龐大、功能強大等特點,提升用戶參與競拍的便捷性與積極性,進而增加參與同場競拍人數,降低流拍率,并能夠高效、及時地擴散馬匹信息,提高馬匹競拍信息化水平,促進相關產業的發展。
通過實地調研并結合實際情況及競拍業務邏輯的基本需求,利用應用程序的簡單易用、適應移動設備等特點,設計了馬匹競拍APP 功能結構,如圖1所示。

圖1 功能結構圖
由圖1 可見,馬匹競拍APP 由即將競拍、正在競拍及競拍結束馬匹信息展示模塊、馬匹競拍模塊、訂單管理模塊、保證金管理模塊及用戶管理模塊組成。利用應用已實現的功能,可將即將競拍馬匹、正在競拍馬匹及競拍結束馬匹的相關信息展示給用戶。競拍成功的用戶可查看訂單詳細信息,競拍失敗的用戶可查看參與競拍時交納保證金的當前狀態。當前馬匹競拍APP 的功能設計能夠滿足用戶隨時隨地參與馬匹競拍的需求。
在開發Web 應用過程中,分為前后端不分離和前后端分離兩種應用模式。前后端不分離是在前端請求動態頁面時,把數據渲染成模版返回給前端,前端的效果由后端決定。這種模式耦合度較高,代碼管理難度較大,應用維護麻煩。隨著APP 的發展,在實際生產應用中APP 只需要從后端獲取一份單純的數據。當需要開發相同業務的網站和APP 時,如果不使用前后端分離模式,則后端代碼需要分別為移動端和網頁端進行開發,增加了工作量。在前后端分離模式中前端工程師負責前端頁面的設計及開發,后端工程師負責數據庫的設計、接口的開發及后臺的管理。將前后端有效區分開來,極大地提高了開發效率。前后端分離模式中如需新增功能模塊,只需在后端增加相應接口即可,較好地解決了前后端不分離模式中耦合度較高的問題。除此之外,只要前端代碼遵循后端接口的調用規則,一套后端代碼可以支持多種前端應用程序,極大地降低了開發成本[8]。馬匹競拍APP 采用前后端分離的應用模式,前端負責馬匹競拍APP 界面的渲染,后端返回前端所需要的數據,不用再控制前端的效果。后端開發的每個視圖都稱為一個接口,前端需通過調用接口來對數據進行增、刪、改、查。選取這種模式不僅可以解決網頁端和移動端的數據同步問題,還可以方便數據的管理,提升軟件的可維護性。軟件架構設計如圖2 所示。

圖2 軟件架構設計圖
1.3.1 應用開發
這款應用的開發框架選用Flutter,開發語言選用Dart,開發工具選用Android Studio。相比其他跨平臺框架,Flutter 框架的簡單性使其能夠快速運行。它的可定制性和可擴展性使其保持簡單的同時擁有強大的功能。
1.3.2 服務器開發
隨著前后端分離模式在應用開發中逐漸增多,服務器端的開發技術也層出不窮。這款應用服務器端的開發框架選用Django Rest Framework,開發語言選用Python,開發工具選用PyCharm。在編寫接口時其內部幫開發人員提供了豐富的類視圖及很多方便的組件,通過配置開發人員可以完成的序列化、分頁、權限設置等操作,極大地提高了編程效率。
1.3.3 數據庫開發
Postgre SQL 作為一個功能強大的開源數據庫[9]。支持多種語言編程,擁有世界上最豐富的數據類型支持,因此選用Postgre SQL 作為這款應用的數據庫。
Flutter是谷歌發布的一款跨平臺開源的UI框架[10]。Flutter 不僅可以快速在IOS 和Android 上構建高質量的原生用戶界面,還支持MAC OS、Windows、Linux 平臺開發,并且是未來新操作系統Fuchsia 默認的開發套件[11]。Flutter 提供了豐富的組件、接口,可以與現有的代碼一起工作,使得APP 能夠在每一個終端快速上線。
Django Rest Framework 是一款強大且靈活的構建網頁API 的工具,可用最少的代碼快速構建出一套可靠的API,簡稱DRF。DRF 最核心的模塊是Model、Serializer、View、Authentication、Permissions[12]。Django Rest Framework 具有對開發人員友好的網絡通用接口,具備權限管理、序列化等模塊,同時支持ORM 和非ORM 數據源。采用功能性視圖即可自定義所有通用接口,有強大的社區支持且應用廣泛[13]。
Dart 是一種靜態類型的安全語言。相比Java Script 弱類型語言來說,Dart 支持靜態類型檢測,在編譯階段可以獲得更多編輯器提示詞,可以在編譯前發現部分類型的錯誤,排除潛在問題,極大增強了程序的可維護性[14]。
Python 是一種面向對象的解釋型計算機程序設計語言[15]。其應用范圍很廣,支持多種數據類型,擁有強大的第三方開源庫[16]。由于它的多功能性,Python 已經成為最流行的編程語言之一[17]。
數據庫的設計是根據軟件的需求設計出能夠對數據資源進行統一管理,從而實現軟件功能的基礎設計[18]。根據馬匹競拍的業務邏輯、數據庫的完整性及安全性等特征,設計出符合實際的馬匹關聯表,為服務端的實現奠定了基礎。馬匹競拍APP 數據庫內含有競拍首頁輪播圖表、馬匹信息表、競拍詳情表、競拍表、訂單詳情表、買家訂單表及支付信息表等數據庫表,如表1 所示。

表1 馬匹競拍App數據庫組織結構圖
由表1 可知,競拍首頁輪播圖表存儲馬匹競拍APP 首頁展示的輪播圖;馬匹信息表存儲馬匹的具體信息,如RFID 號、護照號、馬名、馬主、品種等數據;競拍表存儲馬匹競拍的相關信息,如起拍價、起止時間、加價幅度、延時周期等數據;競拍詳情表存儲競拍者、競拍狀態、競拍信息、競拍價格、競拍時間等數據;買家訂單表存儲訂單編號、競拍人、保證金、成交價及傭金等數據;訂單詳情表存儲訂單的數量及單價等數據;支付信息表存儲支付用戶、支付類型、支付單標題、支付單總金額及支付狀態等數據,其關系如圖3 所示。

圖3 數據庫表關系
由于文中設計選用的開發模式為前后端分離模式,完成了后端數據庫的開發后,建立數據庫與前端的鏈接便成為該設計的重點之一。為了能夠高效地開發API,提升與服務器的聯動性,在開發設計API時遵守如下Restful 規范。
1)域名的編寫:由于該設計開發的API 分類明確,不會進一步的擴張,所以將API部署在主域名下。
2)協議的選取:使用HTTPS 協議。
3)版本的控制:將API 的版本號放入URL,通過版本號來區分不同版本的接口,不同版本放在不同接口下,以此來提高系統信息的兼容性。
4)API 的命名:路徑使用名詞加負數。
5)返回數據的格式:Json。
6)信息的過濾:通過對參數的控制,指定返回記錄的數量、返回記錄的開始位置、返回頁數及每頁的記錄數、返回結果排序的屬性以及排序順序和篩選條件,可以較好地解決記錄數量大的問題,減緩服務器的壓力。
7)數據操作類型的控制:沒有按照Restful 規范寫接口時,對數據的元操作CRUD(Create、Read、Update、Delete)分別要對應寫出4 類接口來滿足數據的請求。Restful 規范中,規定的請求方式與元操作CRUD 對應。GET 請求方式可實現資源的獲取,POST 請求方式可實現資源的新增,PUT 請求方式可實現資源的更新,PATCH 請求方式可對資源進行部分更新,DELETE 請求方式可對資源進行刪除。其中,GET 請求方式及POST 請求方式則可調用同一類接口。PUT 請求方式、PATCH 請求方式及DELETE 請求方式均需要根據數據庫表的主鍵來更新,則需要傳遞主鍵,可寫一類接口滿足數據的調用。按照Restful 規范寫接口時只需要兩類接口即可滿足需求,數據的獲取只需根據請求方式來控制即可。
以馬匹競拍詳情頁數據接口為例,闡述該APP接口的開發過程如下:
1)獲取完成數據庫遷移操作的數據庫表,從而獲取數據模型類。
2)將數據模型類進行序列化與反序列化。創建ProductSerializer 類、DetailsSerializer 類并繼承ModelSerializer 類,以實現Auction 表的序列化。由于product 字段是Auction 表的一個外鍵,因此需要先將Product 表進行序列化。在序列化Product 表時首先指定序列化模型的類Product,然后指定序列化模型類的屬性,將要序列化的屬性選擇性的賦值給“fields”,此處“'__all__'”是將Product 表的所有屬性都進行序列化。Product 表序列化后再將Product Serializer 類在DetailsSerializer 類中進行調用。將Product 字段進行序列化,從而完成Auction 表的序列化。代碼如下:


3)視圖類的編寫。定義DetailsSerializerView 類并繼承ModelViewSet 類,獲取要序列化的Auction 表的所有對象,指定要使用的序列化類DetailsSerializer,則可實現對數據的增、刪、改、查。除此之外,定義的get_queryset 函數,還可根據id 獲取單條記錄,實現數據的查詢。代碼如下:

5)將接口的Django app在setting.py中進行注冊。
通過上述操作,即可完成馬匹競拍詳情頁數據接口的開發。啟動服務器即可在Django Rest Framework 為開發人員提供的Web 可視化界面中查看接口返回的Json 數據,并且可對數據進行獲取、創建、更新及刪除操作。
3.3.1 馬匹信息展示模塊
待拍賣、拍賣中及拍賣完成的馬匹信息展示模塊的設計能夠使用戶快速、及時、準確地了解拍賣馬匹及拍賣完成馬匹的所有詳細競拍信息。將競拍馬匹的芯片號、馬匹名稱、身高、體長、胸圍、管圍、出生年月、品種、烙號等信息簡明扼要地呈現在用戶眼前,用戶可根據個人意愿參與競拍。
3.3.2 馬匹競拍功能模塊
該模塊對競拍時間段、起拍價、加價幅度、傭金金額、延時周期、保留價進行了設置,用于對馬匹競拍業務功能的實現。用戶可點擊正在拍賣詳情展示界面的“競拍”按鈕,簽訂競拍協議,交納參與競拍的保證金參與競拍。參與競拍的用戶可在規定時間內根據個人意愿按規定的加價幅度或加價幅度的倍數進行競拍。當競拍成功后,保證金則作為付款金額及平臺服務費的一部分,用戶支付尾款即可完成這次競拍。當競拍失敗后,保證金會退還給用戶,結束這次競拍。具體競拍業務流程如圖4所示。

圖4 競拍業務流程
3.3.3 保證金管理功能模塊
在該模塊中對馬匹競拍保證金進行了管理,用戶可查看保證金的當前狀態。競拍成功之后保證金狀態會顯示為扣除狀態,競拍結算金額由競拍金額減去保證金金額得出,并在訂單詳情頁中顯示。競拍失敗的用戶可以查看保證金的退還狀態。
3.3.4 訂單管理功能模塊
該模塊實現了競拍成功訂單的生成、訂單的顯示及個人訂單的管理功能。方便用戶對個人訂單的查看及管理。
3.3.5 用戶管理功能模塊
該模塊實現了用戶個人信息的設置及個人信息的展示。用戶可以修改個人賬戶的基本信息,如密碼、收貨地址、聯系方式等,還可對用戶收藏的馬匹信息及競拍成功后訂單的待付款、待發貨、待收貨、待評價等信息進行查看。除此之外,該模塊的所有信息都與網頁端的賬戶保持同步,用戶可以對自己的個人信息進行便捷管理。
該應用實現的主要功能包括馬匹信息展示、馬匹競拍、保證金管理、訂單管理以及用戶管理。應用的主要功能界面如圖5~8 所示。

圖5 首頁

圖6 競拍詳情頁

圖7 我的競拍頁

圖8 個人中心頁
在對馬匹競拍業務邏輯充分調研的基礎上完成需求分析,根據需求分析確定基于移動端馬匹競拍APP 的設計方案。根據新疆維吾爾自治區大力發展馬產業的現狀,完成了一款易擴展、易維護的IOS 端及Android 端馬匹競拍應用。相較于新疆昭蘇西域馬業傳統馬匹競拍模式,用戶不再需要前往拍賣會場,受到時間、地域的局限,改善了傳統競拍模式中存在的弊端,為交易雙方在馬匹競拍過程中提供了很大程度上的便利,大大提升了競拍效率,提高了人們對馬匹競拍的關注度,滿足了人們的需求。