[知识路书]技术规格说明书

这是一篇课程博客

项目 内容
课程:北航-2020-春-软件工程 博客园班级博客
作业要求 技术规格说明书
我们在这个课程的目标是 提升团队管理及合作能力,实践软件工程开发
这个作业在哪个具体方面帮助我们实现目标 介绍团队项目【知识路书】,定义项目技术规格和相关特性

关于本组:【敏杰开发团队介绍】

关于选题:【知识路书项目介绍】

整体规划

前后端分离。

对前后端分离的介绍可以参考:这篇博客

考虑到项目体量和开发难度,我们选用的实际是上文中介绍的半分离模式

之所以不引入nodejs中间层将控制器前移,是因为可预见地,应用的业务逻辑并不复杂,后端提供一套restful api,加上少量定制的功能接口足以满足大部分的开发需求。同时队里的同学前端经验并不丰富,因此没有必要额外引入nodejs的学习成本。因此综合考虑,我们作出了这个选择。

在具体的技术方案上,前端我们选用vue.js为基础框架搭建spa,后端选用django并基于其插件扩展快速开发api。选用vue主要看中其易上手的特点,方便我们快速进入开发状态;选用django主要看中其大而全的设计,其自带的ORM、路由管理、用户系统等组件免去了我们学习多种第三方库的烦恼,并且django-rest-framework、django-jwt等插件也方便我们快速开发需要的接口。

如何体现抽象

  • 论文被抽象为一个包含作者、标题、摘要、发表时间等属性的数据聚合,而不使用具体的pdf文件表示一篇论文,这样可以方便地管理论文与pdf文件间的映射关系、论文与论文间的引用关系
  • 路书被抽象为素材结点集合及其上的连接关系,这样便于序列化;不同的素材都可以继承自素材父类(原型),不同的连接也继承自连接父类(原型),这样便于代码复用
  • 后端的django ORM组件提供数据模型及持久化的抽象

如何体现高内聚

  • 前端请求restful接口,只给出查询必需的参数而不需要/不允许传控制参数影响后端的查询逻辑,这样后端的接口实现细节对前端隐藏

如何体现低耦合

  • 前后端分离的设计本身就是低耦合的:数据、逻辑与呈现解耦
  • “抽象”一节中提到的论文数据模型实际上是将论文的元信息与具体pdf文件解耦,这样可以方便替换不同版本的pdf文件
  • 文献管理与路书绘制组件解耦,各种文献相关的素材允许复用,提升编辑效率

如何处理错误

由于我们使用View UI,其已经提供了一套模态框,因此我们可以在此基础上封装错误处理,根据错误种类在模块框中显示不同的错误信息

/**
 * 让VUE组件根据异常推出错误模态框
 * @param vc vue component
 * @param err
 */
export const pushErrModal = (vc, err) => {
  const options = getErrModalOptions(err) // 根据异常种类给出错误提示信息
  const errData = err.response ? err.response.data || err : err
  if (...) { // do anything you want
    ...
  } else {
    ...
  }
  vc.$Modal.error(options) // push modal
}

使用时只需要用try-catch捕获不同的异常并使用这个方法处理即可

我们考虑到不同的可能错误制定了内部错误码。目前暂时有如下类型:

Name | Code | Description

  •          | -    | -
    

Uncaught | - | 未能正确处理的错误
Debug | 0001 | 调试用错误
NotImplemented | 0010 | 未实现的方法或接口
RuntimeErr | 1000 | js运行时错误
Undefined | 1010 | 访问未定义对象
NetworkErr | 4000 | 无法分类的网络错误
NotFound | 4040 | 访问或查询不存在的资源
Unauthorized | 4010 | 未登陆或没有访问权限

后续我们会根据开发时遇到的需求补充

对开发环境与部署环境的假设

  • 前端开发环境统一使用yarn管理依赖包,需要预留本地3000端口用于运行测试;需要已配置好git及其他协作工具
  • 后端开发环境要求python版本为3.6或更高,需要使用venv或conda创建虚拟环境并安装requirements.txt中的依赖
  • 生产环境正确部署并配置nginx(用于静态资源分发)和uwsgi(用于代理django)。假设生产环境服务器核数、内存等配置合理

应对变化的灵活性

整体是符合开闭原则的。

  • 后端部分:对数据模型的修改直接创建并应用新的migration即可,在部署时只需要增量应用migrations即可保持向前更新;由于restful api根据模型和序列化器动态创建,因此这部分几乎不需要改动
  • 前端部分:基于vue component组织开发,面向组件的开发可以将每次修改的范围最小化
  • 前后端协调:数据请求过程是无状态的,结合前文介绍的高内聚、低耦合特点,前后端可以最大程度实现各自迭代互不干扰。对于新的接口需求,前端同学只需要将功能告知后端同学,后端同学根据需求增设接口并给出调用方法,再由前端接入即可

对大量数据的处理能力

考虑到我们预期的用户规模并不大(千级),后端逻辑简单且支持自行定制部署,因此项目的高并发需求并不强烈。对于正常的访问场景,mysql + nginx + uwsgi的部署策略对于一般的生产服务器已经够用。

假如出现更强烈的高并发需求,可以借助CDN分发静态资源(前端SPA),后端增加响应实例数量,并添加redis等中间件消峰。

posted @ 2020-04-08 13:50  敏杰开发  阅读(393)  评论(1编辑  收藏  举报