趙美勇 楊永琪 宋思睿
摘要:利用B/S構架設計系統(tǒng),省去了客戶端的設計,擴大了應用范圍,除了計算機以外的其他終端都可以訪問。使用Python進行Web開發(fā),使用其中的Flask框架來進行輕量級的Web應用開發(fā),數(shù)據(jù)庫方面則選的其內(nèi)部的Flask-SQLAlchemy來進行管理SQLite(Unix),簡化了整個SQLAlchemy操作。使整個系統(tǒng)輕便高效。
關鍵詞:B/S架構;Flask框架;Python;Web開發(fā)
中圖分類號:TP393 文獻標識碼:A
文章編號:1009-3044(2019)10-0086-03
開放科學(資源服務)標識碼(OSID):
1 系統(tǒng)開發(fā)平臺
1.1 開發(fā)平臺簡介
本競賽管理系統(tǒng)采用B/S架構,使用Python進行Web開發(fā)。渲染界面采用Jinja2模板引擎,同時使用Flask-Bootstrap集成TwitterBootstrap。
利用Flask-Login管理已登錄用戶的用戶會話,使用Werkzeug計算密碼散列值并進行核對,通過itsdangerous生成并核對加密安全令牌。
選擇使用的數(shù)據(jù)庫框架Flask-SQLAlchem管理數(shù)據(jù)庫,數(shù)據(jù)庫引擎選用SQLite。
1.2 開發(fā)語言
Python-Flask
使用Python Web開發(fā)Flask框架,F(xiàn)lask被設計為可拓展的框架,具有一個包含基本服務的強健核心,其他功能通過拓展實現(xiàn)。
1.3 開發(fā)工具
Pycharm
1.4 操作系統(tǒng)
Ubuntu16.04
1.5 數(shù)據(jù)庫
使用Flask-SQLAlchemy管理SQLite(Unix)
Flask-SQLAlchemy數(shù)據(jù)庫極大地簡化了之前老版本數(shù)據(jù)的操作,它在存儲、查詢方面表現(xiàn)出色,消耗時間少。所以利用它來管理SQLite更為方便,同時響應速度更快。
2 數(shù)據(jù)庫規(guī)劃
2.1 任務陳述
競賽實驗室剛成立,為了更加公正地評估大家平時學習情況,制定了一系列的積分制度,積分與日常的比賽、討論班、考勤等掛鉤。由于積分關聯(lián)項過多、比賽種類不一、實驗室人員增加,與之相關的信息量急劇增多。管理人員通過 Excel 手動維護信息力不從心,需要實驗室管理系統(tǒng)提高效率。為了提高大家學習效率,對已做題目信息、比賽數(shù)據(jù)統(tǒng)計變得尤為重要,如題目類型、題目來源、題目難度等。本實驗室管理系統(tǒng)包括人員管理、隊伍管理、比賽信息管理、積分管理、題目管理、討論班管理六大模塊,對于不同的用戶給予不同的權限。
2.2 需求分析
1) 用戶需求說明
① 數(shù)據(jù)需求:
實驗室人員信息記錄:學號、姓名、學院、聯(lián)系方式、OJ 賬號、積分;
隊伍信息記錄: 隊伍人員組成,隊伍積分、隊伍參與比賽信息;
積分信息記錄: 個人積分與隊伍積分;
比賽信息記錄: 比賽日期、比賽地點、比賽類型、各參賽隊伍成績;
題目信息記錄: 題目類型、題目難度、來源;
討論班信息記錄: 主講人,相關課件。
② 數(shù)據(jù)錄入:
實驗室人員信息錄入:學號、姓名、學院、聯(lián)系方式、 OJ 賬號、頭像、Email;
新建隊伍信息錄入:隊名、隊員組成、頭像、賬號;
比賽信息錄入:比賽日期、比賽地點、比賽類型、比賽形式、相關隊伍、相關問題;
題目信息錄入:來源、編號;
討論版錄入:主講人信息、時間、年級、信息、相關文件上傳;
初始積分錄入;
用戶之間的相互關注、用戶發(fā)表公告。
② 數(shù)據(jù)更新和刪除:
實驗室人員信息更改;
隊伍信息修改;
比賽信息修改;
題目信息修改、刪除;
個人、隊伍積分更新;
用戶之間取消關注、修改公告信息。
③ 數(shù)據(jù)查看
按照 id 或姓名或積分升序列出用戶部分信息 (姓名、 Email、最后訪問時間、分數(shù))
根據(jù)用戶姓名展示用戶詳細信息 (頭像、發(fā)表過的公告、關注者人數(shù))
按照 id 或姓名或積分升序列出隊伍部分信息 (隊名、成員組成、賬號、分數(shù))
根據(jù)隊伍姓名展示隊伍詳細信息 (頭像、參加過的比賽、最高獎項)
按照 id 升序列出討論班部分信息 (時間、主講人、年級、內(nèi)容)
根據(jù)關鍵字檢索討論班信息、比賽信息
對特定討論班相關文件進行下載
根據(jù)比賽名稱展示比賽詳細信息 (頭像、包括題目列表等)
展示最近時間實驗室人員參加的比賽
2) 系統(tǒng)需求說明
① 安全性:
數(shù)據(jù)庫必須有口令保護
數(shù)據(jù)庫中不能明文存儲密碼
用戶注冊賬號需要郵箱認證
用戶之間給予不同的權限
② 備份和恢復:
每天數(shù)據(jù)備份一份
③ 法律問題
對用戶數(shù)據(jù)的處理遵守法律
2.3 數(shù)據(jù)庫邏輯設計
實體的設置
設置User、Team、Contest、Problem、Seminar、Account、Post實體集,具體描述見圖。
2.4 表示聯(lián)系
每個隊伍至多包含三名隊員,每個隊伍和隊員對應一個賬號,通過賬號參加比賽,每個比賽包括一些問題,用戶之間可以互相關注,用戶定期會舉行討論班,發(fā)布重要公告。
2.5 實體集屬性
1) User
Email、Score、Account、Phone、Name、AboutMe分別代表實驗室人員Email、個人積分、賬號ID、電話、姓名、自我介紹,Email為認證郵箱,作為主鍵,Account為外鍵。
2) Team
ID、S1、S2、S3、Name、Score、AboutMe分別代表隊伍ID、隊員一用戶主鍵、隊員二用戶主鍵、隊員三用戶主鍵、隊伍名稱、隊伍分數(shù)、隊伍自我介紹。
3) Problem
ID、Source、Index分別代表問題ID、來源、編號,如來源為‘HDU、編號為‘1001。其中ID為主鍵。
4) Contest
其中Name代表競賽名稱;Participants代表參賽人(隊伍)數(shù);CompetitionLevel代表競賽級別,如‘省賽,‘區(qū)域賽,‘世界總決賽等;Format代表競賽賽制,比如‘ACM-ICPC,‘OI等。Time、Place、ID分別代表競賽時間、地點、ID,其中ID為主鍵。
5) Seminar
Speakerid代表主講人ID,Time代表時間,Grade代表年級,About代表討論班內(nèi)容簡介。
6) 關系類型
既包括一對一關系,又包括多對一關系,多對多關系。對于賬號參加比賽來說,我們不僅需要存儲賬號 id、比賽 id,還需要存儲參加比賽的排名、獎牌。這樣才可以更好地維護 Score 屬性,對于 SQLAlchemy,我們可以通過將多對多關系的左右兩側拆成兩個基本的一對多關系,在關聯(lián)表中記錄額外信息即可。
3 遇到的問題
3.1 權限設置
由于本系統(tǒng)模塊數(shù)較多,根據(jù)不同權限使用不同視圖變得極其繁瑣,因此使用位標志法,使用一個整數(shù),表示位標志。各個操作都對應一個位位置,能執(zhí)行某項操作的用戶,該位會設置成 1. 比如 ‘1010, 代表第一位和第三位對應的操作有權限進行,第二位和第四位對應的操作無權限執(zhí)行
4 郵箱認證
使用 Flask?Mail發(fā)郵件的時候需要設置電子郵件服務器的端口,這個不同郵箱是不一樣的, 并且程序中使用的密碼并不是郵箱密碼,而是我們在設置 SMTP 時分配的密碼。
5 文件操作
對于隊伍和比賽,有的時候需要設置頭像,頭像的存儲可以使用 LargeBinary, 渲染時直接使用 base64:b64encode 即可,但是對于大文件 (比如討論班上傳的文件),不能存儲到數(shù)據(jù)庫中,否則會大大降低數(shù)據(jù)庫的性能,因此可以在數(shù)據(jù)庫中存儲文件路徑,等到客戶端下載時可以直接在服務端磁盤上找到。
6 優(yōu)化
對于多對多關系,如果一端連接的數(shù)量是個不大的數(shù)量,可以考慮通過在一側多加一些屬性來表示。
比如此數(shù)據(jù)庫中 User 與 Team,考慮到已經(jīng)解散的隊伍的存在, User 和 Team 嚴格來說是多對多關系,但一個隊伍最多三名隊員,因此直接在隊伍實體集上添加了三個屬性,分別表示三個 user 的主鍵就好。
7 數(shù)據(jù)同步
賬號和 User 是一對一的關系,如果我們將賬號名作為賬號的主鍵,在我們修改賬號名后,不僅需要維護 Account 實體集元素,也要修改 User 對應賬號主鍵。
8 結論
對于開發(fā)者來說,設計一個系統(tǒng)是一個龐大的項目。從各種文檔的閱讀到實際項目中需求分析、概念結構設計、邏輯系統(tǒng)設計、物理系統(tǒng)設計的一系列過程,親身體驗了開發(fā)系統(tǒng)的過程. 很多東西在文檔中看著挺簡單,思路也很清晰,但是在實際使用的會有意想不到的問題,這時才會發(fā)現(xiàn)其中的難度. 從最初對于Web界面煩瑣的埋怨,到最后驚嘆于Flask的精簡。
整個系統(tǒng)的設計,最重要的一個部分就是數(shù)據(jù)庫的設計。利用Flask框架對于頁面的設計不難,如何設計好最優(yōu)的數(shù)據(jù)庫是整個系統(tǒng)的關鍵。
編碼固然不易,但是一個項目最重要的不在于如何實現(xiàn),而是實現(xiàn)之前的需求分析和模塊設計。
參考文獻:
[1] 丁旭.基于B/S架構的軟件項目實訓:JSP[M].北京:清華大學出版社,2011.
[2] 劉長龍.Python高效開發(fā)實戰(zhàn):Django、Tornado、Flask、Twisted[M].北京:電子工業(yè)出版社,2016.
[3] 李輝.Flask Web開發(fā)實戰(zhàn):入門、進階與原理解析[M].北京:機械工業(yè)出版社,2018.
[4] 明日科技. Java Web從入門到精通[M].2版.北京:清華大學出版社,2017.
【通聯(lián)編輯:謝媛媛】