一、预期开发计划时间安排
| 项目开发计划 |
最晚完成日期 |
完成情况 |
| 完成系统设计和数据库设计,确定前后端要使用的框架 |
2021-4-23 |
完成 |
| 学习框架,前端编写实现静态页面,后端实现对所有接口的数据处理逻辑 |
2021-4-30 |
未完成 |
| 前端完善页面的设计和调整改进,后端完成数据的测试以及安全性测试,前后端实现对接 |
2021-5-7 |
未完成 |
| 对每个功能完成测试,修复当前每个功能出现的bug |
2021-5-14 |
未完成 |
| 发布正式版本1.0,将项目部署到服务器上,撰写项目使用手册 |
2021-5-21 |
未完成 |
| 对整个开发过程进行总结,完善各个部分细节的工作 |
2021-5-28 |
未完成 |
二、预期开发计划分工安排
2.1 后端分工安排
| 姓名 |
任务分工 |
| 郑麟轩 |
搭建后端框架、发布框架学习任务、实现系统安全的保护,参与测试 |
| 吴涵 |
编码model模块、编写用户管理相关模块、实现角色权限管理 |
| 郑嘉晖 |
参与编码API、编码成绩管理模块、实现评分模块 |
| 张孝勇 |
编码model模块、测试系统功能、编写用户管理相关模块 |
| 洪世灿 |
参与编码API、测试系统功能、实现评分模块 |
2.2 前端分工安排
| 姓名 |
任务分工 |
| 丁宇凡 |
完成学生界面,用户登录界面的静态界面。完成登录、学生界面的数据交互 |
| 毛依婷 |
完成教师界面的静态界面以及数据交互 |
| 陈修庆 |
完成队长,评分等界面的静态界面和数据交互 |
| 廖其昌 |
完成管理员界面的静态界面和数据交互 |
三、体系结构设计
本系统使用MVC模式设计架构,进行前后端分离。视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,业务流程或者规则的改变只需要对前端代码进行改动即可。也可以很容易地改变应用程序的数据层和业务规则。
根据MVC模式,本系统主要可分为Model(模型),View(视图),Controller(控制器)三个层次。
(1)Model层
本层主要负责数据库的结构映射,数据库增删改查等直接对数据库进行操作的行为。向提供接口的方式允许其他层间接地访问数据库。
(2)View层
本层的分为前端与后端两个部分。前端负责Web界面的显示与逻辑。后端负责接收前端请求并根据前端请求返回前端所需的数据。
(3)Controller层
本层负责绝大多数的业务逻辑。在接收到前端请求的时候,对请求进行处理。处理业务逻辑过程中,通过Model层间接对数据库进行访问,并且通过View层将处理结果返回给前端,并在前端展示给用户。

四、功能模块层次图
4.1 功能模块层次设计思路
1. 超级管理员
超级管理员模块由登录、教师管理、密码重置组成。超级管理员模块主要负责危险数据的访问,如增加教师与密码重置。
2. 教师/助教
教师/助教模块由学生管理,班级管理,助教管理,作业管理,评分管理,成绩管理等组成。学生管理允许对学生进行导入,以及信息的修改。班级管理、助教管理负责对班级进行创建、增加助教等。作业管理、评分管理、成绩管理可以新建发布作业,对评审表进行评分,对个人成绩、团队成绩进行管理。
3. 学生/组员
普通组员模块主要功能是查看成绩,如个人成绩,团队成绩。
组长模块由团队管理,组员管理,绩效管理,评审表新建、评审表打分组成。
4.2 功能模块层次图展示

