尚硅谷的尚融宝项目

时间:2023-02-11 18:53:45

先建立一个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());
}

放在這裏尚硅谷的尚融宝项目