Java项目实战--瑞吉外卖DAY03

2024-01-28 00:20

本文主要是介绍Java项目实战--瑞吉外卖DAY03,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

P22新增员工_编写全局异常处理器

P23新增员工_完善全局异常处理器并测试

p24新增员工_小结

P27员工分页查询_代码开发1

P28员工分页查询_代码开发2


P22新增员工_编写全局异常处理器



在COMMON新增全局异常捕获的类,其实就是代理我们这些controlle。通过aop把我们这些save方法和其他的方法给拦截到,如果抛异常了,统一在这个类里的方法统一处理。所以这块需要加@controllerAdvice 就是一个通知。在括号里指定拦截那些controller

加断点测试

再点击放行

package com.itheima.reggie.common;
/*** @Author Fxdll* @Date 2024/1/16 20:24* @PackageName:com.itheima.reggie.common* @ClassName: GlobalExceptionHandler* @Description: TODO* @Version 1.0*/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;/*** 全局异常处理* 底层基于代理*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody       //要写一个方法,最终要返回json数据的
@Slf4j
public class GlobalExceptionHandler {/*** 进行异常处理方法,就会被拦截到,统一处理* @return*/@ExceptionHandler(SQLIntegrityConstraintViolationException.class)public  R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());return R.error("失败了");}
}

P23新增员工_完善全局异常处理器并测试

运行显示

修改代码

package com.itheima.reggie.common;
/*** @Author Fxdll* @Date 2024/1/16 20:24* @PackageName:com.itheima.reggie.common* @ClassName: GlobalExceptionHandler* @Description: TODO* @Version 1.0*/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;/*** 全局异常处理* 底层基于代理*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody       //要写一个方法,最终要返回json数据的
@Slf4j
public class GlobalExceptionHandler {/*** 进行异常处理方法,就会被拦截到,统一处理* @return*/@ExceptionHandler(SQLIntegrityConstraintViolationException.class)public  R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());//当前这个异常信息是否含有 Duplicate entry关键字 ,若含有则违反了唯一约束 。// ex.getMessage()就是Duplicate entry 'zss' for key 'employee.idx_username'if (ex.getMessage().contains("Duplicate entry")){String[] split = ex.getMessage().split(" ");String msg = split[2] + "已存在";return R.error(msg);}return R.error("未知错误");}
}

p24新增员工_小结

P25员工信息分页查询_需求分析

P26员工信息分页查询_梳理程序执行过程

刷新页面

P27员工分页查询_代码开发1

创建MybatisPlusConfig        

配置分页插件

package com.itheima.reggie.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author Fxdll* @Date 2024/1/17 21:47* @PackageName:com.itheima.reggie.config* @ClassName: MybatisPlusConfig* @Description: TODO配置mybatis pulus插件* @Version 1.0*/
@Configuration
public class MybatisPlusConfig {@Bean  //加入bean注解让spring进行管理public  MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());//加入拦截器return mybatisPlusInterceptor;}
}

controller加入方法

/*** 员工信息的分页查询* @param page* @param pageSize* @param name* @return*/@GetMapping("/page")public R<Page> page(int page, int pageSize,String name){log.info("page={},pageSize={},name = {}",page,pageSize,name);return null;}
}

调试

P28员工分页查询_代码开发2

  /*** 员工信息的分页查询* @param page* @param pageSize* @param name* @return*/@GetMapping("/page")public R<Page> page(int page, int pageSize,String name){log.info("page={},pageSize={},name = {}",page,pageSize,name);//构造分页构造器Page pageInfo = new Page(page,pageSize);//构造条件构造器.用来动态封装查询条件的LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();//添加一个过滤条件  ,StringUtils.isNotEmpty(name)表示当name不为空时才添加条件queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);//添加排序条件queryWrapper.orderByDesc(Employee::getUpdateTime);//执行查询employeeService.page(pageInfo,queryWrapper);return R.success(pageInfo);}
}

P29员工分页查询_分页测试

点击搜索

会进行like查询语句

状态栏数字如何让展现为汉字:

这样会显示原始数据

package com.itheima.reggie.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;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){/*** 1、将页面提交的密码password进行md5加密处理* 2、根据页面提交的用户名username查询数据库* 3、如果没有查询到则返回登录失败结果* 4、密码比对,如果不一致则返回登录失败结果* 5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果* 6、登录成功,将员工id存入Session并返回登录成功结果*///         * 1、将页面提交的密码password进行md5加密处理String password = employee.getPassword();password = DigestUtils.md5DigestAsHex(password.getBytes());//           * 2、根据页面提交的用户名username查询数据库LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Employee::getUsername,employee.getUsername());Employee emp = employeeService.getOne(queryWrapper);//     * 3、如果没有查询到则返回登录失败结果if (emp==null){return R.error("登陆失败");}//       * 4、密码比对,如果不一致则返回登录失败结果if(!emp.getPassword().equals(password)){return R.error("登陆失败");}// * 5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果if(emp.getStatus() == 0){return R.error("账号已禁用");}// * 6、登录成功,将员工id存入Session并返回登录成功结果request.getSession().setAttribute("employee",emp.getId());return R.success(emp);}/*** 员工退出* @param request* @return*/@PostMapping("logout")public R<String> logout(HttpServletRequest request){//清理Session中保存的当前登陆员工的idrequest.getSession().removeAttribute("employee");return R.success("退出成功");}/*** 新增员工* 要返回json 所以添加@requestbody* @param employee* @return*/@PostMappingpublic R<String> save(HttpServletRequest request,@RequestBody Employee employee){log.info("新增员工,员工信息:{}",employee);//设置初始密码,但是要进行MD5加密employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));//设置创建时间employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());
//        获得当前用户的ID 强转为LONG类型Long empId = (Long) request.getSession().getAttribute("employee");employee.setCreateUser(empId);employee.setUpdateUser(empId);
//        最后调用save方法进行存入employeeService.save(employee);return R.success("新增员工成功");}/*** 员工信息的分页查询* @param page* @param pageSize* @param name* @return*/@GetMapping("/page")public R<Page> page(int page, int pageSize,String name){log.info("page={},pageSize={},name = {}",page,pageSize,name);//构造分页构造器Page pageInfo = new Page(page,pageSize);//构造条件构造器.用来动态封装查询条件的LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();//添加一个过滤条件  ,StringUtils.isNotEmpty(name)表示当name不为空时才添加条件queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);//添加排序条件queryWrapper.orderByDesc(Employee::getUpdateTime);//执行查询employeeService.page(pageInfo,queryWrapper);return R.success(pageInfo);}
}

P31启用/禁用员工账号

P32启用禁用员工账号_分析页面按钮动态显示效果

P33启用禁用员工账号_分析页面ajax发送请求过程

DAY01:Java项目实战--瑞吉外卖DAY01-CSDN博客

DAY02:Java项目实战--瑞吉外卖DAY02-CSDN博客

这篇关于Java项目实战--瑞吉外卖DAY03的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件