外卖项目03---分类管理业务开发

news2025/3/3 6:00:18

目录

一、公共字段自动填充 41

1.1问题分析 41

​编辑1.2公共字段自动填充---代码实现并测试 42

1.3公共字段自动填充---功能完善 43

二、新增分类 44

2.1需求分析 44

三、分类信息查询 45

3.1需求分析 45

3.2代码开发 流程分析

四、删除分类 46

4.1需求分析 46

4.2代码开发 

4.3功能完善---代码开发(自定义业务异常处理) 47

五、修改分类 48

5.1需求分析 48


一、公共字段自动填充 41

1.1问题分析 41

公共字段:在不同的功能处,都有存在响应的字段。实际上就是重复的内容,用到的地方比较多。

1.2公共字段自动填充---代码实现并测试 42

 实现步骤:

步骤一:在实体类属性上添加注解@TableField 

 步骤二:创建一个实体的公共类,用于公共字段的处理

步骤三:对公共字段的处理的属性信息在对应的方法处进行修改处理

之前的字段:

本部分的代码如下:

@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
    @Override //insert语句执行时才会运行该语句 添加时的处理操作
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充[insert]...");
        log.info(metaObject.toString());
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("createUser",new Long(1));//由于我们需要获得Sesion中的数据信息,
                                                            // 但是该类中不能直接获取,先用“1”来代替填充数据
        metaObject.setValue("updateUser",new Long(1));

    }

    @Override //update语句执行时才会运行该语句 更新时的处理操作
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充[update]...");
        log.info(metaObject.toString());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",new Long(1));
    }
}

1.3公共字段自动填充---功能完善 43

问题处理:本部分解决在1.2中createUser和updateUser时,设置的属性信息为固定值。将该固定值设置为动态获得当前登陆用户的id。

解决方案:

 

 ThreadLocal:

实现步骤:

 步骤一:创建BaseContext工具类。

代码:

/**
 * 基于ThreadLocal封装工具类,用户保存和获取当前登陆用户id
 */
public class BaseContext {

    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();


    public static void setCurrentId(Long id){
        threadLocal.set(id);//设置id
    }

    public static Long getCurrrentId(){//获取id并返回long类
        return threadLocal.get();
    }
}

步骤二:在LoginCheckFilter方法中调用创建的工具类,使得其能够调用获取用户登陆成功的id信息

            Long empId = (Long) request.getSession().getAttribute("employee");
            BaseContext.setCurrentId(empId);

步骤三:在MyMethaObjecthandler方法中,获取步骤二设定的id值

二、新增分类 44

2.1需求分析 44

 

 分类管理的数据模型:数据库中的表category

代码开发的基础准备:(骨架的搭建)

 

三、分类信息查询 45

3.1需求分析 45

需求分析:将分类管理进行分页处理 

3.2代码开发 流程分析

本部分代码:

    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        //分页构造器
        Page<Category> pageInfo = new Page<>(page,pageSize);

        //条件构造器,需要设置一个过滤的条件,进行排序。在category实体类里面有一个排序的条件sort
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();

        //添加排序条件,根据sort进行排序
        queryWrapper.orderByAsc(Category::getSort);//根据sort这个字段来进行升序排序

        //进行分页查询
        categoryService.page(pageInfo,queryWrapper);//根据page类进行分页查询
        return R.success(pageInfo);
    }

四、删除分类 46

4.1需求分析 46

注:如果这个分类下面连接着其他的具体的某个菜,是不能被删除的。例如:热门菜品分类:关联着鱼香肉丝。那么这个热门菜品的这个分类是不能被删除的。

4.2代码开发 

 初步的代码:

    /**
     * 根据id删除分类
     * @param id
     * @return
     */
    @DeleteMapping
    public R<String> delete(Long id){
        log.info("删除分类,id为:{}",id);
        
        categoryService.removeById(id);
        return R.success("分类信息删除成功");
    }

4.3功能完善---代码开发(自定义业务异常处理) 47

前期的基础内容准备:基础的类和基础的接口 

 解决方案;因为删除菜品分类之前,需要有一个判断的过程,看是否能被删除掉。4.2中使用的是mtbatis给封装好的一个remove。我们就需要创建一个新的,在CategoryService的接口中创建一个新的方法。

解决该问题的步骤

步骤一:创建分类管理类中创建异常的方法

步骤二:在对应的实现类中方法代码书写

