瑞吉外卖day3

1 公共字段自动填充

问题分析:

数据库表的设计都包含create_time、update_time、create_user、update_user,当我们需要进行修改操作的时候,很多表中都有这样的字段,这些字段可以归列为公共字段:能不能让这些字段在某个地方统一处理,来简化开发?

答案就是使用mybatisplus提供的公共字段自动填充

mybatisplus公共字段自动填充:就是在插入或者更新的时候指定字段赋予指定的值,避免代码重复

实现步骤:

1、在实体类的属性上加入@TableField,指定自动填充策略

2、按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjecHandler接口

2 改造员工信息修改方法

删除原有赋值语句,创建公共类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class MyMetaObjectHandler implements MetaObjectHandler {

//插入操作填充
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充Insert...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("createUser",new Long(1));
metaObject.setValue("updateUser",new Long(1));
}

//更新操作填充
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充update...");
log.info(metaObject.toString());
metaObject.setValue("updateTime", LocalDateTime.now());
metaObject.setValue("updateUser",new Long(1));
}
}

但是这样有一个问题:创建者和修改者信息是写死的,正常应该是谁去修改就填充谁的信息,有一种解决思路是:获取http请求中的session来赋值,但是metaObjectHandler中是不能获得httpsession对象的,所以只能使用以下方法来获取登陆用户id。

可以使用ThreadLocal来解决,这是JDK中的一个类

看完3之后,可以这样解决:

在LoginCheckFilter中的doFilter方法中获取当前用户登录的id,然后调用ThreadLocal的set方法将用户id赋值,然后在MyMetaObjectHandler中的updateFill方法中调用ThreadLocal的get方法取值。

实现步骤:

1、编写BaseContext工具类,基于ThreadLocal封装的工具类

2、在LoginCheckFilter的doFilter中调用赋值

3、在MyMetaObjectHandler中调用取值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 用于保存和获取当前用户登录的id
*/
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

public static void setCurrentId(Long id){
threadLocal.set(id);
}

public static Long getCurrentId(){
return threadLocal.get();
}
}

3 ThreadLocal学习

客户端每次发送http请求,服务端会分配一个新的线程来处理,在修改员工信息的功能中,经过以下类的是同一线程:

1、LoginCheckFilter的doFilter方法

2、EmployeeController的update方法

3、MyMetaObjectHandler的updateFill方法

我们如何证明这一点?

可以在以上方法中使用thread.currentThread().getid();来获取当前线程id

1、什么是ThreadLocal

ThreadLocal并不是一个线程,而是线程的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立的更改自己的副本,并不会影响其他线程副本。

ThreadLocal为每个线程提供单独的存储空间,具有线程隔离的效果,只能在线程内取值

2、常用方法

1
2
3
public void set(T value)		设置当前线程的线程局部变量值

public T get() 返回当前线程对应的局部变量值

4 新增分类功能

需求分析:

后台分类,包括两种类型,分别是菜品分类和套餐分类。当我们在后台系统中添加菜品时需要选择一个菜品分类,当我们在后台徐彤中添加一个套餐时需要选择一个套餐分类,在移动端也会按照菜品分类和套餐分类来展示对应的菜品和套餐

代码开发:

需要先将需要用到的类和接口基本结构创建好:

  • 实体类:Category
  • Mapper接口CategoryMapper
  • 业务层接口CategoryService
  • 业务层实现类CategoryServiceImpl
  • 控制层CategoryController

分析执行过程:

1.在页面上发送ajax请求,将新增的数据以json的数据返回给服务端

2.在服务端的Controller当中接受提交的数据,并调用Service进行保存

3.Service调用Mapper操作数据库,保存数据

5 分类信息的分页查询

代码开发:

1.页面发送ajax请求,将Page,PageSize以json的形式传入服务端

2.Controller层接受数据,并调用service层进行处理

3.service层操作mapper,保存到数据库当中

4.controller将数据会返回给页面

5.页面通过ElementUI的table组件显示分页效果

6 删除分类

需求分析:在分类管理列表页面,可以对某个分类进行删除操作,主要问题是当分类关联了菜品或者套餐时,此分类不能删除

代码开发:

1.页面发送ajax请求,将参数{id}提交到服务端

2.controller接受页面数据并调用service删除数据

4.servic调用mapper操作数据库

功能完善:

上面已经完成了删除功能,但是没有检查数据的分类是否关联了菜品或者套餐,所以需要以下操作:

菜品和套餐基本代码写好

7 修改分类

需求分析:在分类管理页面有修改按钮,点击之后会回显原来的数据,修改成功之后,还会要自动更新修改人、修改时间。