瑞吉外卖 - 新增分类功能(11)

news2024/11/27 20:59:28

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 + JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。
相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PDe_7uIg?pwd=x548
提取码:x548

文章目录

    • 1.需求分析
    • 2.数据模型
    • 3.代码开发
      • 3.1 创建基本结构
      • 3.2 代码实现
    • 4.功能测试

1.需求分析

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

如上,可以在后台系统的分类管理页面分别添加菜品分类和套餐分类:

2.数据模型

分类涉及到的数据库表为 category:

简单说明如下:

  1. name 字段设置了唯一约束,即分类名称不可重复;
  2. type 字段表示分类类型,1 为菜品分类,2 为套餐分类;
  3. sort 字段为该分类的排序优先级。

3.代码开发

3.1 创建基本结构

在正式开发之前,需要先将用到的类和接口的基本结构创建好。

实体类 entity/Category(之前已经一次性导入了所有实体类了,直接使用即可),完整代码如下:

package cn.javgo.reggie_take_out.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
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;
    
    //是否删除
    // private Integer isDeleted;
}

注意,先注释掉上述实体类中的 isDeleted 属性,后续涉及到时我们再进行分析。

准备 Mapper 接口 mapper/CategoryMapper,声名如下:

package cn.javgo.reggie_take_out.mapper;

import cn.javgo.reggie_take_out.entity.Category;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

@Mapper
public interface CategoryMapper extends BaseMapper<Category> {
    
}

准备业务层接口 service/CategoryService,及其实现类 service/CategoryServiceImpl,声名如下:

package cn.javgo.reggie_take_out.service;

import cn.javgo.reggie_take_out.entity.Category;
import com.baomidou.mybatisplus.extension.service.IService;

public interface CategoryService extends IService<Category> {
    
}
package cn.javgo.reggie_take_out.service.impl;

import cn.javgo.reggie_take_out.entity.Category;
import cn.javgo.reggie_take_out.mapper.CategoryMapper;
import cn.javgo.reggie_take_out.service.CategoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

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

}

控制层 controller/CategoryController,声名如下:

package cn.javgo.reggie_take_out.controller;

import org.springframework.web.bind.annotation.RestController;

@RestController
public class CategoryController {
    
}

3.2 代码实现

程序执行过程大致如下:

  1. 页面(backend/page/category/list.html)发送 ajax 请求,将新增分类窗口输入的数据以 json 形式提交到服务端;
  2. 服务端 Controller 接收页面提交的数据并调用 Service 将数据进行保存;
  3. Service 调用 Mapper 操作数据库,保存数据。

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

如果是添加分类则会自动带上 type=1,如果是添加套餐则是 type=2:

CategoryController 中对应的处理方法如下:

package cn.javgo.reggie_take_out.controller;