五、ER分析
5.1 ER设计思路
| 实体集 |
实体集属性 |
实体集意义 |
| User |
ID,UID,password,role,nickname |
用户 |
| Student_Class |
ID,student_id,class_id |
学生-班级 |
| Teacher_Class |
ID,class_id,teacher_id |
教师-班级 |
| Student_Team |
ID,teacher_id,team_id |
学生-团队 |
| Class |
ID,name |
班级 |
| Homework |
ID,class_id,type,content,end_time,start_time,title |
作业 |
| Scoring_Item |
ID,homework_id,description,optional,assistant_id,sequence,parent_item_id,note,score |
评分项 |
| Personal_Blog_Grade |
ID,scorekeeper_id,ID,grade,scoring_item_id |
个人博客成绩 |
| Team_Blog_Grade |
ID,grade,scorekeeper_id,scoring_item_id |
团队博客成绩 |
| Evaluation_Table |
ID,homework_id,team_id |
评审表 |
| Evaluation_item |
ID,evaluation_table_id,content,score,sequence,parent_item_id,suggest |
评审表项 |
| Evaluation_Item_Grade |
ID,UID,team_id,grade,scoring_item_id |
评审表项成绩 |
| Team |
ID,group_leader_id,class_id,name,number |
团队 |
| Partner |
ID,student1_id,student2_id |
结对 |
| Performance |
ID,student_id,percentage,homework_id |
绩效 |
| Job_Submission |
ID,submitter_id,homework_id,submit_status,filepath |
作业提交 |
| Role |
ID,type |
角色 |
| Permission |
ID,type |
权限 |
| Role_Permission |
ID,role_id,permission_id |
角色-权限 |
| 实体集1 |
实体集2 |
联系 |
联系类型(实体集1-实体集2) |
| Role |
Permission |
拥有 |
m-n |
| User |
Role |
拥有 |
n-1 |
| User |
Partner |
结对 |
m-n |
| User |
Performance |
获得 |
1-n |
| User |
Class |
属于 |
n-m |
| User |
Class |
管理 |
n-m |
| User |
Team |
属于 |
m-1 |
| User |
Personal_Blog_Grade |
得分 |
1-n |
| Team |
Team_Blog_Grade |
得分 |
1-n |
| Team_Blog_Grade |
Scoring_Item |
属于 |
1-n |
| Personal_Blog_Grade |
Scoring_Item |
属于 |
1-n |
| Class |
Homework |
属于 |
1-n |
| Homework |
Performance |
属于 |
1-n |
| Homework |
Evaluation_Table |
属于 |
1-n |
| Homework |
Job_Submission |
属于 |
1-n |
| Evaluation_Table |
Evaluation_Item |
属于 |
1-n |
| Evaluation_Item |
Evalustion_Item_Grade |
属于 |
1-n |
5.2 ER图展示

六、表结构设计

| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| UID |
VARCHAR |
9 |
|
是 |
是 |
用户名:学生学号或教师工号 |
| password |
VARCHAR |
16 |
|
是 |
|
加密密码 |
| nickname |
VARCHAR |
20 |
|
是 |
是 |
昵称 |
| role |
INT |
|
|
是 |
|
用户身份,外键,对应权限表的主键 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| student_id |
INT |
|
|
是 |
是 |
学生ID,外键,对应用户表的主键 |
| class_id |
INT |
|
|
是 |
|
班级号,外键,对应班级表的主键 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| teacher_id |
INT |
|
|
是 |
是 |
教师或助教ID,外键,对应用户表的主键 |
| class_id |
INT |
|
|
是 |
|
班级号,外键,对应班级表的主键 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| teacher_id |
INT |
|
|
是 |
是 |
学生ID,外键,对应用户表的主键 |
| team_id |
INT |
|
|
是 |
|
团队ID,外键,对应团队表的主键 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| name |
VARCHAR |
255 |
|
是 |
是 |
班级名 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| class_id |
INT |
|
|
是 |
|
班级ID,外键,对应班级表的主键 |
| type |
INT |
1 |
|
是 |
|
作业类型:个人作业0,结对作业1,团队作业2 |
| title |
VARCHAR |
255 |
|
是 |
|
作业标题 |
| content |
TEXT |
|
|
是 |
|
作业内容 |
| start_time |
DATE |
|
|
是 |
|
开始时间 |
| end_time |
DATE |
|
|
是 |
|
截止时间 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| homework_id |
INT |
|
|
是 |
|
作业ID,外键,对应作业表的主键 |
| description |
VARCHAR |
255 |
|
是 |
|
评分项的描述 |
| score |
INT |
|
|
是 |
|
评分项的分值 |
| optional |
INT |
1 |
|
是 |
|
是否选做:是1,否0 |
| note |
VARCHAR |
255 |
|
是 |
|
备注 |
| assistant_id |
INT |
|
|
是 |
|
助教ID,外键,对应用户表的主键 |
| parent_item_id |
INT |
|
|
是 |
|
父项ID,外键,对应评分项表的主键 |
| sequence |
INT |
|
|
是 |
|
同级排序,表示同一级表格项的顺序 |
- 8.个人博客成绩成绩Personal_Blog_Grade表
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| scoring_item_id |
INT |
|
|
是 |
|
评分项ID,外键,对应评分项表的主键 |
| scorekeeper_id |
INT |
|
|
是 |
|
得分者ID,外键,对应用户表的主键 |
| grade |
INT |
|
|
是 |
|
评分项得分 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| scoring_item_id |
INT |
|
|
是 |
|
评分项ID,外键,对应评分项表的主键 |
| scorekeeper_id |
INT |
|
|
是 |
|
得分者ID,外键,对应用户表的主键 |
| grade |
INT |
|
|
是 |
|
评分项得分 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| homework_id |
INT |
|
|
是 |
|
作业ID,外键,对应作业表的主键 |
| team_id |
INT |
|
|
是 |
|
团队ID,外键,对应团队表的主键 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| evaluation_table_id |
INT |
|
|
是 |
|
评审表ID,外键,对应评审表的主键 |
| content |
VARCHAR |
255 |
|
是 |
|
评审表项内容 |
| score |
INT |
|
|
是 |
|
评审表项的成绩 |
| suggest |
TEXT |
|
|
|
|
评审人所给建议 |
| parent_item_id |
INT |
|
|
是 |
|
父项ID,外键,对应评分项表的主键 |
| sequence |
INT |
|
|
是 |
|
同级排序,表示同一级表格项的顺序 |
- 12.评审表项成绩Evaluation_Item_Grade表
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| scoring_item_id |
INT |
|
|
是 |
|
评审表项ID,外键,对应评审表项表的主键 |
| team_id |
INT |
|
|
是 |
|
被评团队ID,外键,对应团队表的主键 |
| UID |
INT |
|
|
是 |
|
评分者ID,外键,对应用户表主键 |
| grade |
INT |
|
|
是 |
|
评审表项得分 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| number |
INT |
|
|
是 |
|
团队序列号 |
| name |
VARCHAR |
255 |
|
是 |
是 |
团队名 |
| group_leader_id |
INT |
|
|
是 |
|
组长ID,外键,对应用户表主键 |
| class_id |
INT |
|
|
是 |
|
班级号,外键,对应班级表的主键 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| student1_id |
INT |
|
|
是 |
|
结对学生ID,外键,对应用户表主键 |
| student2_id |
INT |
|
|
是 |
|
结对学生ID,外键,对应用户表主键 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| homework_id |
INT |
|
|
是 |
|
作业ID,外键,对应作业表的主键 |
| student_id |
INT |
|
|
是 |
|
学生ID,外键,对应用户表主键 |
| percentage |
INT |
|
|
是 |
|
绩效百分比 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| submitter_id |
INT |
|
|
是 |
|
提交者ID,学生或是团队ID |
| homework_id |
INT |
|
|
|
|
作业ID,外键,对应作业表的主键 |
| submit_status |
INT |
1 |
|
|
|
提交状态:补交2,按时提交1,未提交0 |
| filepath |
VARCHAR |
255 |
|
否 |
|
提交作业的路径 |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| type |
INT |
|
|
是 |
是 |
角色类型,需要Unique |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| type |
INT |
|
|
是 |
是 |
角色类型,需要Unique |
| 字段名 |
类型 |
长度 |
是否主键 |
是否非空 |
是否唯一 |
描述 |
| ID |
INT |
|
是 |
是 |
是 |
主键,自增长字段 |
| role_id |
INT |
|
|
是 |
|
角色ID,外键,对应角色表的主键 |
| permission_id |
INT |
|
|
是 |
|
权限ID,外键,对应权限表的主键 |
七、设计类图
7.1 设计类图展示

