Skip to content

WhatWEat/CS309-OOAD

Repository files navigation

CS309-OOAD-ProjectHelper

项目实现了类似于blackboard的可成管理系统,拥有公告,在线组队,在线浏览,布置作业等功能

效果图

电脑端 手机端

前端: vue+quasar

登录部分(黄硕):

  • login 用于登录,提供多种登录方式,短信/邮件/密码,在该页面中提供切换登录方式的选项
  • register 用于注册,界面风格要求与login保持一致,用户可以提供短信(可选),必须提供学号,名字和密码,学号需要检验是否符合南科大学号规范。 10月1日 完成

主要页面:

  • info 两个用途:1. 用于展示个人信息,至少需要展示名字,学号,权限组(学生/教师/助教等,可扩展),手机号(可选),允许修改除了学号和姓名外的所有信息
  • main 主页面,类似sakai的风格,提供各种project和个人信息的入口

组管理页面:

  • groups 展示所有的group列表,允许点击进入对应的group页面,教师允许编辑信息(划分小组,create multiple groups based on group size, deadline, number and other information.等,具体看project要求)。
  • group 展示group成员,技术栈及leader等信息,学生在该页面只允许浏览、加入和退出,教师允许编辑信息(分配组员,设置leader等,具体看project要求), 10月3日 至10月6日未完成

作业页面:

  • ass-list 展示所有作业,但是可以有分类,一个卡片下面是个人作业,一个卡片是下面是group work,支持点击去到ass-info,教师允许发布作业,教师支持查看布置的所有作业(设计ui的时候条例清晰)
  • ass-info 展示作业具体信息,允许在当前页面提交信息,支持在线浏览,在提交后支持修改,同时教师允许在该页面打分 (汤玉磊完成PDF版本)
    10月7日

打分页面:

  • grade 查看自己作业的分数,以及最终总分
  • grade-list教师支持查看各种分类的得分(按照个人,按照小组),排序也支持按照字母升序/降序,按照分数
    10月10日

后端:springboot+mybatis-plus+postgresql

https的配置

  1. 确保已经pull最新版gitignore
  2. 请将genshin2.fun.jks放置在resource目录下(genshin2.fun.jks已放至qq群)
  3. 请在application.properties中增加如下信息
    # https
    server.port=8443
    server.ssl.key-store-type=JKS
    server.ssl.key-store=classpath:genshin2.fun.jks
    server.ssl.key-store-password=9wbhq255k7
  4. 现在,访问后端的端口变成了https://localhost:8443/
  5. 使用Google Chrome(或其他现代浏览器)访问localhost时,浏览器会弹出类似下图的安全警告,不用理会,部署到云上面就能够解决这个问题 访问效果图

redis的配置

  1. 将application.properties中#redis改为如下信息:
    # redis
    spring.data.redis.host=www.genshin2.fun
    spring.data.redis.port=6379
    spring.cache.type=redis
    spring.data.redis.password=G4t!mP8#r2LqX0wV
  2. 如果想要可视化的看到数据源中的信息,请在IDEADataGrip中配置数据源
    • 要下载driver文件
    • url为jdbc:redis://124.71.110.18:6379/0
    • 密码请输入G4t!mP8#r2LqX0wV
    • 不需要账户名
    • 使用test connection尝试连接,确保可行

springboot:

  1. 包名及其意义:
    • config:装在一些配置类的文件,如CROS等
    • controller:控制器,提供restful服务,将各种服务整合在流程中
    • entities:实体,对应数据库中的表
    • mapper:将实体映射到数据库的表中
    • service:服务类,提供某种具体的服务
    • util:效用类,包装一些可复用的代码块,如cookie的设置与检查等

前端像后端端点访问需要注意的事情

  1. 响应体一定是ResponseResult类,请见com.example.projecthelper.util.ResponseResult
  2. ResponseResult中有状态码,请以该状态码为准
  3. 如果操作失败了,返回的ResponseResult的jwt_token为null。
  4. 如果发现你一直被导向login页面,你可以打开后端,然后进入/test,使用“start genshin”来获取一个用于test的token

