瑞吉点餐:Gitee地址
此项目我大致分成九个部分。分别为:
- 公共部分
- 员工管理
- 菜品分类管理
- 菜品管理
- 套餐管理
- 订单管理
- 用户管理
- 用户地址管理
- 用户的购物车管理
首先,先准备好公共部分代码
(一)线程本地存储
ThreadLocal是线程的局部变量,这些变量只能在这个线程内被读写,在其他线程内是无法访问的。 ThreadLocal 定义的通常是与线程关联的私有静态字段(例如,用户ID或事务ID)。比如用来存储用户 Session。Session 的特性很适合 ThreadLocal ,因为 Session 之前当前会话周期内有效,会话结束便销毁。
public class BaseContext {
private static final ThreadLocal<Long> THREAD_LOCAL = new ThreadLocal<>();
/**
* 将登录成功的员工id存入到ThreadLocal中
* @param id
*/
public static void setCurrentId(Long id){
THREAD_LOCAL.set(id);
}
/**
* 从ThreadLocal中获取当前线程共享的登录用户id
* @return
*/
public static Long getCurrentId(){
return THREAD_LOCAL.get();
}
}
(二)对象映射器
-
对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
-
将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
-
从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
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);
}
}
(三)MyBatisPlus分页拦截器
@Configuration
public class MPConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor