讲师的增删改 分页(条件分页swagger(属性含义)) 统一返回格式(链式)@RequestBody含义区别 添加讲师(跨模块调用配置类)全局异常处理 全局日志处理

  1. 统一返回结果
    1统一返回码
    在common_util(公共工具库)中创建一个存放状态码的接口
    2统一返会格式
     在common_util(公共工具库)中创建一个返回结果的类  将所有结果存入后封装返回给前端
    1将构造函数私有,只能通过两个静态的方法调用
    * 2每个方法都返回R这个类,实现链式编程最后return this
    * 3前三个值固定,直接赋值到两个对外开放的静态方法
    * 4data属性用map集合封装(private Map<String,Object> date=new HashMap<String, Object>();)
    * 5map使用重写创造两种赋值方式
    /***
     * 1将构造函数私有,只能通过两个静态的方法调用
     * 2每个方法都返回R这个类,实现链式编程
     * 3前三个值固定,直接赋值到两个对外开放的静态方法
     */
    
    @Data
    public class R {
    
        @ApiModelProperty(value="是否成功")
        private Boolean success;
    
        @ApiModelProperty(value="返回码")
        private Integer code;
    
        @ApiModelProperty(value="返回消息")
        private String message;
    
        @ApiModelProperty(value="返回数据")
        private Map<String,Object> date=new HashMap<String, Object>();
    
    
        private R() {}
    
        //成功
        public static R ok(){
            R r = new R();
            r.setSuccess(true);
            r.setCode(ResultCode.SUCCESS);
            r.setMessage("成功");
            return r;
        }
    
        //失败
        public static R error(){
            R r = new R();
            r.setSuccess(false);
            r.setCode(ResultCode.ERROR);
            r.setMessage("失败");
            return r;
        }
    
        public R success(Boolean success){
            this.setSuccess(success);
            return this;
        }
    
        public R message(String message){
            this.setMessage(message);
            return this;
        }
    
        public R code(Integer code){
            this.setCode(code);
            return this;
        }
    
        public R date(String key,Object value){
           this.date.put(key, value);
            return this;
        }
    
        public R date(Map<String ,Object> map){
            this.setDate(map);
            return this;
        }
    
    }

    在service中引入common_utils依赖
    将contrllor中返回值统一设为R

  2. 查询全部

    //查询全部数据
        @ApiOperation(value = "查询所有讲师")
        @GetMapping("/aaa")
        public R findall(){
            List<EduTeacher> list = serviceImpl.list(null);
            return R.ok().date("list",list);
        }

  3. 通过id删除
     

     @ApiOperation(value = "逻辑删除讲师")
        @DeleteMapping("{id}")
        public R deleteById(@ApiParam(name = "id",value = "讲师id",required = true) @PathVariable String id){
            boolean flag = serviceImpl.removeById(id);
            if (flag){
                return R.ok();
            }else {
              return   R.error();
            }
  4. 讲师分页
    @ApiParam name是属性名 value是swgger中的解释

     //教师分页
        @ApiOperation(value = "教师分页")
        @GetMapping("/page/{current}/{limit}")
        public R teacherPage(@ApiParam(name = "current",value = "当前页",required = true)@PathVariable Integer current,
                             @ApiParam(name = "limit",value = "记录数",required = true)@PathVariable Integer limit){
    
            Page<EduTeacher> teacherPage = new Page<>(current,limit);
            serviceImpl.page(teacherPage,null);
            long total = teacherPage.getTotal();
            List<EduTeacher> list = teacherPage.getRecords();
    
            return R.ok().date("total",total).date("rows",list);
        }
  5. 讲师的条件查询
    1查询的条件封装成一个类(提供的条件由我们控制)
    2 @RequestBody(required = false) TeacherQuery teacherQuery(将这个类作为参数传入)
    3@RequestBody是以json格式接收数据(只能搭配@postmapping) @ResponceBody     是以json格式返回数据
    4将TeacherQuery的取出
    5创建page对象创建queryWarrpe对像
    6判断对象是否存在设置wrepper
    7service.page(paga,wrepper)
     
     //教师条件查询
        @PostMapping("/quretearch/{current}/{limit}")
        public R quretearch(@ApiParam(name = "current",value = "当前页",required = true)@PathVariable Integer current,
                            @ApiParam(name = "limit",value = "记录数",required = true)@PathVariable Integer limit,
                            @RequestBody(required = false) TeacherQuery teacherQuery){
            Page<EduTeacher> tpage = new Page<>(current, limit);
            QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
            String name = teacherQuery.getName();
            Integer level = teacherQuery.getLevel();
            String begin = teacherQuery.getBegin();
            String end = teacherQuery.getEnd();
            if (!StringUtils.isEmpty(name)){
                wrapper.like("name",name);
    
            }
            if (!StringUtils.isEmpty(level)){
                wrapper.eq("level",level);
            }
            if (!StringUtils.isEmpty(begin)){
                wrapper.ge("gmt_create",begin);
            }
            if (!StringUtils.isEmpty(end)){
                wrapper.le("gmt_create",end);
            }
    
            serviceImpl.page(tpage,wrapper);
            long total = tpage.getTotal();
            List<EduTeacher> list = tpage.getRecords();
            return R.ok().date("total",total).date("rows",list);
        }
  6. 添加一个讲师
    1将讲师类封装成一个对象通过@RequsetBody接收
    2对象属性中添加@TableField(fill = FieldFill.INSERT)注解
    3在service_util中添加自动填充配置类
    4在service pom中引入service_util依赖(在主启动类中设置compentscan(basepack=“”)注解)确保配置类能被扫描到

    @ApiModelProperty(value = "创建时间")
        @TableField(fill = FieldFill.INSERT)
        private Date gmtCreate;
    
        @ApiModelProperty(value = "更新时间")
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date gmtModified;


    3设置时间自动填充(在service_base中设置自动填充配置类)


    4在了service pom中引入 service_base 依赖(主启动类上添加@componentScan(basepackages={"com.liu}))

    service,save根据返回值判断是否成功

     @PostMapping("addTeacher")
        public R add(@RequestBody(required = false) EduTeacher eduTeacher){
    
            boolean b = serviceImpl.save(eduTeacher);
            if (b){
                return R.ok();
            }else {
                return R.error();
            }
        }
  7. 通过id查询讲师
     

    //通过id查询讲师
        @GetMapping("{id}")
        public R getid(@PathVariable String id){
            EduTeacher eduTeacher = serviceImpl.getById(id);
            return R.ok().date("rows",eduTeacher);
        }


     

  8. 修改讲师
    1将讲师封装成一个对象传入
    2service。updateByid修改
     

     //修改讲师
        @PostMapping("update")
        public R updateById(@RequestBody EduTeacher eduTeacher){
    
            boolean b = serviceImpl.updateById(eduTeacher);
            if (b){
                return R.ok();
            }else {
                return R.error();
            }
    


     

    1. 统一异常管理
      1在common_util中创建一个Exception的包
      2创建cexceptioHandler类继承(增加AdviceException注解)
      3创建一个方法(方法参数是要接收的异常的类)(类可以自己定义继承异常类)
      4方法上@ExceptionHandler(Exception.class) (与注解的类一致)
      5返回对象R将捕获的异常信息封装到类中
      6全局异常
      7特定异类(自定义异常)先定异常类 在程序中捕获抛出异常(自动接收)


    2. 捕获抛出自定义异常

       

    3. 全局日志处理
      1日志级别 error>warn>info>debug
      2spring boot设置日志级别logging.level.root=日志级别
      3设置全局日志级别(
          先将所有关于日志的设置关闭
           在resouce创建一个logback.xml(设置日志输入目录和日志格式)

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration  scan="true" scanPeriod="10 seconds">
          <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
          <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
          <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
          <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
      
          <contextName>logback</contextName>
          <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
          <property name="log.path" value="E:/学习/1尚骨粒/aaa"/>
      
          <!-- 彩色日志 -->
          <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
          <!-- magenta:洋红 -->
          <!-- boldMagenta:粗红-->
          <!-- cyan:青色 -->
          <!-- white:白色 -->
          <!-- magenta:洋红 -->
          <property name="CONSOLE_LOG_PATTERN"
                    value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
      
      
          <!--输出到控制台-->
          <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
              <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
              <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 -->
              <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                  <level>INFO</level>
              </filter>
              <encoder>
                  <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                  <!-- 设置字符集 -->
                  <charset>UTF-8</charset>
              </encoder>
          </appender>
      
      
          <!--输出到文件-->
      
          <!-- 时间滚动输出 level为 INFO 日志 -->
          <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <!-- 正在记录的日志文件的路径及文件名 -->
              <file>${log.path}/log_info.log</file>
              <!--日志文件输出格式-->
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                  <charset>UTF-8</charset>
              </encoder>
              <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <!-- 每天日志归档路径以及格式 -->
                  <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                      <maxFileSize>100MB</maxFileSize>
                  </timeBasedFileNamingAndTriggeringPolicy>
                  <!--日志文件保留天数-->
                  <maxHistory>15</maxHistory>
              </rollingPolicy>
              <!-- 此日志文件只记录info级别的 -->
              <filter class="ch.qos.logback.classic.filter.LevelFilter">
                  <level>INFO</level>
                  <onMatch>ACCEPT</onMatch>
                  <onMismatch>DENY</onMismatch>
              </filter>
          </appender>
      
          <!-- 时间滚动输出 level为 WARN 日志 -->
          <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <!-- 正在记录的日志文件的路径及文件名 -->
              <file>${log.path}/log_warn.log</file>
              <!--日志文件输出格式-->
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                  <charset>UTF-8</charset> <!-- 此处设置字符集 -->
              </encoder>
              <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                      <maxFileSize>100MB</maxFileSize>
                  </timeBasedFileNamingAndTriggeringPolicy>
                  <!--日志文件保留天数-->
                  <maxHistory>15</maxHistory>
              </rollingPolicy>
              <!-- 此日志文件只记录warn级别的 -->
              <filter class="ch.qos.logback.classic.filter.LevelFilter">
                  <level>warn</level>
                  <onMatch>ACCEPT</onMatch>
                  <onMismatch>DENY</onMismatch>
              </filter>
          </appender>
      
      
          <!-- 时间滚动输出 level为 ERROR 日志 -->
          <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <!-- 正在记录的日志文件的路径及文件名 -->
              <file>${log.path}/log_error.log</file>
              <!--日志文件输出格式-->
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                  <charset>UTF-8</charset> <!-- 此处设置字符集 -->
              </encoder>
              <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
              <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                  <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                      <maxFileSize>100MB</maxFileSize>
                  </timeBasedFileNamingAndTriggeringPolicy>
                  <!--日志文件保留天数-->
                  <maxHistory>15</maxHistory>
              </rollingPolicy>
              <!-- 此日志文件只记录ERROR级别的 -->
              <filter class="ch.qos.logback.classic.filter.LevelFilter">
                  <level>ERROR</level>
                  <onMatch>ACCEPT</onMatch>
                  <onMismatch>DENY</onMismatch>
              </filter>
          </appender>
      
          <!--
              <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
              <logger>仅有一个name属性,
              一个可选的level和一个可选的addtivity属性。
              name:用来指定受此logger约束的某一个包或者具体的某一个类。
              level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
                    如果未设置此属性,那么当前logger将会继承上级的级别。
          -->
          <!--
              使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
              第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
              第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:
           -->
          <!--开发环境:打印控制台-->
          <springProfile name="dev">
              <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
              <logger name="com.guli" level="INFO" />
      
              <!--
                  root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
                  level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
                  可以包含零个或多个appender元素。
              -->
              <root level="INFO">
                  <appender-ref ref="CONSOLE" />
                  <appender-ref ref="INFO_FILE" />
                  <appender-ref ref="WARN_FILE" />
                  <appender-ref ref="ERROR_FILE" />
              </root>
          </springProfile>
      
      
          <!--生产环境:输出到文件-->
          <springProfile name="pro">
      
              <root level="INFO">
                  <appender-ref ref="CONSOLE" />
                  <appender-ref ref="DEBUG_FILE" />
                  <appender-ref ref="INFO_FILE" />
                  <appender-ref ref="ERROR_FILE" />
                  <appender-ref ref="WARN_FILE" />
              </root>
          </springProfile>
      
      </configuration>
      


            在异常处理类中设置一个输出日志的断点将固定的异常输出到指定文件目录(logger.error.(信息))
         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值