智能化校园:深入探讨云端管理系统设计与实现(二)

系列文章目录

智能化校园:深入探讨云端管理系统设计与实现(一)


文章目录

  • 系列文章目录
      • 功能开发
        • 登录功能分析
          • 验证码功能实现
          • 登录校验功能
          • 登录后跳转功能
        • 系统管理器实现
          • 验证码响应图片功能实现
          • 异步图片上传头像功能实现
          • 全局修改密码功能实现
        • 管理员管理功能实现
          • 查询管理员信息
          • 添加和修改管理员信息
          • 删除和批量删除管理员信息
        • 年级管理功能实现
          • 查询年级信息
          • 添加和修改年级信息
          • 删除和批量删除年级信息
        • 班级管理功能实现
          • 搜索条件中的年级选项
          • 查询班级信息
          • 添加和修改班级信息
          • 删除和批量删除班级信息
        • 教师管理功能实现
          • 搜索条件中班级选项
          • 查询教师功能实现
          • 添加和修改教师信息
          • 删除和批量删除教师信息
        • 学生管理功能实现
          • 搜索条件中班级选项
          • 查询学生功能实现
          • 添加和修改学生信息
          • 删除和批量删除学生信息
        • 项目bug解决
    • 项目总结


image.png

功能开发

登录功能分析

输入用户账户和密码,验证码,然后进行登录校验,通过登录校验后,跳转至首页功能。
与此同时,该系统所有用户都必须登录后才能跳转到后台首页,所以,登录功能在全局系统控制器的代码中实现。

验证码功能实现

image.png
验证码的前端请求
image.png
请求的是后端方法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,那么说明用户名或者密码错误。
image.png

 /** 登录校验* */@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 ,来判断登录页面。
image.png
请求login页面:
image.png
响应码:200
信息:成功
data对象:用户id+类型+token有效时间 =>生成密文
image.png
第二次请求(在login请求成功后,会请求访问getinfo页面):
image.png
第二次请求中也带有一个token。
image.png
请求信息头:
image.png
响应admin 的数据信息:
image.png
源码

@Api(tags = "系统控制器")
@RestController
@RequestMapping("/sms/system")
public class SystemController {@Autowiredprivate AdminService adService;@Autowiredprivate StudentService studentService;@Autowiredprivate 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);}}

image.png

这段代码同时可以优化为以下代码,(后续不少代码给出的是优化后或有一定变动后的代码)

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

系统管理器实现

验证码响应图片功能实现

验证码图片请求
image.png
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();}}

响应验证码图片
image.png
swagger测试接口
image.png

异步图片上传头像功能实现

该操作响应流程
image.png
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);
}

该操作响应成功
image.png
swagger测试接口
image.png

全局修改密码功能实现

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测试接口
image.png

管理员管理功能实现

进入管理员管理界面
image.png

查询管理员信息

先看查询数据流的请求信息
image.png
根据请求路径,到后端请求地址
image.png
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);
}

该请求响应为:
image.png
swagger测试接口:
image.png

添加和修改管理员信息

弹出添加表单,填写相关信息。
image.png
数据流请求地址
image.png

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

在这里区分一下增加和修改操作。

  1. admin 对象的 id 是否为 null 或者为 0。如果是,则表示这是一个新增的管理员,需要对密码进行加密处理。
  2. 如果 id 不为 null 或者不为 0,则表示这是一个修改操作,不需要对密码进行处理。

请求响应头
image.png
swagger测试接口
image.png

删除和批量删除管理员信息

删除操作请求数据流
image.png
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)方法删除对应的管理员用户。

该请求响应操作
image.png
swagger测试接口
image.png

年级管理功能实现

查询年级信息

先查询数据流的请求信息
image.png

根据请求路径,到后端请求地址
image.png

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;}@Overridepublic 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;}
}

该请求响应头
image.png

swagger测试接口功能
image.png

添加和修改年级信息

添加年级表单,填入数据。
image.png

数据流的请求头
image.png

Controller层代码

@Api(tags = "年级控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {private final GradeService gradeService;@Autowiredpublic 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测试接口
image.png

删除和批量删除年级信息

删除操作请求数据流
image.png
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();
}

