【黑马】Java项目实战【苍穹外卖】Day02

新增员工

需求分析和设计

管理端/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.通过前后端联调测试

代码完善

存在问题:

  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

员工分页查询

需求分析和设计

  1. 根据页码展示员工信息
  2. 每页展示10条数据
  3. 分页查询时可以根据需要,输入员工姓名进行查询

代码开发

 @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>

功能测试

代码完善

编辑员工

需求分析和设计

  1. 根据id查询员工信息
  2. 编辑员工信息

代码开发

根据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);
    }

功能测试

代码完善

导入分类模块功能代码

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值