@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper,Category> implements CategoryService {

    @Autowired
    private SetmealService setmealService;
    @Autowired
    private DishService dishService;
    /**
     * 根据id删除分类,删除之前需要进行判断
     * @param id
     */
    @Override
    public void remove(Long id) {
        //构造查询对象
        LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //添加查询条件,根据分类id进行查询
        dishLambdaQueryWrapper.eq(Dish::getCategoryId,id);//查询输出的Long id。传入的id和CategoryId进行匹配
        int count1 = dishService.count(dishLambdaQueryWrapper);

        //1、查询当前分类是否关联了菜品,如果已经关联,抛出一个业务异常。
        if(count1 > 0){
            //已经关联菜品,抛出一个业务异常
            throw new CustomException("当前分类下关联了菜品,不能删除");//实际上就是在前端的页面上点击删除后,
                                                                    // 会弹出窗口提示异常的信息
        }

        //2、查询当前分类是否关联了套餐,如果已经关联,抛出一个业务异常
        //构造查询对象
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //添加查询条件,根据分类id进行查询
        setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
        int count2 = setmealService.count(setmealLambdaQueryWrapper);
        if(count2 > 0){
            //已经关联套餐,抛出一个业务异常
            throw new CustomException("当前分类下关联了套餐,不能删除");
        }

        //正常删除
        super.removeById(id);
    }
}

步骤三:在上述的基础上创建一个自定义的业务异常类(公共类)

代码:

/**
 * 自定义业务异常类
 */
public class CustomException extends RuntimeException {
    public CustomException(String message){
        super(message);
    }

}

 并在之前的全局异常位置进行添加处理:

代码如下:

    /**
     * 异常处理方法
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public R<String> exceptionHandler(CustomException ex){

        log.error(ex.getMessage());

        return R.error(ex.getMessage());//通过ex就可以直接获取前面定义的message信息。
    }
}

步骤四:在Controller层中进行方法的调用

代码:

    /**
     * 根据id删除分类
     * @param id
     * @return
     */
    @DeleteMapping
    public R<String> delete(Long id){
        log.info("删除分类,id为:{}",id);

//        categoryService.removeById(id);//removeById是mybatis内置的方法。
        categoryService.remove(id);//这个是自己创建的业务异常删除的方法,调用CategoryServiceImpl中的remove方法
        return R.success("分类信息删除成功");
    }

五、修改分类 48

5.1需求分析 48

 信息回显:就是点击“修改”按钮后,弹出的窗口上就有对应的信息内容展示。

