苍穹外卖-day03

1. 公共字段自动填充

1.1 问题分析

业务表中的公共字段:

序号字段名含义数据类型
1create_time创建时间datetime
2create_user创建人idbigint
3update_time修改时间datetime
4update_user修改人idbigint

而针对于这些字段,我们的赋值方式为:

  1. 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。
  2. 在更新数据时, 将updateTime 设置为当前时间, updateUser设置为当前登录用户ID。

问题:代码冗余、不便于后期维护

1.2 实现思路

有四个公共字段,需要在新增/更新中进行赋值操作, 具体情况如下:

序号字段名含义数据类型操作类型
1create_time创建时间datetimeinsert
2create_user创建人idbigintinsert
3update_time修改时间datetimeinsert、update
4update_user修改人idbigintinsert、update

实现步骤:

  1. 自定义注解 AutoFill,用于标识需要进行公共字段自动填充的方法
  2. 自定义切面类 AutoFillAspect,统一拦截加入了 AutoFill 注解的方法,通过反射为公共字段赋值
  3. 在 Mapper 的方法上加入 AutoFill 注解

技术点:枚举、注解、AOP、反射

1.3 代码开发

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

完善自定义切面 AutoFillAspect 的 autoFill 方法

@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    /**
     * 切入点
     */
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
    public void autoFillPointCut(){}

    /**
     * 前置通知,在通知中进行公共字段的赋值
     */
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint){
        log.info("开始进行公共字段自动填充...");

        //获取到当前被拦截的方法上的数据库操作类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
        OperationType operationType = autoFill.value();//获得数据库操作类型

        //获取到当前被拦截的方法的参数--实体对象
        Object[] args = joinPoint.getArgs();
        if(args == null || args.length == 0){
            return;
        }

        Object entity = args[0];

        //准备赋值的数据
        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();

        //根据当前不同的操作类型,为对应的属性通过反射来赋值
        if(operationType == OperationType.INSERT){
            //为4个公共字段赋值
            try {
                Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

                //通过反射为对象属性赋值
                setCreateTime.invoke(entity,now);
                setCreateUser.invoke(entity,currentId);
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else if(operationType == OperationType.UPDATE){
            //为2个公共字段赋值
            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();
            }
        }
    }


//    @Before("@annotation(com.sky.annotation.AutoFill)")
//    public void autoFill(JoinPoint joinPoint){
//        /重要
//        //可先进行调试,是否能进入该方法 提前在mapper方法添加AutoFill注解
//        log.info("开始进行公共字段自动填充...");
//
//    }
}

在这里插入图片描述

将业务层为公共字段赋值的代码注释掉

2. 新增菜品

2.1 需求分析与设计

业务规则:

  • 菜品名称必须是唯一的
  • 菜品必须属于某个分类下,不能单独存在
  • 新增菜品时可以根据情况选择菜品的口味
  • 每个菜品必须对应一张图片

2.2 代码开发

2.2.1 文件上传实现

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

2.2.2 新增菜品实现

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

3. 菜品分页查询

3.1 需求分析和设计

业务规则:

  • 根据页码展示菜品信息
  • 每页展示10条数据
  • 分页查询时可以根据需要输入菜品名称、菜品分类、菜品状态进行查询

3.2 代码开发

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

4. 删除菜品

4.1 需求分析和设计

业务规则:

  • 可以一次删除一个菜品,也可以批量删除菜品
  • 起售中的菜品不能删除
  • 被套餐关联的菜品不能删除
  • 删除菜品后,关联的口味数据也需要删除掉

4.2 代码开发

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

5. 修改菜品

5.1 需求分析和设计

接口设计:

  • 根据id查询菜品
  • 根据类型查询分类(已实现)
  • 文件上传(已实现)
  • 修改菜品

5.2 代码开发

5.2.1 根据id查询菜品实现

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

5.2.2 修改菜品实现

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式Raft原理详解,从不同角色视角分析相关状态

分布式Raft原理详解,从不同角色视角分析相关状态 1. CAP定理2.Raft 要解决的问题3. Raft的核心逻辑3.1. Raft的核心逻辑2.1. 复制状态机2.2. 任期 Term2.3. 任期的意义:逻辑时钟2.4 选举定时器 3. Leader选举逻辑4. 从节点视角查看Leader选举4.1. Follow…

MATLAB中的数学建模:基础知识、实例与方法论

前言 在当今科技高速发展的时代,数学建模成为了解析复杂世界的关键工具,而MATLAB作为一种专业的科学计算软件,为我们提供了强大的数学建模平台。MATLAB不仅仅是Matrix Laboratory的简称,更是一个集数值分析、矩阵计算、算法开发和…

IP SSL证书注册流程

使用IP地址申请SSL证书,需要用公网IP地址申请,申请之前确保直接的IP地址可以开放80或者443端口两者选择1个就好,端口不需要一直开放,只要认证的几分钟内开放就可以了,然后IP地址根目录可以上传txt文件。 IP SSL证书认…

【蓝桥杯嵌入式】四、各种外设驱动(十一)ADC(1):软件触发与中断触发方式

温馨提示:本文不会重复之前提到的内容,如需查看,请参考附录 【蓝桥杯嵌入式】附录 目录 重点提炼: 一、需求分析 1、需要的外设资源分析: 2、外设具体分析: 比赛时ADC可能需要配置的部分:…

