输入用户账户和密码,验证码,然后进行登录校验,通过登录校验后,跳转至首页功能。
与此同时,该系统所有用户都必须登录后才能跳转到后台首页,所以,登录功能在全局系统控制器的代码中实现。
验证码的前端请求
请求的是后端方法getVerifiCodeImage,该方法中,先获取请求和响应的参数,获取从工具类中创建的图片,获取图片上的验证码文本,将验证码图片响应给浏览器。
@ApiOperation("获取验证码方法")
@GetMapping("/getVerifiCodeImage")
public void getVerifiCodeImage(
@ApiParam("请求") HttpServletRequest request,
@ApiParam("响应") HttpServletResponse response){
//获取图片
BufferedImage verifiCodeImage= CreateVerifiCodeImage.getVerifiCodeImage();
//获取图片上的验证码
String verifiCode=new String(CreateVerifiCodeImage.getVerifiCode());
//将验证码文本放入session 域,为下一次验证做准备
HttpSession session=request.getSession();
session.setAttribute("verifiCode",verifiCode);
/*
* 将验证码图片响应到浏览器 response输出流
* 将生成的验证码图片,按照PNG格式传给浏览器。
* */
try {
ServletOutputStream outputStream= response.getOutputStream();
ImageIO.write(verifiCodeImage,"PNG",outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
登录校验功能首先需要判断,用户输入的验证码和系统图片的验证码文本是否一致,如若不一致,则会提示验证码有误,请刷新后重试。如若判断一致后,会先将现有session中移除现有验证码,在进行用户类型验证(管理员,学生,老师)。
在这里,采用map类型,进行用户响应数据的存放,将传入的用户类型分为三种,1代表管理员,2代表学生,3 代表老师。(以管理员用户为例)将传入的对象,在数据库进行查询,如果查询找到了,则为admin对象。如果没有找到,则admin对象为null,那么说明用户名或者密码错误。
/*
* 登录校验
* */
@ApiOperation("登录的方法")
@PostMapping("/login")
//传入两个参数,一个是系统的验证码图片,一个是用户输入的验证码
public Result login(@ApiParam("登录提交的表单")@RequestBody LoginForm loginForm,HttpServletRequest request){
//验证码
HttpSession session=request.getSession();
String sessionVerifiCode=(String) session.getAttribute("verifiCode");
String loginVerifiCode=loginForm.getVerifiCode();
//验证码判断,是否失效或者为空
if ("".equals(sessionVerifiCode ) || null==sessionVerifiCode){
return Result.fail().message("验证码失效,请刷新后重试");
}
//判断用户输入验证码和系统验证码是否相同,不区分大小写
if (!sessionVerifiCode.equalsIgnoreCase(loginVerifiCode)){
return Result.fail().message("验证码有误,请输入后重试");
}
//从session移除现有验证码
session.removeAttribute("verifiCode");
//分用户类型验证 管理员,学生,老师等
//准备一个map用户存放响应的数据
Map<String,Object> map=new LinkedHashMap<>();
switch (loginForm.getUserType()){
//管理员表
case 1:
try {
//传入的对象,判断登录,数据库中查询,找到为admin,如果为null,即没有找到。
Admin admin= adminService.login(loginForm);
if (null !=admin){
//用户的id 和类型,转换为一个密文,以token形式的名称反馈前端
String token= JwtHelper.createToken(admin.getId().longValue(),1);
map.put("token",token);
}else {
throw new RuntimeException("用户名或者密码有误");
}
return Result.ok(map);
}catch (RuntimeException e){
e.printStackTrace();
//异常对象抛出来的信息 new RuntimeException("用户名或者密码有误");
return Result.fail().message(e.getMessage());
}
//学生信息
case 2:
try {
Student student= studentService.login(loginForm);
if (null !=student){
String token=JwtHelper.createToken(student.getId().longValue(),2);
map.put("token",token);
}else {
throw new RuntimeException("用户名或者密码错误");
}
return Result.ok(map);
}catch (RuntimeException e){
e.printStackTrace();
return Result.fail().message(e.getMessage());
}
case 3:
try {
Teacher teacher= teacherService.login(loginForm);
if (null !=teacher){
String token=JwtHelper.createToken(teacher.getId().longValue(),3);
map.put("token",token);
}else {
throw new RuntimeException("用户名或者密码错误");
}
return Result.ok(map);
}catch (RuntimeException e){
e.printStackTrace();
return Result.fail().message(e.getMessage());
}
}
return Result.fail().message("查无此人");
}
在登录过程中,先请求login,再次请求getinfo ,来判断登录页面。
请求login页面:
响应码:200
信息:成功
data对象:用户id+类型+token有效时间 =>生成密文
第二次请求(在login请求成功后,会请求访问getinfo页面):
第二次请求中也带有一个token。
请求信息头:
响应admin 的数据信息:
源码
@Api(tags = "系统控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {
@Autowired
private AdminService adService;
@Autowired
private StudentService studentService;
@Autowired
private TeacherService teacherService;
/*
* token 判断登录
* */
@ApiOperation("通过taken口令来获取当前登录的用户信息的方法")
@GetMapping("/getInfo")
public Result getInfoByToken(
//请求头 token
@ApiParam("token口令") @RequestHeader("token") String token){
boolean expiration=JwtHelper.isExpiration(token);//验证token是否过期。
if (expiration){
//token无效
return Result.build(null, ResultCodeEnum.TOKEN_ERROR);
}
//从token解析出 用户id+用户类型
Long userId=JwtHelper.getUserId(token);
Integer userType=JwtHelper.getUserType(token);
//判断登录状态
Map<String,Object> map=new LinkedHashMap<>();
//用户类型
switch (userType){
case 1:
//根据adminid查询一个对象,键值对
Admin admin=adminService.getAdminById(userId);
map.put("userType",1);
map.put("user",admin);
break;
case 2:
Student student=studentService.getStudentById(userId);
map.put("userType",2);
map.put("user",student);
break;
case 3:
Teacher teacher=teacherService.getByTeacherById(userId);
map.put("userType",3);
map.put("user",teacher);
break;
}
return Result.ok(map);
}
}
这段代码同时可以优化为以下代码,(后续不少代码给出的是优化后或有一定变动后的代码)
@Api(tags = "系统控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {
private static final int ADMIN_USER_TYPE = 1;
private static final int STUDENT_USER_TYPE = 2;
private static final int TEACHER_USER_TYPE = 3;
private final AdminService adService;
private final StudentService studentService;
private final TeacherService teacherService;
@Autowired
public SystemController(AdminService adService, StudentService studentService, TeacherService teacherService) {
this.adService = adService;
this.studentService = studentService;
this.teacherService = teacherService;
}
/*
* token 判断登录
* */
@ApiOperation("通过taken口令来获取当前登录的用户信息的方法")
@GetMapping("/getInfo")
public Result getInfoByToken(
//请求头 token
@ApiParam("token口令") @RequestHeader("token") String token){
boolean isTokenExpired=JwtHelper.isExpiration(token);//验证token是否过期。
if (isTokenExpired){
//token无效
return Result.build(null, ResultCodeEnum.TOKEN_ERROR);
}
//从token解析出 用户id+用户类型
Long userId=JwtHelper.getUserId(token);
Integer userType=JwtHelper.getUserType(token);
//判断登录状态
Map<String,Object> map=new LinkedHashMap<>();
//用户类型
if (userType == ADMIN_USER_TYPE) {
// 处理管理员用户逻辑
Admin admin=adminService.getAdminById(userId);
map.put("userType",1);
map.put("user",admin);
break;
} else if (userType == STUDENT_USER_TYPE) {
// 处理学生用户逻辑
Student student=studentService.getStudentById(userId);
map.put("userType",2);
map.put("user",student);
break;
} else if (userType == TEACHER_USER_TYPE) {
// 处理教师用户逻辑
Teacher teacher=teacherService.getByTeacherById(userId);
map.put("userType",3);
map.put("user",teacher);
break;
} else {
// 处理其他用户类型逻辑
return Result.ok(map);
}
}
验证码图片请求
Controller层代码
/*
* 响应验证码图片的流程
* 匹配处理器方法路径
* */
@ApiOperation("获取验证码方法")
@GetMapping("/getVerifiCodeImage")
public void getVerifiCodeImage(
@ApiParam("请求") HttpServletRequest request,
@ApiParam("响应") HttpServletResponse response){
//获取图片
BufferedImage verifiCodeImage= CreateVerifiCodeImage.getVerifiCodeImage();
//获取图片上的验证码
String verifiCode=new String(CreateVerifiCodeImage.getVerifiCode());
//将验证码文本放入session 域,为下一次验证做准备
HttpSession session=request.getSession();
session.setAttribute("verifiCode",verifiCode);
/*
* 将验证码图片响应到浏览器 response输出流
* 将生成的验证码图片,按照PNG格式传给浏览器。
* */
try {
ServletOutputStream outputStream= response.getOutputStream();
ImageIO.write(verifiCodeImage,"PNG",outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
响应验证码图片
swagger测试接口
该操作响应流程
Controller层代码
@ApiOperation("文件上传统一入口")
@PostMapping("/headerImgUpload")
public Result headerImgUpload(
@ApiParam("头像文件") @RequestParam("file") MultipartFile file,
HttpServletRequest request
) {
if (file.isEmpty()) {
return Result.error("文件为空");
}
String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
String originalFilename = file.getOriginalFilename();
String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName = uuid + fileExtension;
String uploadDirectory = "D:/ideaProjects/smart_campus/target/classes/public/upload/";
String portraitPath = uploadDirectory + newFileName;
try {
Files.createDirectories(Paths.get(uploadDirectory));
file.transferTo(new File(portraitPath));
} catch (IOException e) {
e.printStackTrace();
return Result.error("文件上传失败");
}
String path = "upload/" + newFileName;
return Result.ok(path);
}
该操作响应成功
swagger测试接口
Controller层代码
@ApiOperation("全局密码更新器")
@PostMapping("/updatePwd/{oldPwd}/{newPwd}")
public Result updatePwd(
@ApiParam("token口令") @RequestHeader("token") String token,
@ApiParam("旧密码") @PathVariable("oldPwd") String oldPwd,
@ApiParam("新密码") @PathVariable("newPwd") String newPwd
) {
boolean expiration = JwtHelper.isExpiration(token);
if (expiration) {
// token 过期
return Result.fail().message("token过期,请重新登录");
}
// 获取用户id和用户类型
Long userId = JwtHelper.getUserId(token);
Integer userType = JwtHelper.getUserType(token);
// 定义用户实体类和服务类
BaseUser user = null;
BaseService<BaseUser> userService = null;
// 根据用户类型选择对应的实体类和服务类
switch (userType) {
case 1:
user = adminService.getById(userId);
userService = adminService;
break;
case 2:
user = studentService.getById(userId);
userService = studentService;
break;
case 3:
user = teacherService.getById(userId);
userService = teacherService;
break;
}
// 验证用户和密码
if (user != null && user.getPassword().equals(MD5.encrypt(oldPwd))) {
// 修改密码
user.setPassword(MD5.encrypt(newPwd));
userService.saveOrUpdate(user);
return Result.ok().message("密码修改成功");
} else {
return Result.fail().message("原密码有误!");
}
}
swagger测试接口
进入管理员管理界面
先看查询数据流的请求信息
根据请求路径,到后端请求地址
Controller层代码
@Autowired
private AdminService adminService;
/*
* /sms/adminController/getAllAdmin/1/3
* 分页查询
* */
@ApiOperation("分页查询功能")
@GetMapping("/getAllAdmin/{pageNo}/{pageSize}")
public Result getAllAdmin(
@ApiParam("页码") @PathVariable("pageNo") Integer pageNo,
@ApiParam("页大小") @PathVariable("pageSize") Integer pageSize,
@ApiParam("管理员名字") String adminName
){
Page<Admin> page = new Page<>(pageNo, pageSize);
IPage<Admin> iPage = adminService.getAdminsByOpr(page, adminName);
return Result.ok(iPage);
}
service层代码
@Override
public IPage<Admin> getAdminsByOpr(Page<Admin> page, String adminName) {
QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(adminName)) {
queryWrapper.like("name", adminName);
}
queryWrapper.orderByDesc("id");
return baseMapper.selectPage(page, queryWrapper);
}
该请求响应为:
swagger测试接口:
弹出添加表单,填写相关信息。
数据流请求地址
Controller层代码
@ApiOperation("增加或者修改管理员信息")
@PostMapping("/saveOrUpdateAdmin")
public Result saveOrUpdateAdmin(@ApiParam("JSON格式的Admin对象") @RequestBody Admin admin) {
if (admin.getId() == null || admin.getId() == 0) {
admin.setPassword(MD5.encrypt(admin.getPassword()));
}
adminService.saveOrUpdate(admin);
return Result.ok();
}
在这里区分一下增加和修改操作。
- admin 对象的 id 是否为 null 或者为 0。如果是,则表示这是一个新增的管理员,需要对密码进行加密处理。
- 如果 id 不为 null 或者不为 0,则表示这是一个修改操作,不需要对密码进行处理。
请求响应头
swagger测试接口
删除操作请求数据流
Controller层代码
@ApiOperation("删除单个用户或者批量删除多个用户")
@DeleteMapping("/deleteAdmin")
public Result deleteAdmin(@ApiParam("删除管理员用户的id的JSON集合") @RequestBody List<Integer> ids) {
if (ids.size() == 1) {
// 单一删除逻辑
adminService.removeById(ids.get(0));
} else {
// 批量删除逻辑
adminService.removeByIds(ids);
}
return Result.ok();
}
通过判断ids列表的长度,来区分是单一删除还是批量删除
如果长度为1,则执行单一删除逻辑,调用adminService.removeById(ids.get(0))方法删除对应的管理员用户;
如果长度大于1,则执行批量删除逻辑,调用adminService.removeByIds(ids)方法删除对应的管理员用户。
该请求响应操作
swagger测试接口
先查询数据流的请求信息
根据请求路径,到后端请求地址
Controller层代码
@Api(tags = "年级控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
private final GradeService gradeService;
public GradeController(GradeService gradeService) {
this.gradeService = gradeService;
}
@ApiOperation("查询年级信息,分页带条件")
@GetMapping("/getGrades")
public Result getGrades(
@ApiParam("分页查询页码数") @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@ApiParam("分页查询页大小") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@ApiParam("分页查询模糊匹配班级名") @RequestParam(value = "gradeName", required = false) String gradeName) {
Page<Grade> page = new Page<>(pageNo, pageSize);
IPage<Grade> pageRs = gradeService.getGradeByOpr(page, gradeName);
return Result.ok(pageRs);
}
}
Service层代码
@Service
@Transactional
public class GradeServiceImpl extends ServiceImpl<GradeMapper, Grade> implements GradeService {
private final GradeMapper gradeMapper;
public GradeServiceImpl(GradeMapper gradeMapper) {
this.gradeMapper = gradeMapper;
}
@Override
public IPage<Grade> getGradeByOpr(Page<Grade> pageParam, String gradeName) {
// 设置查询条件
QueryWrapper<Grade> queryWrapper = new QueryWrapper<>();
if (!StringUtils.isEmpty(gradeName)) {
queryWrapper.like("name", gradeName);
}
// 设置排序规则
queryWrapper.orderByDesc("id");
queryWrapper.orderByAsc("name");
// 分页查询数据
IPage<Grade> page = gradeMapper.selectPage(pageParam, queryWrapper);
return page;
}
}
该请求响应头
swagger测试接口功能
添加年级表单,填入数据。
数据流的请求头
Controller层代码
@Api(tags = "年级控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
private final GradeService gradeService;
@Autowired
public GradeController(GradeService gradeService) {
this.gradeService = gradeService;
}
@ApiOperation("添加或者修改年级信息")
@PostMapping("/saveOrUpdateGrade")
public Result saveOrUpdateGrade(@ApiParam("JSON的grade对象转换后台数据模型") @RequestBody Grade grade) {
// 调用服务层方法,实现添加或者修改年级信息
gradeService.saveOrUpdate(grade);
return Result.ok();
}
}
swagger测试接口
删除操作请求数据流
Controller层代码
private final GradeService gradeService;
public GradeController(GradeService gradeService) {
this.gradeService = gradeService;
}
@ApiOperation("删除一个或者多个grade信息")
@DeleteMapping("/deleteGrade")
public Result deleteGradeById(
@ApiParam("JSON的年级id集合,映射为后台List<Integer>") @RequestBody List<Integer> ids
) {
gradeService.removeByIds(ids);
return Result.ok();
}
请求后的响应
swagger测试接口
Controller层代码
@Api(tags = "年级控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {
@Autowired
private GradeService gradeService;
@ApiOperation("获取所有Grade信息")
@GetMapping("/getGrades")
public Result getGrades(){
List<Grade> grades = gradeService.getGrades();
return Result.ok(grades);
}
}
service层代码
@Service
@Transactional
public class GradeServiceImpl extends ServiceImpl<GradeMapper, Grade> implements GradeService {
public List<Grade> getGrades(){
List<Grade> grades = baseMapper.selectList(null);
return grades;
}
}
mapper层代码
public interface BaseMapper<T> extends Mapper<T>{
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
}
swagger测试接口
先看查询数据流的请求信息
根据请求路径,到后端请求地址
Controller层代码
@Api(tags = "班级控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {
@Autowired
private ClazzService clazzService;
@ApiOperation("查询班级信息,分页带条件")
@GetMapping("/getClazzsByOpr/{pageNo}/{pageSize}")
public Result getClazzsByOpr(
@ApiParam("页码数") @PathVariable("pageNo") Integer pageNo,
@ApiParam("页大小") @PathVariable("pageSize") Integer pageSize,
@ApiParam("查询条件") Clazz clazz
){
//设置分页信息
Page<Clazz> page =new Page<>(pageNo,pageSize);
IPage<Clazz> iPage = clazzService.getClazzsByOpr(page, clazz);
return Result.ok(iPage);
}
}
service层代码
@Service
@Transactional
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {
/**
* 分页查询所有班级信息【带条件】
* @param clazz
* @return
*/
@Override
public IPage<Clazz> getClazzsByOpr(Page<Clazz> pageParam,Clazz clazz) {
QueryWrapper queryWrapper = new QueryWrapper();
if(clazz != null){
//年级名称条件
String gradeName = clazz.getGradeName();
if(!StringUtils.isEmpty(gradeName)){
queryWrapper.eq("grade_name",gradeName);
}
//班级名称条件
String clazzName = clazz.getName();
if(!StringUtils.isEmpty(clazzName)){
queryWrapper.like("name",clazzName);
}
queryWrapper.orderByDesc("id");
queryWrapper.orderByAsc("name");
}
Page page = baseMapper.selectPage(pageParam, queryWrapper);
return page;
}
}
该请求响应头
swagger测试接口
填写表单,添加数据
该数据流请求头
Controller层代码
@Api(tags = "班级控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {
@Autowired
private ClazzService clazzService;
@ApiOperation("保存或者修改班级信息")
@PostMapping("/saveOrUpdateClazz")
public Result saveOrUpdateClazz(
@ApiParam("JSON转换后端Clazz数据模型") @RequestBody Clazz clazz
){
clazzService.saveOrUpdate(clazz);
return Result.ok();
}
}
请求响应后
增加
修改
swagger测试接口
删除响应:
Controller层代码
public class ClazzController {
private final ClazzService clazzService;
public ClazzController(ClazzService clazzService) {
this.clazzService = clazzService;
}
@ApiOperation("删除一个或者多个班级信息")
@DeleteMapping("/deleteClazz")
public Result deleteClazzByIds(
@ApiParam("多个班级id的JSON") @RequestBody List<Integer> ids
){
clazzService.removeByIds(ids);
return Result.ok();
}
}
请求响应后
swagger测试接口
Controller层代码
//查询所有班级信息
@ApiOperation("查询所有班级的信息")
@GetMapping("/getClazzs")
public Result getClazzs(){
List<Clazz> clazzes=clazzService.getClazzs();
return Result.ok(clazzes);
}
service层代码
@Service("clazzServiceImpl")
@Transactional //事务控制
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {
@Override
public List<Clazz> getClazzs() {
return baseMapper.selectList(null);
}
}
swagger测试接口
先查询数据流的请求信息
根据请求路径,到后端请求地址
Controller层代码
@Api(tags = "教师信息管理控制器")
@RestController
@RequestMapping("/sms/teacherController")
public class TeacherController {
@Autowired
private TeacherService teacherService;
@ApiOperation("获取教师信息,分页带条件")
@GetMapping("/getTeachers/{pageNo}/{pageSize}")
public Result getTeachers(
@PathVariable("pageNo") Integer pageNo,
@PathVariable("pageSize") Integer pageSize,
Teacher teacher
){
Page<Teacher> pageParam = new Page<>(pageNo,pageSize);
IPage<Teacher> page = teacherService.getTeachersByOpr(pageParam, teacher);
return Result.ok(page);
}
}
service层代码
@Override
public IPage<Teacher> getTeachersByOpr(Page<Teacher> pageParam, Teacher teacher) {
QueryWrapper queryWrapper = new QueryWrapper();
if(teacher != null){
//班级名称条件
String clazzName = teacher.getClazzName();
if (!StringUtils.isEmpty(clazzName)) {
queryWrapper.eq("clazz_name",clazzName);
}
//教师名称条件
String teacherName = teacher.getName();
if(!StringUtils.isEmpty(teacherName)){
queryWrapper.like("name",teacherName);
}
queryWrapper.orderByDesc("id");
queryWrapper.orderByAsc("name");
}
IPage<Teacher> page = baseMapper.selectPage(pageParam, queryWrapper);
return page;
}
该请求响应为
swagger测试接口
填写表单数据
该操作请求数据响应头
Controller层代码
@ApiOperation("添加和修改教师信息")
@PostMapping("/saveOrUpdateTeacher")
public Result saveOrUpdateTeacher(
@RequestBody Teacher teacher
){
if (teacher.getId() != null) {
// ID 不为空,执行修改操作
teacherService.update(teacher);
} else {
// ID 为空,执行增加操作
teacherService.add(teacher);
}
return Result.ok();
}
通过判断teacher对象的id属性是否为空来确定是执行增加操作还是修改操作。如果id不为空,则执行修改操作;如果id为空,则执行增加操作。
swagger测试接口
该删除操作请求路径
Controller层代码
@ApiOperation("删除一个或者多个教师信息")
@DeleteMapping("/deleteTeacher")
public Result deleteTeacher(
@RequestBody List<Integer> ids
){
if (ids.size() == 1) {
// ids 列表只包含一个元素,执行删除操作
teacherService.removeById(ids.get(0));
} else {
// ids 列表包含多个元素,执行批量删除操作
teacherService.removeByIds(ids);
}
return Result.ok();
}
通过判断ids列表的大小来确定是执行删除操作还是批量删除操作。如果ids列表只包含一个元素,则执行删除操作;如果ids列表包含多个元素,则执行批量删除操作。
swagger测试接口
Controller层代码
//查询所有班级信息
@ApiOperation("查询所有班级的信息")
@GetMapping("/getClazzs")
public Result getClazzs(){
List<Clazz> clazzes=clazzService.getClazzs();
return Result.ok(clazzes);
}
service层代码
@Service("clazzServiceImpl")
@Transactional //事务控制
public class ClazzServiceImpl extends ServiceImpl<ClazzMapper, Clazz> implements ClazzService {
@Override
public List<Clazz> getClazzs() {
return baseMapper.selectList(null);
}
}
swagger测试接口
先查询数据流的请求信息
Controller层代码
@Api(tags = "学生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {
@Autowired
private StudentService studentService;
@ApiOperation("查询学生信息,分页带条件")
@GetMapping("/getStudentByOpr/{pageNo}/{pageSize}")
public Result getStudentsByOpr(
@ApiParam("页码数") @PathVariable("pageNo")Integer pageNo,
@ApiParam("页大小") @PathVariable("pageSize")Integer pageSize,
@ApiParam("查询条件转换后端数据模型") Student student
){
// 准备分页信息封装的page对象
Page<Student> page =new Page<>(pageNo,pageSize);
// 获取分页的学生信息
IPage<Student> iPage = studentService.getStudentByOpr(page, student);
// 返回学生信息
return Result.ok(iPage);
}
}
service层代码
@Service("stuService")
@Transactional
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {
/**
* 按条件查询学生信息【带分页】
*/
public IPage<Student> getStudentByOpr(Page<Student> pageParam,Student student){
QueryWrapper<Student> queryWrapper = null;
if(student != null) {
queryWrapper = new QueryWrapper<>();
if (student.getClazzName() != null) {
queryWrapper.eq("clazz_name", student.getClazzName());
}
if (student.getName() != null) {
queryWrapper.like("name", student.getName());
}
queryWrapper.orderByDesc("id");
queryWrapper.orderByAsc("name");
}
//创建分页对象
IPage<Student> pages = baseMapper.selectPage(pageParam, queryWrapper);
return pages;
}
请求响应
swagger测试接口
填写表单数据
该操作数据请求
Controller层代码
@Api(tags = "学生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {
@Autowired
private StudentService studentService;
@ApiOperation("增加学生信息")
@PostMapping("/addOrUpdateStudent")
public Result addOrUpdateStudent(@RequestBody Student student){
//对学生的密码进行加密
if (!Strings.isEmpty(student.getPassword())) {
student.setPassword(MD5.encrypt(student.getPassword()));
}
//保存学生信息进入数据库
studentService.saveOrUpdate(student);
return Result.ok();
}
}
根据学生对象是否具有唯一标识(如学生ID)来进行判断。如果学生对象具有唯一标识,则可以将其视为修改操作;否则,可以将其视为增加操作。
该操作响应
swagger测试接口
该操作请求路径
Controller层代码
@Api(tags = "学生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {
@Autowired
private StudentService studentService;
@ApiOperation("删除一个或者多个学生信息")
@DeleteMapping("/delStudentById")
public Result delStudentById(
@ApiParam("多个学生id的JSON") @RequestBody List<Integer> ids
){
studentService.removeByIds(ids);
return Result.ok();
}
}
该请求响应数据
swagger测试接口
项目启动报错“javax.xml.bind.DatatypeConverter”
项目启动时没有问题,swagger调接口也没有问题,前后端联调的时候出现以下问题,提示:javax.xml.bind.DatatypeConverter
JAXB API是java EE 的API,因此在java SE 9.0 中不再包含这个 Jar 包。
java 9 中引入了模块的概念,默认情况下,Java SE中将不再包含java EE 的Jar包而在
java 6/7 / 8 时关于这个API 都是捆绑在一起的
jar包中缺少这一依赖-javax.xml.bind.api
导入依赖即可。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
智慧校园云端管理系统是一个基于前后端分离架构的校园管理系统,主要用于管理校内学生、老师、班级和年级的相关信息,并提供学生和老师信息记录和统计的功能。该系统采用了以下技术和工具:
系统的用户角色包括管理员、老师和学生。每个角色都有不同的功能和权限:
通过该系统,管理员可以方便地管理校园的核心基础业务数据,老师和学生可以更好地进行信息管理和查看。至此项目成功完结。