苍穹外卖新增员工

2024-08-30 02:28
文章标签 新增 员工 外卖 苍穹

本文主要是介绍苍穹外卖新增员工,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、需求分析和设计

接口设计:

数据库设计(employee表):

2、代码开发

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

为什么使用DTO呢,就是当前端提交的数据和实体类中对应的属性差别比较大时,建议使用DTO来封装数据。

EmployeeController: 

    @PostMapping@ApiOperation("新增员工")public Result save(@RequestBody EmployeeDTO employeeDTO){log.info("新增员工:{}",employeeDTO);employeeService.save(employeeDTO);return Result.success();}

EmployeeServiceImpl:

/*** 新增员工* @param employeeDTO*/@Overridepublic void save(EmployeeDTO employeeDTO) {Employee employee = new Employee();//对象属性拷贝BeanUtils.copyProperties(employeeDTO,employee);//设置账号的状态,默认正常状态 1表示正常  0表示禁用employee.setStatus(StatusConstant.ENABLE);//设置密码,默认密码123456employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));//设置当前记录时间和修改时间employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());//设置当前记录创建人id和修改人id// TODO 后期需要改未当前登录用户employee.setCreateUser(10L);employee.setUpdateUser(10L);employeeMapper.insert(employee);}

对象属性拷贝:BeanUtils.copyProperties(employeeDTO,employee);

md5加密:DigestUtils.md5DigestAsHex("123456".getBytes());

获取当前时间:LocalDateTime.now()

EmployeeMapper:
一般单表操作直接用注解的方式进行sql操作。

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

 mybatis配置

mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.sky.entityconfiguration:#开启驼峰命名map-underscore-to-camel-case: true

 开启驼峰命名:map-underscore-to-camel-case:true

3、测试

4、代码完善

程序存在的问题:

  • 录入的用户名已存在,抛出异常后没有处理
  • 新增员工时,创建人 id 和修改人 id 设置为了固定值(10L)

第一个问题:

GlobalExceptionHandle:

  /*** 处理SQL异常* @param ex* @return*/@ExceptionHandlerpublic Result exceptionHandler(SQLIntegrityConstraintViolationException ex){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);}}

对sql异常进行处理。

第二个问题:

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

  //登录成功后,生成jwt令牌Map<String, Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.EMP_ID, employee.getId());String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);

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

 //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);//3、通过,放行return true;} catch (Exception ex) {//4、不通过,响应401状态码response.setStatus(401);return false;}
 // 1、从请求头中获取令牌String token = request.getHeader(jwtProperties.getAdminTokenName());
  • 这行代码的目的是从HTTP请求头中获取一个名为“令牌”的字符串。jwtProperties.getAdminTokenName() 返回的是令牌在请求头中的键名,然后通过 request.getHeader() 方法获取对应的令牌值。

 // 2、校验令牌try {log.info("jwt校验:{}", token);
  • 这部分代码开始一个 try 块,用于尝试执行可能会抛出异常的代码。首先,它记录一条日志,表明开始进行JWT(JSON Web Token)的校验,并打印出待校验的令牌。

 Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
  • 这行代码调用 JwtUtil.parseJWT() 方法来解析和校验JWT。这个方法需要两个参数:一个是密钥(用于验证令牌的签名),另一个是待校验的令牌。如果令牌是有效的,并且签名匹配,该方法将返回一个 Claims 对象,其中包含了令牌中的声明(例如,用户的ID、角色等)。

 Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());
  • 这行代码从 Claims 对象中获取员工ID。JwtClaimsConstant.EMP_ID 是一个常量,表示在JWT中存储员工ID的键。该值被转换为字符串,然后再转换为 Long 类型。

 log.info("当前员工id:", empId);
  • 记录一条日志,显示当前请求对应的员工ID。但请注意,这里的 log.info 调用可能有一个小错误,因为通常日志框架的 info 方法接受一个字符串模板和一系列参数。如果这是SLF4J或类似的日志框架,正确的调用可能是 log.info("当前员工id:{}", empId);

 // 3、通过,放行return true;
  • 如果令牌校验成功,并且没有抛出任何异常,这段代码将返回 true,表示请求应该被放行。

