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