springboot苍穹外卖实战:三、新增员工(JWT令牌校验失败+用户名重复+ThreadLocal获取用户id解决方案)

news2025/7/19 21:05:27

新增员工

根据前端传递参数列表设计DTO

当前端提交的数据和实体类中对应的属性差别比较大时,建议使用DTO来封装数据。进入sky-pojo模块,在com.sky.dto包下,已定义EmployeeDTO。

EmployeeController

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

EmployeeService接口

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

EmployeeServiceImpl

	/**
     * 新增员工
     *
     * @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

	/**
     * 插入员工数据
     * @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);

其实这里可以使用MybatisPlus进行改进。

测试

通过swagger页面进行接口测试,发现没有请求成功。
在这里插入图片描述

JWT令牌校验失败

通过调试发现是JWT令牌校验失败的原因(这部分可以去看原视频,过程不好用图文描述),解决方法:调用员工登录接口获得一个合法的JWT令牌,然后将其添加到全局参数中。
文档管理–>全局参数设置–>添加参数。
在这里插入图片描述
然后重启该swagger页面,发现测试成功。

用户名重复

Handler

com.sky.handler.GlobalExceptionHandler

 /**
     * 捕获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);
        }

    }

Constant

com.sky.constant.MessageConstant新增

public static final String ALREADY_EXISTS = "已存在";

获取用户id(ThreadLocal)

ThreadLocal介绍与常用方法

ThreadLocal 并不是一个Thread,而是Thread的局部变量。
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

  • public void set(T value) 设置当前线程的线程局部变量的值
  • public T get() 返回当前线程所对应的线程局部变量的值
  • public void remove() 移除当前线程的线程局部变量

定义ThreadLocal工具类

com.sky.context.BaseContext已经定义好

JwtTokenAdminInterceptor中设置id

com.sky.interceptor.JwtTokenAdminInterceptor

//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);
            //3、通过,放行

            BaseContext.setCurrentId(empId);

            
            return true;

EmployeeServiceImpl中获取id

com.sky.service.impl.EmployeeServiceImpl

        employee.setCreateUser(BaseContext.getCurrentId());
        employee.setUpdateUser(BaseContext.getCurrentId());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

检测密码安全强度 和 凯撒加密

检测密码安全强度 按照含有数字,小写字母,大写字母,指定标点符号的种类,把安全强度分为强密码,中高,中低,弱密码. 编写程序,输入一个字符串,输出该字符串作为密码时的安全强度 from string import digits, ascii_lowercase, ascii_uppercasedef check(pwd):# 密码必须至少包含…

【前端学习】—使用多种方式实现数组去重(六)

【前端学习】—使用多种方式实现数组去重(六) 一、数组常用的几个方法 //[1,2,3,4,2,1]//[{name:"caicai",age:"10"},{name:"zhangsan",age:"20"}]const array=[

jmeter监听每秒点击数(Hits per Second)

jmeter监听每秒点击数(Hits per Second) 下载插件添加监听器执行压测,监听结果 下载插件 点击选项,点击Plugins Manager (has upgrades),点击Available Plugins,搜索5 Additional Graphs安装。 添加监听…

C++新经典 | C++ 查漏补缺(内存)

目录 一、new和delete 1.new类对象时,括号问题 2.new做了什么事 3.delete做了什么事 4.new与malloc的区别 5.delete与free的区别 二、分配及释放内存 三、重载operator new和operator delete操作符 1.重载类中的operator new和operator delete操作符 &…

通信系统中ZF,ML,MRC以及MMSE四种信号检测算法误码率matlab对比仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、ZF(零迫)算法 4.2、ML(最大似然)算法 4.3、MRC(最大比合并)算法 4.4、MMSE(最小均方误差&#xff…

2024杭州人工智能展会(世亚智博会)一场人工智能领域的视觉盛宴

2024年,一场规模空前的人工智能盛会将在杭州国际博览中心盛大开幕。这场名为“2024杭州国际人工智能展览会(简称:世亚智博会)”的展会活动,将于4月份在杭州国际博览中心隆重举行,届时将迎来一场人工智能领域…

网络安全必备常识:Web应用防火墙是什么?

如今,很多企业都将应用架设在Web平台上,为用户提供更为方便、快捷的服务支持,例如网上银行、网上购物等。与此同时,应用程序组合变得前所未有的复杂和多样化,这为攻击者发动攻击开辟了大量媒介,Web应用防火…

【C++ 学习 ㉘】- 详解 C++11 的列表初始化

目录 一、C11 简介 二、列表初始化 2.1 - 统一初始化 2.2 - 列表初始化的使用细节 2.2.1 - 聚合类型的定义 2.2.2 - 注意事项 2.3 - initializer_list 2.3.1 - 基本使用 2.3.2 - 源码剖析 一、C11 简介 1998 年,C 标准委员会发布了第一版 C 标准&#xff0…

使用new创建动态结构

在运行时创建数组优于在编译时创建数组,对于结构(同一个结构可以存储多种类型的数据。)也是如此。需要在程序运行时为结构分配所需的空间,这也可以使用new运算符来完成。通过使用new,可以创建动态结构。同样&#xff0…

【广州华锐互动】利用AR进行野外地质调查学习,培养学生实践能力

在科技发展的驱动下,AR(增强现实)技术已经在许多领域中找到了应用,包括医疗、教育、建筑和娱乐等。然而,有一个领域尚未充分利用AR技术的潜力,那就是野外地质调查。通过将AR技术引入到这个传统上需要大量人…

免费:实时 AI 编程助手 Amazon CodeWhisperer

点 ,一起程序员弯道超车之路 现已正式推出实时 AI 编程助手 Amazon CodeWhisperer,包括 CodeWhisperer 个人套餐,所有开发人员均可免费使用。最初于去年推出的预览版 CodeWhisperer 让开发人员能够保持专注、高效,帮助他们快速、安…

rabbitMq (2)

RabbitMQ 消息应答与发布 文章目录 1. 消息应答1.2 自动应答1.2 手动应答1.3 代码案例 2. RabbitMQ 持久化2.1 队列持久化2.2 消息持久化 3. 不公平分发4. 预取值分发5. 发布确认5.1 发布确认逻辑5.2 开启发布确认的方法5.3 单个确认发布5.4 批量确认发布5.5 异步确认5.5.1 处理…

【milkv】更新rndis驱动

问题 由于windows升级到了11,导致rndis驱动无法识别到。 解决 打开设备管理器,查看网络适配器,没有更新会显示黄色的图标。 右击选择更新驱动

机器学习基础之《回归与聚类算法(3)—线性回归优化:岭回归》

一、什么是岭回归 其实岭回归就是带L2正则化的线性回归 岭回归,其实也是一种线性回归。只不过在算法建立回归方程时候,加上L2正则化的限制,从而达到解决过拟合的效果 二、API 1、sklearn.linear_model.Ridge(alpha1.0, fit_interceptTrue…

软件测试中bug修正后测试就结束了吗?

一般来说,当 Bug 跟踪系统上所有的 bug 都被关闭了以后,你会感到如释重负,终于可以松一口气了。 当项目成功交付后,你是否感到大脑进入了疲惫期,上网,聊天,写自己感兴趣的小程序,项…

SRS Config 一 基础配置

Config srs 流媒体服务配置官方文档已经很详细了,本文仅记录部分配置过程 srs.conf同级目录下 新建 self.conf 仿照srs.conf 添加基础配置 1 rtmp RTMP是直播的事实标准,这么多年以来一直是使用最广泛的直播协议。 然而Adobe公司没有一直更新RTMP协…

“1688按图搜索商品:拍立淘API,轻松实现高效购物!“

1688按图搜索商品(拍立淘)API的步骤大致如下: 需要先开放平台注册开发者账号。为每个淘宝应用注册一个应用程序键,登陆密钥。下载1688API的SDK并掌握基本的API基础知识和调用。利用SDK接口和对象,传入AppKey或者必要的…

VScode折叠代码

问题现状 代码看的我很烦, 有大段大段好像没有逻辑意义的部分,像大量的print语句, 想能不能折叠起来 在设置里面找 搜索Folding,找到Show Folding Controls, 换成always吧,一般默认是mouseover&#x…

21-数据结构-内部排序-交换排序

简介:主要根据两个数据进行比较从而交换彼此位置,以此类推,交换完全部。主要有冒泡和快速排序两种。 目录 一、冒泡排序 1.1简介: 1.2代码: 二、快速排序 1.1简介: 1.2代码: 一、冒泡排序…

10.17七段数码管单个多个(部分)

单个数码管的实现 第一种方式 一端并接称为位码;一端分别接收电平信号以控制灯的亮灭,称为段码 8421BCD码转七段数码管段码是将BCD码表示的十进制数转换成七段LED数码管的7个驱动段码, 段码就是LED灯的信号 a为1表示没用到a,a为…