新增员工
需求分析和设计
管理端/admin前缀;用户端/user前缀
代码开发
当前端提交数据与实体类中对应属性差别比较大时,使用DTO封装数据
public void save(EmployeeDTO employeeDTO) {
//DTO ====>Employee实体
Employee employee = new Employee();
//对象属性拷贝,原对象拷贝到目标对象,前提属性名一致
BeanUtils.copyProperties(employeeDTO,employee);
//设置状态可用,使用常量
employee.setStatus(StatusConstant.ENABLE);
//设置时间,当前系统时间
employee.setCreateTime(LocalDateTime.now());
employee.setUpdateTime(LocalDateTime.now());
//设置密码,默认密码123456,md5加密
employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
//设置当前记录创建人id和修改人id
//TODO 后期需要改为当前登录用户id,使用tlias所学解决?
employee.setCreateUser(10L);
employee.setUpdateUser(10L);
employeeMapper.insert(employee);
}
功能测试
1.通过接口文档测试(主要方式)
2.通过前后端联调测试
代码完善
存在问题:
- 录入用户名已存在,抛出异常没有处理
- 新增员工时,创建人id和修改人id设置为了固定值
解决:
一、新增异常处理方法,解决SQL异常
/**
* 处理SQL异常
* @param ex
* @return
*/
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
//Duplicate entry 'lisi' 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
客户端发起的每次请求都会是一个单独的线程,
ThreadLocal为Thread的局部变量,为每个线程单独提供一份存储空间,只有在线程内才能获取到对应值,线程外无法访问
前端的JWT令牌中会携带当前登录员工的ID,解析该ID后,调用threadLocal.set(id),存入当前用户ID,在service层调用threadLocal.get()取出当前用户ID
员工分页查询
需求分析和设计
- 根据页码展示员工信息
- 每页展示10条数据
- 分页查询时可以根据需要,输入员工姓名进行查询
代码开发
@Override
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
//select * from emp limit 0,10
//使用PageHelper开始分页查询
PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
Page<Employee> page= employeeMapper.pageQuery(employeePageQueryDTO);
//Page封装===>PageHelper
long total = page.getTotal();
List<Employee> records = page.getResult();
return new PageResult(total,records);
}
<mapper namespace="com.sky.mapper.EmployeeMapper">
<select id="pageQuery" resultType="com.sky.entity.Employee">
select * from employee
<where>
<if test="name != null and name != ''">
and name like concat('%',#{name},'%'})
</if>
</where>
order by create_time desc
</select>
</mapper>
功能测试
代码完善
存在问题:
日期数据,数据格式存在问题
解决:
一、在属性上加上注解,对日期进行格式化处理
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
二、在WebMVCConfiguration中扩展Spring MVC消息转换器,统一对日期类型进行格式化处理
/**
* 扩展spring MVC框架的消息转换器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("扩展消息转换器");
//创建消息转换器对象
MappingJackson2HttpMessageConverter converter =new MappingJackson2HttpMessageConverter();
//为消息转换器,设置一个对象转换器,对象转换器可以将Java对象序列化为Json数据
converter.setObjectMapper(new JacksonObjectMapper());
//将自己的消息转换器加入到容器中
converters.add(0,converter);//数字0 代表优先使用该转换器
}
启用禁用员工账号
需求分析和设计
代码开发
/**
* 启用禁用员工账号
*
* @param status
* @param id
* @return
*/
@Override
public void startOrStop(Integer status, Long id) {
// update employee set status = ? where id = ?
//为了通用性,创建实体类
// Employee employee = new Employee();
// employee.setStatus(status);
// employee.setId(id);
Employee employee = Employee.builder()
.status(status)
.id(id)
.build();
employeeMapper.update(employee);
}
<!-- 配置了扫描包type-aliases-package: com.sky.entity,此处可以写别名-->
<update id="update" parameterType="com.sky.entity.Employee">
update employee
<set>
<if test="name != null">
name = #{name},
</if>
<if test="username != null">
username = #{username},
</if>
<if test="password != null">
password = #{password},
</if>
<if test="phone != null">
phone = #{phone},
</if>
<if test="sex != null">
sex = #{sex},
</if>
<if test="idNumber != null">
id_Number = #{idNumber},
</if>
<if test="updateTime != null">
update_Time = #{updateTime},
</if>
<if test="updateUser != null">
update_User = #{updateUser},
</if>
<if test="status != null">
status = #{status},
</if>
</set>
<where>
id = #{id}
</where>
</update>
功能测试
代码完善
编辑员工
需求分析和设计
- 根据id查询员工信息
- 编辑员工信息
代码开发
根据id查询员工信息
/**
* 根据id查询员工
* @param id
* @return
*/
@GetMapping("/{id}")
@ApiOperation("根据id查询员工")
public Result<Employee> getById(@PathVariable Long id){
Employee employee = employeeService.getById(id);
return Result.success(employee);
}
public Employee getById(Long id) {
Employee employee = employeeMapper.getById(id);
//安全性处理
employee.setPassword("****");
return employee;
}
编辑员工信息
/**
* 编辑员工信息
* @param employeeDTO
* @return
*/
@PutMapping()
@ApiOperation("编辑员工信息")
public Result update(@RequestBody EmployeeDTO employeeDTO){//使用EmployeeDTO封装
log.info("编辑员工信息");
employeeService.update(employeeDTO);
return Result.success();
}
public void update(EmployeeDTO employeeDTO) {
//使用Mapper层的update方法==>动态SQL,但需要进行数据转换
//使用属性拷贝
// Employee employee = Employee.builder()
// .id(employeeDTO.getId())
// .username(employeeDTO.getUsername())
// .name(employeeDTO.getName())
// .phone(employeeDTO.getPhone())
// .sex(employeeDTO.getSex())
// .idNumber(employeeDTO.getIdNumber())
// .build();
Employee employee = new Employee();
//调用BeanUtils属性拷贝方法,前拷贝到后
BeanUtils.copyProperties(employeeDTO, employee);
//添加属性
employee.setUpdateTime(LocalDateTime.now());
employee.setUpdateUser(BaseContext.getCurrentId());
employeeMapper.update(employee);
}