当前位置: 首页 > news >正文

Java项目-苍穹外卖-Day04

公共字段自动填充

这些字段在每张表基本都有,手动进行填充效率低,且后期维护更改繁琐
在这里插入图片描述
在这里插入图片描述
使用到注解+AOP主要
先答应一个AutoFill注解
在这里插入图片描述

再定义一个切面类进行通知
在这里插入图片描述
对应代码
用到了枚举类和反射

package com.sky.aspect;
/***  自定义切面类,实现公共字段自动填充*/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {/*** 切入点*///不仅需要符合切入点表达式,且要满足方法上有对应注解@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void auotFillPointCut(){}/*** 前置通知,在通知中进行公共字段赋值*/@Before("auotFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("开始进行公共字段的自动填充...");//获取方法上的数据库操作类型(决定是否需修改CreateUser和CreateTime)MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象OperationType value = annotation.value();//获取数据库的操作类型//获取方法上的参数--实体参数Object[] args = joinPoint.getArgs();if (args==null || args.length==0){return;}Object entity=args[0];//可能接收不同实体,因为是公共字段,可能员工,菜品什么的都有,所以用object//准备赋值数据LocalDateTime now = LocalDateTime.now();Long currentId = BaseContext.getCurrentId();//根据当前不同的操作类型,为对应属性进行赋值if(value==OperationType.INSERT){try {//通过反射获取对应的方法Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//再进行赋值setCreateTime.invoke(entity,now);setUpdateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}else if(value==OperationType.UPDATE) {try {Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}}
}

我们设置的条件就是拦截mapper里面所有方法还要带@AutoFill注解
所以我们在对应mapper文件的insert和update操作做上加上@AutoFill注解并且指定value(操作类型)
在这里插入图片描述
然后我们就可以把之前service中设置UpdateTime和UpdateUser以及Create的全都可以注释/删除
进行测试
我这里测试过了
提交推送即可

增加菜品业务

需求分析

涉及到我们的菜品分类的回查
还有文件上传图片可以用阿里云的oss实现
在这里插入图片描述

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

代码开发

文件上传功能

先开发一个阿里云的服务
在这里插入图片描述
先写配置文件,来写我们的域名,bucket名,秘钥id和密码
在这里插入图片描述
第三方bean,写个配置类
配置上对应的参数
在这里插入图片描述
再写Commoncontroller
在这里插入图片描述

