基于Springboot外卖系统06: 新增员工功能+全局异常处理器

2. 新增员工

2.1 需求分析

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

当填写完表单信息, 点击"保存"按钮后, 会提交该表单的数据到服务端, 在服务端中需要接受数据, 然后将数据保存至数据库中。

2.2 数据模型

新增员工,其实就是将我们新增页面录入的员工数据插入到employee表。employee表中的status字段已经设置了默认值1,表示状态正常。

 需要注意,employee表中对username字段加入了唯一约束,因为username是员工的登录账号,必须是唯一的。

 

2.3 程序执行流程

A. 点击"保存"按钮, 页面发送ajax请求,将新增员工页面中输入的数据以json的形式提交到服务端, 请求方式POST, 请求路径 /employee

B. 服务端Controller接收页面提交的数据并调用Service将数据进行保存

C. Service调用Mapper操作数据库,保存数据

2.4 代码实现

package com.itheima.reggie.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@PostMapping("/login")public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){/**@Description: 员工登陆* @param @RequestBody 传入的是json 故需要将其转化为实体类,json中的类名与实体类名对应才可以封装*          A. 由于需求分析时, 我们看到前端发起的请求为post请求, 所以服务端需要使用注解 @PostMapping*          B. 由于前端传递的请求参数为json格式的数据, 这里使用Employee对象接收, 但是将json格式数据封装到实体类中, 在形参前需要加注解@RequestBody* @return com.itheima.reggie.common.R<com.itheima.reggie.entity.Employee>* @version v1.0* @author LiBiGo* @date 2022/8/12 11:32*///  ①. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串String password = employee.getPassword();password = DigestUtils.md5DigestAsHex(password.getBytes());//  ②. 根据页面提交的用户名username查询数据库中员工数据信息LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Employee::getUsername,employee.getUsername());Employee emp = employeeService.getOne(queryWrapper); //在数据库中用户名是唯一的,所以可以用getone()//  ③. 如果没有查询到, 则返回登录失败结果if (emp == null){return R.error("用户名不存在");}//  ④. 密码比对,如果不一致, 则返回登录失败结果if(!emp.getPassword().equals(password)){return R.error("密码失败");}//  ⑤. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果if(emp.getStatus() == 0){return R.error("账户已禁用");}//  ⑥. 登录成功,将员工id存入Session, 并返回登录成功结果request.getSession().setAttribute("employee",emp.getId());return R.success(emp);}@PostMapping("/logout")public R<String> logout(HttpServletRequest request){/**@Description:  /employee/logout 员工退出* @author LiBiGo* @date 2022/8/12 12:09*///  清理Session中保存的当前登录员工的idrequest.getSession().removeAttribute("employee");//  返回结果return R.success("退出成功");}@PostMappingpublic R<String> save(HttpServletRequest request,@RequestBody Employee employee){/**@Description: 用于保存用户员工信息。** B. 在组装员工信息时, 还需要封装创建时间、修改时间,创建人、修改人信息(从session中获取当前登录用户)。* @author LiBiGo* @date 2022/8/12 17:25*/log.info("新增员工,员工信息:{}",employee.toString());// A. 在新增员工时,设置初始密码,需要进行MD5加密处理employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));// B. 在组装员工信息时, 需封装创建时间、修改时间,创建人、修改人信息(从session中获取当前登录用户)。employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());//获得当前登录员工用户的idLong empId = (Long) request.getSession().getAttribute("employee");employee.setCreateUser(empId); // 创建员工信息的人employee.setUpdateUser(empId); // 最后一次更新信息的人employeeService.save(employee); // 因为employeeService继承了,所以不用写,直接用log.info("新增员工成功");return R.success("新增员工成功");}
}

2 全局异常处理

2.1 新增员工存在的问题

当我们在测试中,添加用户时, 输入了一个已存在的用户名时,前端界面出现错误提示信息:

 而此时,服务端已经报错了, 报错信息如下:

出现上述的错误, 主要就是因为在 employee 表结构中,我们针对于username字段,建立了唯一索引,添加重复的username数据时,违背该约束,就会报错。但是此时前端提示的信息并不具体,用户并不知道是因为什么原因造成的该异常,我们需要给用户提示详细的错误信息 。

2.2 全局异常处理思路

我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:

A. 在Controller方法中加入 try...catch 进行异常捕获

形式如下:

 如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在Controller方法中加上try...catch进行处理,代码冗余,不通用。

B. 使用异常处理器进行全局异常捕获

采用这种方式来实现,只需要在项目中定义一个通用的全局异常处理器,就可以解决项目的所有异常。

