公共字段自动填充、菜品管理

一、公共字段填充

1.1、问题分析

1.2、实现思路

1.3、代码开发

1.3.1、自定义注解

import com.sky.enumeration.OperationType;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target ( ElementType.METHOD )
@Retention ( RetentionPolicy.RUNTIME )
public @interface AutoFill {//通过枚举类型指定数据库操作的类型//UPDATE INSERTOperationType value();
}

1.3.2、切面类

import com.sky.annotation.AutoFill;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.time.LocalDateTime;/*** 自定义切面,实现公共公共部分自动填充的逻辑*/
@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 ){//为四个公共字段赋值try {//通过反射获得方法Method setCreatTime = 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 );//通过反射进行赋值setCreatTime.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){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 ();}//为两个公共字段赋值}}}

二、新增菜品

2.1、需求分析和设计

2.2、文件上传

1.Controller层

import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.UUID;/*** 通用接口*/
@RestController
@RequestMapping("/admin/common")
@Slf4j
@Api(tags = "通用接口")
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* @param file* @return*/@PostMapping("/upload")
@ApiOperation ( "文件上传" )public Result<String> upload(MultipartFile file){log.info ( "文件上传,{}",file );try {String originalFilename = file.getOriginalFilename ();//获得文件原来的文件名称//截取原始文件名的后缀String extension = originalFilename.substring ( originalFilename.lastIndexOf ( "." ) );//创建新的文件名称String objectName = UUID.randomUUID ().toString () + extension;String filePath = aliOssUtil.upload ( file.getBytes (), objectName );return Result.success (filePath);} catch (IOException e) {log.error ( "文件上传失败,{}",e );}return Result.error ( "文件上传失败" );}}

2.3、新增菜品

1.DishController

    /*** 新增菜品* @param dishDTO* @return*/@PostMapping@ApiOperation ( "新增菜品" )public Result save(@RequestBody DishDTO dishDTO){log.info ( "新增菜品,{}",dishDTO );dishService.saveWithFlavor (dishDTO);return Result.success ();}

2.DishServiceImlp

    /*** 新增菜品和对应的口味* @param dishDTO*/@Transactional     //注解方式的事务管理  操作多张表保证数据的原子性,一致性@Overridepublic void saveWithFlavor(DishDTO dishDTO) {Dish dish = new Dish ();BeanUtils.copyProperties ( dishDTO,dish );//向菜品表插入一条数据dishMapper.insert(dish);//获取Insert语句生成的主键值Long dishId = dish.getId ();//向口味表插入n条数据List<DishFlavor> flavors = dishDTO.getFlavors ();if (flavors !=null && flavors.size () >0){flavors.forEach ( dishFlavor -> dishFlavor.setDishId ( dishId ));//向口味表插入n条数据dishFlavorMapper.insertBatch(flavors);}

3.Mapper


import com.sky.annotation.AutoFill;
import com.sky.dto.DishDTO;
import com.sky.entity.Dish;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface DishMapper {/*** 根据分类id查询菜品数量* @param categoryId* @return*/@Select("select count(id) from dish where category_id = #{categoryId}")Integer countByCategoryId(Long categoryId);/*** 修改菜品信息* @param dishDTO*/void updateDish(DishDTO dishDTO);/*** 新增菜品* @param dish*/@AutoFill ( OperationType.INSERT )void insert(Dish dish);
}
import com.sky.entity.DishFlavor;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface DishFlavorMapper {/*** 批量插入口味数据* @param flavors*/void insertBatch(List<DishFlavor> flavors);
}

4.XML

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into dish(id,name,category_id,price,image,description,status,create_time,update_time,create_user,update_user)values(#{id},#{name},#{categoryId},#{price},#{image},#{description},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})</insert>
    <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>

三、菜品分页查询

3.1、需求分析设计

3.2、代码实现

1.Controller

    /*** 菜品分页查询* @param dishPageQueryDTO* @return*/@ApiOperation ( "菜品分页查询" )@GetMapping("/page")public  Result<PageResult> dishPageQuery(DishPageQueryDTO dishPageQueryDTO){log.info ( "分页查询,{}",dishPageQueryDTO );PageResult pageResult= dishService.dishPageQuery(dishPageQueryDTO);return Result.success (pageResult);}

2.Service

    /*** 菜品分页查询* @param dishPageQueryDTO* @return*/@ApiOperation ( "菜品分页查询" )@GetMapping("/page")public  Result<PageResult> dishPageQuery(DishPageQueryDTO dishPageQueryDTO){log.info ( "分页查询,{}",dishPageQueryDTO );PageResult pageResult= dishService.dishPageQuery(dishPageQueryDTO);return Result.success (pageResult);}

3.Mapper

<!--分页查询--><select id="dishPageQuery" resultType="com.sky.vo.DishVO">select d.* ,c.name as categoryName from dish d  left outer join category c on d.category_id = c.id<where><if test="name !=null"> and d.name like concat('%',#{name},'%')</if><if test="categoryId !=null">and d.category_id =#{categoryId}</if><if test="status !=null"> and d.status=#{status}</if></where>order by d.create_time desc</select>

四、删除菜品

4.1、需求分析与设计

4.2、代码实现

1.Controller层

    /*** 批量删除菜品* @param ids* @return*/@DeleteMapping@ApiOperation ( "批量删除菜品" )public Result delete(@RequestParam List<Long> ids ){log.info ( "批量删除菜品,{}",ids );dishService.deleteBatch(ids);return Result.success ();}

2.Service层

 /*** 批量删除* @param ids*/@Transactional@Overridepublic void deleteBatch(List<Long> ids) {//判断当前菜品是否能够删除--是否存在起售中的菜品??for (Long id : ids) {Dish dish=dishMapper.getById(id);if (dish.getStatus ()== StatusConstant.ENABLE){//当前菜品起售中,不能删除throw new DeletionNotAllowedException ( MessageConstant.DISH_ON_SALE );}}//判断当前菜品是否能够删除--当前菜品是否被套餐关联List<Long> setmealIds = setmealDishMapper.GetSetmealIdsByDishIds ( ids );if (setmealIds !=null && setmealIds.size ()>0){//当前菜品被套餐关联不能删除throw new DeletionNotAllowedException ( MessageConstant.DISH_BE_RELATED_BY_SETMEAL );}//删除菜品表中的菜品数据for (Long id : ids) {dishMapper.deleteById(id);//删除菜品关联的口味数据dishFlavorMapper.deleteByDishId(id);}}

3.Mapper层

<?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.SetmealDishMapper"><!--根据菜品ID查询套餐ID--><select id="GetSetmealIdsByDishIds" resultType="java.lang.Long">select setmeal_id from setmeal_dish where dish_id in<foreach collection="dishIds" item="dishId" separator="," open="(" close=")">#{dishId}</foreach></select>
</mapper>
import com.sky.entity.DishFlavor;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface DishFlavorMapper {/*** 批量插入口味数据* @param flavors*/void insertBatch(List<DishFlavor> flavors);/*** 根据菜品id删除对应的口味数据* @param dishId*/@Delete ( "delete from dish_flavor where dish_id=#{dishId}" )void deleteByDishId(Long dishId);
}

五、修改菜品

5.1、需求分析设计

5.2、根据ID查询菜品接口开发

       service层

    /*** 根据ID查询菜品信息及口味* @param id* @return*/@Transactional@Overridepublic DishVO getById(Long id) {Dish dish =dishMapper.getById ( id );List<DishFlavor> flavors = dishFlavorMapper.getFlavor(id);DishVO dishVO = new DishVO ();BeanUtils.copyProperties ( dish,dishVO );dishVO.setFlavors ( flavors );return dishVO;}

5.3、修改菜品接口开发

1.Controller层

    /*** 修改菜品信息* @param dishDTO* @return*/@PutMapping@ApiOperation ( "修改菜品" )public Result updateDish(@RequestBody DishDTO dishDTO){log.info ( "修改菜品,{}",dishDTO );dishService.updateDish(dishDTO);return Result.success ();}

2.Service层

    /*** 修改菜品* @param dishDTO*/@AutoFill ( value = OperationType.UPDATE)@Overridepublic void updateDish(DishDTO dishDTO) {//修改菜品基本信息Dish dish = new Dish ();BeanUtils.copyProperties ( dishDTO,dish );dishMapper.updateDish(dish);//删除原有的口味数据dishFlavorMapper.deleteByDishId (dishDTO.getId () );//重新插入口味数据List<DishFlavor> flavors = dishDTO.getFlavors ();if (flavors !=null && flavors.size ()>0){flavors.forEach ( dishFlavor ->{dishFlavor.setDishId ( dishDTO.getId () );} );dishFlavorMapper.insertBatch ( flavors );}}

3.Mapper层

    <update id="updateDish">update dish<set><if test="categoryId !=null">category_id=#{categoryId},</if><if test="description !=null">description=#{description},</if><if test="id !=null">id =#{id},</if><if test="image !=null">image =#{image},</if><if test="name !=null">name =#{name},</if><if test="price !=null">price =#{price},</if><if test="status !=null">status=#{status}</if></set>where id=#{id}</update>
    <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>
    /*** 根据菜品id删除对应的口味数据* @param dishId*/@Delete ( "delete from dish_flavor where dish_id=#{dishId}" )void deleteByDishId(Long dishId);

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

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

相关文章

【红蓝攻防鸿篇巨著】ATTCK视角下的红蓝对抗实战指南

【文末送书】今天推荐一本网安领域优质书籍《ATT&CK视角下的红蓝对抗实战指南》&#xff0c;本文将从其亮点与内容出发&#xff0c;详细阐发其对于网安从业人员的重要性与益处。 文章目录 背景简介内容文末送书 背景 根据中国互联网络信息中心&#xff08;CNNIC&#xff0…

正则表达式包含数字和字符匹配

至少6位。 pattern : (?.[0-9])(?.[A-Za-z])[0-9A-Za-z]{6,} 正则表达式中的“?”是一个正向预查字符&#xff0c;它的意思是匹配前一个字符出现的最少一次。具体来说&#xff0c;当一个匹配出现时&#xff0c;它会检查前一个字符是否符合要求&#xff0c;如果符合&#xf…

Yuhan Blu-ray DVD Creator for Mac: 打造专属的高清视听盛宴

在如今的高清时代&#xff0c;谁能拒绝一款能够轻松将高清影片刻录成蓝光DVD的刻录机呢&#xff1f;而Yuhan Blu-ray DVD Creator for Mac正是这样一款令人惊艳的软件。 作为一款专为Mac用户打造的蓝光DVD刻录机&#xff0c;Yuhan Blu-ray DVD Creator for Mac支持将各种高清视…

媒体宣传如何助力品牌发展

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传可以在多方面助力品牌发展&#xff0c;下面是一些关键的方式&#xff1a; 1. 提高品牌知名度&#xff1a;媒体宣传可以将品牌曝光给更广泛的受众&#xff0c;使更多人了解您的品…

【Nginx37】Nginx学习:SSL模块(一)简单配置与指令介绍

Nginx学习&#xff1a;SSL模块&#xff08;一&#xff09;简单配置与指令介绍 又是一个重点模块&#xff0c;SSL 模块&#xff0c;其实就是我们常见的 HTTPS 所需要的配置模块。HTTPS 的重要性不用多说了吧&#xff0c;现在所有的 App、小程序 都强制要求是 HTTPS 的&#xff0…

代码随想录打卡第五十六天|1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

1143.最长公共子序列 题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的…

深入理解udp

1.再谈端口号 1.1复习 我们上一篇谈了很久的应用层的http&#xff0c;并在此前我们使用socket编程写了一个能相互通信的客户端与服务端&#xff0c;但是我们也只是粗略的理解了一下tcp和udp在编程过程中所形成的差异性&#xff0c;并没有实质去了解一下其详细内容&#xff0c;…

家政服务系统小程序app开发功能架构;

家政服务小程序系统&#xff0c;轻松搭建上门服务小程序。支持H5与小程序双端&#xff0c;还能DIY页面。根据您的需求&#xff0c;我们可定制开发家政服务小程序系统。想添加多种服务类目、优惠专区以及IM即时沟通功能&#xff1f;没问题&#xff0c;我们支持&#xff01;想要快…

【计算机网络笔记】传输层——可靠数据传输原理之Rdt协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

局域网内两台电脑共享文件夹(通过网线直连共享数据)

文章目录 2.设置共享文件夹3.访问共享文件夹 1.将两台电脑置于同一局域网下 用网线将两台电脑连接关闭两台电脑防火墙将两台电脑IP地址设置在同一局域网下 测试是否在同一局域网下&#xff0c;使用ping命令 ping 192.168.0.122.设置共享文件夹 选择想要共享的文件夹&#xff…

微服务-统一网关Gateway

网关的作用 对用户请求做身份认证、权限校验将用户请求路由到微服务&#xff0c;并实现负载均衡对用户请求做限流 搭建网关服务 创建新module&#xff0c;命名为Gateway&#xff0c;引入依赖&#xff08;1.SpringCloudGateway依赖&#xff1b;2.Eureka客户端依赖或者nacos的服…

git命令清单

一、设置和配置 1.初始化一个新的仓库&#xff1a; git init2.克隆&#xff08;Clone&#xff09;一个远程仓库到本地&#xff1a; git clone <repository_url>3.配置用户信息&#xff1a; git config --global user.name "Your Name" git config --global…

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式 Hadoop Local (Standalone) Mode 单机模式 1. 修改yum源 并升级内核和软件 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecacheyum -y update2. 安…

【新品首发】DPEasy,让数据库安全风险无所遁形!

就在今天&#xff0c;DPEasy 正式出道啦&#xff01;&#xff01;&#xff01; DPEasy 是由杭州图尔兹信息技术有限公司自主研发的一款高效的数据库安全风险扫描工具&#xff0c;旨在帮助大家发现并分析出数据库可能面临的安全威胁。同时&#xff0c;在不影响应用运行的情况下…

【Java 进阶篇】深入理解 Java Response:从基础到高级

HTTP响应&#xff08;Response&#xff09;是Web开发中的一个关键概念&#xff0c;它是服务器向客户端&#xff08;通常是浏览器&#xff09;返回数据的方式。理解如何在Java中处理和构建HTTP响应是开发Web应用程序的重要一部分。本文将从基础知识到高级技巧&#xff0c;详细介…

Qt QWidget、QDialog、QMainWindow的区别

QWidget QWidget是Qt框架中最基础的窗口类&#xff0c;可以理解为用户界面的最基本单元。QWidget类提供了一个空白窗口&#xff0c;可以通过继承该类来创建自定义的窗口类。QWidget类提供了基本的窗口属性和方法&#xff0c;如大小、位置、标题、图标等。 QDialog QDialog是…

【设计模式】第18节:行为型模式之“迭代器模式”

一、简介 迭代器模式&#xff08;Iterator Design Pattern&#xff09;&#xff0c;也叫作游标模式&#xff08;Cursor Design Pattern&#xff09;。 在通过迭代器来遍历集合元素的同时&#xff0c;增加或者删除集合中的元素&#xff0c;有可能会导致某个元素被重复遍历或遍…

Flask Shell 操作 SQLite

一、前言 这段时间在玩Flask Web&#xff0c;发现用Flask Shell去操作SQLite还是比较方便的。今天简单地介绍一下。 二、SQLite SQLite是一种嵌入式数据库&#xff0c;它的数据库就是一个文件&#xff0c;处理速度快&#xff0c;经常被集成在各种应用程序中&#xff0c;在IO…

安装OPENCMS过程记录

今天尝试安装个人网站&#xff0c;或者说是内容管理系统&#xff0c;wordpress 是PHP的&#xff0c;所以上网找了一个免费的&#xff0c;在知乎上基于Java的开源CMS有哪些推荐&#xff0c;各自特点是什么 - 知乎 (zhihu.com) 找了这个opencms&#xff0c;据说是免费&#xff0…

什么是AUTOSAR ComStack,AUTOSAR架构中,CAN通信堆栈CAN Communication Stack介绍

AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;ComStack指的是AUTOSAR架构中的通信堆栈。在AUTOSAR体系结构中&#xff0c;ComStack是指用于不同软件组件&#xff08;如应用软件、基础软件等&#xff09;之间进行通信的一组协议和服务。 在AUTOSAR架构中…