[软软软]技术规格说明书

[软软软]技术规格说明书

项目 内容
这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建)
这个作业的要求在哪里 团队博客作业-技术规格说明书

产品描述:“妈妈再也不用担心我忘交作业了!”
产品功能介绍:功能规格说明书

概述

我们的学生资源整合与作业提醒平台将通过Web搭建服务,前端框架采用Vue.js,后端框架采用Django。由于是从零开始开发,所以我们将采用增量式开发的思路,先实现基本的需求,然后再通过增加新功能的方式进行迭代。

前端框架:Vue.js

目前网络上的前端框架有非常多的可选项,主流的前端框架有Angular,React,Vue等,相对于前两者,Vue更加年轻,同时也有许多支持我们选择的优点,如简单易学、轻量高效、文档丰富等等。Vue作为渐进式JS框架,可以很好地支持自底向上的增量开发,符合我们“敏捷”的原则。此外Vue的两大核心——数据驱动与视图组件化也是支持我们选择的重要原因,数据驱动大大简化视图更新的过程,减少工作量的同时也能够为用户提供更高效的交互,视图组件化使得页面能够划分为区块进行拼接或嵌套,也使我们的开发更加高效和规整。

后端框架:Django

市面上的后端框架也琳琅满目,如基于Java的Spring Boot,基于Ruby的Ruby on Rails,基于Python的Django、Flask等等。相比于Ruby和Java,python更容易上手,开发过程更敏捷高效。Django框架拥有健全的功能模块和文档教程,可以为我们提供比较完善的开发环境和开发过程中的疑难解答。

数据库:Sqlite3/MySql

MySql是市场上较为成熟的数据库,被许多网页和程序都使用,使用上来说无论是连接还是兼容性都表现出色。至于Sqlite3是Python(Django)原生支持的数据库,所以我们设想是否需要在前期先使用简单的方式进行实现,即使用Sqlite3,后期正式发布的时候进行数据库迁移,迁移到数据库服务器上,使用MySql。

部署:Nginx+uWSGI

最常见的部署代理,在后面会使用一篇博客专门介绍如何搭建。

产品设计

产品数据库存储设计

  1. User 用户表
    1. uid : primary key
    2. name
    3. email
    4. password : encrypted
    5. is_active : 账户激活
  2. Course 课程表
    1. cid 数据库自增
    2. name
    3. teacher
  3. UserCourse 用户选择的课程表
    1. user
    2. course
    3. isAdmin : 是否课程负责人
  4. Task 包括作业和自定义事项
    1. tid
    2. title
    3. course_name
    4. content
    5. platform
    6. category
      1. homework
      2. exam
      3. personal
      4. meeting
    7. urls
    8. ddl_time
    9. create_time
  5. Resource 课程资源表
    1. rid
    2. title
    3. url
    4. code
  6. UserTask 学生任务表
    1. user
    2. task
    3. isAdmin : 是否会议任务创建者
    4. is_finished : 是否完成任务
    5. notification_time
    6. notification_alert : 是否开启任务提醒
  7. CourseResource 课程资源表,由于不同老师的课程可能会有一样的资源
    1. course
    2. resource
  8. CourseTask 课程日程表,由于不同老师的课程可能会有一样的作业
    1. course
    2. task

抽象和模块化

Django 实现

Django是我们采用的后端框架。Django框架提供了对象关系映射器(ORM),使用它即可通过Python代码来实现数据库中对数据模型的各种操作,这些操作是面向对象的。具体来讲,Django将每一个数据库的每一个实体都封装成了一个类,类的属性即是实体的属性,还提供了不同的属性数据类型,如日期,字符等。此外,类的主码、外码等关系也可以在Django框架中定义。以Django的document中给出的demo为例:

from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

这段代码建立了两个数据库实体:Reporter和Article。分别以一个类实现,Reporter的属性有full_name,Article的属性有pub_date,headline,content,reporter。其中reporter是外码。注意到两个类中都实现了一个__str__方法,这个方法可以在查看类中的实体是设置显示的内容(而非"object")。

经过这样的抽象封装,可以直接通过调用类中的方法来实现数据的插删改查,并且如果数据库的结构之后有改动,可以直接通过Django的migration命令来更新,方便了数据库的维护。

信息封装和隐藏

Vue.js 实现

Vue是我们采用的前端框架,它的特点在于它可以像Python的包一样,去import其他的.vue文件。因此如果将核心的方法封装在一个.vue文件中,其他项目需要用到这些方法时直接通过import包的方式去调用这些方法,而不必知道这些方法的实现具体过程,这样就实现了方法内部的信息封装和隐藏。

前后端分离

RESTful API 实现

我们的项目还使用了RESTful框架,REST指的是一组架构约束条件和原则,它规定了一组资源的接口和URI规则。规定的接口包括GET、POST、PUT和DELETE这几个HTTP请求方法,并遵循这些方法的语义。

规定了这些方法之后,前端和后端就可以利用这些方法来实现请求和返回数据。后端在开发时,需要实现RESTful API的一些接口,以从后端数据库中按要求获取数据;而前端在向后端请求数据时,只需调用后端实现好的接口,即可获得返回结果,不需要也不关心后端的数据是如何存储、如何查询的。这种框架保证了前后端的分离,并且如果前端需要增加功能时,后端只需修改或增加相应的RESTful接口供前端调用即可,也保持了良好的可扩展性。

API一览 (维护中)

# Action url meaning others
1 post /api/activate/token?= 验证账户
2 post /api/modify 修改账户信息
3 post /api/register 注册账户数据
4 post /api/login 登陆账户
5 post /api/logout 登出账户
6 get /api/user/int:uid/info 获取账户信息
7 get /api/user/int:uid/update_course 更新课程中心信息
8 post /api/course/int:cid/user/int:uid/appoint 指定用户为课程负责人
9 get /api/user/int:uid/tasks 获取用户所有日程
10 post /api/user/int:uid/tasks/new 新建日程
11 get /api/user/int:uid/courses 获取当前用户的所有课程
11 get /api/user/int:uid/course/int:cid/tasks 获取当前用户的当前课程下所有课程
12 post /api/course/int:cid/tasks/new 新建课程下的新日程
13 post /api/user/int:uid/task/int:tid/alterTaskState 修改用户的某个日程
14 get /api/user/int:uid/course/int:cid/resources 获取当前用户的当前课程下所有资源
15 post /api/user/int:uid/course/int:cid/resources/new 新建当前课程下的资源

错误处理

可能的错误包括:

  1. 输入的信息不合法(如邮箱格式错误、学号重复等)

  2. 请求的后端数据不存在(如查询了一门不存在的课程id)

  3. 操作对象不存在(如访问了不存在的url)

其中,第1种错误属于前端的错误,在前端的vue.js框架中就提供了正则表达式的检验,可以直接检查并提示这种错误;

第2种错误属于需要前后端协同处理的,前端将用户的请求数据内容发送给后端,后端可以实现相应的接口检验数据的合法性,如果合法才能继续查询,否则返回错误代码;

第3种错误主要出现在后端,因为不存在的url需要到后端才能检查出,对于这种错误,可以返回一个错误代码或错误信息。

[End]

原文地址:https://www.cnblogs.com/UltraSoft/p/12660863.html