瑞吉外卖 - 新增员工功能(6)

news2024/11/29 5:28:35

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 + JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。
相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PDe_7uIg?pwd=x548
提取码:x548

文章目录

    • 1.问题分析
    • 2.数据模型
    • 3.代码实现
      • 3.1 实现逻辑分析
      • 3.2 Controller 层具体实现
      • 3.3 编写全局异常处理器
    • 4.功能测试

1.问题分析

后台系统中可以直接管理员工信息,通过新增员工来添加后台系统用户。点击【添加员工】按钮跳转到新增页面,如下:

2.数据模型

新增员工其实就是将我们新增页面录入的员工数据插入到 employee 表中,需要注意的是,employee 表单中对 username 字段加了唯一约束,因为 username 是员工的登陆账号,必须是唯一的:

另外,employee 表中的 status 字段已经设置了默认值为 1,表示员工状态正常:

3.代码实现

3.1 实现逻辑分析

在开发代码之前,需要梳理一下整个程序的执行过程:

  1. 页面发送 ajax 请求,将新增员工页面中输入的数据以 json 格式提交到服务端;
  2. 服务端 Controller 接收页面提交的数据并调用 Service 将数据进行保存;
  3. Service 调用 Mapper(dao)操作数据库,保存数据。

下面通过新增员工页面填写一些测试数据,看一下对应的请求 URL 和携带的数据形式:

点击保存后查看浏览器控制台相关请求数据:

首先可以明确的是它会发送一个 POST 请求,请求的 URL 为 “http://localhost:8080/employee”。下面再看看该请求携带的参数:

可以看到,携带的 json 参数就是我们在新增页面填写的信息。

3.2 Controller 层具体实现

EmployeeController 中新增员工部分代码如下:

@RestController
@RequestMapping("/employee")
public class EmployeeController {
    /**
     * 处理新增员工请求
     * @param request 请求对象
     * @param employee 员工对象
     * @return 响应对象
     */
    @PostMapping
    public R<String> save(HttpServletRequest request, @RequestBody Employee employee) {
        // 设置初始密码为 12346,需要进行 md5 加密再存入数据库
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        // 设置创建时间
        employee.setCreateTime(LocalDateTime.now());
        // 设置更新时间
        employee.setUpdateTime(LocalDateTime.now());

        // 获取当前登录的员工 id,作为创建人
        Long empId = (Long) request.getSession().getAttribute("employee");
        employee.setCreateUser(empId);
        employee.setUpdateUser(empId);

        // 保存员工信息
        employeeService.save(employee);

        // 返回保存成功结果
        return R.success("新增员工成功");
    }
    
    // 省略其他方法
}

下面重启应用,我们再次在新增员工页面进行测试:

点击保存后,刷新并查看数据库端对应的 employee 表中就能看到新增的员工记录:

3.3 编写全局异常处理器

上面我们提到,username 将作为员工账号,是唯一的。那么上面我们已经添加过 username=zhangsan 了,现在我们再次添加一个 username=zhangsan 的员工,控制台就会报错并且数据表中也不会有具体的记录:

此时需要我们的程序进行异常捕获,通常有两种处理方式:

  1. 在 Controller 层方法中加入 try-catch 进行异常捕获(不建议);
  2. 使用异常处理器进行全局异常捕获。

我们以第二种方式为例,在项目下新建一个 handler 包用于存放我们的各种处理器,然后再该报下实现我们的自定义全局异常处理器 GlobalExceptionHandler,代码如下:

package cn.javgo.reggie_take_out.handler;

import cn.javgo.reggie_take_out.common.R;
import org.springframework.context.annotation.Conditional;
import org.springframework.web.bind.annotation.*;
import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理器
 */
@ControllerAdvice(annotations = {RestController.class, Conditional.class})
@ResponseBody
public class GlobalExceptionHandler {

