项目实现了类似于blackboard的可成管理系统,拥有公告,在线组队,在线浏览,布置作业等功能
- 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日
- 确保已经pull最新版gitignore
- 请将
genshin2.fun.jks放置在resource目录下(genshin2.fun.jks已放至qq群) - 请在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
- 现在,访问后端的端口变成了https://localhost:8443/
- 使用Google Chrome(或其他现代浏览器)访问localhost时,浏览器会弹出类似下图的安全警告,不用理会,部署到云上面就能够解决这个问题

- 将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
- 如果想要可视化的看到数据源中的信息,请在
IDEA或DataGrip中配置数据源- 要下载driver文件
- url为jdbc:redis://124.71.110.18:6379/0
- 密码请输入G4t!mP8#r2LqX0wV
- 不需要账户名
- 使用test connection尝试连接,确保可行
- 包名及其意义:
- config:装在一些配置类的文件,如CROS等
- controller:控制器,提供restful服务,将各种服务整合在流程中
- entities:实体,对应数据库中的表
- mapper:将实体映射到数据库的表中
- service:服务类,提供某种具体的服务
- util:效用类,包装一些可复用的代码块,如cookie的设置与检查等
- 响应体一定是ResponseResult类,请见
com.example.projecthelper.util.ResponseResult - ResponseResult中有状态码,请以该状态码为准
- 如果操作失败了,返回的ResponseResult的jwt_token为null。
- 如果发现你一直被导向login页面,你可以打开后端,然后进入/test,使用“start genshin”来获取一个用于test的token
-
/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" } -
/login POST
请求体
{ "key":"10", "value":"Aa@123456" }响应体
"statusCode": 200成功,401“认证失败”(用户名密码错误){ "statusCode": 200, "msg": "success", "jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiJudWxsIiwiZXhwIjoxNjk2OTQ1ODQxLCJpZGVudGl0eUNvZGUiOiIwIiwiaWF0IjoxNjk2OTQ0OTQxfQ.Ivu-LmaUnoEJ_tP0vWPnWBcg4w1dNrYliOOMyrZvO-ycXABDJGUxhxb30qyfGxihSjCZsA8rc_ZwnJFhBdvI1g" } -
/logout DELETE 请求体:任意 响应体:
{ "statusCode": 200, "msg": "登出成功" }前端要自行将header中的Token删掉已经使用redis完善了该功能 -
/tea/** 必须以教师身份访问,否则返回的响应体的"statusCode" = 402“权限不够”(比如说学生来发)
-
/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" } -
/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" } -
/stu/**必须以学生身份访问,identity为3, 否则权限不够
-
/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" } -
/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" } -
/tea/create_project POST
请求体:
{
"name": "CS309"
}name均不能为空
响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}- /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"
}- /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"
}- /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"
}- /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"
}- /stu/join_group POST 请求体:
1一个数字,表示groupId
响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}- /stu/leave_group DELETE 响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}- /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"
}- /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"
}- /stu/remove_ass DELETE 请求体:
1表示提交的Id
响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}- /tea/view_all_submitted_ass GET 请求体:
1表示作业的Id,根据作业的assignmentId查看所有的已经提交的作业
响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}- /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"
}- /stu/view_sub GET 请求体:
1表示提交的Id
响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}所有请求地址名字都暂定,后端可以为了统一修改请求地址
无请求体,仅携带jwt_token
响应体
{
"statusCode": 200,
"msg": "Success",
"data": {
"username": "123",
"userid": 12
},
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}用于添加一个todo的item
请求体:
{
"description": "Finish the homework"
}响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}用于删除一个todo list的item
无请求体
响应体
{
"statusCode": 200,
"msg": "Success",
"jwt_token": "eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJzdWIiOiIyIiwiZXhwIjoxNjk3Mjc3OTgzLCJpZGVudGl0eUNvZGUiOiIzIiwiaWF0IjoxNjk3Mjc0MzgzfQ.Awh6vlRDj3mPQs3T2OAcC5D-2JD7kGX9qBHtVdEohTo6Xnz_B_tMDbAFtTNP9DvF8E6XftkOi-UQ_D4H_NGHug"
}用于展示所有的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"
}
