技术规格说明书
1、前端框架
小程序是现在比较热门的一种移动端应用形式,跨平台且用户使用十分便利。为此我们选择将我们的应用开发在小程序上。小程序的前端框架我们选择了腾讯的wepy前端框架,该框架支持 npm 包,支持 css 预处理器,而且组件美观且有完整的指导文档,便于我们学习以及完成我们的开发任务。
2、后端框架
关于后端框架的选择,我们调研了基于python 的Django,Flask 框架,以及基于php 的ThinkPHP,基于java的JSP。最终我们选择了基于python语言的Django框架。愿意如下:
- Django封装较好,学习成本较低,并且功能齐全。我们组开发后端的人员中有的同学完全没有相关的开发经验,选择Django有助于他们快速上手,并完成我们的开发任务。
- 具有较强的数据库访问组件。我们可以方便的对数据库进行操作即使没有SQL语言的基础。
- admin interface. Django 拥有一个完整的后台管理界面。可视化界面简化了我们对后台数据的管理。
- Django 目前的文档已经相当完善,也易于我们学习。
3、前端技术
作为手机APP,页面是用户直接接触到的主要部分,也是前端的主要部分。合理的页面布局设计与页面跳转关系是确保用户体验的必要条件。
页面转换关系
页面的转换关系如下图,其中,矩形框表示具体页面,连线表示页面的跳转,线上文字表示触发跳转的用户动作。用户按下返回按键时,返回当前页面的上一级页面。当前页面上一级有多个页面时,由哪个页面进入当前页面,则返回哪个页面。
页面布局设计
页面布局设计在功能规格说明书中有详细示意图,此处不再重复。设计的主要原则是尽量清晰简明的将该页面中的主要信息传达给用户。
4、数据库结构规格
- 数据库中需要存储用户数据、用户个人信息、帖子、申请4个实体,实体之间存在联系,实体也包含属性。联系、属性如下图所示:
5、接口规范
前端
- 欢迎和登陆页面
/index
- 注册页面
/register
- 帖子总览页面
/f
- 帖子详情
/p/<post_id>
- 帖子收到的申请
/p/<post_id>/apply
- 我的帖子
/my/<ID>/post
- 我的申请
/my/<ID>/apply
- 发布帖子
c/post
后端
post 请求
/login
-
parameter
{ "account":"string", // 唯一,英文字母和数字,长度不超过14,以英文开头 "password":"string" // 数字大小写字母,标点符号,8~14个字符 }
-
return
{ "ret":"bool", //是否登录成功 "ID":"string" // 用户的唯一ID }
/register
-
parameter
{ "account":"string", // 唯一,英文字母和数字,长度不超过14,以英文开头 "password":"string", // 数字大小写字母,标点符号,8~14个字符 "name":"string", //真实姓名 "age":"int", "studentID":"string", "sex":"string", "major":"string", "grade":"string" }
-
return
{ "ret":"bool", //是否注册成功 "ID":"string" // 用户的唯一ID }
c/post
-
parameter
{ "title":"string", "postDetail":"string", "requestNum":"int", "ddl":"datetime", //YYYY-MM-DD "posterID":"string", }
-
return
{ "ret":"bool", //是否发布成功 "postID":"string" // 帖子ID }
get请求
/f
-
return
[ { "title":"string", "postDetail":"string", "requestNum":"int", "acceptedNum":"int", "ddl":"datetime", //YYYY-MM-DD "ifEnd":"bool", "postID":"string", "posterID":"string", }, ... ]
/p/<post_id>
-
return
{ "title":"string", "postDetail":"string", "requestNum":"int", "acceptedNum":"int", "ddl":"datetime", //YYYY-MM-DD "ifEnd":"bool", "postID":"string", "posterID":"string", }
/p/<post_id>/apply
-
return
[ { "applyID":"string", "resume":"file", "applyStatus":"string", //接受,待定,结束 "applicantID":"string", }, ... ]
/my/<ID>/post
-
return
[ { "title":"string", "postDetail":"string", "requestNum":"int", "acceptedNum":"int", "ddl":"datetime", //YYYY-MM-DD "ifEnd":"bool", "postID":"string", "posterID":"string", }, ... ]
/my/<ID>/apply
-
return
[ { "applyID":"string", "resume":"file", "applyStatus":"string", //接受,待定,结束 "applicantID":"string", }, ... ]
6、错误处理
我们定义错误处理类,对错误进行分类汇总,集中处理,目前暂时分为如下几大类,具体的细化会在开发的时候逐渐扩充。
- InvalidInputError: 处理不合理的输入,比如用户名,密码中的不合理的字符以及发布需求的时候,填入不合法的人数,截至日期等等。
- DataOverflowError: 防止用户输入大量的数据导致程序崩溃,限制用户的输入的长度并且抛出异常。
- FrequentRefreshError: 用户如果过于频发刷新,抛出异常并在一定时间内禁止刷新,防止app崩溃
7、应对变化的灵活性
我们将功能抽象成独立的接口,前端UI操作与后端响应函数与数据管理十分独立,程序每个页面之间的实现也互相独立,程序具有良好的扩展性以及应对变化的能力。
8、抗压能力
拥有较好的异常处理机制防止程序崩溃,对于模拟大量用户同时操作的压力测试目前还没有做。