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