目录

1 项目简介

1.1 分工

2 开发环境

2.1 框架搭建

2.2 数据库建表(Resuorce)

2.2.1 用户信息user表

2.2.2 学生学历/学籍信息student_graduate表

2.2.3 学生成绩student_grade表

3 接口总览

3.1 对StudentGraduate类的操作接口

3.1.1 查询入学/毕业信息(GET)

3.1.2 入学信息录入(POST)

3.1.3 入学信息修改(PUT)

3.1.4 学籍信息删除(DELETE)

3.1.5 返回某一学生的所有学籍学历信息(GET)

3.1.6 学校对毕业信息签名(GET)

3.1.7 学生对毕业信息签名(POST)

3.1.8 企业核实学历(GET)

3.2 对StudentGrade类的操作接口

3.2.1 上传成绩信息(POST)

3.2.1 获取成绩信息(GET)

3.3 对User类的操作接口

3.3.1 用户登陆(POST)

3.3.2 用户注册(POST)

代码:第三次作业实验代码.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表

主要用于账号的注册和登录。

user表

2.2.2 学生学历/学籍信息student_graduate表

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

student_graduate表

student_graduate表的属性

2.2.3 学生成绩student_grade表

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

student_grade表

3 接口总览

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

接口文档:

Swagger UI

接口总览

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);}

接口测试:

查询入学/毕业信息(GET)接口测试

前端调用:

这里我们在前端通过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摘要后再存入数据库。

学历学籍系统-Web服务开发实验(REST API)相关推荐

  1. 《大规模Web服务开发技术》

    Web 服务开发的心灵鸡汤 周末去上海陪妹子的两天在路途上看完了这本<大规模 Web 服务开发技术>. <大规模 Web 服务开发技术>是日本的 Hetena 团队以夏天举办的 ...

  2. 自动匹配未认领订单编号_海量订单系统微服务开发:使用MongoDB支持海量数据...

    海量订单系统微服务开发 订单系统是电商平台中一个非常重要的组成部分,而且它还是一个具有巨大流量和高并发访问的系统,与订单相关的服务涉及库存.支付.物流等.在设计订单系统时,我们选择使用支持海量数据的N ...

  3. Web前端开发实验作业 - 网页计算器

    Web前端开发实验作业 - 网页计算器 项目已上传至GitHub 仅供学习交流 需要自取 不妨点个start 谢谢 https://github.com/zhenggengqiong/Computer ...

  4. 干净架构在 Web 服务开发中的实践

    干净架构(The Clean Architecture)是 Bob 大叔在 2012 年的一篇博文 The Clean Architecture 中,提出的一种适用于复杂业务系统的软件架构方式.干净架 ...

  5. JAX-WS Web 服务开发调用和数据传输分析

    一. 开发服务 新建maven的web项目就可以了, 1.新建一个web服务 2.服务名称定义 3.更改配置 4.默认建好的服务文件 5.增加一个add的服务 import javax.jws.Web ...

  6. 使用ASP.Net 3.5 的Ajax与Web服务开发实例

    本文继续介绍使用ASP.NET3.5中的AJAX环境中如何从客户端JavaScript调用Web服务方法.编写本文的目的在于让大家深刻了解基于ASP.Net3.5的Ajax和Web的服务,虽然例子比较 ...

  7. python——Web服务开发(二)分布式缓存

    上一篇博客写了flask模块实现web服务搭建的基本方法以及简单的缓存功能,但是这种缓存随着服务重启便会丢失,也无法满足多个服务共享缓存的需求,因此,我们通过redis来实现web服务的分布式缓存. ...

  8. 软件设计与体系结构第三次实验——web服务开发

    目录 一.后端 二.前端 三.运行结果 概述:本次实验中我们选择使用实现REST API,在web上实现登录.签到以及查询签到结果的功能. 一.后端 本次实验在第二次实验(设计模式)的基础上进行了极大 ...

  9. 大规模web服务开发技能

    2019独角兽企业重金招聘Python工程师标准>>> 第5课 大规模数据处理的难点 -- 内存和磁盘 单台Linux服务器瓶颈分析 1.查看平均负载 用top.uptime命令查看 ...

最新文章

  1. Linux - 收藏集 - 掘金
  2. jar包的生成和使用简单例子
  3. 利用pdf.js开发嵌入pdf显示,以及利用jquery-ui左右分栏显示
  4. java面试题28 牛客 下面有关java classloader说法错误的是?
  5. 线性代数的本质-B站视频
  6. Nginx防止恶意解析-禁止通过IP访问网站
  7. 遇到的bug及解决方法,持续更新
  8. 如何设置 iCloud 云盘?
  9. json转换map多层嵌套问题
  10. 树莓派版本及各种引脚
  11. 美国大学生数学建模竞赛获奖经验贴
  12. CCD 相机与CMOS 相机的区别在哪里?
  13. 多元统计分析及R语言建模(第四版)-----数据,包,资源
  14. 【总结】Android的16ms和垂直同步以及三重缓存
  15. Unity:DOTween来回运行或者缩放等LoopType.Yoyo
  16. 易迅网接入微信支付,为消费者提供购物体验
  17. k米评分容易得高分的歌_下线“交友陪玩”!全民K歌回应涉黄被罚:上月已完成整改,强化审核...
  18. 渗透测试工具:跨站脚本漏洞检测---Xsser
  19. 什么是.NETCore?
  20. XM5728_IDK_V3 基于AM5728 iperf千兆网络速率测试指南

热门文章

  1. excel删除重复的行
  2. 应用性能管理APM巅峰对决:skywalking P.K. Pinpoint
  3. 电脑c盘数据迁移的方法
  4. 公文管理系统案例展示
  5. Arnold渲染器适合什么样的电脑配置
  6. 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
  7. CBS paper防伪安全纸
  8. android获取手机短信记录,android 获取手机电话号码和短信内容
  9. 杀出重围3显卡测试软件,更多游戏实测-《战地5》实测-3D MARK跑分-配套软件-微星RTX 2060 Gaming Z 6G非公版显卡开箱上手体验_游戏硬件_游侠网...
  10. xy苹果助手未受信任_重要通知:苹果APP紧急修复!