@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;@ApiOperation("文件上传")@PostMapping("/upload")public Result<String> upload(MultipartFile file){log.info("文件上传:{}",file);try {//获取原始文件名String originalFilename = file.getOriginalFilename();//截取原始文件名后缀 xxx.jpgString substring = originalFilename.substring(originalFilename.lastIndexOf('.'));String uuid = UUID.randomUUID().toString();//构造新文件名String name=uuid+substring;String filePath = aliOssUtil.upload(file.getBytes(), name);//返回值为文件请求路径return Result.success(filePath);} catch (IOException e) {log.error("文件上传失败:{}",e);}return Result.error(MessageConstant.UPLOAD_FAILED);}}

这样就可以了,完成文件上传操作,用到了阿里云oss,不知道怎么用可以看一下我之前的文件上传博客
把对应权限改为公开权限就可以在别的地方看到对应图片

新增菜品开发

controller

@RestController
@RequestMapping("/admin/dish")
@Slf4j
@Api(tags = "菜品相关接口")
public class DishController {@Autowiredprivate DishService dishService;@PostMapping@ApiOperation("新增菜品")public Result save(@RequestBody DishDTO dishDTO){log.info("新增菜品:{}",dishDTO);dishService.savewithFlavor(dishDTO);return Result.success();}
}

在这里插入图片描述
Service

@Service
@Slf4j
public class DishServiceImpl implements DishService {@Autowiredprivate DishMapper dishMapper;@Autowiredprivate DishFlavorMapper dishFlavorMapper;/*** 新增菜品和对应的口味数据* @param dishDTO*/@Transactional//事务注解,因为有两次操作的,一次修改菜品表,一次是口味表public void savewithFlavor(DishDTO dishDTO) {Dish dish = new Dish();BeanUtils.copyProperties(dishDTO,dish);//向菜品表插入1条数据dishMapper.insert(dish);//获取insert语句生产的主键值Long id = dish.getId();//向口味表插入n条数据List<DishFlavor> flavors = dishDTO.getFlavors();if(flavors != null && flavors.size() > 0) {for (DishFlavor flavor:flavors) {flavor.setDishId(id);}dishFlavorMapper.insertBatch(flavors);}}
}

在这里插入图片描述
解释一下,分开两个表插入的其实是,所以我们要加上@Transactional的注解,进行一个事务操作,还要创建两个mapper

DishMapper

@Mapper
public interface DishMapper {/*** 根据分类id查询菜品数量* @param categoryId* @return*/@Select("select count(id) from dish where category_id = #{categoryId}")Integer countByCategoryId(Long categoryId);@AutoFill(value = OperationType.INSERT)void insert(Dish dish);}

对应xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into dish (name,category_id,price,image,description,create_time,update_time,create_user,update_user,status)values(#{name},#{categoryId},#{price},#{image},#{description},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})</insert></mapper>

DishFlavorMapper

@Mapper
public interface DishFlavorMapper {/*** 批量插入口味数据* @param flavors*/@AutoFill(value = OperationType.INSERT)void insertBatch(List<DishFlavor> flavors);
}

对应xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.DishFlavorMapper"><insert id="insertBatch">insert into dish_flavor(dish_id,name,value) values<foreach collection="flavors" item="df" separator=",">(#{df.dishId},#{df.name},#{df.value})</foreach></insert>
</mapper>

然后就是前后端联调
我联调成功了
记得在insert操作上加@AutoFill不然不会自动加入创建人那些公共字段

菜品分页查询

需求分析

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

代码开发

controller
在这里插入图片描述
service
在这里插入图片描述
mapper+xml
在这里插入图片描述
在这里插入图片描述
测试成功
主要看能不能显示出菜品名称

易漏点

dish表里无菜品分类名称这一个字段的,需要返回DishVO对象
但有category_id这个字段,可以在category里面查到
需要从category里查
这里设计到多表查询了,而且是以一个表的字段匹配另一个表
这里直接用了左外连接进行查询

删除菜品功能开发

需求分析

注意点
两点
1.在套餐内菜品不能直接删除
2.删除对应的菜品对应的口味表也要删除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码开发

controller
在这里插入图片描述
service
在这里插入图片描述
对应涉及到根据ID查询的mapper就不放图片了,也用不到xml文件
像根据id查询菜品,根据id删除菜品,还有口味表中的根据菜品id删除口味都简单,直接注解实现即可

mapper
因为要根据菜品的id查询套餐的id
setmealmapper

在这里插入图片描述

在这里插入图片描述
测试
自己测试试试
根据对应的业务规则

修改菜品业务功能

设计根据id回显和修改操作
不仅涉及菜品表还涉及菜品口味表
controller
在这里插入图片描述
service
id获取菜品信息
在这里插入图片描述
修改菜品信息
注意:这里修改口味表情况比较多,我们就用事务注解+删除原口味+新增口味的方法完成
在这里插入图片描述
mapper
用到的基本都是之前定义的
就新增这个修改菜品基本信息的
在这里插入图片描述

相关文章:

Java项目-苍穹外卖-Day04

公共字段自动填充 这些字段在每张表基本都有&#xff0c;手动进行填充效率低&#xff0c;且后期维护更改繁琐 使用到注解AOP主要 先答应一个AutoFill注解 再定义一个切面类进行通知 对应代码 用到了枚举类和反射 package com.sky.aspect; /*** 自定义切面类&#xff0c…...

SQL递归获取完整的树形结构数据

在 SQL 中&#xff0c;WITH RECURSIVE 用于创建递归查询&#xff0c;它允许在查询中引用自身。这种查询通常用于处理具有层次结构的数据&#xff0c;例如树形结构。 以下是使用 WITH RECURSIVE 创建递归查询的一般语法&#xff1a; WITH RECURSIVE [alias] ([column1], [colu…...

如何使用营销活动,提升小程序用户的参与度

在当今数字化时代&#xff0c;小程序已成为企业私域营销的重要一环。然而&#xff0c;仅仅拥有小程序还不足以吸引用户的兴趣和参与。营销活动作为推动用户参与的有效手段&#xff0c;可以在激烈的市场竞争中脱颖而出。本文将深入探讨如何使用营销活动&#xff0c;提升小程序用…...

IDEA中使用Docker插件构建镜像并推送至私服Harbor

一、开启Docker服务器的远程访问 1.1 开启2375远程访问 默认的dokcer是不支持远程访问的&#xff0c;需要加点配置&#xff0c;开启Docker的远程访问 # 首先查看docker配置文件所在位置 systemctl status docker# 会输出如下内容&#xff1a; ● docker.service - Docker Ap…...

第7章 高性能门户首页构建

mini商城第7章 高性能门户首页构建 一、课题 高性能门户建设 二、回顾 1、了解文件存储系统的概念 2、了解常用文件服务器的区别 3、掌握Minio的应用 三、目标 1、OpenResty 百万并发站点架构 OpenResty 特性介绍 搭建OpenResty Web站点动静分离方案剖析 2、多级缓存架…...

用加持了大模型的 Byzer-Notebook 做数据分析是什么体验

Byzer-Notebook 是专门为 SQL 而研发的一款 Web Notebook。他的第一公民是 SQL&#xff0c;而 Jupyter 则是是以 Python 为第一公民的。 随着 Byzer 引擎对大模型能力的支持日渐完善&#xff0c; Byzer-Notebook 也在不自觉中变得更加强大。我和小伙伴在聊天的过程中才发现他已…...

学习设计模式之观察者模式,但是宝可梦

前言 作者在准备秋招中&#xff0c;学习设计模式&#xff0c;做点小笔记&#xff0c;用宝可梦为场景举例&#xff0c;有错误欢迎指出。 观察者模式 观察者模式定义了一种一对多的依赖关系&#xff0c;一个对象的状态改变&#xff0c;其他所有依赖者都会接收相应的通知。 所…...

课程项目设计--spring security--用户管理功能--宿舍管理系统--springboot后端

写在前面&#xff1a; 还要实习&#xff0c;每次时间好少呀&#xff0c;进度会比较慢一点 本文主要实现是用户管理相关功能。 前文项目建立 文章目录 验证码功能验证码配置验证码生成工具类添加依赖功能测试编写controller接口启动项目 security配置拦截器配置验证码拦截器 …...

学习设计模式之装饰器模式,但是宝可梦

装饰模式 为了不改变组件的结构&#xff0c;动态地扩展其功能。 通常&#xff0c;扩展功能通过子类进行&#xff0c;但是继承的方式具有静态特征&#xff0c;耦合度高。 意图&#xff1a;动态地给对象添加额外的功能 主要解决&#xff1a;继承方式是静态特征&#xff0c;扩…...

【AWS】创建IAM用户;无法登录IAM用户怎么办?错误提示:您的身份验证信息错误,请重试(已解决)

目录 0.背景问题分析 1.解决步骤 0.背景问题分析 windows 11 &#xff0c;64位 我的问题情景&#xff1a; 首先我创建了aws的账户&#xff0c;并且可以用ROOT用户登录&#xff0c;但是在登录时选择IAM用户&#xff0c;输入ROOT的名字和密码&#xff0c;就会提示【您的身份验证…...

微服务基础知识

文章目录 微服务基础知识一、系统架构的演变1、单体应用架构2、垂直应用架构3、分布式SOA架构&#xff08;1&#xff09;什么是SOA&#xff08;2&#xff09;SOA架构 4、微服务架构5、SOA和微服务的关系&#xff08;1&#xff09;SOA&#xff08;2&#xff09;微服务架构 二、分…...

倒残差结构

倒残差结构&#xff1a;   倒残差结构是MobileNetV2中引入的一种设计&#xff0c;用于增强网络的表达能力和特征提取能力&#xff0c;同时保持轻量级的特点。它的核心思想是在每个瓶颈块中&#xff0c;先使用一个扩张卷积&#xff08;Dilated Convolution&#xff09;&#x…...

Docker的基本使用

Docker 概念 Docker架构 docker分为客户端&#xff0c;Docker服务端&#xff0c;仓库 客户端 Docker 是一个客户端-服务器&#xff08;C/S&#xff09;架构程序。Docker 客户端只需要向 Docker 服务端发起请求&#xff0c;服务端将完成所有的工作并返回相应结果。 Docker …...

paddlenlp安装踩坑记录

错误1 ModuleNotFoundError: No module named paddle.metric我下载paddlepaddle-gpu2.5.0.post117解决了&#xff0c;最开始下载的2.5.1报错&#xff0c;post后面的117是我的cuda版本&#xff0c;不要写你对应的版本号 python3 -m pip install paddlepaddle-gpu2.5.0.post117…...

微服务流程引擎:简单又灵活,实现流程全生命周期管理!

伴随着日益激烈的市场竞争&#xff0c;传统的办公操作已经无法满足发展需要了。如果采用微服务流程引擎加油助力&#xff0c;就可以帮助企业更好地管理数据资源&#xff0c;高效做好各种表单制作&#xff0c;实现高效率办公。流辰信息以市场为导向&#xff0c;用心钻研低代码技…...

Qt表格数据处理

概述 在Qt表格数据处理中&#xff0c;涉及到如下几个具体的类&#xff1a; QAbstractItemModel&#xff1a;这是一个抽象基类&#xff0c;定义了模型&#xff08;Model&#xff09;的接口规范。所有的模型类都应该派生自QAbstractItemModel&#xff0c;并实现它的纯虚函数&…...

EasyPOI 实战总结

EasyPOI实战总结 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 使用EasyPOI 环境搭建 # 1.引入相关依…...

【LeetCode-困难题】42. 接雨水

题目 题解一&#xff1a;暴力双重for循环&#xff08;以行计算水量&#xff09; 1.先找出最高的柱子有多高&#xff08;max 3&#xff09; 2.然后第一个for为行数&#xff08;1&#xff0c;2&#xff0c;3&#xff09; 3.第二个for计算每一行的雨水量&#xff08;关键在于去除…...

npm install 安装依赖,报错 Host key verification failed

设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…...

SOLIDWORKS焊件是什么?

SOLIDWORKS是一款广泛应用于机械设计领域的三维计算机辅助设计软件。SOLIDWORKS提供了强大的焊件功能&#xff0c;可以帮助工程师们以更高的效率设计焊接件。本文将介绍SOLIDWORKS焊件的概念、特点以及使用方法&#xff0c;以期帮助读者更好地理解和应用这一关键技术。 SOLIDWO…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...