Java——SSM项目(瑞吉外卖)笔记

news2025/1/19 8:25:16

阅读提醒:最重要的内容都是我手打的字,还有截图上的红字备注部分。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

nginx是一个服务器,主要部署一些静态的资源,包括后面做tomcat的集群, 可以接收前端的请求,然后分发给各个tomcat
在这里插入图片描述
第一步搭建数据库:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过url访问页面,可以访问到静态资源页面,也可以访问到controller页面,但是静态资源页面是不能接受后端的数据的,所以会用到jsp页面,或者用Vue来返回数据。

在这里插入图片描述

在这里插入图片描述

开发小技巧

写业务需求的时,先考虑前端传来的数据是什么,数据格式是什么,我要返回的值是什么,请求的url是什么?等等想清楚这些问题之后先不着急写业务代码,而是接受前端数据并进行log打印,打断点调试一下,看看能不能接收到前端数据,再开始辨析业务需求。

业务开发:(与面试官交流内容)

登录、退出功能

分三步走:
在这里插入图片描述
在登录界面上,输入用户名和密码,点击登录按钮就会发送请求,最终这个请求就会请求到服务端的一些组件,比如说先请求到我们的controller,然后通过controller调我们的service,然后通过service调mapper,最终和数据库交互,根据用户名和密码进行查询。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
controller对请求进行处理会返回数据,这些数据需要用一个类来封装,相当一个通用结果类,服务端响应的所有结果最终都会包装为此类型返回给前端页面,我们将此类定义为R,并将其放在common包下。

在这里插入图片描述

        //2、根据页面提交的用户名username查询数据库
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();		//查询包装类
        queryWrapper.eq(Employee::getUsername,employee.getUsername());		//比较是否一致
        Employee emp = employeeService.getOne(queryWrapper);			 //username是唯一约束,是不能重复的,所以可以调用getOne方法
        //将此用户名的对象赋值给emp
        
        //4、密码比对,如果不一致则返回登录失败结果
        if(!emp.getPassword().equals(password)){	//判断数据库中的密码和前端传来的密码password 是否一致
            return R.error("登录失败");
        }

在这里插入图片描述

调试要打断点再调试,然后一步一步往下走,看数据的变化。
如果改了后端的配置文件信息,前端没有生效,原因是浏览器中有缓存,所以需要清理一下历史记录(cookie),再刷新就ok

账号退出的需求:
在这里插入图片描述

/**
 * 员工退出
 * @param request
 * @return
 */
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request){
    //清理Session中保存的当前登录员工的id
    request.getSession().removeAttribute("employee");
    return R.success("退出成功");
}

在这里插入图片描述

员工管理业务开发

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先完成整个架子,再去填充过滤器的细节。
在这里插入图片描述
使用参数servletRequest,将其强转为HttpServletRequest,然后调用request.getRequestURL()方法
接下来放行,如何放行?用参数 filterChain调用doFilter( , )方法,将request和response放进去,如:
在这里插入图片描述
再进行访问页面,发现控制台和日志有输出,证明我们的过滤器架子搭好了:
在这里插入图片描述
用Session判断登录状态,用AntPathMatcher类的match方法进行地址匹配,

在这里插入图片描述
这一章是针对员工实体进行一系列的操作,是带分页的,所以会有分页查询的功能,而且点击编辑可以对员工的信息进行修改,还有账号的启用禁用,点击添加员工可以跳转页面,并进行信息填写
在这里插入图片描述

新增员工

业务开发中,需求分析数据模型是最关键的一块,往后的代码开发功能测试就是对需求分析一一翻译的过程。
点击新增员工,页面跳转到一个表单,输入信息,点击保存,前端页面发送ajax请求,将数据以json的方式传给controller,它再调用Service将数据进行保存,Service调用Mapper进行查询数据库,看username是否重复,因为username字段设置的唯一,不重复则将数据插入到数据库中,再跳转到员工管理
在这里插入图片描述

   /**
     * 新增员工
     * @param employee
     * @return
     */
    @PostMapping()
    public R<String> save(HttpServletRequest request,@RequestBody Employee employee){   //这个返回值是返回给前端
        log.info("员工信息:{}",employee.toString());

        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        //获取当前时间
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());
        //获得当前用户的id(用session获得
        long empId = (long) request.getSession().getAttribute("employee");
        employee.setCreateUser(empId);
        employee.setUpdateUser(empId);

        employeeService.save(employee);
        return R.success("新增员工成功");
        
    }

