后端技术规格说明书
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 | 普通用户注册 |
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 | 创建备注(报名) |
4.后端数据库设计
我们对于数据库的设计如下。同时对于每个表单,我们对于几个关键属性设置了索引表,为了便于查询。当数据库中有大量数据的时候,我们对数据库的操作并不会太慢。当数据达到一定程度的时候,我们也可以建立二级索引等。通过这些我们也可以支持对于大量数据的处理能力。
4.1 数据表
表名 | 属性名 | 类型 | 属性含义 |
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 | 表更新时间 |
4.2 E-R图概念模型
5.错误处理:
我们的错误处理主要通过两方面实现。
一方面通过rails自带框架实现。
rails自带框架中对于请求格式,请求内容等,以及一些错误情况有所判断和区分,对于一些错误rails框架会自主返回错误信息。在http表单的表头中会添上相应的错误码。
另一方面在代码中有所判断。
我们在代码中对于边界情况等有所判断。每次对于资源的请求,对于资源的操作,用户持有的权限等,我们都会对于当前情况进行判断, 并在表单中返回错误信息。
状态码 | 错误 | 返回错误信息 |
401 | 普通用户账户信息认证失败 | Invalid User |
401 | 社团用户账户信息认证失败 | Invalid club |
404 | 数据表中没有该记录 | NoRecord error |
404 | 创建记录失败 | New record failed |
404 | 更新记录失败 | update failed |
404 | 删除记录失败 | destroy failed |
6、安全:
安全部分并没有做到足够细化,暂时只考虑了部分数据和过程的安全。主要是通过两种方式实现。
一方面通过rails框架和HTTPS实现部分安全。
rails框架对于http请求会进行一个简单的身份验证,这个验证是依托浏览器的,浏览器在请求中会自动嵌入一个token,rails在控制器中对于这个token进行验证,实现一个简单的身份验证。
另一方面通过代码设计和存储设计等实现。
关于用户口令:
用户口令在后端数据库加上盐值后通过MD5进行哈希之后再进行存储,保证服务器被攻破后用户口令不会泄露。
关于状态认证:
用户成功登陆后,后端服务器返回一段哈希值作为token,哈希内容为用户账户信息以及随机选择的随机数。后端保存随机数。用户进行验证的时候,后端对账户信息和随机数进行哈希后再比对,验证用户登录状态。