基于SSM的订餐系统---公共字段自动填充简化开发

问题分析

我们已经完成了后台系统的员工管理功能开发,在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段、在编辑员工时需要修改时间和修改人等字段。这些字段属于公共字段,也就是很多表中都有这些字段。
员工管理界面:在这里插入图片描述新增员工:在这里插入图片描述
**问题:**可否对于公共字段在某个地方进行统一处理,来简化开发?
**解决方案:**使用Mybatis Plus中的公共字段填充功能。
实现步骤:
1.在实体类的属性上加入TableField注解,指定自动填充的策略
2.按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口

**问题:**在自动填充createUser和updateUser时设置的用户id需要动态获取当前登录用户id,在MyMetaObjectHandler类中不能获得HttpSession对象,所以即使登录时向HttpSession中存放了id,也无法从HttpSession获取id。
解决方案分析: ThreadLocal,客户端每发送一次请求,对应的服务端都会分配一个新的线程来处理,其中以下类中的方法属于同一个线程:
1.LoginCheckFilter的doFilter方法
2.EmployeeController的update方法
3.MyMetaObjectHandler的updateFill方法

可以在上述方法分别加入以下代码获取当前线程id:

long id = Thread.currentThread().getId();
log.info("线程id:{}",id);

会发现控制台输出的线程id都为35:

2022-04-18 14:03:22.522  INFO 15680 --- [nio-8080-exec-7] c.i.reggie.filter.LoginCheckFilter       : id=35
2022-04-18 14:03:22.525  INFO 15680 --- [nio-8080-exec-7] c.i.r.controller.EmployeeController      : id=35
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2c0a1ec8] was not registered for synchronization because synchronization is not active
2022-04-18 14:03:22.527  INFO 15680 --- [nio-8080-exec-7] c.i.reggie.common.MyMetaObjectHandler    : id=35

ThreadLocal并不是一个Thread,而是Thread的局部变量。当时用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立改变自己的副本,而不会影响其他线程所对应的副本。
ThreadLoca为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取对应的值,线程外则不能访问。

解决方案:我们可以在LoginCheckFilter的doFilter方法中获取当前用户登录的id,并用ThreadLocal的set方法设置当前线程的线程局部变量的值(用户id)。然后在MyMetaObjectHandler的updateFill方法中调用ThreadLocal的get方法来获得当前线程所对用的线程局部变量的值(用户id)。

实现步骤:
1.编写BaseContext工具类,基于ThreadLocal封装的工具类
2.在LoginCheckFilter中的doFilrer方法中调用BaseContext来设置当前登录用户的id
3.在MyMetaObjectHandler的方法中调用BaseContext来获取登录用户的id

代码实现

entity:

@Data
public class Employee implements Serializable {
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
}

BaseContext:

/**
 * 基于ThreadLoacl封装工具类,用户保存和获取当前登录用户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();
    }
}

LoginCheckFilter:

 @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        Long empId = (Long) request.getSession().getAttribute("employee");
        BaseContext.setCurrentId(empId);
        filterChain.doFilter(request,response); //放行
        }
}

MyMetaObjectHandler:

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("createUser",BaseContext.getCurrentId());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
    /**
     * 更新自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着信息化的发展,电子人力资源管理系统(e-hr)成为了企业信息化建设的重要组成部分。本文针对ssm框架(Spring + SpringMVC + MyBatis)下的e-hr管理系统进行了设计与实现。 系统采用了B/S(浏览器/服务器)模式,前端采用HTML、CSS、JavaScript等技术,后端采用Spring框架作为控制反转的容器和AOP(面向切面编程)的框架,SpringMVC框架作为请求的分发器,MyBatis框架作为持久化框架,实现了基于Web的电子人力资源管理。 系统主要功能包括: 1.用户管理:实现新建、删除、修改、查询用户信息的功能。 2.部门管理:实现部门的管理和查询功能。 3.员工管理:实现员工的管理和查询功能。 4.考勤管理:实现考勤记录的管理和查询功能。 5.薪酬管理:实现薪酬计算和统计功能。 6.培训管理:实现培训计划制定和实施情况的查询。 7.绩效管理:实现绩效考核的制定和绩效报告的查询。 在具体实现过程中,我采用了Maven作为项目管理工具,并使用Git作为版本控制工具,保证了项目组合作的高效性。此外,我还在代码编写阶段,注重使用了面向对象的编程思想,提高了代码的可扩展性和可维护性。 综上所述,该e-hr管理系统基于ssm框架,以其良好的组合、普遍的适用性和效率较高的特点,实现了基于Web的电子人力资源管理,为企业管理和人力资源管理提供了便利,同时提高了信息化运营的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值