开发环境 | 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,哈希内容为用户帐户信息以及随机选择的随机数。后端保存随机数。用户进行验证的时候,后端对帐户信息和随机数进行哈希后再比对,验证用户登陆状态。