一. HospitalSetController类(医院设置)

接口1:后台系统——添加医院

Post:http://localhost:8201/admin/hosp/hospitalSet/saveHospitalSet

1. 前端页面

image.png

2. controller

  1. @PostMapping("saveHospitalSet")
  2. public Result saveHospitalSet(@RequestBody HospitalSet hospitalSet) {
  3. //设置状态 1 使用 0 不能使用
  4. hospitalSet.setStatus(1);
  5. //签名秘钥
  6. Random random = new Random();
  7. hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis() + "" + random.nextInt(1000)));
  8. //调用service
  9. boolean save = hospitalSetService.save(hospitalSet);
  10. if (save) {
  11. return Result.ok();
  12. } else {
  13. return Result.fail();
  14. }
  15. }

3. 知识点:

(1)Random

第三方类
包名:java.util.Random
详情:https://www.cnblogs.com/ningvsban/p/3590722.html
两种构造方法。
rand.nextInt(100);中的100是随机数的上限,产生的随机数为0-100的整数,不包括100。

(2)MD5

自己写的类:

  1. public final class MD5 {
  2. public static String encrypt(String strSrc) {
  3. try {
  4. char hexChars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
  5. '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  6. byte[] bytes = strSrc.getBytes();
  7. MessageDigest md = MessageDigest.getInstance("MD5");
  8. md.update(bytes);
  9. bytes = md.digest();
  10. int j = bytes.length;
  11. char[] chars = new char[j * 2];
  12. int k = 0;
  13. for (int i = 0; i < bytes.length; i++) {
  14. byte b = bytes[i];
  15. chars[k++] = hexChars[b >>> 4 & 0xf];
  16. chars[k++] = hexChars[b & 0xf];
  17. }
  18. return new String(chars);
  19. } catch (NoSuchAlgorithmException e) {
  20. e.printStackTrace();
  21. throw new RuntimeException("MD5加密出错!!+" + e);
  22. }
  23. }
  24. }

md5加密有两种方式,加盐方式和普通方式,这里用的是普通方式。这里是固定形式!固定调用

4. 总结:

(1)添加医院接口,service层和dao层是调用别人写好的!

(2)记忆方式:

前端传来hospital对象(含数据),附加两个属性,然后存入数据库。
如何附加属性数据?两个属性:

  • 签名(密钥——MD5加密)
  • 医院状态

image.png

接口2:后台系统——条件查询医院(分页)

Post:/admin/hosp/hospitalSet/findPageHospSet/{current}/{limit}

1. controller

  1. //3 条件查询带分页
  2. @PostMapping("findPageHospSet/{current}/{limit}")
  3. public Result findPageHospSet(@PathVariable long current,
  4. @PathVariable long limit,
  5. @RequestBody
  6. (required = false) HospitalSetQueryVo hospitalSetQueryVo) {
  7. //创建page对象,传递当前页,每页记录数
  8. Page<HospitalSet> page = new Page<>(current, limit);
  9. //构建条件
  10. QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
  11. // 输入框条件
  12. String hosname = hospitalSetQueryVo.getHosname();//医院名称
  13. String hoscode = hospitalSetQueryVo.getHoscode();//医院编号
  14. if (!StringUtils.isEmpty(hosname)) {
  15. //附加条件
  16. wrapper.like("hosname", hospitalSetQueryVo.getHosname());
  17. }
  18. if (!StringUtils.isEmpty(hoscode)) {
  19. //附加条件
  20. wrapper.eq("hoscode", hospitalSetQueryVo.getHoscode());
  21. }
  22. //调用方法实现分页查询
  23. Page<HospitalSet> pageHospitalSet = hospitalSetService.page(page, wrapper);
  24. //返回结果
  25. return Result.ok(pageHospitalSet);
  26. }

2. 总结:

(1)业务在controller层中

(2)记忆方式:

  • 参数:三个参数

第一个:当前页
第二个:总页数
第三个:封装查询条件的对象(有几种条件,就有几种属性)

  • 创建分页对象
  • 创建条件对象
  • 条件对象封装条件
  • 调用方法实现分页查询
  • 返回