2.3 全局异常处理器

在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解 @ExceptionHandler 来指定拦截的是那一类型的异常。

异常处理方法逻辑:

  • 指定捕获的异常类型为 SQLIntegrityConstraintViolationException

  • 解析异常的提示信息, 获取出是那个值违背了唯一约束

  • 组装错误信息并返回

 

2.4 全局异常处理器代码实现

package com.itheima.reggie.common;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;
/*** Description: 全局异常处理器*/@ControllerAdvice(annotations = {RestController.class, Controller.class})// 处理@RestController、@Controller的函数异常 //指定拦截那些类型的控制器;
@ResponseBody   //将方法的返回值 R 对象转换为json格式的数据, 响应给页面;
@Slf4j
public class GlobalExceptionHandler {/**@Description: 异常处理方法* @author LiBiGo* @date 2022/8/12 17:46*/@ExceptionHandler(SQLIntegrityConstraintViolationException.class) // 处理指定异常类public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());//Duplicate entry '299067' for key 'idx_username'if(ex.getMessage().contains("Duplicate entry")){String[] split = ex.getMessage().split(" "); //提取重复字段,即哪个用户名重复 从0开始第2个即为用户名String msg = split[2] + "已存在";return R.error(msg);}return R.error("未知错误");}
}

2.5 测试

全局异常处理器编写完毕后将项目重启, 完毕之后直接访问管理系统首页, 点击 "员工管理" 页面中的 "添加员工" 按钮。当添加用户时, 输入了一个已存在的用户名时,前端界面出现如下错误提示信息:

 

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

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

相关文章

Linq 实现sql中的not in和in条件查询

T-SQL的IN&#xff1a; Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID in (1, 2)T-SQL的NOT IN&#xff1a; Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID not in (1, 2)Or Select ProductID, ProductName…

spring aop实现原理_Spring 异步实现原理与实战分享

最近因为全链路压测项目需要对用户自定义线程池 Bean 进行适配工作&#xff0c;我们知道全链路压测的核心思想是对流量压测进行标记&#xff0c;因此我们需要给压测的流量请求进行打标&#xff0c;并在链路中进行传递&#xff0c;那么问题来了&#xff0c;如果项目中使用了多线…

基于Springboot外卖系统07:员工分页查询+ 分页插件配置+分页代码实现

1. 员工分页查询 1.1 需求分析 在分页查询页面中, 以分页的方式来展示列表数据&#xff0c;以及查询条件 "员工姓名"。 请求参数 搜索条件&#xff1a; 员工姓名(模糊查询) 分页条件&#xff1a; 每页展示条数 &#xff0c; 页码 响应数据 总记录数 结果列表 1…

1045-Access denied for user 'root'@'localhost'(using password:YES)

解决&#xff1a; 1. 开始 --> cmd --> net stop mysql (停用MySQL服务 没启动的可以省略) 2. 找到安装路径 MySQL Server 5.1下的my.ini 3. 打开 my.ini 找到 [mysqld] 然后在下面加上 这句&#xff1a; skip_grant_tables &#xff08;意思好像是 启动MySQL服务…

arial字体可以商用吗_【工作总结】莫让字体版权引火上身

前段一条微软雅黑字体引发的巨额罚款新闻&#xff0c;引起国内多个TW大群小地震&#xff0c;人人自危。我也赶紧检查自家文档、商用出版物、网站的字体&#xff0c;以免给公司带来法务后患。把这两天收集的信息&#xff0c;采取的行动记录一下。哪些中文字体免费&#xff1f;事…

基于Springboot外卖系统08:员工账号状态管理功能+对象转换器+扩展Spring mvc的消息转换器

1. 员工账号状态管理 1.1 需求分析 在员工管理列表页面&#xff0c;可以对某个员工账号进行启用或者禁用操作。账号禁用的员工不能登录系统&#xff0c;启用后的员工可以正常登录。如果某个员工账号状态为正常&#xff0c;则按钮显示为 "禁用"&#xff0c;如果员工…

Android init.rc 服务启动不成功

Android init.rc 服务启动不成功 问题 在开发过程中发现一个问题&#xff0c;我们需要在开机的时候判断硬件版本号去启动服务&#xff0c; 服务的名字是ledservice和ledservice4,但是发现每次烧录完固件后&#xff0c;服务启动不 成功&#xff0c;需要再复位重启一次&#xff0…

python爬虫什么网站都能爬吗_python如何爬取动态网站

