黑马苍穹外卖2 员工的增查改+异常处理+ThreadLocal

员工管理

新增员工

在这里插入图片描述
在这里插入图片描述
Controller:

  @PostMapping//post类型的请求
    @ApiOperation("添加员工")
    public Result save(@RequestBody EmployeeDTO employeeDTO) {
        log.info("新增员工{}", employeeDTO);
        employeeService.save(employeeDTO);
        return Result.success();
    }

代码完善–存在问题

在这里插入图片描述
问题1.控制台抛出异常,程序处理。使用全局异常处理器
处理sql异常 Duplicate entry 'zhangsan’ for key 'employee.idx username
全局异常处理器:GlobalExceptionHandler.java

@ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex) {
        //处理sql异常 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);//未知错误提示信息
        }
    }

问题2.
动态获取登录用户ID
先看一下基于JWT令牌认证流程
在这里插入图片描述
在这里插入图片描述

ThreadLocal

并不是一个thread,而是Thread的局部变量。
每个县城独享一份存储空间,具有线程隔离的效果,只有在县城内才能获取到对应的值,线程外不行。
客户端发起的每一次请求,Tomcat服务器会分配一个进程,然后单独的执行代码每次请求都是一个单独的线程
也就是在这个线程内能共享一份存储空间。
所以我们可以讲给当前用户ID存到这个空间内。
JwtTokenAdminInterceptor.java // JWT拦截器

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断当前拦截到的是Controller的方法还是其他资源
        if (!(handler instanceof HandlerMethod)) {
            //当前拦截到的不是动态方法,直接放行
            return true;
        }

        //1、从请求头中获取令牌
        String token = request.getHeader(jwtProperties.getAdminTokenName());

        //2、校验令牌
        try {
            log.info("jwt校验:{}", token);
            Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
            Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());
            log.info("当前员工id:{}", empId);
            BaseContext.setCurrentId(empId);//将ID放入线程空间
            //3、通过,放行
            return true;
        } catch (Exception ex) {
            //4、不通过,响应401状态码
            response.setStatus(401);
            return false;
        }
    }

上图就是调用这个方法类将员工ID存到当前线程空间中。
下图是添加员工信息Service中的方法实现,重点在于从线程空间取出登录用户ID

Service:

public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        //提交给数据库的最好是entity
        BeanUtils.copyProperties(employeeDTO, employee);//进行一个属性复制

        //填充字段
        employee.setStatus(StatusConstant.ENABLE);
        employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
        employee.setCreateTime(LocalDateTime.now());
       employee.setUpdateTime(LocalDateTime.now());

        //通过ThreadLocal获得当前用户的id
        employee.setCreateUser(BaseContext.getCurrentId());
       employee.setUpdateUser(BaseContext.getCurrentId());

        employeeMapper.insert(employee);
    }

员工分页查询

在这里插入图片描述在这里插入图片描述
Controller:

 @GetMapping("/page")//get类型的请求
    @ApiOperation("员工分页查询")
    public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO) {//数据不是json,不需要注解
        PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
        return Result.success(pageResult);
    }

PageHelper插件来辅助代码
Service:

@Override
    public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
        //select * from employee linit 0,10
        //调用PageHelper 开始分页查询                    页码,每页记录数
        PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
        Page<Employee> page = employeeMapper.selectByPage(employeePageQueryDTO);
        //返回的是Page
        //接下来处理一下,变成pageresult,需要两个参数
        long total = page.getTotal();
        List<Employee> result = page.getResult();
        return new PageResult(total, result);
    }

mapper:
不用注解,动态sql使用映射文件
在resource文件夹里都是xml文件

<select id="selectByPage" resultType="com.sky.entity.Employee">
        select * from employee
        <where>
            <if test="name!=null and name !='' ">
                and name like concat('%',#{name},'%') <!--模糊查询 like -->
            </if>
        </where>
        order by create_time desc <!--创建时间降序-->
</select>

在这里插入图片描述
方式一:在实体类里加

//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

方式二:扩展消息转换器,在配置类中
重写父类方法

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //创建一个消息转换器
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
        converter.setObjectMapper(new JacksonObjectMapper());
        //将自己的消息转化器加入容器中
        converters.add(0, converter);//0为索引,让这个转换器排前面
    }

启用禁用员工账号

在这里插入图片描述
Controller:

@PostMapping("/status/{status}")
    @ApiOperation("启用禁用员工账号")
    public Result startOrStop(@PathVariable("status") Integer status, Long id) {
        employeeService.startOrStop(status, id);
        return Result.success();
    }

Service:本质是修改员工Status 即update

public void startOrStop(Integer status, Long id) {
        Employee employee =//本质就是创建一个实体类对象
            Employee.builder()// 构建器对象
                .id(id)// 方法名和属性名一致
                .status(status)
                .build();
        employeeMapper.update(employee);
    }

根据主键动态修改,所以又到xml里

<!--因为在yml文件中声明了别名包的扫描,所以此处可以不使用全类名-->
    <update id="update" parameterType="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}
    </update>

编辑员工

在这里插入图片描述
在这里插入图片描述
查询员工信息:

@GetMapping("/{id}")
    @ApiOperation("根据Id查询员工")
    public Result<Employee> getById(@PathVariable Long id) {//加个路径参数的注解@PathVariable来得到id
        Employee employee = employeeService.getById(id);
        return Result.success(employee);
    }
@Override
    public Employee getById(Long id) {
        Employee employee = employeeMapper.getById(id);
        employee.setPassword("****");// 查出的密码,给前端传****
        return employee;
    }
@Select("select * from employee where id=#{id}")
    Employee getById(Long id);

编辑员工信息:

@PutMapping
    @ApiOperation("编辑员工信息")
    public Result update(@RequestBody EmployeeDTO employeeDTO) {
        employeeService.update(employeeDTO);
        return Result.success();
    }
public void update(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();//对象属性拷贝
        BeanUtils.copyProperties(employeeDTO,employee);

        employee.setUpdateTime(LocalDateTime.now());
        employee.setUpdateUser(BaseContext.getCurrentId());

        employeeMapper.update(employee);
    }

导入分类模块功能代码

在这里插入图片描述
直接粘贴到对应文件夹(在IDEA里操作)
导入完手动编译一下
在这里插入图片描述

相关推荐

  1. 黑马苍穹

    2024-06-18 14:20:05       9 阅读
  2. 苍穹项目(黑马)学习笔记

    2024-06-18 14:20:05       217 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 14:20:05       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 14:20:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 14:20:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 14:20:05       18 阅读

热门阅读

  1. 8D错漏件分析改进

    2024-06-18 14:20:05       5 阅读
  2. 编程连接主板:深入探索与实践的技术之旅

    2024-06-18 14:20:05       7 阅读
  3. 程序员做电子书产品变现的复盘(5)

    2024-06-18 14:20:05       5 阅读
  4. Halcon C++ XLD 数据写入图片

    2024-06-18 14:20:05       8 阅读
  5. webpack 自动清理 dist 文件夹的两种实现方法

    2024-06-18 14:20:05       6 阅读
  6. 生产环境下部署微调的10条戒律

    2024-06-18 14:20:05       6 阅读
  7. 常用原语介绍

    2024-06-18 14:20:05       6 阅读
  8. Redis内存数据库

    2024-06-18 14:20:05       5 阅读