基于Springboot外卖系统11:菜品新增类别+类别信息分页查询

1. 新增分类

1.1 需求分析

后台系统中可以管理分类信息,分类包括两种类型,分别是 菜品分类套餐分类 。当我们在后台系统中添加菜品时需要选择一个菜品分类,在后台系统中添加一个套餐时需要选择一个套餐分类,在移动端也会按照菜品分类和套餐分类来展示对应的菜品和套餐。

在分类管理中,新增分类时可以选择新增菜品分类(川菜、湘菜、粤菜...), 也可以选择新增套餐分类(营养早餐、超值午餐...)。 在添加套餐的时候, 输入的排序字段, 控制的是移动端套餐列表的展示顺序。  

1.2 数据模型

新增分类,将新增窗口录入的分类数据,插入到category表,具体表结构如下:

套餐名称是唯一的,不能够重复的,所以在设计表结构时,已经针对于name字段建立了唯一索引,如下:  

1.3 前端页面分析

整个程序的执行过程:

1). 在页面(backend/page/category/list.html)的新增分类表单中填写数据,点击 "确定" 发送ajax请求,将新增分类窗口输入的数据以json形式提交到服务端

2). 服务端Controller接收页面提交的数据并调用Service将数据进行保存

3). Service调用Mapper操作数据库,保存数据

1.3.1 json数据结构分析

新增菜品分类和新增套餐分类请求的服务端地址和提交的json数据结构相同,所以服务端只需要提供一个方法统一处理即可:

 具体请求信息整理如下:

请求说明
请求方式POST
请求路径/category
请求参数json格式 - {"name":"川菜","type":"1","sort":2}

1.4 代码实现

代码实现的具体步骤如下:

  • 实体类Category(直接从课程资料中导入即可)

  • Mapper接口CategoryMapper

  • 业务层接口CategoryService

  • 业务层实现类CategoryServiceImpl

  • 控制层CategoryController

1). 实体类Category

package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;/*** 分类*/
@Data
public class Category implements Serializable {private static final long serialVersionUID = 1L;private Long id;//类型 1 菜品分类 2 套餐分类private Integer type;//分类名称private String name;//顺序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;}

2). Mapper接口CategoryMapper

package com.itheima.reggie.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.reggie.entity.Category;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface CategoryMapper extends BaseMapper<Category> {}

3). 业务层接口CategoryService

package com.itheima.reggie.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.mapper.CategoryMapper;
import com.itheima.reggie.service.CategoryService;
import org.springframework.stereotype.Service;/*** Description: 类别业务层接口* @version 1.0* @date 2022/8/15 13:55*/@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
}

4). 业务层实现类CategoryServiceImpl

package com.itheima.reggie.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.mapper.CategoryMapper;
import com.itheima.reggie.service.CategoryService;
import org.springframework.stereotype.Service;@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
}

5). 控制层CategoryController

package com.itheima.reggie.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;/*** Description: 分类管理*/@RestController
@RequestMapping("/category")
@Slf4j
public class CategoryController {@Autowiredprivate CategoryService categoryService;/**@Description: 新增分类* @author LiBiGo* @date 2022/8/15 14:05*/@PostMappingpublic R<String> save(@RequestBody Category category){log.info("category:{}",category);categoryService.save(category);return R.success("新增分类成功");}@GetMapping("/page")public R<Page> page(int page,int pageSize){/**@Description: 分页查询* @author LiBiGo* @date 2022/8/15 14:21*/// 分页构造Page<Category> pageinfo = new Page<>(page,pageSize);// 构造条件构造器对象LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper();// 添加排序条件,根据sore进行排序queryWrapper.orderByAsc(Category::getSort);// 进行分页查询categoryService.page(pageinfo,queryWrapper);return R.success(pageinfo);}
}

1.5 功能测试

新启动项目,进入管理系统访问分类管理, 然后进行新增分类测试,需要将所有情况都覆盖全,例如:

1). 输入的分类名称不存在

2). 输入已存在的分类名称

3). 新增菜品分类

4). 新增套餐分类

2. 分类信息分页查询

2.1 需求分析

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

2.2 前端页面分析

在开发代码之前,需要梳理一下整个程序的执行过程:

1). 页面发送ajax请求,将分页查询参数(page、pageSize)提交到服务端

2). 服务端Controller接收页面提交的数据并调用Service查询数据

3). Service调用Mapper操作数据库,查询分页数据

4). Controller将查询到的分页数据响应给页面

5). 页面接收到分页数据并通过ElementUI的Table组件展示到页面上