7.2 类图设计思路
1.用户需求
老师:
(1)添加助教;
(2)导入学生信息;
(3)创建班级;
(4)博客评分;
(5)评审团队;
(6)开始/结束结对组队;
(7)开始/结束团队创建;
(8)登录;
助教:
(1)批改作业;
(2)博客评分;
(3)创建作业;
(4)自定义评分细则;
(5)评审团队;
(6)开始/结束结对组队;
(7)开始/结束团队创建;
(8)登录;
组员:
(1)查看成绩;
(2)查看作业;
(3)结对组队;
(4)登录;
组长:
(1)查看成绩;
(2)查看作业;
(3)结对组队;
(4)组员管理;
(5)创建评审表;
(6)评审其他团队;
(7)填写绩效;
(8)登录;
超级管理员:
(1)用户管理;
(2)重置密码;
(3)PDF导入名称正则规则修改;
(4)登录;
2.类
用户类
教师
学生
班级类
团队类
结对类
绩效类
作业类
作业提交类
博客成绩类
评审表类
评审表项类
评分项类
评审表成绩类
八、系统安全
我们针对几种常见的Web攻击方式,制定了几种应对策略。
1. SRF(Cross-site request forgery)跨站请求伪造
我们通过设置SameSite Cookie属性为strict属性,使Cookie在任何情况下都不可能作为第三方Cookie,来避免CSRF攻击。
2.SQL注入
我们通过使用ORM框架,避免SQL语句直接进行字符串拼接,以避免SQL注入。
3. XSS(Cross Site Scripting)跨站脚本攻击
我们通过对特殊字符进行转义来避免XSS攻击。
九、权限设计
本系统使用基于角色的权限访问控制RBAC(Role-Based Access Control)方式进行权限控制。每个用户都对应以下的某个角色,每种角色拥有自己特定的权限。
| 用户 |
评审表评分 |
团队管理 |
学生管理 |
助教管理 |
老师管理 |
班级管理 |
创建评审表 |
重置密码 |
作业管理 |
成绩管理 |
| 组员 |
|
|
|
|
|
|
|
|
|
|
| 组长 |
√ |
√ |
|
|
|
|
√ |
|
|
√ |
| 老师 |
√ |
√ |
√ |
√ |
√ |
√ |
|
|
√ |
√ |
| 助教 |
√ |
√ |
√ |
√ |
√ |
√ |
|
|
√ |
√ |
| 超级管理员 |
|
√ |
√ |
√ |
√ |
√ |
|
√ |
|
√ |
十、问题回答&改进
Q1:个人单次作业成绩在总分中的占比是否能够体现?
A1:在第一版原型中确实无法体现,原型展示结束(4.13)后就开始了对原型的改进,在新版原型中的组员-成绩列表中不光可以显示每次作业的成绩,还可以显示该次作业在总分中的占比。包括在之后的实现中也会在相应页面显示分数和占比。

Q2:团队作业中成员的绩效如何体现?
A2:原来的想法是助教在进行批改团队作业的同时录入团队成员的绩效,后来经过商讨,在组长界面中增加了添加绩效表的功能按钮,可以让组长设置各次团队作业组员的绩效占比(总值100,每人1-100,如组长设置甲某绩效80,则甲某本次绩效占比80%),在团队作业评分结束后,系统会自动获取绩效占比,并计算每位同学的作业得分。

Q3:团队作业的答辩部分分为老师、助教和学生,这三部分得分按一定公式计算得到团队答辩分数,是否可以实现?
A3:可以,我们的系统划分了老师、助教和学生,其中组长、助教、老师都可以评审团队并提交评审表,系统获取角色身份和评审分计算出团队作业的答辩分数。

Q4:团队作业得分为博客得分和答辩得分按照一定计算公式计算得到,系统能否实现?
A4:可以,在原型中分别有个人作业和团队作业的成绩展示页面,在团队作业的展示页面中,显示了该次作业不同模块的得分情况,这些得分由系统获得后按公式计算得到最终得分。

十一、绩效
| 学号 |
工作内容 |
贡献度 |
| 郑麟轩 |
系统结构说明书,权限设计 |
14 |
| 毛依婷 |
审核原型,报告、博客 |
12 |
| 吴涵 |
数据库说明书、开发计划 |
14 |
| 张孝勇 |
数据库结构表、ER图、功能模块层次图、泳道图 |
13 |
| 陈修庆 |
原型设计 |
10 |
| 郑嘉晖 |
评审表,权限文档,接口文档,ER图 |
14 |
| 洪世灿 |
接口设计,ppt,数据流图 |
13 |
| 丁宇凡 |
原型设计 |
9 |
| 廖其昌 |
|
1 |
十二、链接合集
12.1 github团队仓库链接
github团队仓库链接
12.2 团队名称_系统设计说明书.pdf
系统设计说明书链接
12.3 团队名称_数据库设计说明书.pdf
数据库设计说明书链接
12.4 团队名称_系统设计和数据库设计答辩PPT.pdf
系统设计和数据库设计答辩PPT链接