【瑞吉外卖】学习笔记-day5:(一)套餐管理开发——新增套餐、套餐分页查询、删除/起售/停售套餐

新增套餐:

需求分析:

套餐就是菜品的集合。

后台系统中可以管理套餐信息,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐。

 数据模型:

新增套餐,其实就是将新增页面录入的套餐信息插入到setmeal表,还需要向setmeal_dish表插入套餐和菜品关联数据。所以在新增套餐时,涉及到两个表:

setmeal套餐表

setmeal_dish 套餐菜品关系表

 准备工作:

需要用到的类和接口基本结构

1、实体类SetmealDish(Setmeal实体前面课程中已经导入过了)

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 套餐菜品关系
 */
@Data
public class SetmealDish implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;


    //套餐id
    private Long setmealId;


    //菜品id
    private Long dishId;


    //菜品名称 (冗余字段)
    private String name;

    //菜品原价
    private BigDecimal price;

    //份数
    private Integer copies;


    //排序
    private Integer sort;


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


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


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


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


    //是否删除
    private Integer isDeleted;
}

2、DTO SetmealDto数据传输对象

import com.itzq.reggie.entity.Setmeal;
import com.itzq.reggie.entity.SetmealDish;
import lombok.Data;
import java.util.List;

@Data
public class SetmealDto extends Setmeal {

    private List<SetmealDish> setmealDishes;

    private String categoryName;
}

3、Mapper接口SetmealDishMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itzq.reggie.entity.SetmealDish;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface SetmealDishMapper extends BaseMapper<SetmealDish> {
}

4、业务层接口SetmealDishService

import com.baomidou.mybatisplus.extension.service.IService;
import com.itzq.reggie.entity.SetmealDish;

public interface SetmealDishService extends IService<SetmealDish> {
}

5、业务层实现类SetmealDishservicelmpl

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itzq.reggie.entity.SetmealDish;
import com.itzq.reggie.mapper.SetmealDishMapper;
import com.itzq.reggie.service.SetmealDishService;
import org.springframework.stereotype.Service;

@Service
public class SetmealDishServiceImpl extends ServiceImpl<SetmealDishMapper,SetmealDish> implements SetmealDishService {
}

6、控制层SetmealController

import com.itzq.reggie.service.SetmealDishService;
import com.itzq.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {
    @Autowired
    private SetmealService setmealService;
    
    @Autowired
    private SetmealDishService setmealDishService;
    
}

 交互流程:

1、页面(backend/page/combo/add.html)发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框中
2、页面发送ajax请求,请求服务端,获取菜品分类数据并展示到添加菜品窗口中
3、页面发送ajax请求,请求服务端,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中
4、页面发送请求进行图片上传,请求服务端将图片保存到服务器
5、页面发送请求进行图片下载,将上传的图片进行回显
6、点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端

开发新增套餐功能,其实就是在服务端编写代码去处理前端页面发送的这6次请求即可

代码开发:

在DishController类中,添加list方法
注意:需要添加额外的查询条件,只查询status为1的数据,表示该菜品为起售状态,才能被加入套餐中,供用户选择

/**
 * 根据条件来查询对应的菜品数据
 * @param dish
 * @return
 */
@GetMapping("/list")
public R<List<Dish>> list(Dish dish){

    //构造查询条件
    LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(dish.getCategoryId() != null,Dish::getCategoryId,dish.getCategoryId());
    //添加条件,查询状态为1(起售)的菜品
    queryWrapper.eq(Dish::getStatus,1);


    //添加排序条件
    queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);

    List<Dish> list = dishService.list(queryWrapper);

    return R.success(list);
}

刷新界面,查询数据成功,并回显到前端页面

 

 服务端接收页面提交的数据:

添加套餐页面,输入数据,点击保存,插卡前端页面发送的请求:

根据前端传过来的数据我们可以在后端确定我们需要在后端使用什么来接受前端的参数:

在SetmealController类中添加save方法。编写controller:上面的dishList,我们数据库并不需要这个数据,所以接收数据的实体类没有dishList这个属性也没有关系,前端传过来的数据都是自动映射到接收数据的实体类的属性上的,没有对应起来就不会映射。