import cn.javgo.reggie_take_out.common.R;
import cn.javgo.reggie_take_out.entity.Category;
import cn.javgo.reggie_take_out.service.CategoryService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * 分类管理
 */
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Resource
    private CategoryService categoryService;

    /**
     * 新增分类
     * @param category 分类实体
     * @return R
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        categoryService.save(category);
        return R.success("新增分类成功");
    }
}

4.功能测试

由于数据库表中已经有 “川菜”的分类了:

前面我们说过分类名字是设置了唯一约束的,所以我们再次添加“川菜”肯定会报异常,但是由于我们之前已经写了处理该异常的全局异常处理器,所以会进行对应的错误提示:

上面会显示“<唯一字段> 已存在”字样,是因为我们对 GlobalExceptionHandler#exceptionHandler 方法做了一些小小的改动,具体如下:

@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
    if(ex.getMessage().contains("Duplicate entry")){
        String[] split = ex.getMessage().split(" ");
        return R.error(split[2] + "已存在");
    }
    return R.error("未知错误");
}

我们可以将 “川菜”这条记删除后再重新进行添加:

从新增的结记录中我们还可以看到之前写的公共字段也是正确地进行了填充:

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

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

相关文章

网安学习踩坑经验篇

回想学习网络安全一年来&#xff0c;踩了不少坑走了不少弯路&#xff0c;在此稍作总结&#xff0c;希望可以帮助那些想要入门 web 安全或者是想打CTF的同学们一些建议 坑点 先总结一下&#xff0c;我在学习中遇到的坑点 只看视频&#xff0c;眼高手低&#xff0c;不练习&…

【嵌入式Linux】设备树基本语法

设备树基本语法 1_总领-本期设备树视频要怎么讲&#xff1f;讲什么&#xff1f;_哔哩哔哩_bilibili 基本的 特殊的 中断控制 描述GIC控制器 时钟 CPU GPIO 个数&#xff0c;保留范围&#xff08;起始、长度&#xff09;&#xff0c;个数对应的名字 GPIO映射-这个脚被用了换一…

chatgpt赋能Python-numpy_归一化

NumPy归一化&#xff1a;理解数据规范化的重要性 什么是归一化&#xff1f; 在数据科学和机器学习中&#xff0c;归一化是预处理数据的一种常用技术。归一化是指将数据缩放到一个特定的范围内&#xff0c;通常是0到1或-1到1之间。 例如&#xff0c;我们可能比较一家医院的三…

渗透测试--5.3.使用john破解密码

前言 由于Linux是Internet最流行的服务器操作系统&#xff0c;因此它的安全性备受关注。这种安全主要靠口令实现。 Linux使用一个单向函数crypt&#xff08;&#xff09;来加密用户口令。单向函数crypt&#xff08;&#xff09;从数学原理上保证了从加密的密文得到加密前的明…

Java笔记_22(反射和动态代理)

Java笔记_22 一、反射1.1、反射的概述1.2、获取class对象的三种方式1.3、反射获取构造方法1.4、反射获取成员变量1.5、反射获取成员方法1.6、综合练习1.6.1、保存信息1.6.2、跟配置文件结合动态创建 一、反射 1.1、反射的概述 什么是反射? 反射允许对成员变量&#xff0c;成…

基于IC5000烧录器使用winIDEA烧写+调试程序(S32K324的软件烧写与调试)

目录 一、iSYSTEM简介二、如何使用iSYSTEM winIDEA烧写调试程序2.1 打开winIDEA&#xff1a;2.2 新建一个Workspace;2.3 硬件配置:2.4 选择CPU芯片型号&#xff1a;2.5 加载烧写文件&#xff1a;2.6 开始烧录程序&#xff1a;2.7 程序调试Debug&#xff1a;2.7.1 运行程序&…

PCL点云处理之单点选择的交互操作(一百六十七)

PCL点云处理之单点选择的交互操作(一百六十七) 一、效果展示二、实现代码一、效果展示 交互选择点,输出点信息,具体如下图所示 二、实现代码 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/pcl_visu

Spring Cloud Alibaba(二)Nacos统一配置管理

目录 一、为什么需要配置中心 二、常用的配置中心 Nacos 的几个概念 三、Nacos配置中心的使用 &#xff08;一&#xff09;properties格式 1、导入依赖 2、在配置中心新建配置 3、修改配置文件名为bootstrap.yml 4、在微服务中添加nacos config服务地址的配置 5、测试…

chatgpt赋能Python-numpy精度

Numpy精度介绍 Numpy是一个用于进行科学计算的Python库&#xff0c;它提供了多维数组对象以及一系列用于操作数组的函数。Numpy的广泛使用使其成为数据科学中的重要组成部分。然而&#xff0c;Numpy中的精度问题却常常被忽视。 浮点数精度问题 在Numpy中&#xff0c;浮点数是…

STL与string类的认识及简单使用

STL与string类的认识及简单使用 一、STL二、string类构造函数容量操作访问及遍历操作迭代器 修改操作非成员函数重载关系运算符重载getline 三、总结 一、STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组…

【计算机毕设】基于SringBoot+Vue的校园二手交易平台(含支付)

在导师的严格指导下&#xff0c;我的毕业设计终于完成了&#xff0c;毕设被推优算是给大学生活画上了圆满的句号&#xff0c;几个月的努力也没白费。在开发的过程中收获了很多&#xff0c;也遇到很多问题&#xff0c;但因怕时间来不及&#xff08;根本不知道截止时间TvT&#x…

点餐小程序实战教程04-餐品分类及餐品数据源设计

我们已经利用一定篇幅实现了店铺信息展示的功能,本篇我们来实现一下点餐的逻辑。点餐的逻辑有以下: 用户打开点餐页面,利用侧边栏导航来切换菜品初始状态用户未点餐,显示一个加号的图标点击加号显示数量,需要将菜品加入购物车,购物车显示选购菜品的数量和总价点击减号可以…

[日记]LeetCode算法·二十五——二叉树⑤ AVL树(插入+删除)附代码实现

本章的代码实现基于上一篇BST与优先队列的基类进行平衡二叉树&#xff0c;即AVL树。 文章目录 AVL的概念AVL查询效率AVL的插入1.插入节点2.更新平衡因子BF3.旋转调整树的结构3.1 LL 右旋3.2 RR 左旋3.3 LR 左右双旋3.4 RL 右左双旋 4 插入总结 AVL的删除1.寻找删除节点2.更新平…

窗口组件元素识别工具

inspect.exe 微软官方工具集成于 Windows SDK 官网下载&#xff1a;https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/ FlaUInspect&#xff1a; 第三方开源的识别工具 https://github.com/FlaUI/FlaUInspect UIRecorder&#xff1a; WinAppDriver里…

无状态子域名爆破工具(附下载)

ksubdomain是一款基于无状态子域名爆破工具&#xff0c;支持在Windows/Linux/Mac上使用&#xff0c;它会很快的进行DNS爆破&#xff0c;在Mac和Windows上理论最大发包速度在30w/s,linux上为160w/s的速度。 总的来说&#xff0c;ksubdomain能爆破/验证域名&#xff0c;并且快和…

【P25】JMeter 取样器超时(Sample Timeout)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设…

CHATGPT:北京打响大模型地方战第一枪

5月16日消息&#xff0c;最近&#xff0c;“北京市促进通用人工智能创新发展的若干措施&#xff08;2023-2025年&#xff09;&#xff08;征求意见稿&#xff09;”&#xff08;以下简称“措施”&#xff09;公布。这个措施从算力、数据、算法、应用、监管五个方向出发&#xf…

Redis学习---03

一、redis事务 (1) Redis单条命令保证原子性&#xff0c;但事务不保证原子性。 Redis 事务不是严格意义上的事务&#xff0c;只是用于帮助用户在一个步骤中执行多个命令。单个 Redis 命令的执行是原子性的&#xff0c;但 Redis 没有在事务上增加任何维持原子性的机制&#xf…

STL好难(2):string类的使用

【本节目标】 1. 标准库中的string类2. string类的模拟实现3. 扩展阅读 目录 【本节目标】 1.标准库中的string类 2. string类对象的常见构造 &#x1f349;无参构造 &#x1f349;带参构造 &#x1f349;拷贝构造 &#x1f349;用n字符 # 去初始化 &#x1f349;用字…