郭瀚亭
(山西大學 山西 太原 237016)
當今社會是一個互聯網高度發達和信息爆炸的時代,隨著個人電腦的廣泛使用與互聯網的普及,人們對計算機系統的依賴程度日漸加深,各類應用軟件也成了計算機用戶生產力的重要來源。互聯網在帶來便利的同時也帶來了有效信息搜集困難的問題以及很多對用戶數據安全性產生惡意破壞的盜版、破解軟件。因此,對于軟件的審核是十分重要的。本文以此為目的,設計開發了一款軟件分享平臺,將某一專業領域常用精品軟件經審核后,上傳至獨立平臺,提前為用戶篩選,以便用戶下載和使用。
從經濟可行性角度分析,本平臺圍繞程序員等計算機使用者日常工作時的痛點,分享無毒無害、高效可靠的工具軟件,提高計算機用戶的工作、學習效率。在一定范圍內有較大的受眾群體,可通過綁定用戶的方式帶來經濟效益。
就技術可行性而言,Python 語言、Django 框架、jQuery 庫、MariaDB 數據庫、Redis 數據庫等工具已經有了較高的成熟度,說明文檔清晰,教程豐富,技術難度相對較低,開發周期相對較短,風險相對較小。
從系統的功能需求角度分析,作為軟件共享平臺,用戶信息、軟件包數據、評論信息、支付信息是不可或缺的。因此,本平臺應具有的功能模塊包括用戶管理、文件管理、評論管理以及支付管理功能。此外,為保證用戶有相對較好的使用體驗,還需要確保平臺界面的美觀、交互簡單,通過CSS、JavaScript 技術對其進行美化和交互行為的優化。具體的需求分析如下。
1.2.1 用戶管理功能
用戶管理功能主要是對普通用戶的賬號、密碼及郵箱等信息進行管理,方便用戶管理其在該站點上的用戶狀態,如注冊、登錄、登出、修改密碼等。除普通用戶以外,還有后臺管理員用戶,對整個站點的所有數據進行管理。
1.2.2 文件管理功能
作為該平臺的核心功能,文件管理功能主要包括文件數據上傳(圖標、軟件包、簡介)、文件展示、瀏覽記錄、下載記錄等數據的管理。為保證站點安全,只有部分普通用戶具有文件上傳權限。
1.2.3 評論管理功能
為提高用戶間的交互性,也方便用戶對當前瀏覽軟件進行評價、反饋,本站點應具有評論功能,用戶還可以對認可的評論進行“點贊”。
1.2.4 支付管理功能
為使網站的收益多元化,不僅要在站點頁尾加入收款碼,站點也應接入支付寶的支付接口,保證用戶安全支付。
1.2.5 運維功能
為了保證系統日常運行穩定,便于維護,系統應具有對請求日志、數據庫操作日志定期切分,數據庫定期備份,并對日志及數據庫備份文件進行異地備份的功能。
1.2.6 安全保護功能
公網部署的項目不僅要為用戶提供穩定的功能,還應具有對惡意攻擊行為進行主動防御及避免的能力,以確保站點提供安全、正常的服務,并且保證用戶數據不被拖庫或其他惡意行為竊取、篡改,必要時對指定IP 的請求根據風險等級進行不同時間長度的封禁。
非功能性需求方面,平臺各頁面應保持整體風格一致,交互體驗應滿足簡單、高效、清晰、嚴謹。
將Django框架特征與軟件分享平臺功能特點相結合,設計出該系統的架構,見圖1。
由圖1 可知,該系統架構主要由DMZ(隔離層)、APP Core(應用核心層)及DB Core(數據層)3 部分構成。
系統的DMZ 主要由Nginx 服務器構成,負責響應靜態文件請求及對uwsgi 服務器進行反向代理,并在配置中加入安全策略。該區域在實現靜態文件高效分發的同時,保證了邏輯服務與外界請求的隔離,從流量角度上實現了站點的安全。DMZ 部署在負載均衡服務器上。APP Core 主要由靜態部分和動態部分構成,靜態部分由前端文件、圖片、音視頻及軟件包等組成,動態部分主要以Django 作為后端程序,為前端提供動態數據[1]。APP Core 部署在應用服務器上。DB Core 由數據庫集群構成,一臺主機、數臺從機進行讀寫分離及相互備份,以實現負載均衡、容錯容災。同時,對于數據庫,采用保留7 d 14 次全量備份的本地備份策略,并上傳到云端進行異地備份。
通過對一些管理系統和文件共享平臺的分析,并結合本平臺的實際需求,設計出系統的功能結構,見圖2。
由圖2 可知,該系統參與者為管理員和普通用戶,對用戶身份做嚴格區分可以在保護系統及用戶信息安全的同時,讓管理員更容易進行站點管理。賦予普通用戶有限的權力和選擇,合理降低系統的復雜度,不僅降低了用戶在選擇上的困難度,一定程度上提升了用戶體驗,也減少了系統可能的漏洞數量,提高了系統的安全性[2]。
系統的數據庫設計階段,根據需求、功能和數據屬性對關系型數據庫數據表進行初步設計,再根據功能模塊、數據之間的關系對初步設計進行完善。數據庫設計的合理性和嚴謹性是整個系統能穩定、高效運行的重要因素。本系統的數據庫設計見圖3。
本系統的實體包括用戶信息、軟件信息、瀏覽記錄、下載記錄、評論信息、支付信息及郵箱驗證碼信息,共7個實體[3]。
(1)在用戶信息表中,包括用戶id、用戶名、密碼(加密)、郵箱、注冊時間及用戶年齡,共6 個字段。
(2)在軟件信息表中,包括軟件id、軟件名、軟件文件、軟件圖標、軟件介紹、瀏覽量、下載量、上傳時間、上傳用戶、最后更新時間及是否通過審核,共11 個字段。
(3)在瀏覽歷史表中,包括用戶id、軟件id 及瀏覽時間,共3 個字段。
(4)在下載歷史表中,包括用戶id、軟件id 及下載時間,共3 個字段。
(5)在評論信息表中,包括用戶id、軟件id、評論內容、評論時間及點贊數,共5 個字段。
(6)在郵箱驗證碼表中,包括驗證消息id、郵箱地址、驗證碼及發送時間,共4 個字段。
(7)在支付信息表中,包括用戶id、訂單金額、訂單時間、訂單號、支付時間及交易狀態,共6 個字段。
本系統后端部分采用Python 語言及Django 框架進行開發,前端部分采用jQuery 工具庫進行開發。
Python 語言是一種產生于20 世紀90 年代初期的解釋型語言,具有容易上手、方便移植、開發效率高的特性。本系統使用Python3.7.6 的發行版Anaconda3 進行開發。
Python 可使用第三方工具庫Scapy 以實現網絡數據包的發送、嗅探、分析和偽造功能。該工具被廣泛應用在偵測、掃描和攻擊中。本系統使用Scapy 對服務端口進行嗅探,檢測SYN 攻擊及其他DoS 攻擊方式。
Django 框架為Python-Web 開發中最為重要也最為常用的開源框架之一,由Python 編寫而成,因簡便、快速開發、強大的插件系統而被Python 開發者廣泛使用[4]。
Django 框架不僅支持前后端不分離的MTV 設計模式,也支持通過JsonResponse 作為純后端進行前后端分離式開發。若利用DRF(Django REST Framework)工具包進行開發,則可以直接利用其提供的REST 風格接口及序列化、反序列化器進行編碼,并生成接口文檔和接口測試頁面,進一步提高開發、測試效率。本系統采用原生Django2.1.15 框架進行開發。
jQuery 是一個為了簡化原生JavaScript 語言而誕生的工具庫。它將JavaScript 的常用功能進行封裝,提供了一種簡潔、快速的JavaScript 設計模式。本系統使用jQuery-1.12.4 進行前端開發。
Visual Studio Code(以下簡稱VS Code)是Microsoft 發布的一款開源免費的跨平臺代碼編輯器。VS Code 對各種語言和文件格式也有較好的支持,通過擴展生態可以使其達到主流IDE 的使用體驗。本項目的前、后端及部署時的配置文件編寫,全部在VS Code 上完成。VS Code 生態中也具有成熟的遠程開發插件,可以在客戶機上對服務器上運行的代碼進行在線開發,極大地提高了開發的靈活性。
MariaDB 為關系型數據庫MySQL 的一個分支,使用InnoDB 作為數據庫引擎,完全兼容MySQL 的API 和命令行。完全的開源、良好的社區及優秀的性能使之成了MySQL 完美的替代品。MariaDB 也提供了便捷的mysqldump 備份工具,方便運維人員對數據庫進行全量、增量備份及數據還原,保證了數據庫的穩定性及易維護性。
Redis 是一款C 語言編寫、支持網絡、基于內存、可持久化和分布式的鍵值型數據庫。因其數據存儲在內存中,保證了讀寫的高效。在互聯網項目中,Redis 常作為熱數據的緩存介質。Redis 提供了多種語言的接口,故本項目可借助其為Python 提供的接口為用戶提供更高性能的使用體驗。
Gitee 是國內的一款提供Git 托管服務的云端平臺,還集成了代碼質量檢測、項目演示等功能。對于團隊協作開發,Gitee 還提供了項目管理、代碼托管、文檔管理等服務。本項目源代碼全部在Gitee 平臺開源,且14d 內日志、7 d 內每天兩次的數據庫備份文件也在Gitee 進行異地備份。一旦本地服務器發生故障,可立刻從云端下拉源碼,并恢復數據,可在半小時內對簡單故障進行處理并恢復服務。
系統的前端軟件架構是前端頁面由HTML5 進行頁面布局,CSS3 對HTML 元素進行樣式的制定及部分動畫的制作,由JavaScript 完成用戶行為的交互。頁頭頁尾通過嵌入iframe 頁面,保證大部分頁面風格的一致性。數據方面,通過jQuery、Ajax 技術向Django 后端的發起數據交互請求,并將數據有序地生成到頁面中[5]。在頁面動態數據生成過程中,還需要避免XSS 注入的發生。
系統的后端軟件架構主要由Django 框架的Model 及View 構成,Model 以Python 類的形式定義、操作數據庫,MariaDB 作為關系型數據庫,并使用Django 內置的ORM 模塊進行數據庫操作。View 中以Python 函數或類的形式對前端發起的Ajax 請求進行業務邏輯處理。Django Middleware 則在從服務器接收到請求到返回響應的所有流程中對數據進行處理。Redis 作為Session 數據及分布式消息隊列的存儲介質,提高系統運行效率。
系統中,所有前端發出的Ajax 請求在后端均有與之對應的View 接受并返回響應,在保證系統全部功能均可正常運行的前提下,提高了系統的可擴展性,為功能更新迭代提供了便利。
系統運維以Shell 腳本和Python 腳本為工具,實現日志切分、數據庫備份、文件上傳云端、IP 檢測、DDNS解析等功能。
在Ubuntu 系統中,以“日期+時間”命名數據庫備份文件,使用Git 對日志、備份文件進行管理。獲取服務器IP 地址,并以郵件發送給管理員,使用DDNS 接口進行動態域名解析。配合crontab 定時任務,每日12 時進行數據庫備份,每日0 時進行數據庫備份及日志切分,每10min 進行一次DDNS 解析。當系統負載長時間維持較高值,系統發送郵件告警。
該軟件分享平臺采用Python 語言進行開發,Django作為后端開發框架,jQuery 作為前端開發框架。因Python 及Django 技術經過多年發展已經趨于成熟穩定,形成了完善的社區體系,大幅提升了開發效率。
系統以分享優質軟件資源為目的進行設計、開發,希望更多開發者、計算機初學者獲取到更多優質的軟件工具,同時也鼓勵眾多開發者提出自己的新想法,開發、開源自己的優質軟件,這不僅可以推動行業發展,也可以帶來一定的經濟價值。