/**
 * 新增套餐
 * @param setmealDto
 * @return
 */
@PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto){
    log.info("套餐信息:{}",setmealDto);

    setmealService.saveWithDish(setmealDto);

    return R.success("新增套餐成功");
}

SetmealService中添加自定义的方法:

/**
     * 新增套餐,同时需要保存套餐和菜品的关联关系
     * @param setmealDto
     */
    public void saveWithDish(SetmealDto setmealDto);

 SetmealServiceImpl实现类:

@Autowired
private SetmealDishService setmealDishService;

/**
 * 新增套餐,同时需要保存套餐和菜品的关联关系
 * @param setmealDto
 */
@Transactional
public void saveWithDish(SetmealDto setmealDto) {
    //保存套餐基本信息,操作setmeal表,执行insert操作
    this.save(setmealDto);

    List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
    setmealDishes.stream().map((item) -> {
        item.setSetmealId(setmealDto.getId());
        return item;
    }).collect(Collectors.toList());

    //保存套餐和菜品的关联信息操作setmeal_dish,执行insert操作
    setmealDishService.saveBatch(setmealDishes);

}

 套餐分页查询:

需求分析:

系统中的套餐数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。

交互流程:

1、页面(backend/page/combo/list.html)发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据。
2、页面发送请求,请求服务端进行图片下载,用于页面图片展示。

开发套餐信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。

代码开发:

在SetmealController类中添加page方法(与前面菜品信息分页查询方法类似)

/**
 * 套餐分页查询
 * @param page
 * @param pageSize
 * @param name
 * @return
 */
@GetMapping("/page")
public  R<Page> page(int page, int pageSize, String name){
    //分页构造器对象
    Page<Setmeal> pageInfo = new Page<>(page,pageSize);
    Page<SetmealDto> dtoPage = new Page<>();

    LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();

    //添加查询条件,根据name进行like模糊查询
    queryWrapper.like(name != null,Setmeal::getName,name);
    //添加排序条件,根据更新时间降序排列
    queryWrapper.orderByDesc(Setmeal::getUpdateTime);

    setmealService.page(pageInfo,queryWrapper);

    //对象拷贝
    BeanUtils.copyProperties(pageInfo,dtoPage,"records");
    List<Setmeal> records = pageInfo.getRecords();

    List<SetmealDto> list = records.stream().map((item) -> {
        SetmealDto setmealDto = new SetmealDto();
        //对象拷贝
        BeanUtils.copyProperties(item,setmealDto);
        Long categoryId = item.getCategoryId();
        //根据分类id来查询分类对象
        Category category = categoryService.getById(categoryId);
        if(category != null){
            //分类名称
            String categoryName = category.getName();
            setmealDto.setCategoryName(categoryName);
        }
        return setmealDto;
    }).collect(Collectors.toList());

    dtoPage.setRecords(list);

    return R.success(dtoPage);
}

删除、起售以及停售套餐:

需求分析:

在套餐管理列表页面点击删除按钮,可以删除对应的套餐信息。也可以通过复选框选择多个套餐,点击批量删除按钮一次删除多个套餐。注意,对于状态为售卖中的套餐不能删除,需要先停售,然后才能删除。

代码开发:

开发删除套餐功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。
观察删除单个套餐和批量删除套餐的请求信息可以发现,两种请求的地址和请求方式都是相同的,不同的则是传递的id个数,所以在服务端可以提供一个方法来统一处理。

(批量)停售、起售套餐:

/**
 * 根据id(批量)停售/启售套餐信息
 * @param status
 * @param ids
 * @return
 */
@PostMapping("/status/{status}")
public R<String> updateMulStatus(@PathVariable Integer status, Long[] ids){
    List<Long> list = Arrays.asList(ids);

    //构造条件构造器
    LambdaUpdateWrapper<Setmeal> updateWrapper = new LambdaUpdateWrapper<>();
    //添加过滤条件
    updateWrapper.set(Setmeal::getStatus,status).in(Setmeal::getId,list);
    setmealService.update(updateWrapper);

    return R.success("套餐信息修改成功");
}

删除套餐:

1、在SetmealService中添加自定义的方法:

