苍穹外卖(二)新增员工及项目细节

news2025/2/24 17:56:35

我们实现员工管理功能:

  • 新增员工
  • 员工分页查询
  • 启用禁用员工账号
  • 编辑员工
  • 导入分类模块功能代码

员工管理效果:

员工管理效果: 

1. 新增员工

1.1 需求分析和设计 

接口设计

 

明确新增员工接口的请求路径、请求方式、请求参数、返回数据

表设计

新增员工,其实就是将我们新增页面录入的员工数据插入到employee表。

1.2 代码开发 

1.2.1 设计DTO类

根据新增员工接口设计对应的DTO

前端传递参数列表:

 **思考:**是否可以使用对应的实体类来接收呢?

 

结论 : 当前端提交的数据和实体类中对应的属性差别比较大时,建议使用DTO来封装数据

由于上述传入参数和实体类有较大差别,所以自定义DTO类。

 

1.2.2 Controller层

EmployeeController中创建新增员工方法

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

1.2.3 Service层接口

在EmployeeService接口中声明新增员工方法

1.2.4 Service层实现类

在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);//后续步骤定义
    }

 

1.2.5 Mapper层

在EmployeeMapper中声明insert方法

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

 

细节一 :  @Data

使用lombok简化操作 

只需要加入下面依赖 就可以达成操作

 

细节二:  Mybatis

(1) 在Sky_take_out数据库中建立employee表

(2) 在Springboot工程中引入起步依赖 

application.yml文件中配置数据库连接信息

(3) Mapper中以注解方式编写SQL语句

完成引入mybatis操作

注意 : 若以XML方式配置映射文件须遵守一下要求 

细节三: @ConfigurationProperties

当我们把四个参数传给yml属性配置文件进行集中的配置管理

如果我们想在工具类中使用这四个参数就要在类中变量上加上注解 来注入这四个参数

但这样无疑很繁琐

@Component: 标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean。

 

改进办法:

        使用@ConfigurationProperties注解来指定前缀

条件: 

        1. yml 文件和类中变量名必须一致

        2. 加入@Data注解 方便调用类中变量, 设置类中变量

        3. 加入@Component 将这个类交给IOC容器管理

        4. 加入@ConfigurationProperties  补全前缀

 

 改进结果:

        只在对象上需要加上@Autowired  注入上面这个Bean对象,  再调用 Get()方法就可拿到参数值

两种方法对比:

@Component
@ConfigurationProperties(prefix = "sky.jwt")
@Data
public class JwtProperties {

    /**
     * 管理端员工生成jwt令牌相关配置
     */
    private String adminSecretKey;
    private long adminTtl;
    private String adminTokenName;

    /**
     * 用户端微信用户生成jwt令牌相关配置
     */
    private String userSecretKey;
    private long userTtl;
    private String userTokenName;

}

 细节四: ThreadLocal

 描述:新增员工时,创建人id和修改人id设置为固定值

//当前设置的id为固定值10//
        employee.setCreateUser(10L);
        employee.setUpdateUser(10L);
        //

解决:

通过某种方式动态获取当前登录员工的id。

 

员工登录成功后会生成JWT令牌并响应给前端: 

        claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
        String token = JwtUtil.createJWT(
                jwtProperties.getAdminSecretKey(),
                jwtProperties.getAdminTtl(),
                claims);

 

后续请求中,前端会携带JWT令牌,通过JWT令牌可以解析出当前登录员工id:

JwtTokenAdminInterceptor.java

            Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
            Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());

 **思考:**解析出登录员工id后,如何传递给Service的save方法?

 

答 : ThreadLocal

介绍:

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

常用方法:

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

对ThreadLocal有了一定认识后,接下来继续解决问题

在拦截器中解析出当前登录员工id,并放入线程局部变量中: 

public class JwtTokenAdminInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 校验jwt
     */
    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
            threadLocal.set(empId);
            
            //3、通过,放行
            return true;
        } catch (Exception ex) {
            //......................
        }
    }
}

 在Service中获取线程局部变量中的值:

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

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

        employeeMapper.insert(employee);
    }

 

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

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

相关文章

让物体移动到点击的位置