请求后的响应
image.png

swagger测试接口
image.png

班级管理功能实现

搜索条件中的年级选项

image.png

Controller层代码

@Api(tags = "年级控制器")
@RestController
@RequestMapping("/sms/gradeController")
public class GradeController {@Autowiredprivate 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测试接口
image.png

查询班级信息

先看查询数据流的请求信息
image.png

根据请求路径,到后端请求地址
image.png

Controller层代码

@Api(tags = "班级控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {@Autowiredprivate 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*/@Overridepublic 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;}
}

该请求响应头
image.png

swagger测试接口
image.png

添加和修改班级信息

填写表单,添加数据
image.png

该数据流请求头
image.png
Controller层代码

@Api(tags = "班级控制器")
@RestController
@RequestMapping("/sms/clazzController")
public class ClazzController {@Autowiredprivate ClazzService clazzService;@ApiOperation("保存或者修改班级信息")@PostMapping("/saveOrUpdateClazz")public Result saveOrUpdateClazz(@ApiParam("JSON转换后端Clazz数据模型") @RequestBody Clazz clazz){clazzService.saveOrUpdate(clazz);return Result.ok();}
}

请求响应后
image.png
增加
image.png
修改
image.png
swagger测试接口
image.png

删除和批量删除班级信息

删除响应:
image.png
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();}
}

请求响应后
image.png
swagger测试接口
image.png

教师管理功能实现

搜索条件中班级选项

image.png

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 {@Overridepublic List<Clazz> getClazzs() {return baseMapper.selectList(null);}}

swagger测试接口
image.png

查询教师功能实现

先查询数据流的请求信息
image.png
根据请求路径,到后端请求地址
image.png
Controller层代码

@Api(tags = "教师信息管理控制器")
@RestController
@RequestMapping("/sms/teacherController")
public class TeacherController {@Autowiredprivate 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;
}

该请求响应为
image.png
swagger测试接口
image.png

添加和修改教师信息

填写表单数据
image.png
该操作请求数据响应头
image.png
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测试接口
image.png

删除和批量删除教师信息

该删除操作请求路径
image.png
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测试接口
image.png

学生管理功能实现

搜索条件中班级选项

image.png

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 {@Overridepublic List<Clazz> getClazzs() {return baseMapper.selectList(null);}}

swagger测试接口
image.png

查询学生功能实现

先查询数据流的请求信息
image.png
Controller层代码