python有许多库可以让我们很方便地编写网络爬虫&#xff0c;爬取某些页面&#xff0c;获得有价值的信息&#xff01;但许多时候&#xff0c;爬虫取到的页面仅仅是一个静态的页面&#xff0c;即网页 的源代码&#xff0c;就像在浏览器上的“查看网页源代码”一样。一些动态的东西…

hdu4027Can you answer these queries?

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4027 区间&#xff08;单点&#xff09;更新&#xff0c;区间求和。 1 #include<cstdio>2 #include<algorithm>3 #include<cmath>4 #define lson l,m,rt<<15 #define rson m1,r,rt<…

基于Springboot外卖系统09:员工信息编辑+员工信息保存

1 编辑员工信息功能 1.1 需求分析 在员工管理列表页面点击 "编辑" 按钮&#xff0c;跳转到编辑页面&#xff0c;在编辑页面回显员工信息并进行修改&#xff0c;最后点击 "保存" 按钮完成编辑操作。 那么从上述的分析中&#xff0c;当前实现的编辑功能需…

共享资料

共享资料 请关注公众号 嵌入式Linux 索取posted on 2018-09-22 00:27 公众号&#xff1b;嵌入式Linux 阅读(...) 评论(...) 编辑 收藏

selenium-05-常见问题

一&#xff1a;日期控件 selenium不能直接对日期控件操作&#xff0c;可以通过js对日期控件做赋值操作 WebElement inputTimeBoxdriver.findElement(by.name("###")); //定位日期控件 Stringtime "2015/10/10"; ((JavascriptExecutor)driver).executeScri…

bcp 不能调用where 子句_MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

不知道从什么时候开始&#xff0c;网上流传着这么一个说法&#xff1a;MySQL的WHERE子句中包含 IS NULL、IS NOT NULL、! 这些条件时便不能使用索引查询&#xff0c;只能使用全表扫描。这种说法愈演愈烈&#xff0c;甚至被很多同学奉为真理。咱啥话也不说&#xff0c;举个例子。…

基于Springboot外卖系统10:公共字段填充功能+ThreadLocal模块改进

1. 公共字段自动填充 1.1 问题分析 在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在系统中很多表中都会有这些字段&#xff0c;如下&#xff1a; 而…

## __VA_ARGS__ ... 宏和可变参数

在GNU C中&#xff0c;宏可以接受可变数目的参数&#xff0c;就象函数一样&#xff0c;例如: 1 2 #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg) 用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表&#xff0c;如: 1 vo…

腾讯云挂在和格式化数据盘

新购买了数据盘时&#xff0c;需要格式化才可使用。未购买数据盘的用户可以跳过此步骤。也可以根据需要进行多分区操作。 这里以Windows 2012R2为例进行格式化说明。 1) 通过步骤四介绍的方法登录Windows云服务器。 2) 点击【开始】&#xff08;Start&#xff09;-【服务器管理…

基于Springboot外卖系统11:菜品新增类别+类别信息分页查询

1. 新增分类 1.1 需求分析 后台系统中可以管理分类信息&#xff0c;分类包括两种类型&#xff0c;分别是 菜品分类 和 套餐分类 。当我们在后台系统中添加菜品时需要选择一个菜品分类&#xff0c;在后台系统中添加一个套餐时需要选择一个套餐分类&#xff0c;在移动端也会按照…

Linux内核自旋锁

Linux内核自旋锁 自旋锁 自旋锁&#xff08;spinlock&#xff09;是用在多个CPU系统中的锁机制&#xff0c;当一个CPU正访问自旋锁保护的临界区时&#xff0c;临界区将被锁上&#xff0c;其他需要访问此临界区的CPU只能忙等待&#xff0c;直到前面的CPU已访问完临界区&#xf…

词云python_诗词名句网 -古诗词大全|诗歌|诗词鉴赏|古诗名句|诗句赏析!

倾酒向涟漪&#xff0c;乘流欲去时。 寸心同尺璧&#xff0c;投此报冯夷。 展开全文 江曲全萦楚&#xff0c;云飞半自秦。 岘山回首望&#xff0c;如别故乡人。 浦烟含夜色&#xff0c;冷日转秋旻。 自有沈碑在&#xff0c;清光不照人。 楚岸云空合&#xff0c;楚城人不来。 只…

基于Springboot外卖系统12:删除菜品套餐类别+修改套餐类别信息

1. 删除分类 1.1 需求分析 在分类管理列表页面&#xff0c;可以对某个分类进行删除操作。需要注意的是当分类关联了菜品或者套餐时&#xff0c;此分类不允许删除。 1.2 前端页面分析 在前端页面中&#xff0c;点击 "删除" 按钮&#xff0c;就会触发定义的方法&…