目录
2.2.2 学生学历/学籍信息student_graduate表
代码:第三次作业实验代码.zip-网页制作文档类资源-CSDN下载
1 项目简介
项目需求可以参考之前的博客,学历学籍管理系统-UML建模_m0_47308595的博客-CSDN博客
在具体实现中,为了减少数据冗余,我们将StudentDocument(学籍类)和StudentCertificate(证书类)合成为StudentGraduate类,通过属性signStatus区分,0为学校未为其签名,即可以当作StudentDocument(学籍类),为1时表示学校已签名,可以表示StudentCertificate(证书类),为2时表示学生也完成了签名。
这里我们主要完成了用户登陆与注册,成绩上传与获取,学籍学历信息的增删改查与验证。
同时我们在开发之余,自己用java搭建了一个小型的区块链数据结构,可以将完成双重签名的学历信息存储在区块链上,实现数据的不可篡改。
1.1 分工
阁承越:整体设计、开发(40%)
胡斐:文档撰写、部分开发(30%)
杨一帆:文档撰写、测试记录(30%)
2 开发环境
主体使用Springboot整合了Tomcat、Spring MVC、Spring、Mybatis-plus等,进行Web服务的开发。数据持久层使用MySql存储,并通过Mybatis-plus进行持久层与业务层的数据交互。同时,这里涉及了学校和学生的公私钥管理,这里我们以键值对的形式存储在redis上,方便快速的存取。
2.1 框架搭建
首先使用IDEA创建一个Spring工程,在pom.xml中已经自动引入Springboot的相关依赖,还需要我们自行引入mybatis-plus的依赖。
然后我们在application.properties中需要设置端口号,数据库的地址、用户名、密码,mybatis-plus的扫面范围等,具体如下:
server.port=8432
# MySQL config
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxxx:3306/ccb?serverTimezone=GMT%2B8
spring.datasource.username=xxxx
spring.datasource.password=xxxxx
# mybatis-plus config
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=com.example.ccb.entity
然后点击运行,该项目就已经启动了,可以对localhost:8432进行访问。在本次试验中,我们将项目部署在了服务器上,因此接口的统一访问形式是http://47.93.99.237:8432/xxx。
2.2 数据库建表(Resuorce)
这里我们主要建造了三个表,也代表了REST风格中的资源部分。
2.2.1 用户信息user表
主要用于账号的注册和登录。

2.2.2 学生学历/学籍信息student_graduate表
包括学生的个人信息以及毕业时需要的学历证书编号、签名状态等, 用于生成、获取学生的个人信息,对其sign_status的改变则代表的学生毕业时的签名状态。


2.2.3 学生成绩student_grade表
存储所有学生的成绩,用于获取学生的成绩。

3 接口总览
这里使用swagger自动生成了项目的接口文档。由于篇幅原因,这里重点对StudentGraduate的GET、POST、PUT、DELETE接口及其实现方式做重点介绍,其余则会通过前端演示的方式来简略介绍。
接口文档:

3.1 对StudentGraduate类的操作接口
对于StudentGraduate类的接口编写全部都包含在StudentGraduateController中,该类用@RequestMapping("/studentGraduate")修饰,表面访问该接口的统一形式是http://47.93.99.237:8432/studentGraduate。
3.1.1 查询入学/毕业信息(GET)
该接口的形式为"http://47.93.99.237:8432/studentGraduate",这里需要前端传入学历层次、学号、入学年份(如果不传入则显示全部的学历学籍信息),后台接受到前端传来的数据后,会使用mybatis-plus中封装的QueryWrapper类对数据库进行查找,最后以json字符串的形式返回,这里我们封装了BaseResult类用于返回请求的成功/异常。
@GetMapping("")
@ApiOperation("查询入学/毕业信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "education", value = "学历层次"),
@ApiImplicitParam(name = "studentNum", value = "学号"),
@ApiImplicitParam(name = "admission", value = "入学年份")
})
public BaseResult findStudentGraduate(@RequestParam(value = "education", required = false) String education,
@RequestParam(value = "studentNum", required = false) String studentNum,
@RequestParam(value = "admission", required = false) String admission) {
QueryWrapper<StudentGraduate> queryWrapper = new QueryWrapper<>();
if (education != null) {
queryWrapper.eq("education", education);
}
if (studentNum != null) {
queryWrapper.eq("student_num", studentNum);
}
if (admission != null) {
queryWrapper.eq("admission", admission);
}
List<StudentGraduate> list = studentGraduateService.list(queryWrapper);
return BaseResult.successWithData(list);
}
接口测试:

