1.技術概覽
開發環境 | Ubuntu 14.04.2 |
資料庫 | MySQL |
後端開發架構 | rails 4.0 |
前後端互動 | 前端用URL發送HTTP請求,後端捕獲request,進行路由比對,傳回json格式資料 |
後端在Ubuntu 14.04.2環境上開發,以Ruby On Rails架構搭建,并使用MySQL資料庫。
RubyOnRails架構開發有簡潔,靈活的特點,提供了一個一站式的很便捷的MVC架構,可以很友善地實作BS架構的軟體。ROR通過ActiveModel層,和ActiveRecord層實作與底層資料庫的互動,通過ActiveControl層實作了MVC架構的控制層,在我們的設計中,view層在後端中是以API接口(即URL請求)向外展示的,也可以把view層直接看做是前端實作的頁面,API實作與view層的互動。ActiveModel和ActiveRecord定義了對象,對象是與資料庫中的表進行關聯,對于資料庫的增删改查的操作被定義為了對象的行為,即rails架構隐藏了底層資料庫操作,rails控制器可以直接操作對象實作對于資料庫的操作。ruby獨特的語言特性和結構極大地便利了代碼重用。ruby語言可以很友善地定義代碼塊,同時rails架構中通過回調函數,過濾器等方式也極大地支援了代碼重用。在這些過程中展現了抽象原則,控制耦合,内容耦合,子產品化,功能内聚等原則。同時我們通過向外開放API,以及不同層次之間的抽象等實作了資訊的隐藏和封裝。
後端資料庫使用MySQL實作,MySQL支援大型資料庫,可以完成對于大量資料的操作,同時,它支援并行操作,并且是開源的免費産品,在現有條件下十分适合我們的程式。它提供了大量資料的處理能力。
前後端互動主要通過API實作。API在這裡表現為URL請求。前端發送URL請求,後端rails架構中通過路由對于請求進行解讀,比對相應的控制器,控制器完成前端的請求并傳回資料。通過這樣的機制我們實作了界面和實作的分離。
後端運作在我們的伺服器上,伺服器是Ubuntu 14.04.2環境。輸入參數設定為URL和http請求,我們通過路由比對規則完成了對URL的限定。對于請求中資料的限定,我們在control中有專門的處理。我們傳回的資料主要是http表單,内容為json格式。
2.實作功能
- 普通使用者與社團使用者的登入系統
- 展示社團釋出的活動資訊
- 社團編輯并釋出自己的活動資訊
- 普通使用者報名參加釋出的活動,并添加相關備注
- 社團使用者擷取參加活動的所有普通使用者名單,并對名單中的使用者進行删除操作
我們定義了四個實體,使用者,社團,文章和備注。使用者,社團和文章實體顧名思義,備注實體的主要作用除了展現使用者報名中關于報名活動的備注以外,還作為使用者報名活動的記錄。這些實體抽象為四個對象(和資料庫中的四個表)進行相關資料的存儲和操作。我們将上述功能抽象到了不同的API接口,通過控制器實作。
3.API設計
對于上述功能我們設計并實作了以下API,同時設計了相應的路由規則。前端可以通過這些API接口來擷取資料和操作。
3.1 API功能分類
3.1.1 使用者登入系統

