最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理

这篇具有很好参考价值的文章主要介绍了最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

黑马程序员最新Java项目实战《苍穹外卖》,最适合新手的SpringBoot+SSM的企业级Java项目实战。

新增员工

设计 DTO 类

  1. 我们需要根据新增员工接口设计对应的 DTO 类去接收前端传递的参数,前端传递参数列表如下:

    最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理,# 苍穹外卖,spring boot,后端,java

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

  2. 进入 sky-pojo 模块,在 com.sky.dto 包下,定义 EmployeeDTO:

    public class EmployeeDTO implements Serializable {
    
        private Long id;
    
        private String username;
    
        private String name;
    
        private String phone;
    
        private String sex;
    
        private String idNumber;
    }
    

编写接口

sky-server下EmployeeController.java 中添加新增员工接口:

/**
* 新增员工
*
* @param employeeDTO
* @return
*/
@PostMapping
@ApiOperation(value = "新增员工")
public Result add(EmployeeDTO employeeDTO) {
  log.info("新增员工:{}", employeeDTO);
  employeeService.save(employeeDTO);
  return Result.success();
}

设置 Header

  1. 项目中使用了 Token 作为身份验证和授权的凭证,用于验证用户的身份和授权用户访问系统中的受保护资源。

    最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理,# 苍穹外卖,spring boot,后端,java

  2. 我们点击【员工登录】接口,在请求体中设置用户登录的账号密码,点击发送,获取后端生成的 Token。

    {
      "password": "123456",
      "username": "admin"
    }
    

    最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理,# 苍穹外卖,spring boot,后端,java

  3. 所有后续的请求都需要在请求头中携带我们生成的 Token,以确保后端进行用户验证。我们在设置中,设置环境,在 Header 中添加我们上一步获取的 Token。

    最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理,# 苍穹外卖,spring boot,后端,java

捕获 SQL 异常

  1. 在员工数据表 employee 中,对 username 字段设置了唯一约束:

    最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理,# 苍穹外卖,spring boot,后端,java

  2. 当我们插入已存在员工姓名时,会出现 SQL 异常:

    java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '11111' for key 'employee.idx_username'
    
  3. 我们需要在全局异常 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);
      }
    }
    
  4. 再次运行【新增员工】接口,后端返回结果如下:

    {
      "code":0,
      "msg":"'xiaozhi'已存在",
      "data":null
    }
    

ThreadLocal 优化

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

  1. 我们需要在 JwtTokenAdminInterceptor 拦截器中当前登录用户 ID 保存到 ThreadLocal 中,方便后续处理:

    // 在线程变量中保存登录用户id
    BaseContext.setCurrentId(empId);
    
  2. 修改 EmployeeServiceImpl 实现类中的 save() 方法,增加员工时添加创建人的 ID:

    //设置当前记录创建人id和修改人id
    Long createUserId = BaseContext.getCurrentId();
    employee.setCreateUser(createUserId);
    employee.setUpdateUser(createUserId);
    
  3. 当我们在线程池下使用 ThreadLocal 时,需要手动调用 remove() 方法,防止内存泄漏。

员工分页查询

设计 DTO 类

  1. 我们需要根据新增员工接口设计对应的 DTO 类去接收前端传递的参数,前端传递参数列表如下:

    最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理,# 苍穹外卖,spring boot,后端,java

  2. 进入 sky-pojo 模块,在 com.sky.dto 包下,定义 EmployeePageQueryDTO:

    public class EmployeePageQueryDTO implements Serializable {
    
        //员工姓名
        private String name;
    
        //页码
        private int page;
    
        //每页显示记录数
        private int pageSize;
    
    }
    

