Skip to content

新增员工


EmployeeController

java
/**
 * 新增员工
 * @param employeeDTO
 * @return
 */
@PostMapping
@ApiOperation("新增员工")
public Result save(@RequestBody EmployeeDTO employeeDTO){
    log.info("新增员工:{}",employeeDTO);
    employeeService.save(employeeDTO);//该方法后续步骤会定义
    return Result.success();
}

EmployeeService

java
/**
 * 新增员工
 * @param employeeDTO
 */
void save(EmployeeDTO employeeDTO);

EmployeeServiceImpl

⭐ 工具类补充

BeanUtils.copyProperties(A,B):对象属性拷贝,把 A 对象的属性拷贝到 B 对象中

DigestUtils.md5DigestAsHex( "密码" . getBytes( ) ):对字符串进行 md5 加密

代码实现

java
/**
 * 新增员工
 *
 * @param employeeDTO
 */
public void save(EmployeeDTO employeeDTO) {
    Employee employee = new Employee();

    //对象属性拷贝
    BeanUtils.copyProperties(employeeDTO, employee);

    //设置账号的状态,默认正常状态 1表示正常 0表示锁定
    employee.setStatus(StatusConstant.ENABLE);

    //设置密码,默认密码123456
    employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));

    //设置当前记录的创建时间和修改时间
    employee.setCreateTime(LocalDateTime.now());
    employee.setUpdateTime(LocalDateTime.now());

    //设置当前记录创建人id和修改人id
    employee.setCreateUser(10L);//目前写个假数据,后期修改
    employee.setUpdateUser(10L);

    employeeMapper.insert(employee);//后续步骤定义
}

EmployeeMapper

开启驼峰命名

在 application.yml 中已开启驼峰命名,故 id_number 和 idNumber 可对应。

yml
mybatis:
  configuration:
    #开启驼峰命名
    map-underscore-to-camel-case: true

代码实现

java
/**
 * 插入员工数据
 * @param employee
 */
@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +
        "values " +
        "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")
void insert(Employee employee);

代码完善

处理重名异常

通过全局异常处理器来处理,进入到 sky-server 模块,com.sky.hander 包下,GlobalExceptionHandler.java 添加方法

java
/**
 * 处理SQL异常
 * @param ex
 * @return
 */
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
    //Duplicate entry 'zhangsan' for key 'employee.idx_username'
    String message = ex.getMessage();
    if(message.contains("Duplicate entry")){
        String[] split = message.split(" ");
        String username = split[2];
        String msg = username + MessageConstant.ALREADY_EXISTS;
        return Result.error(msg);
    }else{
        return Result.error(MessageConstant.UNKNOWN_ERROR);
    }
}

封装 Threadlocal

java
package com.sky.context;

public class BaseContext {

    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

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

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

    public static void removeCurrentId() {
        threadLocal.remove();
    }

}

获取员工 id

在原先的代码中,新增员工时,创建人 id 和修改人 id 设置为固定值,这里可以通过 Threadlocal 实现

(1)在 sky-server 模块中,拦截器

java
package com.sky.interceptor;

/**
 * jwt令牌校验的拦截器
 */
@Component
@Slf4j
public class JwtTokenAdminInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 校验jwt
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

		//.............................

        //2、校验令牌
        try {
            //.................
            Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
            Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());
            log.info("当前员工id:", empId);
            /////将用户id存储到ThreadLocal////////
            BaseContext.setCurrentId(empId);
            ////////////////////////////////////
            //3、通过,放行
            return true;
        } catch (Exception ex) {
            //......................
        }
    }
}

(2)在 Service 中获取线程局部变量中的值

java
/**
 * 新增员工
 *
 * @param employeeDTO
 */
public void save(EmployeeDTO employeeDTO) {
    //.............................

    //设置当前记录创建人id和修改人id
    employee.setCreateUser(BaseContext.getCurrentId());//目前写个假数据,后期修改
    employee.setUpdateUser(BaseContext.getCurrentId());

    employeeMapper.insert(employee);
}