项目 | 内容 |
---|---|
班级:2020春季计算机学院软件工程(罗杰 任健) | 博客园班级博客 |
做业:技术规格说明书 | 功能规格说明书 |
咱们所制做的产品是一款Android APP,一切开发基于Google的Android SDK进行制做。咱们使用Android Studio进行开发,开发语言为Java。前端
Android Studio基于IntelliJ IDEA,是Google为开发者提供的安卓开发工具,也是现在市面上使用最普遍的安卓开发IDE。在该软件的框架下开发,咱们能使用强大且方便的布局编辑器,拖拉UI控件而且进行效果预览。chrome
虽然咱们的目标用户是全部北航学生,也考虑到了很多北航同窗使用iOS系统,但因为人数和时间的限制,咱们暂无iOS前端的开发计划,力求尽快在安卓平台交付成品。若是Alpha版本的设计获得好评,咱们会考虑开发iOS前端。数据库
后端使用Django做为框架,MySQL做为数据库,基于Python语言实现。django
Django自己是一款先后端能够兼顾的框架,也可以作全栈开发,不过咱们只使用其后端的相关功能。Django具备基础的MVC设计模式,提供了大量的基础功能,可以知足咱们先后端交互的需求。咱们可能会考虑使用Django REST Framework做为后端的实现框架,体现RESTful开发。后端
数据库使用MySQL。MySQL数据库是咱们最熟悉也是使用人数较多的一款数据库,较为稳定,且相关技术较为成熟,和Django的相性也很好。设计模式
Django自带的SQLite数据库较为轻便,能够做为本地调试使用,但不适合部署在服务器上供应较多的人使用,性能可能会受限。api
目前因为安全缘由,学校并无向学生直接开放数据库的读取接口,咱们也没法用常规方式获取教务网站上的数据。可是咱们依然想要制做这样一款软件,因此不得已选取了爬虫来获取数据浏览器
因为北航教务的session验证较为复杂,且教务系统中有iframe
之类的较为复杂的结构,使用通常的爬虫框架较为困难,因此咱们选择简单易用的无头浏览器Selenium做为从学校获取数据的工具。缓存
咱们会控制爬取的频率和数据,也会保证不会进行越界操做,极大程度上保护用户的安全。安全
同时,数据库中的静态数据采用加密存储方式,解密密钥由用户生成,掌握在用户手中,使得开发人员没法经过简单的查询数据库的方式来获取到你们的统一认证帐户。
咱们暂定使用课程组提供的华为云资源,为1核1G的服务器。
考虑到实际状况,1核1G太少,未必可以知足咱们的需求,在爬虫进行较高频率的爬取时,可能会致使内存不足,以及服务器最重要的带宽多多少少会影响到咱们的响应速度。若是在实践过程当中发现不足,可能会考虑自费更换更高配置的服务器。
先后端的对接使用HTTPS请求来完成。同时,咱们的设计思路遵循RESTful原则,前端只须要调用接口便可得到数据,不须要思考内部细节。架构设计如图:
下面是暂定的接口规则,有待进一步细化。
# | 请求方法 | 请求路径 | 用途 |
---|---|---|---|
1 | POST |
/api/users/verify |
用户验证 |
2 | GET |
/api/users/timetable |
获取课表 |
3 | GET |
/api/users/score |
获取成绩 |
4 | GET |
/api/users/todolist |
获取课程中心ddl |
5 | GET |
/api/users/empty_rooms |
获取空教室 |
6 | GET |
/api/users/tests |
获取考试时间表 |
抽象
行为抽象
行为的抽象主要体如今前端与后端、后端与爬虫的交互上。咱们对实现特定功能的接口均进行了明确的定义,其中具体的操做不须要调用者去操心。
数据抽象
咱们将全部数据存在数据库中,数据库设计在models.py中,将每一个表封装成了对象,方便增删读写的操做。同时将结构的变更维护为迁移记录,方便往后的开发维护。
内聚/耦合/模块化
主要体如今后端的设计上。后端使用的Django框架自己支持较为方便的MVC模式,每一个不一样的功能能够设计进不一样的djangoapp,每一个djangoapp都有独立的方法进行管理,它们之间不会在数据和功能上相互影响。
前端APP也分为不一样的页面,其每一个页面有本身独立的功能,它们之间不会相互影响,每一个页面各司其职,完成它们本身的功能,这也是分工开发的必然。
信息隐藏和封装、界面和实现的分离
信息的隐藏封装,也是先后端分离架构的一大原则。咱们没有把全部的查询功能放在用户程序中去实现,而是经历用户-服务器-教务的过程,之间用尽量少的信息来进行交互隐藏,仅仅经过API交流,互相不暴露内部细节。
而用户手中的前端Android APP,自己就具备较好的封装性,解包和非法读取数据有必定的难度,也对信息的隐藏封装、界面和实现的分离有较好的帮助。
如何处理错误状况
做为一款Android APP,前端留给用户犯错的机会十分有限,若出现输入非法之类的简单错误,则会在前端检出,不会将请求发送给后端。
大多数错误会在后端被检出。一旦检出错误,或者后端内部的爬虫出现爬取错误,则会返回相应的HTTP Status Code,来判断发生了什么样的错误。前端将Code转译为文字,告诉用户具体发生的错误是什么,给予用户详细的操做指导。
程序模板对于运行环境、相关模板、输入输出参数有什么假设?这些假设和相关的人员验证过么?
前端的运行环境和模板基于Android平台,其上自己具备大量应用可供参考,且咱们的产品并无性能和网络需求,因此不会有太大的问题。
后端可能对于高并发爬虫处理存在着一些问题,主要是服务器资源占用过大,致使性能跟不上,若是后续实践中出现相关问题,咱们会当即更换云端环境。
先后端交互依赖HTTPS请求,其输入输出参数自己就有很严格的标准限制,且咱们有充分的错误处理设计,在交互上不会出现很大的问题。
应对变化的灵活性
灵活性创建在模块化和低耦合之上。咱们对先后端尽量的分离、后端尽量的模块化也是基于这一点。若是出现新的需求,或者教务网站出现意外状况,咱们能在修改尽量少的代码的状况下,完成咱们的工做,可以体现出高度的灵活性。
对大量数据的处理能力
后端对于大量来源于前端的请求处理能力,创建在Django框架的合理性和服务器自己的性能之上,这二者都已经在其余大型项目中获得过验证。而在接口设计方面,咱们已经尽量将API和数据传输内容进行简化,不会由于接口问题而致使处理出现难度。
爬虫对于来自于后端的大量命令处理多是一个难点。服务器自己的带宽和资源不支持多开chrome进行高并发查询,因此咱们的解决办法是尽可能减小爬取次数。可以经过缓存机制解决,可以肯定短期内不会变化的数据,咱们不会进行重复爬取,尽量减少服务器压力。