软件设计文档 (SD)
注:在 2019 年春季学期中山大学系统分析与设计课程的大作业。按照本课程作业要求在 SD 文档开头点明。
1. Client
1.1 小程序端
mpvue ,webpack,vuex
1.1.1 技术选型及理由
小程序MPVUE框架
我们选择了小程序开发MPVUE框架,webpack,vuex作为众包系统的前端框架。
- 微信小程序框架提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,容易上手;
- MPVUE框架是一个使用 Vue.js 开发小程序的前端框架。框架基于
Vue.js
核心,mpvue
修改了Vue.js
的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套Vue.js
开发体验。 - 在视图层与逻辑层间提供了数据传输和事件系统,支持响应式、双向数据绑定等特性,可以让数据与视图非常简单地保持同步:当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新,因而能够很好地支持丰富的用户交互体验支持,可以让开发者方便的聚焦于数据与逻辑上;
- 框架还管理了整个小程序的页面路由,可以做到页面间的无缝切换,并给以页面完整的生命周期,开发者需要做的只是将页面的数据,方法,生命周期函数注册进框架中,其他的一切复杂的操作都交由框架处理;
- 4g网络和移动支付的普及推动了微信小程序作为点餐系统的应用发展,使用微信小程序作为点餐系统对用户更加快捷和便利。
- 使用vue开发小程序就可以使用丰富的vue组件,利用vue的设计思想,多个组件拼接成完整的小程序,大大简便了前端开发难度。
- 可以使用vuex进行全局状态管理,方便管理和利用小程序中的状态。
- 同时MPVUE是一个跨平台的前端框架,可以同时支持微信小程序,支付宝小程序,HTML5页面的开发,可以更加方便的对项目进行适配。同一份代码运行在不同的平台。
基于以上理由,选择小程序MPVUE框架作为前端框架对用户和开发者都十分友好。
1.1.2 架构设计
webpack+vue(vuex/vue-router)
- vue:一个类MVVM的渐进式JavaScript框架
- vuex:管理状态
- vue-router:单页应用前端路由
- webpack:项目构建打包
Vue
- 当下前端开发中的前沿技术框架,Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合;
- 另一方面,当与单文件组件和 Vue 生态系统支持的库结合使用时,Vue 也完全能够为复杂的单页应用程序提供驱动;
- Vue 支持组件化开发,其独特的 .vue 文件可以将组件的HTML/CSS/JS代码整合在一个文件中,有利于进行代码管理;
- Vue 也支持响应式、双向数据绑定等 MVVM 特性,能够很好地支持丰富的用户交互体验。
MPVUE框架
文件 | 作用 | |
---|---|---|
app.vue | 小程序页面的结构,页面样式,页面逻辑 | |
app.json | 小程序设置 | |
一个vue文件由3个部分组成,分别是:
文件 | 作用 | |
---|---|---|
html | 页面结构 | |
javascript | 页面逻辑 | |
css | 页面样式表 | |
MPVUE框架图如下:
vue-router
- vue-router 和 vuex 是官方提供的前端路由和数据状态管理的库,能够完美地结合 Vue 框架,实现前端路由和应用数据状态管理,代码结构清晰,程序复杂度降低。
webpack
- 当下前端最流行的构建打包工具,利用 webpack 搭配相应的 loader,可以在前端项目中使用 es6 进行开发,效率更高,开发完成后,webpack 还可以将代码编译到 es5 以兼容大部分浏览器;
- webpack 4优化了构建打包的算法,优化前端的模块加载,整合各个文件的代码、图片、字体、样式表等等,使得构建打包后的产品代码体积更小,也减少了这些资源在传输给用户时的时间损耗。
系统主要包括应用界面、业务逻辑和产品构建等开发内容,还应提供配置项用于构建项目打包时的目标路径及服务器地址等信息,同时还要进行单元测试与集成测试。根据需要,项目确定必须有以下四个包:
- build:提供开发环境和构建项目的代码
- config:项目的webpack打包配置
- src:项目的源代码,主要都在src中进行开发
- test:单元测试等系列测试代码
build
包根据config
中的配置调整webpack打包规则,将src
中的源码进行打包。另外,项目构建后,还会生成dist
包,为构建后的产品文件。
1.1.3 模块划分
根据业务逻辑和UI设计图,将众包系统前端分为4个主页面,按照小程序开发要求的文件结构,每个页面内包含js文件、vue文件,分别处理逻辑、配置、结构和样式;根据页面的划分,得到页面模块的细分:
4个页面模块包括:
- 授权登录,获取用户的信息
- 首页,用户查看推荐任务
- 任务, 查看当前用户参加,待完成,已完成,发布,完成中,结束的任务
- 创建,创建任务以及问卷
- 个人,显示个人信息,更改个人信息
此外还定义了三个复杂的组件,构成组件模块。 三个组件包括:
- 首页广告推荐的卡片,封装了卡片的样式结构以及交互事件
- 滑动框,自动滑动图片,使页面更美观
- 问卷显示系统组件,显示问卷内容,提供给发布者问卷统计的功能
- 问卷编辑系统组件,编辑问卷
加上小程序的全局文件,包括逻辑文件,配置文件,样式文件,构成app模块; 还有资源文件,包括图片,构成资源模块; 最后还有小程序的工具配置模块,和公共代码模块,各个模块关系如下:
最后前端点餐系统的结构如下:
├── project.config.json //开发工具配置
├─- package.json //npm 包依赖
├─- index.html //页面头
├─- build //设置文件夹
| ├── build.js
| ├── vue-loader.conf.js
| ├── webpack.base.conf.js
├─- config
| ├── dev.env.js
| ├── index.js
| ├── prod.env.js
├─- static
| ├── functions //云函数文件夹
| ├── images //图片文件夹
| ├── tabs //tab文件资源
| ├── weui //wechat 提供的资源
├── src //项目源文件
| ├── components //前端组件
| | ├── log //任务显示列表组件文件夹
| | ├── questionSub //问卷系统组件
| | ├── store.js //vuex
| ├── pages //小程序的页面文件存放文件夹
| | ├── index //首页
| | | ├── index.vue //页面结构,样式,逻辑
| | | ├── main.js //vue mount
| | ├── citySelect //地点选择页
| | | ├── index.vue //页面结构,样式,逻辑
| | | ├── main.js //vue mount
| | ├── community //任务发布页
| | | ├── checkQuestionnaire //查看问卷
| | | | ├── index.vue //页面结构,样式,逻辑
| | | | ├── main.js //vue mount
| | | ├── createQuestionnaire //创建问卷
| | | | ├── index.vue //页面结构,样式,逻辑
| | | | ├── main.js //vue mount
| | | ├── fillQuestionnaire //填写问卷
| | | | ├── index.vue //页面结构,样式,逻辑
| | | | ├── main.js //vue mount
| | | ├── taskDetails //任务详情
| | | | ├── index.vue //页面结构,样式,逻辑
| | | | ├── main.js //vue mount
| | | ├── index.vue //页面结构,样式,逻辑
| | | ├── main.js //vue mount
| | ├── logs //任务列表
| | | ├── index.vue //页面结构,样式,逻辑
| | | ├── main.js //vue mount
| | | ├── main.json //数据
| | ├── studylist //推荐任务列表
| | | ├── index.vue //页面结构,样式,逻辑
| | | ├── main.js //vue mount
| | ├── user //用户个人页
| | | ├── index.vue //页面结构,样式,逻辑
| | | ├── main.js //vue mount
| ├── utils //后端访问工具文件夹
| | ├── api.js //访问后端数据库api接口
| | ├── api.md //api接口的解释
| ├── app.json //项目全局设置,全局变量
| ├── App.vue //选择小程序平台
| ├── main.js //初始化云开发环境
└── README.md //项目的编译运行使用文档
1.1.4 软件设计技术
MVVM设计模式
MVVM的全称为Model-View-ViewModel,M表示Model,V表示视图View,VM表示数据与模型,当前端View变化时,由于View与VM进行了绑定,VM又与M进行交互,从而使M得到了改变;当M发生变化时,小程序检测到变化并通知VM,由于VM和V进行了绑定,因此V得到改变。
小程序的框架MPVUE内的设计思想就包含了MVVM,因此小程序内页面和组件模块都自动采用了MVVM设计模式。
综合考虑使用的技术框架,并根据应用需要的组件,可以得到详细的项目结构如下所示。如果过需要新增界面、功能,引入新组件,也可以很方便地将新内容添加到项目中去。
MVVM
在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。
ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
Vue.js 可以说是MVVM 架构的最佳实践,专注于 MVVM 中的 ViewModel,在整个项目中采用了MVVM的设计模式。
ObjectOriented Programming
面向对象的基本思想是使用类, 对象, 继承, 封装, 消息等基本概念进行程序设计。 面向对象方法的三个基本特征:
- 封装性:将对象的实现细节隐藏起来, 通过一些公共的接口方法来供外部调用对象的功能
- 继承性:是面向对象实现的的重要手段,子类继承父类, 子类直接获得父类的非private属性和方法
- 多态性:子类对象可以赋值给父类对象引用, 但运行的时候仍然表现出子类的行为特征,同一个类型的对象在执行同一个方法时, 可能表现出不同的特征
在项目中,对各对象、组件进行了封装,只留给外部接口,调用它的其他组件不用知道其内部的具体实现方式,每个组件拥有自己的方法与行为,在解决整个事务的某问题中行使具体职责。
2. Server
2.1 技术选型及理由
#### 比较小程序云开发与自建服务器开发
小程序云开发:
-
云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。
-
云开发包括三大主要内容:云函数,数据库,存储管理
-
云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写、一键上传部署即可运行后端代码。
-
云数据库是一个既可在小程序前端操作,也能在云函数中读写的 JSON 数据库
-
云存储是在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理的存储服务
-
优点:
-
微信登录逻辑简单
小程序云开发可以自动实现用户登录的校验,开发者无需再次校验用户身份,直接通过云函数的
event.userInfo.openId
即可获取到用户信息。直接调用数据库 、文件存储 API 时,也会自动关联到用户对应的 openId -
免费
目前小程序云开发提供了免费 1GB 的数据库存储和 免费 5 GB 的文件存储,这个存储量并不是很大,但是对于一些个人开发者来说,还是绰绰有余的,开发者可以使用这些容量来快速开发自己的小程序。
-
简单
小程序云开发的调用非常的简单,你只需要了解 JavaScript 和一些简单的异步的知识 (promise),就可以完成小程序云开发的内容。
-
无侵入
小程序云开发本身是在小程序的基础库层面的封装,你无需再引入其他库就可以使用。
同样的,你也可以在原有的应用程序中,将一部分功能迁移到小程序云开发中。
-
-
缺点:
-
异步请求需要通过 Promise 来处理
在云函数中,我们大多会实现一些在小程序中无法实现,或受域名限制的请求接口,这时我们不能使用传统的 Callback 方法来进行请求,因为传统的 callback 方法执行完成后,云函数早已将数据返回给客户端,我们需要使用 Promise 来处理。
-
权限结构比较简单 小程序云开发提供的数据库权限非常简单,仅有四种。
- 仅创建者可写,所有人可读:数据只有创建者可写、所有人可读;比如文章。
- 仅创建者可读写:数据只有创建者可读写,其他用户不可读写;比如用私密相册。
- 仅管理端可写,所有人可读:该数据只有管理端可写,所有人可读;如商品信息。
- 仅管理端可读写:该数据只有管理端可读写;如后台用的不暴露的数据。
-
数据库是非关系型数据库 对于某些程序来说关系型数据库比非关系型数据库查询数据快设计简单
- 数据保存在腾讯云 不能自己选择云服务提供商
-
自建服务器开发
- VPS 需要一个云虚拟机以及一个IP地址
- 需要自己配置数据库,写后端逻辑,定义访问路由
- 优点
- 自定义程度高,可以自己选择需要的数据库,定义访问路由的端口号
- 可选择性价比较高的云服务商
- 缺点
- vps 价格比较贵
- 后端数据库需要自己设计配置
- 访问微信用户信息需要验证
- 数据不安全,有被脱库的风险
在综合比较了云开发和自建服务器开发的便捷性和风险之后,我们选择了云开发。
2.2 架构设计
云数据库+云函数+云存储
- 云数据库:一个非关系型数据库,可以定义访问权限。数据持久化,保存用户信息,任务信息,问卷信息
- 云函数:在开发工具内编写、一键上传部署即可运行后端代码。 提供访问云数据库的接口,可以绕过云数据库访问权限
- 云存储:在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理的存储服务。保存小程序中的图片或文件,提供个小程序访问
2.4 软件设计技术
Structure Programming
这种设计方法的主要思路是将一个大问题分解为多个小问题进行解决,再针对每个小问题编写方法。总体上来说,是先构建一个主过程来启动程序流程,随后根据程序走向来调用相关的其他过程,这种程序设计思想被称为结构化编程。结构化编程乍一看是面向最终结果,实际上是完全针对运行过程进行编程,要求程序员具有清晰的,环环相扣的逻辑