当前位置:网站首页>做项目,你需要。。。【持续更新】
做项目,你需要。。。【持续更新】
2022-08-07 16:42:00 【胡桃姓胡,蝴蝶也姓胡】
准备工作
填写配置文件application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/reggie?characterEncoding=utf-8
username: root
password: Bao1417165487
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
server:
port: 8080
目录层级

Common层
对象映射器
package com.example.reggie_delivery.common;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
/** * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] */
// 将 较大值的Long类型数据 传到前端,可能会造成数值的精度丢失,将Long类型数据转化为字符串再传到前端就可以解决该问题
// 同时,在WebMvcConfig中 添加消息转换方法extendMessageConverters(List<HttpMessageConverter<?>> converters)
public class JacksonObjectMapper extends ObjectMapper {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public JacksonObjectMapper() {
super();
//收到未知属性时不报异常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化时,属性不存在的兼容处理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(BigInteger.class, ToStringSerializer.instance)
.addSerializer(Long.class, ToStringSerializer.instance)
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//注册功能模块 例如,可以添加自定义序列化器和反序列化器
this.registerModule(simpleModule);
}
}
什么时候会用到对象映射器?
当我们做项目的时候,经常会发现,id被加密成了一个很大的数字。
但是js只能保证前16位的精确,所以这个时候我们需要将数字转换成字符串,这个时候我们用到这个通用类,以后可以随时拿过来用。
统一返回结果
@Data
public class R<T> implements Serializable {
private Integer code;
private String msg;
private T data;
private Map map = new HashMap();
public static <T> R<T> success(T object) {
R<T> res = new R<>();
res.code = 1;
res.data = object;
return res;
}
public static <T> R<T> error(String msg) {
R<T> res = new R<>();
res.msg = msg;
res.code = 0;
return res;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
全局异常处理器
@Slf4j
@ResponseBody // 将结果封装成JSON数据并且返回
@ControllerAdvice(annotations = {
RestController.class, Controller.class})
public class GlobalExceptionHandler {
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException e) {
log.info(e.getMessage());
if (e.getMessage().contains("Duplicate entry")) {
String[] split = e.getMessage().split(" ");
String msg = split[2] + "已存在";
return R.error(msg);
}
return R.error("操作失败");
}
}
公共字段自动填充器
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]....");
metaObject.setValue("createTime" , LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("createUser", BaseContext.getCurrentId());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充[update]");
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser", BaseContext.getCurrentId());
}
}
这里就需要使用到ThreadLocal来获取用户的id,我们再创建一个通用工具类,BaseContext
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new InheritableThreadLocal<>();
public static void setCurrentId(Long id) {
threadLocal.set(id);
}
public static Long getCurrentId() {
return threadLocal.get();
}
}
在过滤器里面获取id
Config层
静态资源映射
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.warn("开始进行静态资源映射======");
registry.addResourceHandler("/backend/**")
.addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**")
.addResourceLocations("classpath:/front/");
}
}

如果你没有放在系统默认的static或者template里面的话,就需要进行静态资源映射。
拦截器
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
使用分页查询需要添加这个PaginationInnerInterceptor()拦截器
pom文件大全
<dependencies>
//StringUtils.isNotEmpty()需要用到这个jar包,这个东西用来判断是否为空
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
// JSON.toJSONString()需要用到这个jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
// 这里必须要使用1.1.21版本,不然的话LocalDataTime不支持。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
边栏推荐
- minium小程序自动化测试
- Is it safe to open a stock account with mobile phone registration? Do you need money? How to open an account?
- R语言ggplot2可视化:使用ggpubr包的ggtexttable函数可视化表格数据(直接绘制表格图或者在图像中添加表格数据)、使用tab_add_title为表格数据添加副标题(subtitle
- mysql5.7 implements the sorting function within the group after grouping ROW_NUMBER() OVER (PARTITION BY)
- R语言ggplot2可视化:使用patchwork包将多个ggplot2可视化结果组合起来、使用plot_spacer函数在组合结果图像中的指定位置加入空白区域(不包含任何内容,纯粹空白图)
- 技术岗面试中的一些常见问题
- Xiao sir___Interview employment class__Non-technical interview questions
- LeetCode_796_旋转字符串
- 【论文理解】Batch Normalization论文中关于BN背景和减少内部协变量偏移的解读(论文第1、2节)
- What is the development of the spot options contract exchange system丨Detailed technology for the development of the spot options contract exchange system
猜你喜欢

【kali-权限提升】(4.1)假冒令牌攻击、本地提权:流程

【论文理解】Batch Normalization论文中关于BN背景和减少内部协变量偏移的解读(论文第1、2节)

Analysis of various related architectures of MCU

A brief description of the function stack

【论文翻译和解释(2)】LOF:Identifying Density-Based Local Outliers论文精读

Implementation analysis of 1325_FreeRTOS queue sending function
![[21-day learning challenge] data manipulation of doubly linked list](/img/58/477f11ff4186a22d915eff35ee9e8c.png)
[21-day learning challenge] data manipulation of doubly linked list

Why are test/dev programmers paid so much?

【数学建模】matlab向量(数组)

【kali-权限提升】(4.2)社会工程学工具包(上):启动监听设置payload
随机推荐
873. 欧拉函数
熟练使用几个重要的内置函数
Why are test/dev programmers paid so much?
【论文翻译和解释(2)】LOF:Identifying Density-Based Local Outliers论文精读
R语言ggplot2可视化:使用ggpubr包的ggerrorplot函数可视化水平误差线(orientation)、设置add参数显示均值、error.plot参数显示误差条
R语言ggplot2可视化:使用ggpubr包的ggdotchart函数可视化分组克利夫兰点图(Cleveland dot)、自定义position参数设置不同分组的数据点分离(程度)
845. Eight Numbers
leetcode 485: Maximum number of consecutive 1s
Redis高频面试题完整版
The use of csv configuration elements in jmter
详解中断系统
Oracle commonly used numeric functions
股票账户手机开户安全吗 同花顺开户靠谱吗
[21-day learning challenge] data manipulation of doubly linked list
pytorch save training log
ceph cluster
【经验贴-leetcode报错没头绪时的小妙招(非会员)】
第13章_事务基础知识
R语言ggplot2可视化:使用patchwork包将多个ggplot2可视化结果组合起来、使用plot_spacer函数在组合结果图像中的指定位置加入空白区域(不包含任何内容,纯粹空白图)
from . import XXX