简单来说就三步:

  1. 分页
  2. 条件
  3. 调用方法实现分页查询

    接口3:后台——根据医院id查询医院

    Get:/admin/hosp/hospitalSet/getHospSet/{id}

    1. @GetMapping("getHospSet/{id}")
    2. public Result getHospSet(@PathVariable Long id) {
    3. HospitalSet hospitalSet = hospitalSetService.getById(id);
    4. return Result.ok(hospitalSet);
    5. }

    二. HospitalController类(医院)

    接口1:条件分页查询医院

    1. controller

    1. //医院列表(条件查询分页)
    2. @GetMapping("list/{page}/{limit}")
    3. public Result listHosp(@PathVariable Integer page,
    4. @PathVariable Integer limit,
    5. HospitalQueryVo hospitalQueryVo) {
    6. Page<Hospital> pageModel = hospitalService.selectHospPage(page, limit, hospitalQueryVo);
    7. //Slice:spring data Slice 学习https://segmentfault.com/a/1190000016999494
    8. //getContent():以list形式返回页面内容
    9. //getTotalElements():返回元素总数
    10. //这里这两个数据并没有要求打印出来,可有可无。但是从这里了解了一个东西,那就是mybatis-plus和spring data都有分页查询功能
    11. //这里调用的是spring data的分页查询接口!
    12. List<Hospital> content = pageModel.getContent();
    13. long totalElements = pageModel.getTotalElements();
    14. return Result.ok(pageModel);
    15. }

    2. service

    1. //医院列表(条件查询分页)
    2. //调用的是spring data的接口,我觉得想要看得懂代码,还得去系统的学spring data
    3. @Override
    4. public Page<Hospital> selectHospPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo) {
    5. //创建pageable对象
    6. //Pageable:封装了分页的参数,当前页,每页的显示的条数。注意:他的当前页是从0开始
    7. //https://blog.csdn.net/weixin_40936211/article/details/88682941
    8. Pageable pageable = PageRequest.of(page - 1, limit);
    9. //创建条件匹配器(mybatis-plus中的叫条件构造器)
    10. ExampleMatcher matcher = ExampleMatcher.matching()
    11. .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
    12. .withIgnoreCase(true);
    13. //hospitalSetQueryVo转换Hospital对象
    14. Hospital hospital = new Hospital();
    15. //vo类数据少
    16. BeanUtils.copyProperties(hospitalQueryVo, hospital);
    17. //创建对象
    18. Example<Hospital> example = Example.of(hospital, matcher);
    19. //调用方法实现查询
    20. Page<Hospital> pages = hospitalRepository.findAll(example, pageable);
    21. //获取查询list集合,遍历进行医院等级封装
    22. pages.getContent().stream().forEach(item -> {
    23. this.setHospitalHosType(item);
    24. });

    3. 总结

    这里需要去系统的学习spring data

    接口2:更新医院上线状态

    1. controller

    1. @ApiOperation(value = "更新医院上线状态")
    2. @GetMapping("updateHospStatus/{id}/{status}")
    3. public Result updateHospStatus(@PathVariable String id, @PathVariable Integer status) {
    4. hospitalService.updateStatus(id, status);
    5. return Result.ok();
    6. }

    2. service

    1. //更新医院上线状态
    2. @Override
    3. public void updateStatus(String id, Integer status) {
    4. //根据id查询医院信息
    5. Hospital hospital = hospitalRepository.findById(id).get();
    6. //设置修改的值
    7. hospital.setStatus(status);
    8. hospital.setUpdateTime(new Date());
    9. hospitalRepository.save(hospital);
    10. }

    3. 总结:

    这里依旧是使用的spring data

    接口3:医院详情信息

    1. controller

    1. @ApiOperation(value = "医院详情信息")
    2. @GetMapping("showHospDetail/{id}")
    3. public Result showHospDetail(@PathVariable String id) {
    4. Map<String, Object> map = hospitalService.getHospById(id);
    5. return Result.ok(map);
    6. }

    2. service

    1. @Override
    2. public Map<String, Object> getHospById(String id) {
    3. Map<String, Object> result = new HashMap<>();
    4. Hospital hospital = this.setHospitalHosType(hospitalRepository.findById(id).get());
    5. //医院基本信息(包含医院等级)
    6. result.put("hospital", hospital);
    7. //单独处理更直观
    8. result.put("bookingRule", hospital.getBookingRule());
    9. //不需要重复返回
    10. hospital.setBookingRule(null);
    11. return result;
    12. }

    3. 总结:

    设置预约规则我不太懂,其他的都好说
    service直接返回一整个hospital给controller,再传至客户端

    三. DepartmentController类

    接口1:根据医院编号,查询医院所有科室列表

    1. controller

    1. //根据医院编号,查询医院所有科室列表
    2. @ApiOperation(value = "查询医院所有科室列表")
    3. @GetMapping("getDeptList/{hoscode}")
    4. public Result getDeptList(@PathVariable String hoscode) {
    5. List<DepartmentVo> list = departmentService.findDeptTree(hoscode);
    6. return Result.ok(list);
    7. }

    2. service

    1. //根据医院编号,查询医院所有科室列表
    2. @Override
    3. public List<DepartmentVo> findDeptTree(String hoscode) {
    4. //创建list集合,用于最终数据封装
    5. List<DepartmentVo> result = new ArrayList<>();
    6. //根据医院编号,查询医院所有科室信息
    7. Department departmentQuery = new Department();
    8. departmentQuery.setHoscode(hoscode);
    9. Example example = Example.of(departmentQuery);
    10. //所有科室列表 departmentList
    11. List<Department> departmentList = departmentRepository.findAll(example);
    12. //根据大科室编号 bigcode 分组,获取每个大科室里面下级子科室
    13. Map<String, List<Department>> deparmentMap =
    14. departmentList.stream().collect(Collectors.groupingBy(Department::getBigcode));
    15. //遍历map集合 deparmentMap
    16. for (Map.Entry<String, List<Department>> entry : deparmentMap.entrySet()) {
    17. //大科室编号
    18. String bigcode = entry.getKey();
    19. //大科室编号对应的全局数据
    20. List<Department> deparment1List = entry.getValue();
    21. //封装大科室
    22. DepartmentVo departmentVo1 = new DepartmentVo();
    23. departmentVo1.setDepcode(bigcode);
    24. departmentVo1.setDepname(deparment1List.get(0).getBigname());
    25. //封装小科室
    26. List<DepartmentVo> children = new ArrayList<>();
    27. for (Department department : deparment1List) {
    28. DepartmentVo departmentVo2 = new DepartmentVo();
    29. departmentVo2.setDepcode(department.getDepcode());
    30. departmentVo2.setDepname(department.getDepname());
    31. //封装到list集合
    32. children.add(departmentVo2);
    33. }
    34. //把小科室list集合放到大科室children里面
    35. departmentVo1.setChildren(children);
    36. //放到最终result里面
    37. result.add(departmentVo1);
    38. }
    39. //返回
    40. return result;
    41. }

    3. 总结

    这里依旧用到了spring data

    遗留问题

  4. 医院设置和医院有什么区别?

说实话,我不懂!!!
医院设置类的医院是mysql数据库的yygh_hosp表中的
医院类的医院是mongodb数据库的yygh_hosp表中的
这是个遗留问题!

  1. 医院类的第3个接口有个设置预约规则,不太懂!