Dashboard for course assignment
整个设计文档分成两部分,为了方便检查把课程要求检查的技术选型理由、架构设计、模块划分、详细解释具体设计在源码中的体现 提前放在SD的最前几个小结。
可选的技术选型及其选择理由分析
前端框架
Vue
Vue是一套用于构建用户界面的渐进式框架,可以自底向上逐层应用。Vue容易上手,便于与第三方库整合(例如element-ui),另外Vue是中国开发的前端框架,官方文档全中文,便于学习使用,另外开发人员之前有学习过Vue,所以采用Vue来搭建前端是最合理的选择。
element-ui
element-ui是一个与Vue兼容的桌面端组件库,该组件库中包含众多网站开发中常用的控件,如下拉菜单,导航栏,进度条等等,官网上每个例子后面都有实现代码,方便易用,而且这些控件UI十分优美,可以极大地提高用户体验。
jQuery
jQuery的重要性不言而喻,控制页面组建的最方便的js包。在前端开发的过程中,将jQuery嵌入到了Vue中,加速了前端页面的开发。
可选的技术选型及其选择理由分析
所以我们后端框架选择的是nodejs作为大家开发的统一框架。
后台服务支持 没什么好说的,Nginx,傻瓜式操作。
但是还是因为效率负提升的考虑,最后还是选用了mysql作为数据库的技术栈。
架构是前后端分离,前端发放服务器和后端交互服务器分离,其中用restful-like api进行交互。用mysql作为持久化层。
前端的模式为mvc模式,其中使用到的外部支持库有编辑调查表的survey.js
架构的物理层架构,分别分成了前端用户的浏览器访问端,从静态服务器中获取前端文件,用restful的方式从api服务器去进行交互,其中涉及到持久层的交互由与mysql dbrs完成。
cnpm解决了国内某些依赖包使用npm无法安装或者安装过慢的问题。在安装cnpm之前,首先要确保安装了npm。
根据自己的操作系统,首先前往nodejs官网下载nodejs
然后点击安装,选择自己要安装的路径,此处我选择的是:D:\Program Files\nodejs,一路next,安装至完成。
window+R,输入cmd,打开命令提示符窗口,输入:npm -v 检测是否安装成功。
配置npm的全局模块的存放路径、cache的路径,此处我选择放在:D:\Program Files\nodejs
输入如下命令:
npm config set prefix "D:\Program Files\nodejs\node_global"
npm config set cache"D:\Program Files\nodejs\node_cache"
在系统环境变量添加NODE_PATH,输入路径为: D:\Program Files\nodejs\node_global 操作如下:我的电脑右击,打开属性->高级系统设置->环境变量->新建(系统变量下)->输入变量名NODE_PATH->变量值:输入上面路径,确定即可。
安装cnpm,输入以下命令:
npm install -g cnpm --registry=https://registry.npm.taobao.org
添加系统变量path的内容 。因为cnpm会被安装到D:\Program Files\nodejs\node_global下,而系统变量path并未包含该路径。在系统变量path下添加该路径即可正常使用cnpm。
输入cnpm-v检测是否安装成功。
https://github.com/whatsup-sysu/Backend
前端的划分主要体现在页面的划分上。前端根目录的src文件夹是需要自己编写的部分,里面记录了页面文件以及路由配置。为了便于管理,路由配置全部放到了index.js文件中。前端页面全部放到components文件下。前端的分工主要体现在页面的分工上,不用的人完成不用部分的页面。前端页面总共分为8个模块,分别为
这个7个模块用到的vue页面,js,css以及静态资源等全部独立地放到不同的文件夹中。
结构化编程:为了便于前端的分工,将前端需要实现的页面以及业务流程进行了划分,大致分为了8个模块,分别为创建任务(CreateTask),个人信息(Information),登录(Login),注册(Register),首页(MainPage),问卷系统(Survey),任务详细信息(包含接受任务流程),(TaskDetail),图片管理(Photo)。划分好模块之后编程变得更加容易。
前端模块源码链接:https://github.com/whatsup-sysu/Frontend/tree/master/whatsup/src/components
回调函数,使用回调函数异步地向后端发送请求,支持了并发访问,优化用户体验。
//例子:首页在创建的时候需要向后端清楚数据,将目前正在发布中的任务数据保存到前端寄存器,便于任务的显示
//以及对任务的各种操作。请求数据采用异步请求使用回调函数来进行实现。
created: function() {
this.uid = this.$route.query.uid
if(this.uid==null){
this.uid=$("#username").text();
}
if(this.id==null){
this.uid = this.$cookies.get('id')
}
//如果当前没有任务数据的话就异步地向后端请求数据
if(this.nowduty==null){
var _self = this;
//采用ajax的方式异步请求
$.ajax({
type: 'GET',
url: '/api/duties/screen?pageNumber=1&countPerPage=7&sortType=time&sortOrder=ascend',
dataType: 'json',
timeout: 3000,
success: function(result, xhr) {
//成功请求数据之后的回调函数,解析并保存得到的数据
console.log(result)
_self.nowduty = result['content']
_self.nowpage = 1
_self.nowdutynum = result['count']
if(_self.nowdutynum<7){
for(var i=_self.nowdutynum;i<7;i++){
_self.nowduty.push(0);
}
}
//根据得到的数据动态修改页面内容
for(var i=0;i<7;i++){
if(_self.nowduty[i]!=0){
var content="#dcontent"+(i+1).toString();
$(content).text(_self.nowduty[i].dintroduction);
var type = "#dtype"+(i+1).toString();
$(type).text(_self.nowduty[i].dtype);
var title = "#dtitle"+(i+1).toString();
$(title).text(_self.nowduty[i].dtitle);
var sponsor = "#dsponsor"+(i+1).toString();
$(sponsor).text(_self.nowduty[i].dsponsor);
var modifyTime = "#dmodifyTime"+(i+1).toString();
$(modifyTime).text(_self.nowduty[i].dmodifyTime);
var curaccepters = "#dcuraccepters"+(i+1).toString();
$(curaccepters).text(_self.nowduty[i].curaccepters);
} else {
//alert("hidden");
var id="#u128-"+(i+1).toString();
$(id).css("visibility","hidden");
}
}
},
//请求数据失败之后的回调函数,提示出错,输出错误信息。
error: function(result, xhr) {
console.log(result)
alert('服务器连接错误: ' + xhr)
}
})
}
}
后端架构设计技术:
Service Oriented Architecture
首先后端是按照面向服务的体系结构开发的,它按照一个基于RESTFUL风格标准定义的API接口文档。服务是最核心的抽象手段,业务被划分为一系列粗粒度的业务服务和业务流程。
架构开发思想主要体现在API文档,之后的接口发开都是基于接口文档的标准进行。
Object-Oriented Programming
后端在路由分级后按照业务类型抽象了几个处理不同类型业务的对象类型,如userSystem、dutySystem、tradeSystem等等。这些对象封装了相关的业务逻辑方法。抽象的对象列表相关代码主要在控制器目录中。

