先建立一个Maven
springboot项目
进来先把src删掉,因为是一个父项目,我们删掉src之后,pom里配置的东西,也能给别的模块使用。
 
 改一下springboot的版本号码
加入依赖和依赖管理:
<properties>
    <java.version>1.8</java.version>
    <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    <mybatis-plus.version>3.4.1</mybatis-plus.version>
    <velocity.version>2.0</velocity.version>
    <swagger.version>2.9.2</swagger.version>
    <swagger-bootstrap-ui.version>1.9.2</swagger-bootstrap-ui.version>
    <commons-lang3.version>3.9</commons-lang3.version>
    <commons-fileupload.version>1.3.1</commons-fileupload.version>
    <commons-io.version>2.6</commons-io.version>
    <alibaba.easyexcel.version>2.1.1</alibaba.easyexcel.version>
    <apache.xmlbeans.version>3.1.0</apache.xmlbeans.version>
    <fastjson.version>1.2.28</fastjson.version>
    <gson.version>2.8.2</gson.version>
    <json.version>20170516</json.version>
    <aliyun-java-sdk-core.version>4.3.3</aliyun-java-sdk-core.version>
    <aliyun-sdk-oss.version>3.10.2</aliyun-sdk-oss.version>
    <jodatime.version>2.10.1</jodatime.version>
    <jwt.version>0.7.0</jwt.version>
    <httpclient.version>4.5.1</httpclient.version>