编写接口

  1. 在 sky-server 下 EmployeeController.java 中添加新增员工分页查询接口:

    /**
    * 员工分页查询
    * @param employeePageQueryDTO
    * @return
    */
    @GetMapping("/page")
    @ApiOperation(value = "员工分页查询")
    public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){
      log.info("员工分页查询:{}",employeePageQueryDTO);
      PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
      return Result.success(pageResult);
    }
    
  2. 在 EmployeeServiceImpl 中实现分页查询逻辑:

    @Override
    public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
      PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
      Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);
      return new PageResult(page.getTotal(),page.getResult());
    }
    
  3. 在 EmployeeMapper.xml 中编写 SQL 语句:

    <select id="pageQuery" resultType="com.sky.entity.Employee">
      select * from employee
      <where>
        <if test="name != null and name !=''">
          name like concat('%',#{name},'%')
        </if>
      </where>
      order by create_time desc
    </select>
    
  4. Employee 类中使用 @JsonFormat 注解修改时间格式:

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    
  5. 启动项目,页面测试功能:

    最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理,# 苍穹外卖,spring boot,后端,java

启动禁用员工账号

  1. 在 EmployeeController 员工控制类中编写接口:

        /**
         * 启用、禁用员工账号
         * @param status
         * @param id
         * @return
         */
        @PostMapping("/status/{status}")
        @ApiOperation(value = "启用、禁用员工账号")
        public Result startOrStop(@PathVariable Integer status, Long id){
            log.info("启用禁用员工账号:{},{}",status,id);
            employeeService.startOrStop(status,id);
            return Result.success();
        }
    
  2. 在 EmployeeServiceImpl 实现类中实现功能:

        @Override
        public void startOrStop(Integer status, Long id) {
            Employee employee = Employee.builder().id(id).status(status).build();
            employeeMapper.update(employee);
        }
    
  3. 补充 EmployeeMapper 中的 update SQL语句:

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

根据id查询员工信息

  1. 在 EmployeeController 员工控制类中编写接口:

        /**
         * 根据id查询员工
         * @param id
         * @return
         */
        @GetMapping("/{id}")
        @ApiOperation(value = "根据id查询员工")
        public Result<Employee> getById(@PathVariable Long id){
            log.info("根据id查询员工:{},",id);
            Employee employee = employeeService.getById(id);
            return Result.success(employee);
        }
    
  2. 在 EmployeeServiceImpl 实现类中实现功能:

        @Override
        public Employee getById(Long id) {
            Employee employee = employeeMapper.getById(id);
            employee.setPassword("****");
            return employee;
        }
    
  3. 补充 EmployeeMapper 中的 SQL 语句:

        /**
         * 根据id查询员工
         * @param id
         * @return
         */
        @Select("select * from employee where id = #{id}")
        Employee getById(Long id);
    

    编辑员工信息

  4. 在 EmployeeController 中创建 update 方法:

    	/**
         * 编辑员工信息
         * @param employeeDTO
         * @return
         */
        @PutMapping
        @ApiOperation("编辑员工信息")
        public Result update(@RequestBody EmployeeDTO employeeDTO){
            log.info("编辑员工信息:{}", employeeDTO);
            employeeService.update(employeeDTO);
            return Result.success();
        }
    
  5. 在 EmployeeServiceImpl 中实现 update 方法:文章来源地址https://www.toymoban.com/news/detail-615798.html

 	/**
     * 编辑员工信息
     *
     * @param employeeDTO
     */
    public void update(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        BeanUtils.copyProperties(employeeDTO, employee);

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

        employeeMapper.update(employee);
    }

到了这里,关于最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot+SSM项目实战 苍穹外卖(11) Apache ECharts

    继续上一节的内容,本节学习Apache ECharts,实现营业额统计、用户统计、订单统计和销量排名Top10功能。 数据统计效果图: Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。 常见效果:柱形图、饼形图、折线图

    2024年01月17日
    浏览(32)
  • 项目实战————苍穹外卖(DAY11)

    Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现: 数据统计 数据统计效果图: 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。 官网地址:Apache ECharts 常见效果展示: 1). 柱形图

    2024年01月20日
    浏览(39)
  • 苍穹外卖-day14:前端环境搭建、员工管理

    前端环境搭建 员工分页查询 启用禁用员工账号 新增员工 修改员工 1.1 技术选型 本项目使用到的前端技术如下: node.js vue ElementUI axios vuex vue-router typescript 1.2 熟悉前端代码结构 直接导入课程资料中提供的苍穹外卖项目前端初始工程,此工程中已经开发了部分功能,后续我们

    2024年04月28日
    浏览(30)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)

    1.1 需求分析与设计 1.1.1 产品原型 在员工管理列表页面点击 “编辑” 按钮,跳转到编辑页面,在编辑页面回显员工信息并进行修改,最后点击 “保存” 按钮完成编辑操作。 修改页面原型 : 注:点击修改时,数据应该正常回显到修改页面。 1.1.2 接口设计 根据上述原型图分

    2024年02月05日
    浏览(36)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖集成Redis(九)

    1.1 Redis的Java客户端 Redis 的 Java 客户端很多,常用的几种: Jedis Lettuce Spring Data Redis Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。 1.2 Spring Data Redis使用方式 1.2.1 介绍 Spring Data Redis 是 Spring 的一部分

    2024年02月05日
    浏览(40)
  • 【java苍穹外卖项目实战三】nginx反向代理和负载均衡

    我们思考一个问题: 前端发送的请求,是如何请求到后端服务的? 前端请求地址:http://localhost/api/employee/login 后端接口地址:http://localhost:8080/admin/employee/login 很明显,两个地址不一致,那是如何请求到后端服务的呢? 1、nginx反向代理 nginx 反向代理 ,就是将前端发送的动态

    2024年02月21日
    浏览(37)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十一)

    1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 结果 :系统响应慢、用户体验差 1.2 实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: 每个分类下的菜品保存一份缓存数据

    2024年01月24日
    浏览(39)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(九)

    1.1 入门 在进行微信登录之前我们要先知道HttpClient是什么,它是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 HttpClient作用: 发送HTTP请求 接收响应数据 HttpClient应用场景

    2024年02月03日
    浏览(38)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)

    1.1.1 产品原型 用户可以将菜品或者套餐添加到购物车。对于菜品来说,如果设置了口味信息,则需要选择规格后才能加入购物车;对于套餐来说,可以直接点击+将当前套餐加入购物车。在购物车中可以修改菜品和套餐的数量,也可以清空购物车。 效果图: 1.1.2 接口设计 通过

    2024年01月18日
    浏览(32)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三)

    地址簿,指的是消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。同一个用户可以有多个地址信息,但是只能有一个 默认地址 。 对于地址簿管理,有以下几个功能: 查询地址列表 新增地址 修改地址 删除地址 设置默认地址 查询默认地址 根据上述原型图先

    2024年01月21日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包