代码部分:在controller层进行修改处理

    /**
     * 根据id修改分类信息
     * @param category
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("修改分类信息:{}",category);

        categoryService.updateById(category);
        return R.success("修改分类信息成功");

    }

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

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

相关文章

教你打造高性能的 Go 缓存库

我在看一些优秀的开源库的时候看到一个有意思的缓存库 fastcache&#xff0c;在它的介绍主要有以下几点特点&#xff1a; 读写数据要快&#xff0c;即使在并发下&#xff1b;即使在数 GB 的缓存中&#xff0c;也要保持很好的性能&#xff0c;以及尽可能减少 GC 次数&#xff1…

基于Fluent求解器进行二次开发到底怎么做?

作者 | 小田老师 Ansys Fluent软件作为通用的流体仿真软件&#xff0c;功能模型虽然多而全&#xff0c;但是缺乏相应的行业专业性。同时仿真分析具有一定的技术门槛&#xff0c;既需要技术人员具备行业基础&#xff0c;也需要积累相关仿真经验&#xff0c;对软件操作要有较高的…

Docker安装Redis

文章目录1.Docker搜索Redis镜像2.Docker拉取镜像3.Docker挂载配置文件4.启动Redis 容器5.测试Redis6.Docker删除Redis1.Docker搜索Redis镜像 命令&#xff1a;docker search <镜像名称> docker search redis可以看到有很多redis的镜像&#xff0c;此处因没有指定版本&…

干货|数据安全治理白皮书4.0(文末附下载链接)

数据安全治理白皮书是国内最早的数据安全治理白皮书系列&#xff0c;围绕数据安全治理&#xff0c;“新理论、新技术、新实践”&#xff0c;一次系统汇总、梳理分析与集中呈现&#xff0c;2018年-2021年&#xff0c;已发布1.0/2.0/3.0三个版本&#xff0c;2022年&#xff0c;已…

线性二分类的实现

神经网络结构 从视觉上判断是线性可分的&#xff0c;使用单层神经网络&#xff1b; 输入层设置两个输入单元&#xff0c;表示经纬度&#xff1a;&#x1d44b;&#x1d465;1,&#x1d465;2 输出层设置一个单元&#xff0c;表示地盘所属阵营&#xff1a; &#x1d467;&…

STC15W单片机防丢语音报警GPS北斗定位测距双机LORA无线手持可充电

实践制作DIY- GC0091-防丢语音报警 一、功能说明&#xff1a; 基于STC15W单片机设计-防丢语音报警 功能介绍&#xff1a; 主机硬件&#xff1a; STC15W4K48S4&#xff08;或者STM32F103CxT6&#xff09;系列最小系统板OLED显示器LORA无线通讯模块GPS北斗双模定位模块蜂鸣器…

RGD环肽:环六肽c(GRGDSP),CAS号: 135432-37-0

c(GRGDSP)是一个环RGD肽。刺激大鼠传入小动脉的收缩。已用于顺铂的靶向给药。结果表明&#xff0c;c(RGDSP)可抑制小鼠B16黑色素瘤细胞在纤连蛋白包被孔上的粘附。 编号: 194990中文名称: RGD环肽&#xff1a;环六肽c(GRGDSP)英文名: cyclo(GRGDSP)CAS号: 135432-37-0单字母: c…

电子统计台账:中文标记月度流水账格式数据的转换,以及过滤模板的普遍适配性

上一个例子展示的台账格式中&#xff0c;月份是阿拉伯数字。本文试着转换中文月份格式的台账数据。 1 新建项目 新建一个项目“测试06_工业生产_中文月度流水账_202101”。 切换到2021年1月。 2 打开数据源文件 打开2个企业数据源文件&#xff1a; 6流水账式中文月份M_1-…

go pprof 实战

为什么要进行性能优化 哪些情况需要进行性能优化 其实关于性能优化的主题&#xff0c;网上已经讨论很多次&#xff0c;这里谈一下我的理解&#xff0c;那么其实核心就是 2 个点&#xff1a; 服务一直高负载&#xff0c;业务增长需要经常扩容架构不能满足业务发展&#xff0c…

[附源码]java毕业设计基于的考研408课程学习平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

阿里云产品经理刘宇:Serverless 的前世今生

2022 年 9 月 24 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 12 期活动在厦门举办。活动现场&#xff0c;阿里云 Serverless 产品经理刘宇&#xff0c;向参会企业代表分享了Serverless 架构的前世今生。本文根据演讲内容整理而成&#xff0c;希望和大家一起探索…

基于SSM花卉商城设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

商业智能BI,助力企业数据文化建设

当今&#xff0c;互联网技术飞速发展&#xff0c;我们每天都在接收者来自各方面的海量信息&#xff0c;这样一个信息爆炸的时代&#xff0c;企业如何看待数据、整理数据、利用数据&#xff0c;又如何从这些数据中发掘出有效的信息&#xff0c;成为企业新的生存技能之一。 数据…

QT -- 多线程 —— moveToThread

视频教程链接&#xff1a; https://www.bilibili.com/video/BV1fL4y1V7QP/?spm_id_from333.880.my_history.page.click&vd_sourceb91967c499b23106586d7aa35af46413 moveToThread函数的功能&#xff1a;给多个任务&#xff08;比如显示多个界面&#xff09;各分配一个线程…

基金交易场景下,如何利用 Apache APISIX 来稳固 API 安全

王晔倞&#xff0c;Apache APISIX Committer&#xff0c;公众号「头哥侃码」作者。 背景介绍 金融领域的企业中&#xff0c;安全是非常重中之重的因素。 通常各类金融企业都会花费大量成本去采购安全相关的设备和硬件&#xff0c;基金管理相关企业更是如此。 根据相关国内基金…

在window和Linux上使用docker安装RocketMQ

1.创建namesrv服务 拉取镜像 docker pull rocketmqinc/rocketmq:latest启动 namesrv docker run -d -p 9876:9876 -v D:/programCoding/Docker/rocketmq/namesrv/logs:/root/logs -v D:/programCoding/Docker/rocketmq/namesrv/store:/root/store --name rmqnamesrv -e &quo…

信息论随笔(二)信息熵及其性质

回顾 上次讲到自信息量&#xff0c;也就是用来表示一个发生概率为p的事件含有的信息量&#xff0c;或者说不确定度。一个事件的发生的概率越小&#xff0c;它的不确定度越大&#xff0c;含有的信息量也就越大。 信息熵 那么如何来衡量一个系统&#xff08;多个事件以不同的概…

Java项目:眼镜商城系统(java+SSM+JSP+jQuery+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,管理商城会员,新闻公告管理,眼睛类型管理,城市信息管理,连锁配镜店管理,眼镜商品管理,用户订单管理,管理用户的评价信息等功能。 …

【数据库数据恢复】SQL SERVER数据库MDF (NDF)或LDF损坏怎么恢复数据?

SQL SERVER数据库故障类型&#xff1a; MDF&#xff08;NDF&#xff09;或LDF损坏。 SQL SERVER故障原因&#xff1a; 1、数据库正在操作过程中&#xff0c;机器突然断电&#xff1b; 2、人为误操作。 SQL SERVER故障表现&#xff1a; 1、数据库在管理器界面显示处于“置疑”…

深度学习必备Python基础知识充电1

一、Python解释器运行程序 也被称之为对话模式 就是进行人机交互 1.1 算术计算 >>> 12 3 >>> 9-6 3 >>> 6*3 18 >>> 9/3 3.0 >>> 4/5 0.8 >>> 1/3 0.3333333333333333 >>> 3**9 19683 >>> 3**2 9 &…