学历学籍系统-Web服务开发实验(REST API)
目录
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表
主要用于账号的注册和登录。
2.2.2 学生学历/学籍信息student_graduate表
包括学生的个人信息以及毕业时需要的学历证书编号、签名状态等, 用于生成、获取学生的个人信息,对其sign_status的改变则代表的学生毕业时的签名状态。
2.2.3 学生成绩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);}
接口测试:
前端调用:
这里我们在前端通过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)相关推荐
- 《大规模Web服务开发技术》
Web 服务开发的心灵鸡汤 周末去上海陪妹子的两天在路途上看完了这本<大规模 Web 服务开发技术>. <大规模 Web 服务开发技术>是日本的 Hetena 团队以夏天举办的 ...
- 自动匹配未认领订单编号_海量订单系统微服务开发:使用MongoDB支持海量数据...
海量订单系统微服务开发 订单系统是电商平台中一个非常重要的组成部分,而且它还是一个具有巨大流量和高并发访问的系统,与订单相关的服务涉及库存.支付.物流等.在设计订单系统时,我们选择使用支持海量数据的N ...
- Web前端开发实验作业 - 网页计算器
Web前端开发实验作业 - 网页计算器 项目已上传至GitHub 仅供学习交流 需要自取 不妨点个start 谢谢 https://github.com/zhenggengqiong/Computer ...
- 干净架构在 Web 服务开发中的实践
干净架构(The Clean Architecture)是 Bob 大叔在 2012 年的一篇博文 The Clean Architecture 中,提出的一种适用于复杂业务系统的软件架构方式.干净架 ...
- JAX-WS Web 服务开发调用和数据传输分析
一. 开发服务 新建maven的web项目就可以了, 1.新建一个web服务 2.服务名称定义 3.更改配置 4.默认建好的服务文件 5.增加一个add的服务 import javax.jws.Web ...
- 使用ASP.Net 3.5 的Ajax与Web服务开发实例
本文继续介绍使用ASP.NET3.5中的AJAX环境中如何从客户端JavaScript调用Web服务方法.编写本文的目的在于让大家深刻了解基于ASP.Net3.5的Ajax和Web的服务,虽然例子比较 ...
- python——Web服务开发(二)分布式缓存
上一篇博客写了flask模块实现web服务搭建的基本方法以及简单的缓存功能,但是这种缓存随着服务重启便会丢失,也无法满足多个服务共享缓存的需求,因此,我们通过redis来实现web服务的分布式缓存. ...
- 软件设计与体系结构第三次实验——web服务开发
目录 一.后端 二.前端 三.运行结果 概述:本次实验中我们选择使用实现REST API,在web上实现登录.签到以及查询签到结果的功能. 一.后端 本次实验在第二次实验(设计模式)的基础上进行了极大 ...
- 大规模web服务开发技能
2019独角兽企业重金招聘Python工程师标准>>> 第5课 大规模数据处理的难点 -- 内存和磁盘 单台Linux服务器瓶颈分析 1.查看平均负载 用top.uptime命令查看 ...
最新文章
- Linux - 收藏集 - 掘金
- jar包的生成和使用简单例子
- 利用pdf.js开发嵌入pdf显示,以及利用jquery-ui左右分栏显示
- java面试题28 牛客 下面有关java classloader说法错误的是?
- 线性代数的本质-B站视频
- Nginx防止恶意解析-禁止通过IP访问网站
- 遇到的bug及解决方法,持续更新
- 如何设置 iCloud 云盘?
- json转换map多层嵌套问题
- 树莓派版本及各种引脚
- 美国大学生数学建模竞赛获奖经验贴
- CCD 相机与CMOS 相机的区别在哪里?
- 多元统计分析及R语言建模(第四版)-----数据,包,资源
- 【总结】Android的16ms和垂直同步以及三重缓存
- Unity:DOTween来回运行或者缩放等LoopType.Yoyo
- 易迅网接入微信支付,为消费者提供购物体验
- k米评分容易得高分的歌_下线“交友陪玩”!全民K歌回应涉黄被罚:上月已完成整改,强化审核...
- 渗透测试工具:跨站脚本漏洞检测---Xsser
- 什么是.NETCore?
- XM5728_IDK_V3 基于AM5728 iperf千兆网络速率测试指南
热门文章
- excel删除重复的行
- 应用性能管理APM巅峰对决:skywalking P.K. Pinpoint
- 电脑c盘数据迁移的方法
- 公文管理系统案例展示
- Arnold渲染器适合什么样的电脑配置
- 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
- CBS paper防伪安全纸
- android获取手机短信记录,android 获取手机电话号码和短信内容
- 杀出重围3显卡测试软件,更多游戏实测-《战地5》实测-3D MARK跑分-配套软件-微星RTX 2060 Gaming Z 6G非公版显卡开箱上手体验_游戏硬件_游侠网...
- xy苹果助手未受信任_重要通知:苹果APP紧急修复!