尚硅谷的尚融宝项目
先建立一个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 {@Resourceprivate 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,"成功");//枚举成员之间用逗号//枚举类型,没办法用DATAprivate 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,"服务器内部问题");//枚举成员之间用逗号//枚举类型,没办法用DATAprivate 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 {@Resourceprivate IntegralGradeService integralGradeService;@Resourceprivate 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());
}
放在這裏