因为数据库当中的username设置的是唯一,所以当我们输入重复的username时,会抛异常,两种处理方法
手动捕获和使用异常处理器进行全局异常捕获。
推荐使用异常处理器(Handler),如果做?
创建一个异常处理器类,在上面打上@ControllerAdvice注解,advice是通知的意思,然后在自定义的方法上打上@ExceptionHandler(SQLIntegrityConstraintViolationException.class),括号内填入捕捉异常的类型,代码如下:

@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 异常处理方法
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        log.error(ex.getMessage());

        if(ex.getMessage().contains("Duplicate entry")){
        String[] split = ex.getMessage().split(" ");

            String msg = split[2] + "已存在";
            return R.error(msg);
        }

        return R.error("未知错误");
    }
}

下次再输入重复的username就可以捕获异常,并在前端输出“***已存在”

员工信息分页查询

展现员工信息的时候,全部展示出来会很乱,所以一般采用分页的方式来展示数据
在这里插入图片描述
第一步配置MP的分页插件


/**
 * 配置MP的分页插件
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

controller方法返回值的核心的,前端页面需要什么数据我们就给他什么数据。
然后在页面上的按姓名查询会在url中拼接name,所以参数一共三个。

构造分页条件,我们只需要告诉MP我们的page和pageSize是多少就可以了,他会帮我们做分页查询
在这里插入图片描述
这里我们推荐使用like,对于姓名推荐使用like

2023.2.3

最终的代码:

    @GetMapping("/page")
    public R<Page> page(int page,int pageSize,String name){
        log.info("第{}页,每页{}数据,姓名{}",page,pageSize,name);
        //构造分页构造器
        Page pageInfo = new Page();
        //构造条件构造器
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        //过滤条件
        queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);
        //添加排序条件
        queryWrapper.orderByDesc(Employee::getUpdateTime);
        //执行查询
        employeeService.page(pageInfo,queryWrapper);

        return R.success(pageInfo) ;
    }

启用禁用员工账号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何实现管理员可以看到禁用按钮,其实是前端做了处理:
在这里插入图片描述

在这里插入图片描述
前面返回的数据是json,所以加上RequsetBody
代码:

在这里插入图片描述

在这里插入图片描述
前端的数据是正常的,经过js一处理就不正常了,问题出在js,因为精度问题。所以将long类型给为String类型。

在这里插入图片描述
需要一个Java对象转json或者json对象转Java的类,这个类不需要我们写,到时候直接CV,知道作用就可以了。

在这里插入图片描述

编辑员工信息:

在这里插入图片描述

在这里插入图片描述

    /**
     * 根据员工id查询员工信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable Long id ){
        Employee employee = employeeService.getById(id);
        return R.success(employee);
    }
    @PutMapping
    public R<String> update(HttpServletRequest request,@RequestBody Employee employee){
        log.info(employee.toString());

       Long empId = (Long) request.getSession().getAttribute("employee");
       employee.setUpdateTime(LocalDateTime.now());
       employee.setUpdateUser(empId);
       employeeService.updateById(employee);
       return R.success("修改员工信息成功");
    }

第二阶段目录(菜品分类管理)

在这里插入图片描述

公共字段填充

在这里插入图片描述
在这里插入图片描述


    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;

在这里插入图片描述
这里因为获取不到id,所以暂时写死了,后面再来解决这个问题
在这里插入图片描述
解决方案:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

新增分类

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
添加分类,直接使用save方法,将接受到的json数据放入。

    @PostMapping
    public R<String> save(@RequestBody Category category){
        categoryService.save(category);

        return R.success("新增分类成功");
    }

分类信息分页查询

编写一个controller的前提是,明确它要返回什么类型,接受哪几个参数,什么类型的请求映射,路径要写什么合适,具体的业务实现是什么?

@GetMapping("/page")
public R<Page> page(int page ,int pageSize){
	Page<Category> pageInfo = new Page(page,pageSize);
	LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper();
	queryWrapper.orderByAsc(Category::getSort);
	categoryService.page(pageInfo,queryWrapper);
	return R.succes(pageInfo);
	
}

训练中的不足

关于MP的分页查询不熟很熟悉,以及对于LambdaQueryWrapper的使用比较生疏,以及对这条语句categoryService.page(pageInfo,queryWrapper);的使用

Redis

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
redis远程连接,

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

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

相关文章

浏览器网页视频怎么快速下载到本地?

我们在浏览网页时&#xff0c;经常会遇到一些特别喜欢的视频文件&#xff0c;想要下载收藏却苦于不会操作怎恶魔办呢&#xff1f;这时候可以通过一些小插件快速达成下载&#xff0c;比如通过猫爪视频下载插件用户可以轻松的抓取任意网页的视频文件&#xff0c;并将其保存到本地…

Java 利用PriorityQueue进行无InvokerTransformer反序列化

java_PriorityQueue java.util.PriorityQueue 是一个优先队列&#xff08;Queue&#xff09;&#xff0c;节点之间按照优先级大小排序成一棵树。其中PriorityQueue有自己的readObject反序列化入口。 反序列化链为&#xff1a;PriorityQueue#readObject->heapify()->sif…

新网站沙盒期要多久(关于网站走出沙盒期的征兆)

做网站优化首先要明白搜索引擎抓取原理&#xff0c;不管是百度还是谷歌&#xff0c;新站上线总要进入沙盒&#xff0c;接受来自搜索引擎的审查&#xff0c;涉及网站结构、网站内容、网站外链等内容。对于新手朋友来说&#xff0c;难免着急&#xff0c;这段考察期究竟有多长&…

【Python获取相亲网站数据】马上都元宵节了,还在相亲,看看某相亲网站有没有那个有缘人。

前言 马上都元宵节了&#xff0c;还在相亲&#xff0c;看看某相亲网站有没有那个有缘人。今天我们来爬取某相亲网站获取我们想要的数据&#xff0c;比如说&#xff0c;对方的姓名&#xff0c;年龄&#xff0c;身高&#xff0c;体重等等。今天我们主要使用CSS选择的方法来匹配我…

IDEA插件开发入门.01

环境准备Idea插件SDK文档在线地址&#xff1a;https://plugins.jetbrains.com/docs/intellij/welcome.html安装IntelliJ IDEA&#xff0c;这里使用版本2020.1.3 X64IDEA中安装Plugin DevKit插件创建插件项目新建工程。File ->New -> Project选择工程类型&#xff0c;Inte…

无法应用转换程序。请检查指定的转换程序路径是否有效。例子:Adobe Acrobat DC (PDF编辑器)卸载不了或者无法重新安装

不知道大家有没遇到这种情况&#xff0c;Adobe Acrobat DC (PDF编辑器)卸载不了或者无法重新安装&#xff0c;显示&#xff1a;无法应用转换程序。请检查指定的转换程序路径是否有效。 今天小编句遇到了这种情况&#xff0c;卸不了&#xff0c;把文件夹直接删了还是无法重新安装…

Linux安装Mysql8.0

mysql官网 www.mysql.com 这里是新建了个虚拟机 有时候用 rpm -qa|grep mysql和 rpm -qa|grep mariadb检测不到已经安装了mysql或者mariadb 可以使用rpm -qa|grep -i mysql 自己对Linux学习阶段,因此新建虚拟机安装 卸载原来的mariadb rpm -e mariadb-libs rpm -e --node…

微信如何注册小号?一个手机号注册两个微信账号?图文教学

2023年2月3日微信正式开放注册“小号”的功能&#xff0c;也就是可以使用一个手机号来注册两个微信账号。微信作为很多一款国民级别的工具&#xff0c;早就成为了小伙伴日常生活中不可或缺的一部分了。能够注册微信小号自然很好&#xff0c;可是微信如何注册小号呢&#xff1f;…

什么是窜货?为什么要治理窜货?如何正确治理窜货?

一、什么是窜货 “窜货”行为&#xff0c;就是超出自己授权范围&#xff0c;在非授权区域出售商品的行为。一般有线下窜区域销售、线下商品窜货线上销售两种情况。 二、为什么会出现窜货 1、窜货最常见的原因是&#xff0c;当经销商的授权区域市场趋向饱和时&#xff0c;或其…

茶杯:N个杯子排成一排,第X个杯子藏有球,交换任意两个杯子K次后,找出藏球杯子位置。

N个杯子排成一排&#xff0c;第X个杯子藏有球&#xff0c;交换任意两个杯子K次后&#xff0c;找出藏球杯子位置。 (本文获得CSDN质量评分【85】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完…

Idea JSP 学习

运行JSP文件首次使用Idea运行jsp文件遇到的问题汇总。运行出现404错误。首先配置好Tomcat,我选用的是Tomcat 10.0.27.安装好Tomcat,并进行相关配置。我用的是IDEA2020.2.3 x64版本&#xff0c;不同版本会有区别。这是我的以上配置&#xff0c;特别注意下图三角标识的test.jsp。…

【JavaEE】单例模式详解

目录 一、单例模式的概念 二、饿汉模式 三、懒汉模式 &#xff08;1&#xff09;懒汉模式-单线程版 &#xff08;2&#xff09;懒汉模式-线程安全多线程版 啥是设计模式咧&#x1f914;设计模式好比象棋中的棋谱。红方当头炮&#xff0c;黑方马来跳&#x1f463;。针对红方…

鸿蒙开发学习|HarmonyOS是什么

鸿蒙开发学习 第一章 HarmonyOS是什么文章目录鸿蒙开发学习前言一、什么是HarmonyOS二、HarmonyOS系统架构2.1 内核层2.2系统服务层2.3框架层2.4应用层三、HarmonyOS系统特性3.1 对消费者3.2.对应用开发3.3.对设备开发四、HarmonyOS系统四大技术特性4.1 分布式架构首次用于终端…

LabVIEW最大内存块属性不存在

LabVIEW最大内存块属性不存在在NI Linux实时操作系统目标中使用系统属性节点和分布式系统管理器&#xff08;DSM&#xff09;&#xff0c;但遇到一些问题&#xff1a;它未正确报告系统上的可用物理内存量。在NI Linux实时系统上出现错误-2147220623尝试在NI Linux实时上监测RAM…

webpack自动化打包

webpack自动化打包 首先下载包 npm i webpack-dev-server -D 配置 webpack.config.js const path require(path)//nodejs核心模块&#xff0c;专门用来处理路径问题 const ESLintPlugin require(eslint-webpack-plugin) const HtmlWebpackPlugin require(html-webpack-p…

java-加密、解密算法

rsa2048、sha256 rsa2048对整个文件进行hash算法&#xff0c;生成公钥、私钥后用于数字签名&#xff0c; sha256通过公钥和私钥&#xff0c;作为证书使用。单板打包后对每个动态库sha256计算颁发证书 sha256签名后&#xff0c;rsa2048进行加密。签名用于校验加密数据没有被更…

初始化一个vite+vue3项目,配置eslint+Prettier

引用vite官网的一段话&#xff0c;解释一下我们为什么要选择使用vite 时过境迁&#xff0c;我们见证了诸如 webpack、Rollup 和 Parcel 等工具的变迁&#xff0c;它们极大地改善了前端开发者的开发体验。 然而&#xff0c;当我们开始构建越来越大型的应用时&#xff0c;需要处…

Java后端数据校验学习总结

Java后端校验总结 后端校验注解一直在用&#xff0c;但是感觉不是特别清楚&#xff0c;希望通过写这篇文章搞清楚。 Spring自带的Validation校验框架 Spring提供了Validator接口来校验对象&#xff0c;主要涉及到的方法和类如下&#xff1a; supports方法&#xff1a;设置校…

win11任务栏图标闪烁|任务栏QQ图标闪动|新消息任务栏自动弹出|设置自动隐藏任务栏之后,QQ或微信等工具新消息自动弹出任务栏并颜色提示问题解决方案

背景介绍: 今天正常使用电脑时也出现消息弹出问题(已经设置隐藏任务栏),很头疼那么时什么情况,该如何组去解决呢?(微信任务栏闪动未读消息) MyDockFinder Windows 桌面美化工具 目录 背景介绍 解决问题 微信环境测试 初始界面&#xff08;微信&#xff09; 打开微信 …

PostMan简介2022黑马跟学

2022黑马PostMan简介跟学1.PostMan工具的使用1.1 PostMan简介1.2 PostMan安装1.3 PostMan使用1.3.1 创建WorkSpace工作空间1.3.2 发送请求(1).以百度为例发送get请求(2).以百度为例发送post请求1.3.3 保存当前请求1.3.4 创建server端1.PostMan工具的使用 1.1 PostMan简介 代码…