3.1.2 報名
3.1.3 活動文章增删改
3.1.4 前端擷取文章資訊
3.1.5 活動名單
3.2 路由搭建
HTTP 方法 | 路徑 | 控制器#動作 | 作用 |
POST | /api/register | users#register | 普通使用者注冊 |
/api/users/login | users#login | 普通使用者登入 | |
GET | /api/users/logout | users#logout | 普通使用者登出 |
/api/clubs/login | clubs#login | 社團使用者登入 | |
/api/clubs/:uid/articles/:page_id | clubs#getabstracts | 擷取社團文章概要 | |
/api/clubs/logout | clubs#logout | 社團使用者登出 | |
/api/articles/:page_id | articles#abstracts | 擷取文章概要 | |
/api/articles/detail/:article_id | articles#detail | 擷取文章詳情 | |
/api/clubs/articles/detail/create | articles#create | 建立文章 | |
/api/clubs/articles/detail/:article_id/change | articles#show | 傳回文章 | |
/api/clubs/articles/detail/:article_id/update | articles#update | 編輯文章 | |
/api/clubs/articles/detail/:article_id/delete | articles#destroy | 删除文章 | |
/api/clubs/articles/detail/:article_id/list | articles#list | 擷取參與活動名單 | |
/api/clubs/articles/detail/:article_id/list/delete | articles#cutlist | 删除活動名單 | |
api/users/:uid/articles/:article_id/notes/create | notes#create | 建立備注(報名) |
4.後端資料庫設計
我們對于資料庫的設計如下。同時對于每個表單,我們對于幾個關鍵屬性設定了索引表,為了便于查詢。當資料庫中有大量資料的時候,我們對資料庫的操作并不會太慢。當資料達到一定程度的時候,我們也可以建立二級索引等。通過這些我們也可以支援對于大量資料的處理能力。
4.1 資料表
表名 | 屬性名 | 類型 | 屬性含義 |
articles | id | integer | 主鍵 |
club_id | 外鍵,與club實體建立多對一關聯 | ||
title | string | 文章标題 | |
abstract | 文章摘要 | ||
content | 文章内容 | ||
created_at | 表建立時間 | ||
updated_at | 表更新時間 | ||
users | |||
stu_num | 學号 | ||
password | 密碼 | ||
phone_num | string(11) | 學生聯系電話 | |
log_num | 狀态驗證碼 | ||
clubs | |||
name | 社團名稱 | ||
社團帳号密碼 | |||
introduction | 社團介紹 | ||
head_url | 社團頭像存儲url位址 | ||
notes | |||
備注内容 | |||
user_id | 外鍵,指向users表 | ||
article_id | 外鍵,指向articles表 | ||
4.2 E-R圖概念模型
5.錯誤處理:
我們的錯誤處理主要通過兩方面實作。
一方面通過rails自帶架構實作。
rails自帶架構中對于請求格式,請求内容等,以及一些錯誤情況有所判斷和區分,對于一些錯誤rails架構會自主傳回錯誤資訊。在http表單的表頭中會添上相應的錯誤碼。
另一方面在代碼中有所判斷。
我們在代碼中對于邊界情況等有所判斷。每次對于資源的請求,對于資源的操作,使用者持有的權限等,我們都會對于目前情況進行判斷, 并在表單中傳回錯誤資訊。
狀态碼 | 錯誤 | 傳回錯誤資訊 |
401 | 普通使用者賬戶資訊認證失敗 | Invalid User |
社團使用者賬戶資訊認證失敗 | Invalid club | |
404 | 資料表中沒有該記錄 | NoRecord error |
建立記錄失敗 | New record failed | |
更新記錄失敗 | update failed | |
删除記錄失敗 | destroy failed |
6、安全:
安全部分并沒有做到足夠細化,暫時隻考慮了部分資料和過程的安全。主要是通過兩種方式實作。
一方面通過rails架構和HTTPS實作部分安全。
rails架構對于http請求會進行一個簡單的身份驗證,這個驗證是依托浏覽器的,浏覽器在請求中會自動嵌入一個token,rails在控制器中對于這個token進行驗證,實作一個簡單的身份驗證。
另一方面通過代碼設計和存儲設計等實作。
關于使用者密碼:
使用者密碼在後端資料庫加上鹽值後通過MD5進行哈希之後再進行存儲,保證伺服器被攻破後使用者密碼不會洩露。
關于狀态認證:
使用者成功登陸後,後端伺服器傳回一段哈希值作為token,哈希内容為使用者賬戶資訊以及随機選擇的随機數。後端儲存随機數。使用者進行驗證的時候,後端對賬戶資訊和随機數進行哈希後再比對,驗證使用者登入狀态。