排序算法记录(冒泡+快排+归并)

文章目录 前言冒泡排序快速排序归并排序 前言 冒泡 快排 归并,这三种排序算法太过经典,但又很容易忘了。虽然一开始接触雀氏这些算法雀氏有些头大,但时间长了也还好。主要是回忆这些算法干了啥很耗时间。 如果在笔试时要写一个o(nlogn)的…

手机网页视频批量提取工具可导出视频分享链接|爬虫采集下载软件

解放你的抖音视频管理——全新抖音批量下载工具震撼上线! 在这个信息爆炸的时代,如何高效地获取、管理和分享视频内容成为了许多用户的迫切需求。为了解决这一难题,我们研发了全新的视频批量下载工具,让你轻松畅享海量音视频资源。…

免费的本地图像无损放大工具upscayl,支持六种模型

文章目录 upscayl其他模型其他设置 upscayl upscayl是一款免费的图像无损放大软件,scayl应该就是scale,不知道是哪国语言。进入官网后可直接下载,支持Windows, Linux, MaxOS等主流平台,对于Windows而言,还提供了exe和…

单相桥式全控整流电路

1仿真目的 通过对单相桥式全控整流电路的仿真研究,分析电路带电阻负载与阻感负载的不同工作情况。研究对电路的影响 2仿真原理 2.1单相桥式 如图所示为单相桥式全控电路的框图,设负载为电阻负载。在桥式逆变电路中,桥臂的上下两个开关器件…

teamcenter 无法打开数据集,未找到兼容的工具

原因 teamcenter 图片无法打开看 解决 修改注册表: 注册表位置:计算机\HKEY_CLASSES_ROOT\jpegfile\shell\open\command 注册表的值:“%systemroot%\system32\mspaint.exe” “%1”

BetterDisplay Pro for Mac(显示器校准软件) v2.0.11激活版

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件,可以帮助用户调整显示器的颜色和亮度,以获得更加真实、清晰和舒适的视觉体验。 软件下载:BetterDisplay Pro for Mac v2.0.11激活版 以下是BetterDisplay Pro的主要特点&…

【Redis】哨兵机制

1 🍑基本概念🍑 由于对 Redis 的许多概念都有不同的名词解释,所以在介绍 Redis Sentinel 之前,先对⼏个名词概念进⾏必要的说明。 名词逻辑结构物理结构主节点Redis 主服务⼀个独⽴的 redis-server 进程从节点Redis 从服务⼀个独…

浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog

为什么要写这么一篇介绍ArcGis的文章呢?因为大部分人也包括ArcGisdada,在使用ArcMap应用程序创建工程时总以为我们就是使用了ArcGis这个软件的所有。其实不然,在后期的接触和使用中慢慢发现原来ArcMap只是ArcGis这个综合平台的一部分&#xf…

fifo ip核 ————读写时钟同步

1.原理 timescale 1ns/1ns module tb_fifo();reg sys_clk ; reg sys_rst_n ; reg [7:0] pi_data ; reg rd_req ; reg wr_req ; reg [2:0] cnt;wire empty ; wire full ; wire [7:0] po_data ; wire [7:0] usedw ;initial begins…

《大模型面试宝典》(2024版) 正式发布!

2022 年11月底,OpenAI 正式推出 ChatGPT ,不到两个月的时间,月活用户就突破1亿,成为史上增长最快的消费者应用。 目前国内已发布的大模型超过200个,大模型的出现彻底改变了我们的生活和学习方式。 现在只要你想从事 A…

结构体变量的引用、结构体变量的初始化、结构体数组

一、 结构体变量的引用 在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则: 不能将一个结构体变量作为一个整体进行输入和输出。例如,已定义studentl和 student2为结构体变量并且它们已有值。不能这样引用: printf ("%d,%s,%c,%d,%f,%s\n&quo…

idea报错Terminated with exit code 1

今天学项目的时候,中途打开一个新的项目,pom.xml文件一直在下载依赖,下载了很久都没有下载成功,检查自己的Maven配置,感觉没问题 把项目移动到没有中文的目录下重新启动,也还是不行,后来发现原…

硬核分享|AI语音识别转文字与自动生成字幕

硬核分享|AI语音识别转文字与自动生成字幕_哔哩哔哩_bilibili 在现代快节奏的生活中,语音转文字工具成为了我们工作和学习中的得力助手。它能够将我们说出的话语迅速转化为文字或者将语音视频自动生成字幕,提供便捷和高效。 语音转文字转字幕工具是一种…

nodejs安装使用React

1、react安装 首先,确保电脑上具备nodejs环境,之后用 winr 呼出控制台,输入 cmd 命令弹出cmd控制台(小黑框)之后在默认路径输入如下代码 npm i -g create-react-app //全局安装react环境无需选择特定文件夹安装成功后…

刷题DAY31 | LeetCode 455-分发饼干 376-摆动序列 53-最大子序和

455 分发饼干(easy) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并…

「发稿帮」权重媒体发稿的优势,资源有哪些?

传媒如春雨,润物细无声,大家好,我是51媒体胡老师。 权重媒体发稿的优势主要包括以下方面: 获得更好的排名:高权重媒体在搜索引擎中的排名通常更靠前,这意味着在这些媒体上发布的内容更容易被用户发现和访问…