開發環境 | 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支持大型數據庫,能夠完成對於大量數據的操做,同時,它支持並行操做,而且是開源的免費產品,在現有條件下十分適合咱們的程序。它提供了大量數據的處理能力。json
先後端交互主要經過API實現。API在這裏表現爲URL請求。前端發送URL請求,後端rails框架中經過路由對於請求進行解讀,匹配相應的控制器,控制器完成前端的請求並返回數據。經過這樣的機制咱們實現了界面和實現的分離。後端
後端運行在咱們的服務器上,服務器是Ubuntu 14.04.2環境。輸入參數設定爲URL和http請求,咱們經過路由匹配規則完成了對URL的限定。對於請求中數據的限定,咱們在control中有專門的處理。咱們返回的數據主要是http表單,內容爲json格式。api
咱們定義了四個實體,用戶,社團,文章和備註。用戶,社團和文章實體顧名思義,備註實體的主要做用除了體現用戶報名中關於報名活動的備註之外,還做爲用戶報名活動的記錄。這些實體抽象爲四個對象(和數據庫中的四個表)進行相關數據的存儲和操做。咱們將上述功能抽象到了不一樣的API接口,經過控制器實現。瀏覽器
對於上述功能咱們設計並實現瞭如下API,同時設計了相應的路由規則。前端能夠經過這些API接口來獲取數據和操做。安全
HTTP 方法 | 路徑 | 控制器#動做 | 做用 |
POST | /api/register | users#register | 普通用戶註冊 |
POST | /api/users/login | users#login | 普通用戶登陸 |
GET | /api/users/logout | users#logout | 普通用戶登出 |
POST | /api/clubs/login | clubs#login | 社團用戶登陸 |
GET | /api/clubs/:uid/articles/:page_id | clubs#getabstracts | 獲取社團文章概要 |
GET | /api/clubs/logout | clubs#logout | 社團用戶登出 |
GET | /api/articles/:page_id | articles#abstracts | 獲取文章概要 |
GET | /api/articles/detail/:article_id | articles#detail | 獲取文章詳情 |
POST | /api/clubs/articles/detail/create | articles#create | 建立文章 |
POST | /api/clubs/articles/detail/:article_id/change | articles#show | 返回文章 |
POST | /api/clubs/articles/detail/:article_id/update | articles#update | 編輯文章 |
POST | /api/clubs/articles/detail/:article_id/delete | articles#destroy | 刪除文章 |
POST | /api/clubs/articles/detail/:article_id/list | articles#list | 獲取參與活動名單 |
POST | /api/clubs/articles/detail/:article_id/list/delete | articles#cutlist | 刪除活動名單 |
POST | api/users/:uid/articles/:article_id/notes/create | notes#create | 建立備註(報名) |
咱們對於數據庫的設計以下。同時對於每一個表單,咱們對於幾個關鍵屬性設置了索引表,爲了便於查詢。當數據庫中有大量數據的時候,咱們對數據庫的操做並不會太慢。當數據達到必定程度的時候,咱們也能夠創建二級索引等。經過這些咱們也能夠支持對於大量數據的處理能力。ruby
表名 | 屬性名 | 類型 | 屬性含義 |
articles | id | integer | 主鍵 |
club_id | integer | 外鍵,與club實體創建多對一關聯 | |
title | string | 文章標題 | |
abstract | string | 文章摘要 | |
content | string | 文章內容 | |
created_at | string | 表創建時間 | |
updated_at | string | 表更新時間 | |
users | id | integer | 主鍵 |
stu_num | integer | 學號 | |
password | string | 密碼 | |
phone_num | string(11) | 學生聯繫電話 | |
log_num | integer | 狀態驗證碼 | |
created_at | string | 表創建時間 | |
updated_at | string | 表更新時間 | |
clubs | id | integer | 主鍵 |
name | string | 社團名稱 | |
password | string | 社團賬號密碼 | |
introduction | string | 社團介紹 | |
head_url | string | 社團頭像存儲url地址 | |
log_num | integer | 狀態驗證碼 | |
created_at | string | 表創建時間 | |
updated_at | string | 表更新時間 | |
notes | id | integer | 主鍵 |
content | string | 備註內容 | |
user_id | integer | 外鍵,指向users表 | |
article_id | integer | 外鍵,指向articles表 | |
created_at | string | 表創建時間 | |
updated_at | string | 表更新時間 |
咱們的錯誤處理主要經過兩方面實現。服務器
一方面經過rails自帶框架實現。架構
rails自帶框架中對於請求格式,請求內容等,以及一些錯誤狀況有所判斷和區分,對於一些錯誤rails框架會自主返回錯誤信息。在http表單的表頭中會添上相應的錯誤碼。
另外一方面在代碼中有所判斷。
咱們在代碼中對於邊界狀況等有所判斷。每次對於資源的請求,對於資源的操做,用戶持有的權限等,咱們都會對於當前狀況進行判斷, 並在表單中返回錯誤信息。
狀態碼 | 錯誤 | 返回錯誤信息 |
401 | 普通用戶帳戶信息認證失敗 | Invalid User |
401 | 社團用戶帳戶信息認證失敗 | Invalid club |
404 | 數據表中沒有該記錄 | NoRecord error |
404 | 建立記錄失敗 | New record failed |
404 | 更新記錄失敗 | update failed |
404 | 刪除記錄失敗 | destroy failed |
安所有分並無作到足夠細化,暫時只考慮了部分數據和過程的安全。主要是經過兩種方式實現。
一方面經過rails框架和HTTPS實現部分安全。
rails框架對於http請求會進行一個簡單的身份驗證,這個驗證是依託瀏覽器的,瀏覽器在請求中會自動嵌入一個token,rails在控制器中對於這個token進行驗證,實現一個簡單的身份驗證。
另外一方面經過代碼設計和存儲設計等實現。
關於用戶口令:
用戶口令在後端數據庫加上鹽值後經過MD5進行哈希以後再進行存儲,保證服務器被攻破後用戶口令不會泄露。
關於狀態認證:
用戶成功登錄後,後端服務器返回一段哈希值做爲token,哈希內容爲用戶帳戶信息以及隨機選擇的隨機數。後端保存隨機數。用戶進行驗證的時候,後端對帳戶信息和隨機數進行哈希後再比對,驗證用戶登陸狀態。