接下来的部分是 catch 块,用于处理在 try 块中可能抛出的任何异常:

 } catch (Exception ex) {// 4、不通过,响应401状态码response.setStatus(401);return false;}
  • 如果在令牌校验过程中发生异常(例如,令牌格式错误、签名不匹配、令牌过期等),则执行这个 catch 块。这里,它将HTTP响应的状态码设置为401(未授权),并返回 false,表示请求不应该被放行。

总的来说,这段代码的目的是从HTTP请求头中获取一个JWT令牌,校验其有效性,并根据校验结果决定是否放行该请求。如果令牌有效,请求被放行;如果无效,则返回一个401未授权状态码。

解析出来 id 之后,如何传递给Service 的save方法?

ThreadLocal 并不是一个Thread,而是Thread的局部变量。

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

ThreadLocal常用方法:

public void set(T value) 设置当前线程的线程局部变量的值。

public T get() 返回当前线程所对应的线程局部变量的值

public void remove() 移除当前线程的线程局部变量

JwtTokenAdminIntercepter:

BaseContext.setCurrentId(empId);

EmployeeServiceImpl: 

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

这篇关于苍穹外卖新增员工的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119537

相关文章

Android13_SystemUI下拉框新增音量控制条

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Android13_SystemUI下拉框新增音量控制条 一、必备知识二、源码分析对比1.brightness模块分析对比2.statusbar/phone 对应模块对比对比初始化类声明对比构造方法 三、源码修改四、相关资源 一、必备知识 在Android12 版本上面已经完成了功能的实现,目前是在And

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

实习项目|苍穹外卖|day7

缓存菜品 1.根据原型进行需求分析与设计(接口文档) 2.根据接口设计DTO(redis数据类型选取) 3.编码controller-》service-》mapper @GetMapping("/list")@ApiOperation("根据分类id查询菜品")public Result<List<DishVO>> list(Long categoryId) {//判断缓存

[苍穹外卖]-04菜品管理接口开发

效果预览 新增菜品 需求分析 查看产品原型分析需求, 包括用到哪些接口, 业务的限制规则 业务规则 菜品名称必须是唯一的菜品必须属于某个分类下, 不能单独存在新增菜品时可以根据情况选择菜品的口味每个菜品必须对应一张图片 接口设计 根据类型查询分类接口 文件上传接口 新增菜品接口 数据表设计 设计dish菜品表 和 dish_fl

SpringBoot登录退出|苍穹外卖登录退出分析

文章目录 概要整体流程注意事项一、拦截路径二、token三、注册防止用户重复提交 苍穹外卖登录退出分析注意解决JWT退出后依然有效的问题 概要 结合Spring Boot和Vue3实现安全的用户登录和退出功能,并使用拦截器、JWT和Redis缓存来提高系统的安全性和性能。 整体流程 注意事项 一、拦截路径 像登录页面的路径就不要拦截了,否则都不能登录了 例如:

Java项目——苍穹外卖(一)

Entity、DTO、VO Entity(实体) Entity 是表示数据库表的对象,通常对应数据库中的一行数据。它通常包含与数据库表对应的字段,并可能包含一些业务逻辑。 DTO(数据传输对象) 作用:DTO 是用于在不同层之间传输数据的对象,通常用于网络传输或服务间调用。DTO 主要用于减少网络请求的次数,携带数据而不包含业务逻辑。特点:DTO类通常只包含数据字段和相应的getter和s

【Git 学习笔记_24】Git 使用冷门操作技巧(四)——更多实用 git 别名设置、交互式新增提交

文章目录 11.8 更多别名设置别名1:只查看当前分支(git b)别名2:以图表形式显示自定义格式的 git 日志(git graph)别名3:查看由于合并分支导致的冲突后仍有冲突的、待合并的文件列表(git unmerged)别名4:查看 git 状态(git st)别名5:查看 git 简要状态(git s)别名6:查看最新版本的统计信息(git l1)别名7:查看最近 5 个版本的提

java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频)

这是什么系统? 获取资料方式在最下方 java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频) 企业员工信息管理系统旨在为公司提供高效的员工信息管理解决方案。该系统的核心功能涵盖密码修改、员工管理、部门管理、出勤管理、工资管理、请假审核等方面,帮助企业优化人力资源管理流程。系统结构如下: (1)前端(员工端): 1.密码修改:员工可以修改自己的密码,提升账户的安全

苍穹外卖学习笔记(一)

文章目录 开发环境搭建一. 前端环境搭建二. 后端环境搭建1.进入idea项目2.提交git仓库(+推送github远程仓库)3.数据库环境搭建4.前后端联调(在源代码中项目已经实现登录功能)nginx反向代理好处: 三. 完善登录功能(md5加密存储)1.首先打开pojo模块中实体类的employee,添加salt字段2.在数据库中employee表新建一个salt字段,注意得是字符串类

如何限制与管控员工上网行为?四个方法让员工效率倍增!【企业员工上网行为管理】

在信息化时代,员工的上网行为直接影响着工作效率和企业的安全性。不当的网络使用,如浏览与工作无关的网站、下载不安全的文件,可能导致工作效率低下,甚至引发安全风险。因此,许多企业正在积极寻找有效的措施来管控员工的上网行为,以确保工作效率的提升。 以下是四个常见且有效的员工上网行为管理方法,帮助企业实现更高效的网络管理。 方法一:配置网络防火墙进行访问限制 最基础的员工上网行为管理方法是通过配置防