</properties>
 <dependencyManagement>
    <dependencies>
        <!--Spring Cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${
   spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--Spring Cloud Alibaba-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${
   spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${
   mybatis-plus.version}</version>
        </dependency>
        <!--mybatis-plus 代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${
   mybatis-plus.version}</version>
        </dependency>
        <!-- Mybatis Plus 代码生成器模板引擎,  -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>${
   velocity.version}</version>
        </dependency>
        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${
   swagger.version}</version>
        </dependency>
        <!--swagger ui-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${
   swagger.version}</version>
        </dependency>
        <!--swagger-bootstrap-ui-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>${
   swagger-bootstrap-ui.version}</version>
        </dependency>
        <!--commons-lang3-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${
   commons-lang3.version}</version>
        </dependency>
        <!--文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>${
   commons-fileupload.version}</version>
        </dependency>
        <!--commons-io-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${
   commons-io.version}</version>
        </dependency>
        <!--excel解析-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>${
   alibaba.easyexcel.version}</version>
        </dependency>
        <!--excel解析依赖-->
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>${
   apache.xmlbeans.version}</version>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${
   fastjson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>${
   json.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>${
   gson.version}</version>
        </dependency>
        <!--阿里云SDK远程调用-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>${
   aliyun-java-sdk-core.version}</version>
        </dependency>
        <!--阿里云文件管理-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>${
   aliyun-sdk-oss.version}</version>
        </dependency>
        <!--日期时间工具-->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>${
   jodatime.version}</version>
        </dependency>
        <!--jwt工具-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${
   jwt.version}</version>
        </dependency>
        <!--httpclient-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>${
   httpclient.version}</version>
        </dependency>
        
        
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
 创建硅谷comment
创建一个工具模块。
创建一个Maven项目就ok了
是个WEB项目,guigu-common的pom里,需要加上web依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--lombok用来简化实体类:需要安装lombok插件-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
创建模块service-base
1、创建Maven模块
 在srb下创建普通maven模块
 Group:com.atguigu
 Artifact:service-base
在service-base里面引入依赖
 引入独立的依赖
service-core
在srb下创建普通maven模块
 Group:com.atguigu
 Artifact:service-core
依赖
<dependencies>
    <dependency>
        <groupId>com.atguigu</groupId>
        <artifactId>service-base</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
    </dependency>
    <!--mybatis-plus 代码生成器-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
    </dependency>
    <!-- Mybatis Plus 代码生成器模板引擎,  -->
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-engine-core</artifactId>
    </dependency>
</dependencies>
 积分接口
 
积分等级表
 控制管理員登錄的controller
 
@CrossOrigin   //检查跨域
@RestController
@RequestMapping("/admin/core/integralGrade")
public class AdminIntegralGradeController {
   
    @Resource
    private IntegralGradeService integralGradeService;
    @GetMapping("/list")
    public List<IntegralGrade> listAll(){
   
        return integralGradeService.list();
    }
}
檢查好跨域和注解
 启动起来访问一下试试
 
在这里插入代码片
为了使用方便,统一给数据定义一个返回值
{
   
  "code": 数字, //业务响应码
  "message": 字符串, //返回消息
  "data": 对象 //返回数据
}
使用枚举的方式实现这一点。
 
在这个下面定义
 
 注意包名字要能被掃描進入
package com.atguigu.srb;
//枚举
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
@Getter
@AllArgsConstructor
@ToString
public enum ResponseEnum {
   
    SUCCESS(-1,"成功"),
    ERROR(0,"成功");
    //枚举成员之间用逗号
    //枚举类型,没办法用DATA
    private Integer code;
    private String message;//枚举中的变量
}
 先弄个枚举,用来代表特定值。
然后设置R值,我们返回给前端的东西通通通过R值进行返回。
package com.atguigu.srb;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class R {
   
    //的三个部分中,有一个是一个对象比较好
    private Integer code;
    private String message;
    private Map<String,Object> data = new HashMap<>();
    private R(){
   }
    //表示返回成功
    public static R ok(){
   
        R r = new R();
        r.setCode(ResponseEnum.SUCCESS.getCode());
        r.setMessage(ResponseEnum.SUCCESS.getMessage());
        return r;
    }
    //表示返回失败
    public static R error(){
   
        R r = new R();
        r.setCode(ResponseEnum.ERROR.getCode());
        r.setMessage(ResponseEnum.ERROR.getMessage());
        return r;
    }
    //表示返回别的可能
    //传递一个别的参数进来
    public static R setResult(ResponseEnum responseEnum){
   
        //参数是枚举类型的
        R r = new R();
        r.setCode(responseEnum.getCode());
        r.setMessage(responseEnum.getMessage());
        return r;
    }
}
 R的对象用MAP,毕竟灵活一些。
package com.atguigu.srb;
//枚举
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
@Getter
@AllArgsConstructor
@ToString
public enum ResponseEnum {
   
    SUCCESS(-1,"成功"),
    ERROR(0,"服务器内部问题");
    //枚举成员之间用逗号
    //枚举类型,没办法用DATA
    private Integer code;
    private String message;//枚举中的变量
}
 先用枚举定义一些特殊数据如何处理
然后用R来定义返回状态
返回状态中
 返回码和message都是可以通过枚举,定义的,然后如果我们返回成功了,那么就要设置个ok函数,方便调用,ok函数,实际上,就是讲枚举中的成功码注入进去了,改变了code和message值
如果返回失败了,就要返回给error函数,同理,然后我们再写一个注入R的数据值。
package com.atguigu.srb;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class R {
   
    //的三个部分中,有一个是一个对象比较好
    private Integer code;
    private String message;
    private Map<String,Object> data = new HashMap<>();
    private R(){
   }
    //表示返回成功
    public static R ok(){
   
        //r一旦调用这个函数,就说明内部的三个值被设置好了
        R r = new R();
        r.setCode(ResponseEnum.SUCCESS.getCode());
        r.setMessage(ResponseEnum.SUCCESS.getMessage());
        return r;
    }
    //表示返回失败
    public static R error(){
   
        R r = new R();
        r.setCode(ResponseEnum.ERROR.getCode());
        r.setMessage(ResponseEnum.ERROR.getMessage());
        return r;
    }
    //表示返回别的可能
    //传递一个别的参数进来
    public static R setResult(ResponseEnum responseEnum){
   
        //参数是枚举类型的
        R r = new R();
        r.setCode(responseEnum.getCode());
        r.setMessage(responseEnum.getMessage());
        return r;
    }
    public R data(String name,Object value){
   
        //往R里装数据,将R的data通过这个函数装上数据,然后返回回去
        this.data.put(name,value);
        return this;
    }
}
 后面应用的时候,所有函数,必须返回的是R值
package com.atguigu.srb.core.controller.admin;
import com.atguigu.srb.R;
import com.atguigu.srb.core.pojo.entity.IntegralGrade;
import com.atguigu.srb.core.service.IntegralGradeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
 * 积分等级表 前端控制器
 * </p>
 *
 * @author Helen
 * @since 2023-02-08
 */
@Api(tags = "积分等级管理")
@CrossOrigin   //检查跨域
@RestController
@RequestMapping("/admin/core/integralGrade")
public class AdminIntegralGradeController {
   
    @Resource
    private IntegralGradeService integralGradeService;
    @Resource
    private R r;
    //把r注入进来也行
    @GetMapping("/list")
    public R listAll(){
   
        List<IntegralGrade> list = integralGradeService.list();
        //将数据交给R进行返回
        //先进行判空操作
        if(list != null ){
   
            r.ok().data("list",list);//之所以前面都是静态的,是为了不创建对象,不产生耦合
            //ok返回的都是r对象也是为了能串联到一起去,形成一个串
        }
        return  r;
    }
    //代表从浏览器给个数据
    @ApiOperation(value = "根据id删除")
    @DeleteMapping("/remove/{id}")
    public boolean removeById(@PathVariable Long id){
   
        return integralGradeService.removeById(id);
    }
}
 简单来说,就是将结果直接包装成R样子,然后R的ok和error直接调用R的函数,就不要包装饿了。
异常切面
在主要业务之外,统一管理异常
 
 加上注解之后,所有异常都过来了
 增加扫描范围

package com.atguigu.srb.exception;
import com.atguigu.srb.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class HandlerException {
   
    @ExceptionHandler(value = Exception.class)
    public R handleException(Exception e){
   
        log.error(e.getMessage(),e);
        return R.error(); 
    }
}
 捕捉特殊异常
    //专门特意捕获这个异常
    @ExceptionHandler(BadSqlGrammarException.class)
    public R handleBadSqlGrammarException(BadSqlGrammarException e){
   
        log.error(e.getMessage(), e);
                                        //这个是我们在result的枚举里添加的异常
        return R.setResult(ResponseEnum.BAD_SQL_GRAMMAR_ERROR);
    }

自定義異常
必须是运行时异常,而且我们要继承运行时异常
自己定义一个异常,我们可以可以随时把这个异常抛出去,中断交易

 我們在交易中出現問題,可以直接把異常跑出去,中斷掉程序
我们自己定义了个异常类:
 一定要继承运行时异常方法
 
 別忘記設計捕獲
 
controller
controller上层异常

批量處理,直接複製就行
/**
     * Controller上一层相关异常
     */
@ExceptionHandler({
   
    NoHandlerFoundException.class,
    HttpRequestMethodNotSupportedException.class,
    HttpMediaTypeNotSupportedException.class,
    MissingPathVariableException.class,
    MissingServletRequestParameterException.class,
    TypeMismatchException.class,
    HttpMessageNotReadableException.class,
    HttpMessageNotWritableException.class,
    MethodArgumentNotValidException.class,
    HttpMediaTypeNotAcceptableException.class,
    ServletRequestBindingException.class,
    ConversionNotSupportedException.class,
    MissingServletRequestPartException.class,
    AsyncRequestTimeoutException.class
        })
public R handleServletException(Exception e) {
   
    log.error(e.getMessage(), e);
    //SERVLET_ERROR(-102, "servlet请求异常"),
    return R.error().message(ResponseEnum.SERVLET_ERROR.getMessage()).code(ResponseEnum.SERVLET_ERROR.getCode());
}
 放在這裏
转载:https://blog.csdn.net/qq_40707269/article/details/128936459
 
					