/**
 * 删除套餐,同时删除套餐和菜品的关联关系
 * @param ids
 */
public void removeWithDish(List<Long> ids);

2、 在SetmealServiceImpl中实现该方法:

/**
 * 删除套餐,同时删除套餐和菜品的关联关系
 * @param ids
 */
@Transactional
public void removeWithDish(List<Long> ids) {
    //select count(*) from setmeal where id in (1,2,3) and statue = 1
    //查询套餐状态,确定是否可以删除
    LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.in(Setmeal::getId,ids);
    queryWrapper.eq(Setmeal::getStatus,1);
    int count = this.count(queryWrapper);
    if(count >0){   //在售卖中,不能删除
        //如果不能删除,抛出一个业务异常
        throw new CustomException("套餐正在售卖中,不能删除");
    }

    //如果可以删除,先删除套餐表中的数据---setmeal
    this.removeByIds(ids);

    //delete from setmeal_dish where setmeal_id in (1,2,3)
    LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.in(SetmealDish::getSetmealId,ids);
    //再删除关系表中的数据---setmeal_dish
    setmealDishService.remove(lambdaQueryWrapper);
}

3、在SetmealController中添加delete方法:

/**
 * 删除套餐
 * @param ids
 * @return
 */
@DeleteMapping
public R<String> delete(@RequestParam List<Long> ids){
    log.info("ids:{}",ids);

    setmealService.removeWithDish(ids);

    return R.success("套餐数据删除成功");
}