页面加载时,就会触发Vue声明周期的钩子方法,然后执行分页查询,发送异步请求到服务端,前端代码如下:

 页面中使用的是ElementUI提供的分页组件进行分页条的展示:

 我们通过浏览器,也可以抓取到分页查询的请求信息, 如下:

具体的请求信息整理如下:

请求说明
请求方式GET
请求路径/category/page
请求参数?page=1&pageSize=10

2.3 代码实现

在CategoryController中增加分页查询的方法,在方法中传递分页条件进行查询,并且需要对查询到的结果,安排设置的套餐顺序字段sort进行排序。

    @GetMapping("/page")public R<Page> page(int page,int pageSize){/**@Description: 分页查询* @author LiBiGo* @date 2022/8/15 14:21*/// 分页构造Page<Category> pageinfo = new Page<>(page,pageSize);// 构造条件构造器对象LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper();// 添加排序条件,根据sore进行排序queryWrapper.orderByAsc(Category::getSort);// 进行分页查询categoryService.page(pageinfo,queryWrapper);return R.success(pageinfo);}

2.4 功能测试

分页查询的代码编写完毕之后, 我们需要重新启动项目,然后登陆系统后台,点击分类管理,查询分类列表是否可以正常展示。测试过程中可以使用浏览器的监控工具查看页面和服务端的数据交互细节。

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

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

相关文章

基于Springboot外卖系统12:删除菜品套餐类别+修改套餐类别信息

1. 删除分类 1.1 需求分析 在分类管理列表页面&#xff0c;可以对某个分类进行删除操作。需要注意的是当分类关联了菜品或者套餐时&#xff0c;此分类不允许删除。 1.2 前端页面分析 在前端页面中&#xff0c;点击 "删除" 按钮&#xff0c;就会触发定义的方法&…

html5手机移动端三级联动城市选择器

//我的地址 var area1 new LArea(); area1.init({ trigger: #demo1, //触发选择控件的文本框&#xff0c;同时选择完毕后name属性输出到该位置 valueTo: #value1, //选择完毕后id属性输出到该位置 keys: { id: id, name: name }, //绑定数据源相关字段 id对应valueTo的value属…

我的师傅是风清扬

1 珍惜那些处处帮助你的人 国庆假期就要过去了&#xff0c;国庆这几天一直在考虑一个问题&#xff08;先保留是什么问题&#xff09;&#xff0c;也咨询了几个比较信任的朋友&#xff0c;都没有得到肯定的答案。 回家路上跟了一个大哥哥&#xff08;陈哥&#xff09;&#xf…

要多大内存才满足_佛龛的尺寸要多大?

佛龛是用于供奉佛像或者牌位的小阁子&#xff0c;大多数是木制家具。佛龛在一般是仿中国古代的房子等工程建筑制做而成&#xff0c;在其纹样层面有很高的要求&#xff0c;有关纹样今日姑且先不谈。除此之外佛龛的尺寸大小多少才算吉祥也是很有讲究的&#xff0c;那麼这个问题跟…

【YOLOV5-6.x讲解】数据配置文件 data/XXX.yaml

主干目录&#xff1a; 【YOLOV5-6.x 版本讲解】整体项目代码注释导航现在YOLOV5已经更新到6.X版本&#xff0c;现在网上很多还停留在5.X的源码注释上&#xff0c;因此特开一贴传承开源精神&#xff01;5.X版本的可以看其他大佬的帖子本文章主要从6.X版本出发&#xff0c;主要解…

python print 输出到txt_(Python基础教程之七)Python字符串操作

Python基础教程在SublimeEditor中配置Python环境Python代码中添加注释Python中的变量的使用Python中的数据类型Python中的关键字Python字符串操作Python中的list操作Python中的Tuple操作Pythonmax()和min()–在列表或数组中查找最大值和最小值Python找到最大的N个(前N个)或最小…

【YOLOV5-6.x讲解】常用工具类 models/common.py

主干目录&#xff1a; 【YOLOV5-6.x 版本讲解】整体项目代码注释导航现在YOLOV5已经更新到6.X版本&#xff0c;现在网上很多还停留在5.X的源码注释上&#xff0c;因此特开一贴传承开源精神&#xff01;5.X版本的可以看其他大佬的帖子本文章主要从6.X版本出发&#xff0c;主要解…

【YOLOV5-6.x讲解】DIY实验文件 models/experimental.py

主干目录&#xff1a; 【YOLOV5-6.x 版本讲解】整体项目代码注释导航现在YOLOV5已经更新到6.X版本&#xff0c;现在网上很多还停留在5.X的源码注释上&#xff0c;因此特开一贴传承开源精神&#xff01;5.X版本的可以看其他大佬的帖子本文章主要从6.X版本出发&#xff0c;主要解…

mysql 触发器_MySQL入门之触发器

触发器作用当操作了某张表时&#xff0c;希望同时触发一些动作/行为&#xff0c;可以使用触发器完成&#xff01;&#xff01;例如&#xff1a; 当向员工表插入一条记录时&#xff0c;希望同时往日志表插入数据。首先创建日志表-- 日志表CREATE TABLE test_log(id INT PRIMARY …

【YOLOV5-6.x讲解】模型搭建模块 models/yolo.py

主干目录&#xff1a; 【YOLOV5-6.x 版本讲解】整体项目代码注释导航现在YOLOV5已经更新到6.X版本&#xff0c;现在网上很多还停留在5.X的源码注释上&#xff0c;因此特开一贴传承开源精神&#xff01;5.X版本的可以看其他大佬的帖子本文章主要从6.X版本出发&#xff0c;主要解…

C++primer拾遗(第八章:IO库)

第八章内容不多&#xff0c;不过包含比较实用的文件读写操作。 总结不易&#xff0c;转载注明出处&#xff0c;谢谢。 http://www.cnblogs.com/linhaowei0389/ 转载于:https://www.cnblogs.com/linhaowei0389/p/6628471.html

python中cmd是什么_python中的cmd是什么

cmd模块是python中包含的一个公共模块&#xff0c;用于交互式shell和其它命令解释器等的基类。我们可以基于cmd模块自定义我们的子类&#xff0c;实现我们自己的交互式shell。 它的执行流程也挺简单的&#xff0c;使用命令行解释器循环读取输入的所有行并解析它们&#xff0c;然…

基于Springboot外卖系统13:实现文件上传下载模块

1. 上传功能模块 1.1 上传概述 文件上传&#xff0c;也称为upload&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。 文件上传时&#xff0c;对页面的form表单有如下要求&#xff1a; 表单属性取值说明methodpost必…

hihoCoder #1143 : 骨牌覆盖问题·一

#1143 : 骨牌覆盖问题一 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 骨牌&#xff0c;一种古老的玩具。今天我们要研究的是骨牌的覆盖问题&#xff1a;我们有一个2xN的长条形棋盘&#xff0c;然后用1x2的骨牌去覆盖整个棋盘。对于这个棋盘&#xff0c;一共有多少种不同…

关于CPU Cache -- 程序猿需要知道的那些事

关于CPU Cache -- 程序猿需要知道的那些事 本文将介绍一些作为程序猿或者IT从业者应该知道的CPU Cache相关的知识 文章欢迎转载&#xff0c;但转载时请保留本段文字&#xff0c;并置于文章的顶部 作者&#xff1a;卢钧轶(cenalulu) 本文原文地址&#xff1a;http://cenalulu.gi…

python线性回归代码_day-12 python实现简单线性回归和多元线性回归算法

1、问题引入 在统计学中&#xff0c;线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。一个带有一个自变量的线性回归方程代表一条直线。我们需要对线性回归结…

基于Springboot外卖系统14:菜品新增模块+多个数据表操作+文件上传下载复用

2.1 需求分析 后台系统中可以管理菜品信息&#xff0c;通过新增功能来添加一个新的菜品&#xff0c;在添加菜品时需要选择当前菜品所属的菜品分类&#xff0c;并且需要上传菜品图片&#xff0c;在移动端会按照菜品分类来展示对应的菜品信息 。 2.2 数据模型 新增菜品&#xff…

python层次聚类_python实现层次聚类

BAFIMINARMTO BA0662877255412996 FI6620295468268400 MI8772950754564138 NA2554687540219869 RM4122685642190669 TO9964001388696690 这是一个距离矩阵。不管是scipy还是fastcluster&#xff0c;都有一个计算距离矩阵的步骤&#xff08;也可以不用&#xff09;。距离矩阵是冗…

解析统计文本文件中的字符数、单词数、行数。

用android 编程解析统计文本文件中的字符数、单词数、行数&#xff08;作业&#xff09; 主要代码 ... private void analysis() { String str " "; int words 0; int chars 0; int lines 0; int spaces 0; int marks 0; int character 0; String filename e…

shell自动生成的文件有一个问号的后缀

写了一个脚本&#xff0c;自动处理一个文件。 rm -f session.log rm -f link wget ftp://hostname/f:/ddn/session.log egrep ^N[[:digit:]]|^D[1-4] session.log >>link egrep -c ^N[[:digit:]]|^D[1-4] session.log >>link egrep -v ACT/UP link>>link ls …