后端已经完成基本测试的接口:

  1. /signup POST

    请求体

    {
       "identity":0,
       "password":"Aa@123456",
       "name":"Andy",
       "gender":"m"
    }

    响应体

    "statusCode": 200成功, 405密码太弱或身份不合法/"信息不完整"
    
    {
       "statusCode":200, 
       "msg":"",
       "jwt_token":"eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIxMCIsImV4cCI6MTY5Njk0NDg1MSwiaWRlbnRpdHlDb2RlIjoiMCIsImlhdCI6MTY5Njk0Mzk1MX0.A6hDRUi06U-EmpRHgVNajRubZQzfMDUcOyEr_EoUBN-GR7uHpDkdSyikrKw6TxyE2eEH57xaBAKyJ3oWVkcTqA"
    }
  2. /login POST

    请求体

    {
       "key":"10",
       "value":"Aa@123456"
    }

    响应体

    "statusCode": 200成功,401“认证失败”(用户名密码错误)
    
    {
        "statusCode": 200,
        "msg": "success",
        "jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiJudWxsIiwiZXhwIjoxNjk2OTQ1ODQxLCJpZGVudGl0eUNvZGUiOiIwIiwiaWF0IjoxNjk2OTQ0OTQxfQ.Ivu-LmaUnoEJ_tP0vWPnWBcg4w1dNrYliOOMyrZvO-ycXABDJGUxhxb30qyfGxihSjCZsA8rc_ZwnJFhBdvI1g"
    }
  3. /logout DELETE 请求体:任意 响应体:

    {
        "statusCode": 200,
        "msg": "登出成功"
    }

    前端要自行将header中的Token删掉已经使用redis完善了该功能

  4. /tea/** 必须以教师身份访问,否则返回的响应体的"statusCode" = 402“权限不够”(比如说学生来发)

  5. /tea/post_notice POST

    请求体:

    {
       "title":"t1",
       "content":"c1",
       "projectId": 1, 
       "stuView": [3, 4, 5, 6, 7]
    }

    响应体:

    "statusCode": 200成功,401“认证失败”(用户名密码错误),
    
    {
        "statusCode": 200,
        "msg": "success",
        "jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiJudWxsIiwiZXhwIjoxNjk2OTQ1ODQxLCJpZGVudGl0eUNvZGUiOiIwIiwiaWF0IjoxNjk2OTQ0OTQxfQ.Ivu-LmaUnoEJ_tP0vWPnWBcg4w1dNrYliOOMyrZvO-ycXABDJGUxhxb30qyfGxihSjCZsA8rc_ZwnJFhBdvI1g"
    }
  6. /tea/modify_notice PUT

    请求体:

    {
       "noticeId":1,
       "title":"t2",
       "content": "c2",
       "stuView": [3],
       "toAll": true
    }

    响应体:

    "statusCode": 200成功,401“认证失败”(用户名密码错误),405"无权修改别人发布的公告"
    
    {
        "statusCode": 200,
        "msg": "success",
        "jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiJudWxsIiwiZXhwIjoxNjk2OTQ1ODQxLCJpZGVudGl0eUNvZGUiOiIwIiwiaWF0IjoxNjk2OTQ0OTQxfQ.Ivu-LmaUnoEJ_tP0vWPnWBcg4w1dNrYliOOMyrZvO-ycXABDJGUxhxb30qyfGxihSjCZsA8rc_ZwnJFhBdvI1g"
    }
  7. /stu/**必须以学生身份访问,identity为3, 否则权限不够

  8. /stu/edit_person_info PUT

    请求体:

    {
     "phone": "123456",
     "mail": "usr@gmail.com",
     "name": "Alice",
     "gender": "f",
     "birthday": "2023-11-02",
     "technologyStack": "ts1",
     "programmingSkills": "ps1",
     "intendedTeammates": "it1"
    }

    name, gender不能为空 响应体

    {
    "statusCode": 200,
    "msg": "Success",
    "jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
    }
  9. /adm/create_multiple_users POST

    请求体:

    {
     "obj":{
         "identity": 3,
         "password": "Aa@123456",
         "name": "Andy",
         "gender": "m"
     },
     "count": 10
    }

    identity, password, name, gender, count均不能为空

    响应体

    {
    "statusCode": 200,
    "msg": "Success",
    "jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
    }
  10. /tea/create_project POST

请求体:

{
 "name": "CS309"
}

name均不能为空

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /tea/add_stu_to_Project POST

请求体:

{
 "key": 1,
 "value": [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
}  

key, value均不能为空

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /tea/create_group POST

请求体:

{
 "maxsize": 5,
 "groupName": "gp1",
 "projectId": 1,
 "instructorId": 1
}

maxsize, groupName, projectId, instructorId均不能为空

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /tea/create_multiple_groups POST

请求体:

{
 "obj": {
 "maxsize": 10,
 "groupName":"gp2",
 "projectId": 1,
 "instructorId": 1
 },
 "count": 10
}

maxsize, groupName, projectId, instructorId, count均不能为空

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /tea/modify_group_info PUT

请求体:

{
"maxsize": 500,
"groupName": "gp3",
"instructorId": 1,
"groupId": 4
}

maxsize, groupName, groupId, instructorId均不能为空

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /stu/join_group POST 请求体:
1

一个数字,表示groupId

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /stu/leave_group DELETE 响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /tea/post_assignment POST

请求体:

{
 "title": "ass1",
 "description": "write an essay",
 "projectId": 1,
 "fullMark": 100,
 "type": "g",
 "deadline": "2024-11-02T15:45:30"
}

title, description, projectId, fullMark, type, deadline均不能为空 type取值范围:g表示group,i表示individual

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /stu/submit_assignment POST 请求体:
{
 "assignmentId": 1,
 "text": "test111",
 "filepath": "file/121"
}

assignmentId不能为空,如果是错误的assignmentId会产生异常

如果之前提交过了,会自动覆盖旧的作业

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /stu/remove_ass DELETE 请求体:
1

表示提交的Id

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /tea/view_all_submitted_ass GET 请求体:
1

表示作业的Id,根据作业的assignmentId查看所有的已经提交的作业

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /tea/grade_ass POST 请求体:
{
 "grade": 88,
 "submitId": 1,
 "comment": "hello",
 "review": "review_test"
}

submitId不能为空

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
  1. /stu/view_sub GET 请求体:
1

表示提交的Id

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}

Controller接口

所有请求地址名字都暂定,后端可以为了统一修改请求地址

校验 (前端10.23提出)

get /getIden

无请求体,仅携带jwt_token

响应体

{
"statusCode": 200,
"msg": "Success",
"data": {
   "username": "123", 
   "userid": 12
}, 
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}

todo-list (前端10.24提出)

get /todo/add

用于添加一个todo的item

请求体:

{
"description": "Finish the homework"
}

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
get /todo/remove/{id}

用于删除一个todo list的item

无请求体

响应体

{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}
get /todo/list

用于展示所有的todo list

无请求体

响应体

{
"statusCode": 200,
"msg": "Success",
"data": [
   {"id": 1, "description": "finish math"},
   {"id": 2, "description": "finish science"}
],
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5