第一版设计思路主要如下
整个web页面在设计视觉效果上可以有大概一下四个不同的页面:
主页面
用走马灯的形式展示最热的活动功能,用卡片的形式展示全部活动,用导航栏的形式链接各个页面和各个功能。

活动详情页
用左右页面设计的形式,区别活动详情和发起者信息。

个人页面
个人页面采用和普通社交网络的设计风格,用上下式的,上部分展示个人基本信息,下部分展示与其有关的全部活动。

创建活动或调查页面
这部分和一般的调查问卷的页面类似,不过结合需求,暂时使用固定题型的形式发布和创建。

根据上一版本的思考之后,为了解决填写问卷的时候能增加用户需要的提醒,所以需要对活动发布的页面进行改进。同时为了让个人页面和活动详情页能在整体上风格更加的一致,所以将个人页面的布局从上下分割改成了左右分割。
将原来发布活动的页面从简陋的固定题型发布改成了可以选择题型的形式,让这个页面中的功能更能适应比较多的活动需求

为了让个人页面和活动详情页面能有比较统一的风格,在这版里面稍微的改动了一下个人页面的布局,将上下界面划分这种方法改成了左右划分。

这里包含了系统基础框架所需的完整数据库设计。

我们并没有对于权限进行设计,而是直接把用户和发布人的功能进行不同的划分,能够调用的api不同,而不是相同的api所能执行的功能因为权限不同而产生不同的效果。
采用了前后端分离的api设计,因为api太多所以只列了作为样例的几个。
POST /user
由于需要上传文件,要求使用multipart/form-data提交请求。
| 参数名 | 数据类型 | 描述 | 必需 |
|---|---|---|---|
| string | 注册邮箱 | 是 | |
| password | string | 密码 | 是 |
| name | string | 用户名 | 是 |
| license(optional) | file(docx、doc、pdf) | 组织证明 | 是 |
| HTTP状态码 | 返回格式 | 描述 |
|---|---|---|
| 200 | NULL | 成功 |
| 400 | {message: ‘reason’} | 错误的请求 |
const form = new FormData();
form.append('email', info.email);
form.append('name', info.name);
form.append('password', info.password);
form.append('license', info.license, 'a.docx');
axios.post('/restaurant', form, {
headers: form.getHeaders()
});
POST /customer/session
调用此API后,如果用户没有注册,则会自动注册并登录;如果用户已经注册,则完成登录。
| 参数名 | 数据类型 | 描述 | 必须 |
|---|---|---|---|
| code | string | 登录凭证 | 是 |
| HTTP状态码 | 返回格式 | 描述 |
|---|---|---|
| 200 | NULL | 成功 |
| 400 | {message: ‘reason’} | 错误的请求 |
[前端api文档](https://documenter.getpostman.com/view/7355822/S1TVXyAV?version=latest#f651b449-dbaa-4758-bab2-cdf4b1acf71b)
[后端api文档](https://documenter.getpostman.com/view/7355822/S1TZzbyN?version=latest)
附文件《后端API测试报告》
总用例框图
一共分为两个用例,一个是发布和接受任务,一个是登陆和注册。
BCE模式下的ssd如下
状态图如下
BCE模式下的ssd如下
状态图如下
用户的注册登陆
发布人的注册登陆