@Api(tags = "学生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {@Autowiredprivate 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;}

请求响应
image.png
swagger测试接口
image.png

添加和修改学生信息

填写表单数据
image.png
该操作数据请求
image.png
Controller层代码

@Api(tags = "学生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {@Autowiredprivate 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)来进行判断。如果学生对象具有唯一标识,则可以将其视为修改操作;否则,可以将其视为增加操作。

该操作响应
image.png
swagger测试接口
image.png

删除和批量删除学生信息

该操作请求路径
image.png
Controller层代码

@Api(tags = "学生控制器")
@RestController
@RequestMapping("/sms/studentController")
public class StudentController {@Autowiredprivate StudentService studentService;@ApiOperation("删除一个或者多个学生信息")@DeleteMapping("/delStudentById")public Result delStudentById(@ApiParam("多个学生id的JSON") @RequestBody List<Integer> ids){studentService.removeByIds(ids);return Result.ok();}
}

该请求响应数据
image.png
swagger测试接口
image.png

项目bug解决

项目启动报错“javax.xml.bind.DatatypeConverter”
项目启动时没有问题,swagger调接口也没有问题,前后端联调的时候出现以下问题,提示:javax.xml.bind.DatatypeConverter
image.png
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>

项目总结

智慧校园云端管理系统是一个基于前后端分离架构的校园管理系统,主要用于管理校内学生、老师、班级和年级的相关信息,并提供学生和老师信息记录和统计的功能。该系统采用了以下技术和工具:

  • 前端技术:HTML、CSS和Vue.js,用于实现页面效果展示和交互功能。
  • 后端框架:Spring Boot和MyBatis Plus,用于实现数据存储和服务。
  • 数据库:MySQL,作为存储层,提供高性能的数据存储和查询。
  • 服务器:使用Spring Boot内置的Tomcat 9.x作为Web服务器,用于部署和运行系统。
  • 项目构建工具:Maven,用于管理项目依赖和构建过程。

系统的用户角色包括管理员、老师和学生。每个角色都有不同的功能和权限:

  • 管理员角色:可以进行学生、老师、年级和班级信息的管理,包括添加、编辑和删除操作,还可以管理个人信息和重置账户密码。
  • 老师角色:可以参与相关学生和班级信息的管理,包括查看和编辑操作,同时也可以管理个人信息。
  • 学生角色:可以查看自己所在班级的信息、同学信息,还可以管理个人信息。

通过该系统,管理员可以方便地管理校园的核心基础业务数据,老师和学生可以更好地进行信息管理和查看。至此项目成功完结。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8改进 | 主干篇 | CSWinTransformer交叉形窗口网络

一、本文介绍 本文给大家带来的改进机制是CSWin Transformer,其基于Transformer架构,创新性地引入了交叉形窗口自注意力机制,用于有效地并行处理图像的水平和垂直条带,形成交叉形窗口以提高计算效率。它还提出了局部增强位置编码(LePE),更好地处理局部位置信息,我将其…

HttpClient库与代理IP在爬虫程序中的应用

目录 前言 一、HttpClient库的基本使用方法 二、代理IP的使用方法 三、代理IP池的使用方法 四、总结 前言 在编写爬虫程序时&#xff0c;我们经常会使用HttpClient库来发送HTTP请求&#xff0c;获取网页内容。然而&#xff0c;有些网站可能会对频繁的请求进行限制&#x…

前端工程化回顾-vite 构建神器

1.构建vite 项目 pnpm create vite2.常用的配置&#xff1a; 1.公共资源路径配置&#xff1a; base: ./, 默认是/2.路径别名配置&#xff1a; resolve: {alias: {: path.resolve(__dirname, ./src),ass: path.resolve(__dirname, ./src/assets),comp: path.resolve(__dirnam…

uni-app中实现元素拖动

uni-app中实现元素拖动 1、代码示例 <template><movable-area class"music-layout"><movable-view class"img-layout" :x"x" :y"y" direction"all"><img :src"musicDetail.bgUrl" :class&…

springboot+redisTemplate多库操作

单库操作 我做了依赖管理&#xff0c;所以就不写版本号了添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>配置文件 spring:redis:database: 2…

勒索检测能力升级,亚信安全发布《勒索家族和勒索事件监控报告》

评论员简评 近期(12.08-12.14)共发生勒索事件119起&#xff0c;相较之前呈现持平趋势。 与上周相比&#xff0c;本周仍然流行的勒索家族为lockbit3和8base。在涉及的勒索家族中&#xff0c;活跃程度Top5的勒索家族分别是&#xff1a;lockbit3、siegedsec、dragonforce、8base和…

MatrixOne 1.1.0 Release

我们非常高兴地宣布&#xff1a; MatrixOne内核1.1.0版本 正式发布啦&#xff01; 项目文档网站 https://docs.matrixorigin.cn MatrixOne是一款分布式超融合异构数据库&#xff0c;MatrixOne旨在提供一个云原生、高性能、高弹性、高度兼容MySQL的HSTAP数据库&#xff0c;让…

Oracle database 12cRAC异地恢复至单机

环境 rac 环境 byoradbrac Oracle12.1.0.2 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;172.17.38.4…

工具篇--Spring-Cloud--feign 通过feign 接口完成文件的下载

文章目录 前言一、feign接口获取文件流程&#xff1a;二、文件获取实现2.1 引入jar&#xff1a;2.2 实现&#xff1a; 总结 前言 通常在spring-boot 项目中&#xff0c;对于文件的下载都是直接调用到对应的服务中&#xff0c;而不是通过feign 接口获取文件&#xff1b;有时我们…

使用 Process Explorer 和 Windbg 排查软件线程堵塞案例分享

目录 1、问题说明 2、线程堵塞的可能原因分析 3、使用Windbg和Process Explorer确定线程中发生了死循环 4、根据Windbg中显示的函数调用堆栈去查看源码&#xff0c;找到问题 4.1、在Windbg定位发生死循环的函数的方法 4.2、在Windbg中查看变量的值去辅助分析 4.3、是循环…

HubSpot电子邮件自动化的关键功能和流程!

HubSpot提供了强大的电子邮件自动化工具&#xff0c;使用户能够创建、执行和跟踪复杂的电子邮件市场营销活动。以下是HubSpot电子邮件自动化的一些关键功能和流程&#xff1a; 1.电子邮件工作流程&#xff08;Email Workflows&#xff09;&#xff1a; 用户可以使用HubSpot的工…

机器学习笔记 - 偏最小二乘回归 (PLSR)

一、偏最小二乘回归:简介 PLS 方法构成了一个非常大的方法族。虽然回归方法可能是最流行的 PLS 技术,但它绝不是唯一的一种。即使在 PLSR 中,也有多种不同的算法可以获得解决方案。PLS 回归主要由斯堪的纳维亚化学计量学家 Svante Wold 和 Harald Martens 在 20 世纪 80 年代…

【零基础入门TypeScript】判断条件和循环

目录 定环 无限循环 示例&#xff1a;while 与 do..while 中断语句 句法 流程图 例子 继续语句 句法 流程图 例子 输出 无限循环 语法&#xff1a;使用 for 循环的无限循环 示例&#xff1a;使用 for 循环的无限循环 语法&#xff1a;使用 while 循环进行无限循…

LeetCode-轮转数组的三种方法(189)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 思路一&#xff1a; 建立一个两倍原数组长度的数组&#xff0c;然后其中保存两遍原数组中的元素&#xff0c;轮转的过程就可以看成是在这个新数组中截…

云计算:OpenStack 分布式架构管理VXLAN网络(单控制节点与多计算节点)

目录 一、实验 1.环境 2.各节点新增网卡准备VXLAN网络 3.控制节点配置私有网络 4.计算节点1配置私有网络 5.计算节点2配置私有网络 6.重启服务 7.修改Dashboard 8.新建项目&#xff08;租户&#xff09;及用户 9.新建网络与子网 10.新建实例 11.新建路由 12.新增浮…

物联网的网络管理技术开发

物联网并不是新的事物。不论称为物联网或者是传感网&#xff0c;物联网的基本组成可以看成为传感器网络接入互联网构成,当然也有仅仅是传感器网络组成的简单的物联网系统。但是总的来说,物联网有许多新的特点。这些特点导致物联网对于其网络的管理有新的要求。因此电信网和互联…

算法与数据结构之数组(Java)

目录 1、数组的定义 2、线性结构与非线性结构 3、数组的表现形式 3.1 一维数组 3.2 多维数组 4、重要特性&#xff1a;随机访问 5、ArrayList和数组 6、堆内存和栈内存 7、数组的增删查改 7.1 插入数据 7.2 删除一个数据 7.3 修改数组 7.4 查找数据 8、总结 什么…

视频监控可视化云平台EasyCVR智能视频技术优势分析

TSINGSEE青犀视频安防视频管理系统EasyCVR视频智能融合共享平台&#xff0c;是一个支持Windows/Linux(CentOS ubuntu)/国产化系统的视频管理平台。平台可以支持多协议接入&#xff0c;通过视频应用引擎将多种格式的视频数据转换为统一的视频流数据&#xff0c;支持无插件H5直播…

RK3568平台 input输入子系统

一.input子系统简介 Input 子系统是管理输入的子系统&#xff0c; 和 pinctrl 和 gpio 子系统一样&#xff0c; 都是 Linux 内核针对某一类设备而创建的框架。 input 子系统处理输入事务&#xff0c; 任何输入设备的驱动程序都可以通过 input 输入子系统提供的接口注册到内核&…

Java虚拟机介绍

JVM是一种用于计算设备的规范&#xff0c;它是一个虚拟出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟计算机的各个功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。每个Java虚拟机都着一个清晰的任务&#x…