XuehaiB
关注 关注
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
瑞吉外小程序开发笔记
09-23
帮助瑞吉外学习的小伙伴快速查阅代码和主要内容。
最新java项目-瑞吉外
05-07
最新java项目-瑞吉外 最新java项目-瑞吉外最新java项目-瑞吉外
瑞吉外】SpringBoot使用邮件发送短信验证码--完善用户登录功能
06-24
黑马程序员---瑞吉外--SpringBoot项目 新增sendMail()方法,用户登录时使用QQ邮件发送验证码,完善用户登录功能。 亲测有效!
瑞吉外项目实战说明图文详解
02-27
瑞吉外项目实战说明图文详解
黑马瑞吉外之菜品的启
jgdabc的博客
09-12 3161
所以到这里我们其实需要完成状态的修改,包含的就是批量状态的修改,另外就是单个状态的修改。可以从这里看到,这里其实对菜品信息的启用和禁用是根据前端这里scope.row的status返回值来进行设置和启的。这一部分功能是课程没有去完成的,但是其实是比较简单的,我们需要去完成菜品的启。我们可以发现这里其实也是调用到了同样的绑定的方法,只不过它这里其实传了一个字符串的1。执行之前的项目,我们要完成的就是这里的这个的状态的更改。所以其实在数据库的菜品的表的设计当中就有这样的一个字段。
瑞吉外-全网最全笔记-Day01
热门推荐
eadzsdad的博客
04-17 2万+
黑马教程-瑞吉外,基于流行的Spring Boot、mybatis plus等技术框架进行开发,带领学员体验真实项目开发流程、需求分析过程和代码实现过程。能够收获:锻炼需求分析能力、编码能力、bug调试能力,增长开发经验。
基于Springboot外系统18:套餐分页查询模块+删除套餐+多数据表同步
小李的研究生学习日记
08-21 9643
查询套餐信息时, 只包含套餐的基本信息, 并不包含套餐的分类名称, 所以在这里查询套餐的基本信息后, 还需要根据分类ID(categoryId), 查询套餐分类名称(categoryName),并最终将套餐的基本信息及分类名称信息封装到SetmealDto(在第一小节已经导入)中。查询返回的字段中,包含套餐的基本信息之外,还有一个套餐的分类名称,在查询时,需要关联查询这个字段。2). 删除多个套餐时,页面发送ajax请求,根据提交的多个套餐id删除对应套餐
Redis基础
黄辛华的博客
01-03 555
Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件
瑞吉外-Day6-功能开发(8)
m0_52255127的博客
08-04 420
瑞吉外-前端,购物车功能
学习瑞吉外⑤】SpringBoot单体项目_套餐管理业务开发
做笔记,记录学习中遇到的问题。
06-09 1488
本文内容:新增套餐功能的开发套餐数据分页查询功能的开发删除套餐功能的开发、其他功能(套餐 / 启功能、套餐修改功能)的开发
瑞吉外第二天资源讲义
04-22
瑞吉外第二天资源讲义
5W字详细-瑞吉外-功能开发以及拓展功能
06-07
详细讲解瑞吉外开发过程,并提供不同的实现方式
瑞吉外-Day01.md
03-30
瑞吉外-Day01.md
瑞吉外项目-服务端开发(未优化版本代码)
06-21
瑞吉外项目--服务端开发(未优化版本代码)
瑞吉外学习笔记...
08-28
瑞吉外学习笔记...
苍穹外-day04-套餐管理
最新发布
m0_64378422的博客
10-29 250
setmeal_dish表为套餐菜品关系表,用于存储套餐和菜品的关联关系。setmeal表为套餐表,用于存储套餐的信息。
黑马瑞吉外项目之菜品删除、起和批量删除、起菜品功能
m0_72256927的博客
07-06 587
黑马瑞吉外项目之菜品删除、起和批量删除、起菜品功能
删除套餐(关联表的删除操作,批量删除,单个删除
A1916403680的博客
09-09 379
删除套餐(关联表的删除操作,批量删除,单个删除
瑞吉外项目-菜品类别与套餐类别添加和修改以及查询,菜品的添加修改等功能
花花的小脑瓜的博客
03-12 1432
瑞吉外项目-菜品类别与套餐类别添加和修改以及查询,菜品的添加修改等功能
瑞吉外nginx笔记
08-10
很抱歉,根据提供的引用内容,没有找到关于"瑞吉外nginx笔记"的相关信息。请提供更具体的问题或者详细的信息,我将竭力为您提供帮助。123 #### 引用[.reference_title] - *1* *3* ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替) 2426
  • 【瑞吉外卖】学习笔记-day4:(三)菜品管理开发——菜品信息分页查询、修改菜品、停售起售菜品以及删除菜品 1537
  • 【瑞吉外卖】学习笔记-day1:项目介绍及后台初识 1193
  • 【瑞吉外卖】学习笔记-day6:(一)导入用户地址簿相关功能及菜品展示 1108
  • 【瑞吉外卖】学习笔记-day5:(一)套餐管理开发——新增套餐、套餐分页查询、删除/起售/停售套餐 1078

最新评论

  • 【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)

    m0_70995613: 登录的时候500是什么原因呢

  • 【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)

    m0_62291264: javaMailSender 报这个错是什么问题 Could not autowire. No beans of 'JavaMailSender' type found.

  • 【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)

    Clear_0625: 点击发送就直接闪退了,是没发送成功吗

  • 【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)

    无休止々爱你: 表情包 2023.5.8也遇到了这个问题

  • 【瑞吉外卖】学习笔记-day4:(一)菜品管理开发——文件上传

    djh123123: 大哥我爱你~笔记实在是太好了~

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 【瑞吉外卖】学习笔记-day6:(一)导入用户地址簿相关功能及菜品展示
  • 【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)
  • 【瑞吉外卖】学习笔记-day5:(二)套餐管理开发——修改套餐以及遗留待解决的一些问题
2022年14篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码鸡西seo排名多少钱长葛SEO按效果付费公司渭南网站优化排名推荐宝鸡模板网站建设玉溪网站优化软件多少钱沈阳英文网站建设多少钱大理建站岳阳百度竞价包年推广哪家好辽阳营销网站黔南seo排名哪家好唐山百姓网标王推广多少钱晋中外贸网站制作推荐南京关键词按天扣费报价滁州seo排名多少钱坪山网站定制推荐广州SEO按天收费南平企业网站改版价格常州网站改版哪家好临猗百搜标王公司黄山网站制作多少钱文山设计公司网站多少钱清远百搜标王公司佛山模板推广哪家好保山百度网站优化排名哪家好宜昌设计网站推荐飞来峡建站公司焦作网站搜索优化多少钱普洱网站推广系统哪家好永新百度标王多少钱黄山阿里店铺托管歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化