using System.Collections; using System.Collections.Generic; using UnityEngine;public class MouseRayPoint : MonoBehaviour {Vector3 target; // 跟踪目标public float smoothTime 5f; // 平滑时间private Vector3 velocity Vector3.zero;GameObject mainRole;public f…

4、在docker容器内的tomcat 中发布项目

1、查看本地是否有tomcat镜像,如果不存在则去下载 docker images 2、查看本地是否有tomcat容器,如存在跳过第3步 docker ps 3、创建tomcat容器 此容器用于复制tomcat的配置文件,配置文件复制后需删除此容器,如果已经存在跳过此步…

18.(开发工具篇Gitlab)Git如何回退到指定版本

首先: 使用git log命令查看提交历史,找到想要回退的版本的commit id. 使用git reset命令 第一步:git reset --hard 命令是强制回到某一个版本。执行后本地工程回退到该版本。 第二步:利用git push -f命令强制推到远程 如下所示: 优点:干净利落,回滚后完全回到最初状态…

创新视频剪辑:轻松实现批量垂直翻转,提高视频品质与吸引力

在视频剪辑的过程中,我们常常需要面对各种各样的需求。比如,有些视频需要进行垂直翻转,以创造出独特的视觉效果。然而,如果一个个手动操作,不仅费时费力,还可能因为重复性工作导致剪辑质量下降。那么&#…

【学习笔记】数据一致性分发

为什么要数据分发 微服务中,每个服务都有独立的数据源,这使得数据同步成为难题。 拉模式or推模式? 拉模式存在的问题 由于网络延迟,拉取的数据不一定是最新的 如果频繁向另一服务拉取数据,会给服务造成压力&#xf…

解决typescript项目报错:找不到模块“xxx”或其相应的类型声明

现象: 解决办法:在项目根目录下新建后缀为.d.ts文件,然后通过declare module 将相应的资源类型放进去即可 比如上面的例子: 新建一个typing.d.ts文件,然后声明一行: declare module "/redux/*"…

模拟信号隔离器在水处理控制系统中的应用方案

安科瑞 崔丽洁 摘要:水处理控制系统中,其控制、监测模块的非电量模拟量传感器采用信号隔离器的接线方式合理地解决了相关模拟量传感器供电电源安全和相对独立的问题,保证了监测模块的电源、模拟量采集模块和输出模块的相对隔离,降…

MVVM 与 MVC区别和应用场景?

MVVM 和 MVC 1. MVC2. MVVM 1. MVC MVC 是 Model View Controller 的缩写 Model:模型层,是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。View:视图层,用户界面渲染逻辑,通常视图…

微信页面公众号页面 安全键盘收起后键盘下方页面留白

微信浏览器打开H5页面和公众号页面,输入密码时调起安全键盘,键盘收起后 键盘下方页面留白 解决办法: 1、(简单)只有在调起安全键盘(输入密码)的时候会出现这种情况,将input属性改为n…

01-自动内存管理机制

一、走进java 每个文件都有自己的格式,java也不例外,而JVM通常是通过16进制对应的java汇编码来解释的, magic(魔数) 每个Java class 文件的前4个字节被称为他的魔数(magic number):…

ASCII 码对照表详解

原文 https://baijiahao.baidu.com/s?id1704767913015693638&wfrspider&forpc 其实大家都知道计算机是老美发明的,当初人家并没有考虑后来需要增加那么多字符,比如中国的汉字,那么早期的美国常用字符,用 1 个字节的前 7…

Unity设计模式——建造者模式

Product类——产品类&#xff0c;由多个部件组成。 class Product {IList<string> parts new List<string>();//添加产品部件public void Add(string part){parts.Add(part);}public void Show(){foreach (string part in parts){Debug.Log("产品:"pa…

python关联分析实践学习笔记

曾经有个沃尔玛超市&#xff0c;它将啤酒与尿布这样两个奇怪的东西放在一起进行销售&#xff0c;并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加。 我们关注的是在这样的场景下&#xff0c;如何找出物品之间的关联规则。接下来就来介绍下如何使用Apriori算法&…

【图像去噪的扩散滤波】图像线性扩散滤波、边缘增强线性和非线性各向异性滤波(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

您需要知道的API基础知识都在这里

API是应用程序编程接口&#xff08;Application Programming Interface&#xff09;的缩写&#xff0c;能够起到两个软件组件之间的连接器或中介的作用。此类接口往往通过一组明确的协议&#xff0c;来表示各种原始的请求和响应。API文档可以向开发人员展示请求和响应是如何形成…

跨境独立站代购中国电商平台商品PHP多语言多货币

跨境独立站代购中国电商平台商品是指代购者在海外建立自己的独立电商平台&#xff0c;代理中国主流电商平台&#xff08;如淘宝、京东等&#xff09;的商品进行销售和代购。这种模式的优势在于代购者可以自主选择产品和价格策略&#xff0c;同时还能提供更专业和优质的服务。 …

【爬虫】python爬虫爬取网站页面(基础讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

亚马逊频繁扫号下的跨境电商,跨境电商卖家应该何去何从?

相信各位同行都知道&#xff0c;自2021年起&#xff0c;亚马逊的扫号活动就从未间断&#xff0c;直到如今2023年的亚马逊&#xff0c;仍然是隔2周-几个月就有大规模的审核扫号&#xff0c;大批卖家店铺被封&#xff0c;亚马逊卖家人人自危&#xff0c;面对时间间隔短频率高的扫…

富文本文案存储翻译方案

一般富文本的功能会有些样式&#xff0c;存储到数据库表里面之后会带上一大堆的标签和样式&#xff0c;底层如果要对这些进行翻译的话会变得非常困难&#xff0c;因为我们要翻译的只是里面的中文内容&#xff0c;这就面临第一个问题&#xff0c;把中文取出来&#xff0c;如果把…

(echarts)饼图封装相关总结及使用

(echarts)饼图封装相关总结 一、封装组件pieCharts.vue <template><div :id"id" :class"className" :style"{ height: height, width: width }" /> </template><script> import echarts from echarts import resize fr…