    /**
     * 处理 SQLIntegrityConstraintViolationException 异常
     * @param ex 异常对象
     * @return 响应对象
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        if(ex.getMessage().contains("Duplicate entry")){
            return R.error("该用户名已存在");
        }
        return R.error("未知错误");
    }
}

简单解释一下上面涉及到的几个注解:

  • @ControllerAdvice:用于全局异常处理和全局数据绑定的注解。它允许开发人员定义一个通用的类,该类将应用于整个应用程序中的所有控制器。通常,它被用于编写全局异常处理程序,以便集中处理和管理应用程序中的异常情况。上面我们通过该注解的 annotations 参数指定了处理使用了 @RestController@Controller 注解的类抛出的异常。
  • @ResponseBody:用于将方法的返回值直接绑定到响应体中,而不是将其解析为视图。即当一个方法或类带有 @ResponseBody 注解时,Spring 将自动将方法的返回值转换为适当的响应体格式(如 JSON)并返回给客户端。
  • @ExceptionHandler:用于在控制器中处理特定类型的异常。当控制器中抛出异常时,如果存在匹配的 @ExceptionHandler 方法,它将被调用来处理该异常。上面我们传入的异常其实就是控制台错误信息中的异常。

判断逻辑也很简单,那就是根据异常信息的特点进行判断:

如果出现 SQLIntegrityConstraintViolationException 异常,且异常信息中包含 “Duplicate entry”,则返回 “该用户已存在”即可。

4.功能测试

下面我们再次添加一个 username=zhangsan 的员工记录,点击【添加按钮】后页面顶部就会显示服务端处理后的传回的错误信息:

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

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

相关文章

智慧水务管控一体化平台,实现水务数字化管理

平台概述 柳林智慧水务管控一体化平台是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心&#xff0c;以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为支撑&#xff0c;以城市水资源、水生…

ArcSWAT报错:数据集未投影;Dataset must have a projected coordinate system

文章目录 1 报错内容2 定义投影3 重新执行ArcSWAT相关步骤 1 报错内容 Dataset must have a projected coordinate system. The current coordinate system is geographic . Please define a projected coordinate system for your DEM dataset using ArcToolbox before procee…

Java 线程池(Thread Pools)详解

目录 1、线程池介绍 2、线程池执行原理 3、线程池中的阻塞队列 4、Java 线程池中的拒绝策略 5、Java 提供的创建线程池的方式 6、线程池的使用示例 7、ForkJoinPool 和 ThreadPool 的区别 1、线程池介绍 线程池是一种重用线程的机制&#xff0c;用于提高线程的利用率和管…

Android开发:我们很迷茫,出路在哪里?

“都说今年是互联网行业寒风刺骨&#xff0c;尤其移动端开发市场更是饱和&#xff0c;在跌跌撞撞近一个月后&#xff0c;我终于在一家小公司找到了工作。入职后&#xff0c;领导让我接手一个二手Android项目&#xff0c;项目很庞大&#xff0c;前任开发人员已离职一个多月了&am…

实现 Kubernetes 安全态势管理

Kubernetes 已经成为容器编排的事实标准。它引入了强大的管理功能&#xff0c;但也带来了一些严峻的安全挑战——尤其是在多云环境中。其中包括缺乏对设置的可见性、镜像的滥用、通信故障和监控困难。 理解 K8s 的安全挑战 Kubernetes 挑战的核心是需要以高度协调的方式管理大…

日撸 Java 三百行day51

文章目录 说明Day51 KNN 分类器1.KNN2.代码1.aff内容解读2.代码理解 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledat…

静电防护:消除静电的秘诀!

随着现代科技的进步&#xff0c;人们对静电防护越来越重视。有的人认为消除静电是不可能做到的事情&#xff0c;但实际上并不是这样的&#xff01; 1&#xff1a;静电的产生 静电是一个非常普遍的现象&#xff0c;通常发生在5 kV电压下。静电可以产生于物体表面或环境中。如果…

电视盒子哪个牌子好?博主力荐2023目前性能最好的电视盒子

电视盒子能让电视机在不换新的前提下丰富资源、升级配置&#xff0c;是电视机的最佳拍档&#xff0c;但面对这么多的品牌让大家在选购时都会疑惑电视盒子哪个牌子好&#xff0c;博主老周盘点了目前性能最好的电视盒子&#xff0c;具体是哪些品牌呢&#xff1f;请看下文&#xf…

CMU-CERT内部威胁数据集 Insider Threat

CMU-CERT内部威胁数据集 Insider Threat CMU-CERT简介CMU-CERT版本CMU-CERT r1版本内容logon.csv内容decive.csv内容HTTP.csv内容LDAP and Administrative records勘误一些已知的缺陷 CMU-CERT网站 CMU-CERT简介 首先解释一下CMU-CERT是什么意思。 “CMU”是卡内基梅隆大学&a…

专业的Web自动化测试工具拥有哪些特点?

Web自动化测试是为了解决Web应用程序测试工程师在测试过程中的挑战和复杂性而实施的&#xff0c;可以通过自动化测试工具来实现。自动化测试工具是一种软件&#xff0c;其目的在于自动执行测试&#xff0c;提高测试效率和测试准确性&#xff0c;那专业的Web自动化测试工具拥有哪…

Learning C++ No.20【二叉树OJ题实战】

文章目录 引言&#xff1a;第一题&#xff1a;根据二叉树创建字符串第二题&#xff1a;二叉树的层序遍历第三题&#xff1a;自底向上实现层序遍历第四题&#xff1a;二叉树的最近公共祖先第五题&#xff1a;将搜索二叉树转换成双向链表第六题&#xff1a;从前序和中序遍历序列构…

什么是字符串数组

一、概念理解 1.C语言中没有字符串类型&#xff0c;用一片内存空间保存一串字符&#xff0c;这片空间称作字符数组。 2.以‘\0’结尾的字符数组被称为字符串数组。‘\0’是字符串结束的标志。 3.用双引号括起来的都是字符串。 二、初始化 char str[6] {h,e,l,l,o,\0};//字符串…

Linux网络——shell编程之sed编辑器

Linux网络——shell编程之sed编辑器 一、sed编辑器1.概述2.工作流程3.工作场景4.常用选项 二、sed编辑器基本用法1.打印操作2.打印行号3.增加操作4.插入操作5.替换操作6.删除操作7.字符转换 一、sed编辑器 1.概述 sed是一种在线编辑器&#xff0c;它一次处理一行内容。处理时&…

JWT学习

JSON Web Token&#xff08;JWT&#xff09;是目前最流行的跨域身份验证解决方案。虫虫今天给大家介绍JWT的原理和用法。 1.跨域身份验证 Internet服务无法与用户身份验证分开。一般过程如下。 1.用户向服务器发送用户名和密码。 2.验证服务器后&#xff0c;相关数据&#…

Unity 2022 Build-in、URP、HDRP对比

渲染管线对比 Platform Support平台支持Lights光照Lights灯光Shadows阴影Global Illumination全局光照Light Probes光照探针Adaptive Probe Volumes自适应探针体积Reflection Probes 反射探针 Raytracing 光线跟踪Path tracing 路径追踪Environment lighting 环境光 Color颜色H…

编译 MXNet 模型

本篇文章译自英文文档 Compile MXNet Models。 作者是 Joshua Z. Zhang&#xff0c;Kazutaka Morita。 更多 TVM 中文文档可访问 →TVM 中文站。 本文将介绍如何用 Relay 部署 MXNet 模型。 首先安装 mxnet 模块&#xff0c;可通过 pip 快速安装&#xff1a; pip install …

4、picodet 小目标训练全流程

文章目录 1、数据准备1.1 VOC转COCO2、使用sahi切图2.1 切图分析及过程可视化2.2 使用完整的切图命令进行切图2.3 对各个数据集的状态进行查看2.4 过滤数据集中不合适的框 3、转换成VOC4、生成训练数据5、模型训练6、模型推理 使用picodet进行小目标检测。 本文以检测小目标乒乓…

索洛模型(二)

索洛模型(二) 文章目录 索洛模型(二)[toc]1 事实2 假设2.1 对生产函数的假设2.2对投入要素的假设 3 索洛模型的动态学3.1 k k k的动态学3.2 平衡增长路径 4 储蓄率变化的影响4.1 对产出的影响4.2 对消费的影响 索罗经济增长模型&#xff08;Solow growth model&#xff09;&am…

ClickHouse 安装部署

文章目录 ClickHouse 安装部署一、准备环节1、确认防火墙是在关闭状态2、CentOS 取消打开文件数限制3、安装依赖4、CentOS 取消 SELINUX 二、单机搭建三、启动server ClickHouse 安装部署 一、准备环节 1、确认防火墙是在关闭状态 输入命令&#xff1a; systemctl status fi…

Centos7.6系统里安装Superset,连接ClickHouse

​ 本文是在centos 7 虚拟机中安装Superset和clickhouse&#xff0c;首先要有 安装python3环境 Centos7.6默认有python2&#xff0c;要先安装python3&#xff0c;下边这个python3安装教程很详细。 参考连接&#xff1a;CentOS7下安装Python3&#xff0c;超详细完整教程_centos…