• 尚医通(二)


    视频链接:https://www.bilibili.com/video/BV1V5411K7rT?vd_source=9545770e4a2968c05878ffac8589ec6c
    视频选集:P11— P25
    Java微服务 + 分布式 +全栈项目

    1.前后端分离概念

    前端:html、css、js…【进行数据显示】
    后端:java【提供数据或者操作】
    在这里插入图片描述

    2.搭建项目后端环境

    父工程    pom 管理依赖版本和公共依赖        springboot工程【2.2.1】
    子模块1              maven工程
    	子模块1.1
    	子模块1.2
    	...
    
    子模块2             maven工程
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    3.把项目代码提交远程git仓库

    先在gitee上创建账号,得到git仓库地址,然后在IDEA上先把代码提交到本地的仓库,然后本地仓库和远程git仓库进行链接
    在这里插入图片描述

    4.开发医院设置接口

    医院设置主要是用来保存开通医院的一些基本信息,每个医院一条信息,保存了医院编号(平台分配,全局唯一)和接口调用相关的签名key等信息,是整个流程的第一步,只有开通了医院设置信息,才可以上传医院相关信息。

    我们所开发的功能就是基于单表的一个CRUD、锁定/解锁和发送签名信息这些基本功能。

    4.1 需求和准备

    在这里插入图片描述
    创建表:
    在这里插入图片描述
    注意:status【状态(锁定/解锁)】

    4.2 在service中搭建医院模块

    4.2.1 创建基础类

    4.2.2 查询和逻辑删除

    在这里插入图片描述

    4.2.3 整合Swagger测试

    swagger2

    • 编写和维护接口文档是每个程序员的职责,根据Swagger2可以快速帮助我们编写最新的API接口文档,再也不用担心开会前仍忙于整理各种资料了,间接提升了团队开发的沟通效率。
    • 常用注解
    • swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。”

    4.2.4 统一返回结果定义

     //1 查询医院设置表所有信息
        @ApiOperation(value = "获取所有医院设置")
        @GetMapping("findAll")
        public Result findAllHospitalSet() {
            //调用service的方法
            List<HospitalSet> list = hospitalSetService.list();
            return Result.ok(list);
        }
    
        //2 逻辑删除医院设置
        @ApiOperation(value = "逻辑删除医院设置")
        @DeleteMapping("{id}")
        public Result removeHospSet(@PathVa riable Long id) {
            boolean flag = hospitalSetService.removeById(id);
            if(flag) {
                return Result.ok();
            } else {
                return Result.fail();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.2.5 分页条件查询

    在这里插入图片描述

    1. 创建vo类,封装条件值
      在这里插入图片描述
    2. 编写controller 获取条件对象,分页数据【当前页,每页记录数】
    //3 条件查询带分页
        @PostMapping("findPageHospSet/{current}/{limit}")
        public Result findPageHospSet(@PathVariable long current,
                                      @PathVariable long limit,
                                      @RequestBody(required = false) HospitalSetQueryVo hospitalSetQueryVo) {
            //创建page对象,传递当前页,每页记录数
            Page<HospitalSet> page = new Page<>(current,limit);
            //构建条件
            QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
            String hosname = hospitalSetQueryVo.getHosname();//医院名称
            String hoscode = hospitalSetQueryVo.getHoscode();//医院编号
            if(!StringUtils.isEmpty(hosname)) {
                wrapper.like("hosname",hospitalSetQueryVo.getHosname());
            }
            if(!StringUtils.isEmpty(hoscode)) {
                wrapper.eq("hoscode",hospitalSetQueryVo.getHoscode());
            }
    
            //调用方法实现分页查询
            IPage<HospitalSet> pageHospitalSet = hospitalSetService.page(page, wrapper);
    
            //返回结果
            return Result.ok(pageHospitalSet);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    @RequestBody(required = false)加上之后:
    在这里插入图片描述

    4.2.6 添加医院设置

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

    4.2.7 根据Id获取医院设置

    /5 根据id获取医院设置
        @GetMapping("getHospSet/{id}")
        public Result getHospSet(@PathVariable Long id) {
    //        try {
    //            //模拟异常
    //            int a = 1/0;
    //        }catch (Exception e) {
    //            throw new YyghException("失败",201);
    //        }
    
            HospitalSet hospitalSet = hospitalSetService.getById(id);
            return Result.ok(hospitalSet);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.2.8 修改医院设置

    //6 修改医院设置
        @PostMapping("updateHospitalSet")
        public Result updateHospitalSet(@RequestBody HospitalSet hospitalSet) {
            boolean flag = hospitalSetService.updateById(hospitalSet);
            if(flag) {
                return Result.ok();
            } else {
                return Result.fail();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.2.9 批量删除医院设置

        //7 批量删除医院设置
        @DeleteMapping("batchRemove")
        public Result batchRemoveHospitalSet(@RequestBody List<Long> idList) {
            hospitalSetService.removeByIds(idList);
            return Result.ok();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2.10 锁定和发送签名

     //8 医院设置锁定和解锁  设置status值
        @PutMapping("lockHospitalSet/{id}/{status}")
        public Result lockHospitalSet(@PathVariable Long id,
                                      @PathVariable Integer status) {
            //根据id查询医院设置信息
            HospitalSet hospitalSet = hospitalSetService.getById(id);
            //设置状态
            hospitalSet.setStatus(status);
            //调用方法
            hospitalSetService.updateById(hospitalSet);
            return Result.ok();
        }
    
        //9 发送签名秘钥
        @PutMapping("sendKey/{id}")
        public Result lockHospitalSet(@PathVariable Long id) {
            HospitalSet hospitalSet = hospitalSetService.getById(id);
            String signKey = hospitalSet.getSignKey();
            String hoscode = hospitalSet.getHoscode();
            //TODO 发送短信
            return Result.ok();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    5.异常处理

    spring boot 默认情况下会映射到/error进行异常处理,但是提示并不十分友好,下面自定义异常处理,提供友好展示。

    5.1 自定义异常类

    在搭建模块时在common-util模块已经添加了YyghException类
    自定义的需要手动抛出!
    在这里插入图片描述

    package com.atguigu.yygh.common.exception;
    
    import com.atguigu.yygh.common.result.ResultCodeEnum;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    /**
     * 自定义全局异常类
     *
     * @author qy
     */
    @Data
    @ApiModel(value = "自定义全局异常类")
    public class YyghException extends RuntimeException {
    
        @ApiModelProperty(value = "异常状态码")
        private Integer code;
    
        /**
         * 通过状态码和错误消息创建异常对象
         * @param message
         * @param code
         */
        public YyghException(String message, Integer code) {
            super(message);
            this.code = code;
        }
    
        /**
         * 接收枚举类型对象
         * @param resultCodeEnum
         */
        public YyghException(ResultCodeEnum resultCodeEnum) {
            super(resultCodeEnum.getMessage());
            this.code = resultCodeEnum.getCode();
        }
    
        @Override
        public String toString() {
            return "YyghException{" +
                    "code=" + code +
                    ", message=" + this.getMessage() +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    package com.atguigu.yygh.common.exception;
    
    import com.atguigu.yygh.common.result.Result;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(YyghException.class)
        @ResponseBody
        public Result error(YyghException e) {
            e.printStackTrace();
            return Result.fail();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5.2 添加全局异常处理

    在service-util.模块添加全局异常处理类。

    package com.atguigu.yygh.common.exception;
    
    import com.atguigu.yygh.common.result.Result;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public Result error(Exception e) {
            e.printStackTrace();
            return Result.fail();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    6.日志处理

    日志记录器(Logger )的行为是分等级的。如下表所示:
    分为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
    默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别

    设置日志级别:在spring boot配置文件中
    logging.level.root=WARN

  • 相关阅读:
    RxJava 复刻简版之四,线程切换
    ROS2机器人笔记220805-重要备忘录-
    SpringSecurity - 启动流程分析(五)
    SSM-学情分析系统-56772(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案
    ELB 后端主机异常
    y87.第五章 分布式链路追踪系统 -- 分布式链路追踪系统起源(一)
    第二章:String类
    .NET 8 预览版 1:NativeAOT 升级和新的Blazor United
    使用注解开发
    Conformer Encoder GPU 加速策略较全面汇总
  • 原文地址:https://blog.csdn.net/weixin_49883619/article/details/126777156