前端调用:
这里我们在前端通过javascript对于返回的数据进行处理,当signStatus为0时表示的是入学的学籍信息,当signStatus为1时表示是已经通过毕业审核且学校签名的学历信息,当signStatus为2时为学生已经确认的信息。
这里是的调取了入学年份为2018,学历层次为本科的所有学籍记录。
这里是在毕业确认时调取了入学年份为2018,学历层次为本科的所有学籍记录。
这里返回的是已经完成学校+学生双重签名的学籍记录 ,即只显示signStatus为2的学历信息。
3.1.2 入学信息录入(POST)
该接口的形式为"http://47.93.99.237:8432/studentGraduate",方式为POST,这里需要前端传入StudentGraduate类中所需要的数据,表单里的id和证书编号不用填,是因为id在mysql中设置的自增长,证书编号则在下面的处理中自动生成,然后我们调用了业务层的StudentGraduateService接口中的save方法(该方法extends自mybatis-plus的IService接口,用于做数据的插入),将一条数据插入数据库中,如果成功返回证书编号,否则返回错误代码。
@PostMapping("")
@ApiOperation("入学信息录入, 表单里的id和证书编号不用填")
public BaseResult addStudentGraduate(@RequestBody StudentGraduate studentGraduate) {
String certificateId = UUID.randomUUID().toString();
studentGraduate.setCertificateNum(certificateId);
if (studentGraduateService.save(studentGraduate)) {
return BaseResult.successWithData(certificateId);
} else {
return BaseResult.failWithErrorCode(ErrorCode.INNER_ERROR);
}
}
接口测试:
前端调用:
3.1.3 入学信息修改(PUT)
该接口的形式为"http://47.93.99.237:8432/studentGraduate",方式为PUT,通过传入的StudentGraduate信息中的id,在数据库里查找,只有在signStatus为0即学校未确认时才允许修改。
@PutMapping("")
@ApiOperation("修改录入的信息,修改入学录入信息和毕业录入信息都用该接口。学校未确认才允许修改")
public BaseResult updateStudentGraduate(@RequestBody StudentGraduate studentGraduate) {
//现根据id查db里的毕业信息
StudentGraduate dbInfo = studentGraduateService.getById(studentGraduate.getId());
if (dbInfo != null && dbInfo.getSignStatus() == SignStatus.UN_SIGN && studentGraduateService.updateById(studentGraduate)) {
return BaseResult.success();
} else {
return BaseResult.failWithErrorCode(ErrorCode.INSERT_FAILED);
}
}
接口测试:
前端调用:
在信息总览中,点击详情,即可进入修改界面,点击保存即可完成修改。
3.1.4 学籍信息删除(DELETE)
该接口的形式为"http://47.93.99.237:8432/studentGraduate/{graduateId}",方式为PUT,通过传入studentgraduate的id,指定删除哪一条信息,如果未找到或者该条记录已经经过双重签名(即已经是确定的学历信息),返回错误代码,否则返回成功信息。
@DeleteMapping("/{graduateId}")
@ApiOperation("入学信息删除,传入入学信息id")
public BaseResult deleteStudentGraduate(@PathVariable("graduateId") Integer graduateId) {
StudentGraduate graduateInfo = studentGraduateService.getById(graduateId);
if (graduateInfo == null || graduateInfo.getSignStatus() != SignStatus.UN_SIGN) {
return BaseResult.failWithErrorCode(ErrorCode.DELETE_FAILED);
}
if (studentGraduateService.removeById(graduateId)) {
return BaseResult.success();
} else {
return BaseResult.failWithErrorCode(ErrorCode.DELETE_FAILED);
}
}
接口测试:
前端调用:
点击撤销按钮,即可完成删除。
3.1.5 返回某一学生的所有学籍学历信息(GET)
该接口的形式为"http://47.93.99.237:8432/studentGraduate/graduateInfo/{identityNum}",方式为GET,即获取某一用户的所有学籍学历信息。
前端调用:
在学生端的界面,通过调用该接口,将signStatus为0的信息归类为我的学籍,signStatus为1或2的信息归为我的学历。
3.1.6 学校对毕业信息签名(GET)
该接口的形式为"http://47.93.99.237:8432/studentGraduate/student/{graduateId}",方式为GET,点击确认按钮后,将会在后台根据graduateId调取该生的学籍信息和成绩信息,如果有成绩挂科,则无法毕业,返回错误,如果可以毕业,则用学校的私钥进行签名,并将签名信息暂时保存在redis上,修改signStatus为1,返回成功代码。
前端调用:
3.1.7 学生对毕业信息签名(POST)
该接口的形式为"http://47.93.99.237:8432/studentGraduate/student",方式为POST,需要上传该条信息的ID和学生的身份证号,这里用POST是为了隐式传输数据,防止通过url暴露学生的身份证号,学生在确认信息无误后,点击待确认,即可完成对学历的签名。随后该条学历的信息在加密处理后,上传至我们自己搭的区块链,signStatus变为2。
3.1.8 企业核实学历(GET)
该接口的形式为"http://47.93.99.237:8432/studentGraduate/enterprise",方式为GET,需要传入学历证书编号,学校,身份证号,通过在redis中寻找对应学生、对应学校的公钥,来验证存储在区块链上的密文,若能得到返回值,说明该生确实毕业于该学习,可以进一步核实专业等信息。
3.2 对StudentGrade类的操作接口
这里所有的接口都写在StudentGradeController中。
3.2.1 上传成绩信息(POST)
接口调用形式为:"http://47.93.99.237:8432/studentGrade",方式为POST,输入studentGrade所有信息,即可上传。这里我们在前端没有做展示,因为考虑到我们是学历学籍管理系统,而不是教务系统,所以我们只暴露了一个上传成绩的接口,可以将成绩信息上传至我们的后台,供后续的调用。
@PostMapping("")
@ApiOperation("成绩录入, 表单里的id不用填")
public BaseResult addGrade(@RequestBody StudentGrade studentGrade) {
studentGradeService.save(studentGrade);
log.info("成绩录入成功");
return BaseResult.success();
}
3.2.1 获取成绩信息(GET)
接口调用形式为:"http://47.93.99.237:8432/studentGrade",方式为GET,输入学年、课程号、学号、学历层次(当输入为空时返回所有成绩信息),在后台通过mybatis-plus获取相对应的数据。
前端调用:
这里我们获取了张三本科期间的所有成绩。
3.3 对User类的操作接口
这里所有的接口都写在UserController中。
3.3.1 用户登陆(POST)
接口调用形式为:"http://47.93.99.237:8432/user/login",方式为POST,输入用户名和密码,在后台比对数据库中的信息,如果正确则可以进入,否则返回失败。
3.3.2 用户注册(POST)
接口调用形式为:"http://47.93.99.237:8432/user/register",方式为POST,输入用户名、身份证号、密码,完成注册。密码读取后,在后台进行md5摘要后再存入数据库。