基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)
编辑员工和分类模块功能开发
- 1. 编辑员工
- 1.1 需求分析与设计
- 1.1.1 产品原型
- 1.1.2 接口设计
- 1.2 代码开发
- 1.2.1 回显员工信息功能
- 1.2.2 修改员工信息功能
- 1.3 功能测试
- 2. 分类模块功能开发
- 2.1 需求分析与设计
- 2.1.1 产品原型
- 2.1.2 接口设计
- 2.1.3 表设计
- 2.2 代码实现
- 2.2.1 Mapper层
- 2.2.2 Service层
- 2.2.3 Controller层
- 2.3 功能测试
1. 编辑员工
1.1 需求分析与设计
1.1.1 产品原型
在员工管理列表页面点击 “编辑” 按钮,跳转到编辑页面,在编辑页面回显员工信息并进行修改,最后点击 “保存” 按钮完成编辑操作。
修改页面原型:
注:点击修改时,数据应该正常回显到修改页面。

1.1.2 接口设计
根据上述原型图分析,编辑员工功能涉及到两个接口:
- 根据id查询员工信息
- 编辑员工信息
1). 根据id查询员工信息


2). 编辑员工信息


注:因为是修改功能,请求方式可设置为PUT。
1.2 代码开发
1.2.1 回显员工信息功能
1). Controller层
在 EmployeeController 中创建 getById 方法:
/*** 根据id查询员工信息* @param id* @return*/@GetMapping("/{id}")@ApiOperation("根据id查询员工信息")public Result<Employee> getById(@PathVariable Long id){Employee employee = employeeService.getById(id);return Result.success(employee);}
2). Service层接口
在 EmployeeService 接口中声明 getById 方法:
/*** 根据id查询员工* @param id* @return*/Employee getById(Long id);
3). Service层实现类
在 EmployeeServiceImpl 中实现 getById 方法:
/*** 根据id查询员工** @param id* @return*/public Employee getById(Long id) {Employee employee = employeeMapper.getById(id);employee.setPassword("****");return employee;}
4). Mapper层
在 EmployeeMapper 接口中声明 getById 方法:
/*** 根据id查询员工信息* @param id* @return*/@Select("select * from employee where id = #{id}")Employee getById(Long id);
1.2.2 修改员工信息功能
1). Controller层
在 EmployeeController 中创建 update 方法:
/*** 编辑员工信息* @param employeeDTO* @return*/@PutMapping@ApiOperation("编辑员工信息")public Result update(@RequestBody EmployeeDTO employeeDTO){log.info("编辑员工信息:{}", employeeDTO);employeeService.update(employeeDTO);return Result.success();}
2). Service层接口
在 EmployeeService 接口中声明 update 方法:
/*** 编辑员工信息* @param employeeDTO*/void update(EmployeeDTO employeeDTO);
3). Service层实现类
在 EmployeeServiceImpl 中实现 update 方法:
/*** 编辑员工信息** @param employeeDTO*/public void update(EmployeeDTO employeeDTO) {Employee employee = new Employee();BeanUtils.copyProperties(employeeDTO, employee);employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(BaseContext.getCurrentId());employeeMapper.update(employee);}
1.3 功能测试
进入到员工列表查询。

对员工姓名为杰克的员工数据修改,点击修改,数据已回显。

修改后,点击保存。

2. 分类模块功能开发
2.1 需求分析与设计
2.1.1 产品原型
后台系统中可以管理分类信息,分类包括两种类型,分别是 菜品分类 和 套餐分类 。
菜品分类相关功能。
新增菜品分类:当我们在后台系统中添加菜品时需要选择一个菜品分类,在移动端也会按照菜品分类来展示对应的菜品。
菜品分类分页查询:系统中的分类很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。
根据id删除菜品分类:在分类管理列表页面,可以对某个分类进行删除操作。需要注意的是当分类关联了菜品或者套餐时,此分类不允许删除。
修改菜品分类:在分类管理列表页面点击修改按钮,弹出修改窗口,在修改窗口回显分类信息并进行修改,最后点击确定按钮完成修改操作。
启用禁用菜品分类:在分类管理列表页面,可以对某个分类进行启用或者禁用操作。
分类类型查询:当点击分类类型下拉框时,从数据库中查询所有的菜品分类数据进行展示。
分类管理原型:

业务规则:
- 分类名称必须是唯一的
- 分类按照类型可以分为菜品分类和套餐分类
- 新添加的分类状态默认为“禁用”
2.1.2 接口设计
根据上述原型图分析,菜品分类模块共涉及6个接口。
- 新增分类
- 分类分页查询
- 根据id删除分类
- 修改分类
- 启用禁用分类
- 根据类型查询分类
接下来,详细地分析每个接口。
1). 新增分类


2). 分类分页查询


3). 根据id删除分类

4). 修改分类


5). 启用禁用分类


6). 根据类型查询分类


2.1.3 表设计
category表结构:
| 字段名 | 数据类型 | 说明 | 备注 |
|---|---|---|---|
| id | bigint | 主键 | 自增 |
| name | varchar(32) | 分类名称 | 唯一 |
| type | int | 分类类型 | 1菜品分类 2套餐分类 |
| sort | int | 排序字段 | 用于分类数据的排序 |
| status | int | 状态 | 1启用 0禁用 |
| create_time | datetime | 创建时间 | |
| update_time | datetime | 最后修改时间 | |
| create_user | bigint | 创建人id | |
| update_user | bigint | 最后修改人id |
2.2 代码实现
2.2.1 Mapper层
DishMapper.java
package com.sky.mapper;@Mapper
public interface DishMapper {/*** 根据分类id查询菜品数量* @param categoryId* @return*/@Select("select count(id) from dish where category_id = #{categoryId}")Integer countByCategoryId(Long categoryId);}
SetmealMapper.java
package com.sky.mapper;@Mapper
public interface SetmealMapper {/*** 根据分类id查询套餐的数量* @param id* @return*/@Select("select count(id) from setmeal where category_id = #{categoryId}")Integer countByCategoryId(Long id);}
CategoryMapper.java
package com.sky.mapper;import java.util.List;@Mapper
public interface CategoryMapper {/*** 插入数据* @param category*/@Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +" VALUES" +" (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")void insert(Category category);/*** 分页查询* @param categoryPageQueryDTO* @return*/Page<Category> pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);/*** 根据id删除分类* @param id*/@Delete("delete from category where id = #{id}")void deleteById(Long id);/*** 根据id修改分类* @param category*/void update(Category category);/*** 根据类型查询分类* @param type* @return*/List<Category> findByType(Integer type);
}
CategoryMapper.xml,进入到resources/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.CategoryMapper"><select id="pageQuery" resultType="com.sky.entity.Category">select * from category<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if><if test="type != null">and type = #{type}</if></where>order by sort asc , create_time desc</select><update id="update" parameterType="Category">update category<set><if test="type != null">type = #{type},</if><if test="name != null">name = #{name},</if><if test="sort != null">sort = #{sort},</if><if test="status != null">status = #{status},</if><if test="updateTime != null">update_time = #{updateTime},</if><if test="updateUser != null">update_user = #{updateUser}</if></set>where id = #{id}</update><select id="findByType" resultType="Category">select * from categorywhere status = 1<if test="type != null">and type = #{type}</if>order by sort asc,create_time desc</select>
</mapper>
2.2.2 Service层
CategoryService.java
package com.sky.service;public interface CategoryService {/*** 新增分类* @param categoryDTO*/void save(CategoryDTO categoryDTO);/*** 分页查询* @param categoryPageQueryDTO* @return*/PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);/*** 根据id删除分类* @param id*/void deleteById(Long id);/*** 修改分类* @param categoryDTO*/void update(CategoryDTO categoryDTO);/*** 启用、禁用分类* @param status* @param id*/void startOrStop(Integer status, Long id);/*** 根据类型查询分类* @param type* @return*/List<Category> findByType(Integer type);
}
CategoryServiceImpl.java
@Service
public class CategoryServiceImpl implements CategoryService {
@Autowired
private CategoryMapper categoryMapper;
@Autowired
private SetmealMapper setmealMapper;
@Autowired
private DishMapper dishMapper;
//菜品添加@Overridepublic void add(CategoryDTO categoryDTO) {Category category=new Category();BeanUtils.copyProperties(categoryDTO,category);category.setCreateTime(LocalDateTime.now());category.setUpdateTime(LocalDateTime.now());category.setUpdateUser(BaseContext.getCurrentId());category.setCreateUser(BaseContext.getCurrentId());category.setStatus(StatusConstant.DISABLE);categoryMapper.add(category);}//菜品分页查询@Overridepublic PageResult page(CategoryPageQueryDTO categoryPageQueryDTO) {PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());Page<Category> page= categoryMapper.page(categoryPageQueryDTO);PageResult pageResult=new PageResult();pageResult.setTotal(page.getTotal());pageResult.setRecords( page.getResult());return pageResult;}
//启用禁用@Overridepublic void startOrStop(Integer status, Long id) {Category category = Category.builder().id(id).status(status).build();categoryMapper.update(category);}//根据类型查询@Overridepublic List<Category> findByType(Integer type) {List<Category> categoryList=categoryMapper.findByType(type);return categoryList;}
//菜品的删除@Overridepublic void delete(Long id) {
if (dishMapper.countByCategoryid(id)>0){
throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);
}if (setmealMapper.selectCount(id)>0){throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);}categoryMapper.delete(id);}//菜品的修改@Overridepublic void update( CategoryDTO categoryDTO) {Category category=new Category();BeanUtils.copyProperties(categoryDTO,category);category.setUpdateTime(LocalDateTime.now());category.setUpdateUser(BaseContext.getCurrentId());categoryMapper.update(category);}
}
2.2.3 Controller层
CategoryController.java
package com.sky.controller.admin;/*** 分类管理*/
@RestController
@RequestMapping("/admin/category")
@Api(tags = "分类相关接口")
@Slf4j
public class CategoryController {@Autowiredprivate CategoryService categoryService;/*** 新增分类* @param categoryDTO* @return*/@PostMapping@ApiOperation("新增分类")public Result<String> save(@RequestBody CategoryDTO categoryDTO){log.info("新增分类:{}", categoryDTO);categoryService.save(categoryDTO);return Result.success();}/*** 分类分页查询* @param categoryPageQueryDTO* @return*/@GetMapping("/page")@ApiOperation("分类分页查询")public Result<PageResult> page(CategoryPageQueryDTO categoryPageQueryDTO){log.info("分页查询:{}", categoryPageQueryDTO);PageResult pageResult = categoryService.pageQuery(categoryPageQueryDTO);return Result.success(pageResult);}/*** 删除分类* @param id* @return*/@DeleteMapping@ApiOperation("删除分类")public Result<String> deleteById(Long id){log.info("删除分类:{}", id);categoryService.deleteById(id);return Result.success();}/*** 修改分类* @param categoryDTO* @return*/@PutMapping@ApiOperation("修改分类")public Result<String> update(@RequestBody CategoryDTO categoryDTO){categoryService.update(categoryDTO);return Result.success();}/*** 启用、禁用分类* @param status* @param id* @return*/@PostMapping("/status/{status}")@ApiOperation("启用禁用分类")public Result<String> startOrStop(@PathVariable("status") Integer status, Long id){categoryService.startOrStop(status,id);return Result.success();}/*** 根据类型查询分类* @param type* @return*/@GetMapping("/list")@ApiOperation("根据类型查询分类")public Result<List<Category>> list(Integer type){List<Category> list = categoryService.list(type);return Result.success(list);}
}
2.3 功能测试
重启服务,访问http://localhost:80,进入分类管理
分页查询:

分类类型:

启用禁用:

点击禁用

修改:
回显

修改后

新增:

点击确定,查询列表

删除:

删除后,查询分类列表

删除成功
后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹
相关文章:
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(四)
编辑员工和分类模块功能开发 1. 编辑员工1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 回显员工信息功能1.2.2 修改员工信息功能 1.3 功能测试 2. 分类模块功能开发2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码实现2.2.1 Mappe…...
dcat admin 各种问题
样式问题 如何根据条件给表格数据栏添加背景色 use Illuminate\Support\Collection;protected function grid(){return Grid::make(new BookArticle(), function (Grid $grid) {... 其他代码// Collection的完整路径:Illuminate\Support\Collection;$grid->row…...
数据结构与算法(二)动态规划(Java)
目录 一、简介1.1 什么是动态规划?1.2 动态规划的两种形式1)自顶向下的备忘录法(记忆化搜索法)2)自底向上的动态规划3)两种方法对比 1.3 动态规划的 3 大步骤 二、小试牛刀:钢条切割2.1 题目描述…...
颜值实力“C位出道”:起亚EV6综合实力究竟怎么样?
作为起亚电动化转型的标杆之作,起亚EV6已在全球赢得广泛赞誉,连续斩获“2022欧洲年度汽车”及“2023北美年度汽车”等多项国际大奖,其GT版本更是荣获“2023年度世界性能车”,这些荣誉不仅标志着其设计和技术的国际认可,…...
继承和多态_Java零基础手把手保姆级教程(超详细)
文章目录 Java零基础手把手保姆级教程_继承和多态(超详细)1. 继承1.1 继承的实现(掌握)1.2 继承的好处和弊端(理解) 2. 继承中的成员访问特点2.1 继承中变量的访问特点(掌握)2.2 sup…...
AI:85-基于深度学习的自然场景生成与渲染
🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…...
Windows电脑训练 RT-DETR 改进算法 (Ultralytics) 教程,改进RTDETR算法(包括使用训练、验证、推理教程)
手把手从零开始训练 RT-DETR 改进项目 (Ultralytics版本) 教程,改进RTDETR算法 本文以Windows服务器为例:从零开始使用Windows训练 RT-DETR 算法项目 《芒果剑指 RT-DETR 目标检测算法 改进》 适用于芒果专栏改进RT-DETR算法 文章目录 百度 RT-DETR 算法介绍改进网络代码汇…...
flask框架报错解决方法
1、报错 jinja2.exceptions.TemplateNotFound 解决方法:报错jinja2.exceptions.TemplateNotFound,template没找到,由于我之前直接将.html文件和.py文件直接放在同一目录下,经了解,需要新增一个 templates目录ÿ…...
Ubuntu18.04 安装docker教程
Ubuntu18.04 安装docker教程 1、前言 Docker Engine-Community 支持以下的 Ubuntu 版本: Xenial 16.04 (LTS)Bionic 18.04 (LTS)Cosmic 18.10Disco 19.04 Docker Engine-Community 支持以下CPU架构: x86_64(或 amd64)armhfarm…...
深入理解Git
目录 一、Git 的基本构造 1.1 关键对象类型 1.2 存储机制 二、Git 的内部工作 2.1 哈希和数据完整性 2.2 引用和可达性 2.3 分支和合并 2.4 垃圾回收 三、Git 高级特性 3.1 垃圾回收 3.2 钩子(Hooks) 3.3 子模块 四、常用命令 五、最佳实践…...
Leetcode_203.移除链表元素—C语言
目录 ❣️1.题目❣️ ❣️2.解答❣️ 💞方法一:暴力法 💞方法二: 尾插法 💞方法三:哨兵位法 ❣️1.题目❣️ 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.va…...
虹科方案 | 汽车电子电气架构设计仿真解决方案
来源:虹科汽车电子 虹科方案 | 汽车电子电气架构设计仿真解决方案 导读 本文将介绍面向服务(SOA)的汽车TSN网络架构,并探讨RTaW-Pegase仿真与设计软件在TSN网络设计中的应用。通过RTaW将设计问题分解,我们可以更好地理…...
Java6种单例模式写法
单例模式 某个类任何情况下只有一个实例,并提供一个全局访问点来获取该实例。Java6种单例模式:2种懒汉式,2种饿汉式 ,静态内部类 ,枚举类懒汉式 synchronized延迟加载 public class Singleton {private static Sing…...
Direct3D拾取
假设在屏幕上单击,击中的位置为点s(x,y)。由图可以看出,用户选中了茶壶。但是仅给出点s,应用程序还无法立即判断出茶壶是否被选中。所以针对这类问题,我们需要采用一项称为“拾 取(Picking)”的技术。 茶壶和屏幕点s之间的一种联…...
大洋钻探系列之二IODP 342航次是干什么的?(上)
本文简单介绍一下大洋钻探IODP 342航次,从中,我们一窥大洋钻探航次的风采。 IODP342的航次报告在网络上可以下载,英文名字叫《Integrated Ocean Drilling ProgramExpedition 342 Preliminary Report》,航次研究的主要内容是纽芬兰…...
离散时间系统模型
离散时间系统模型 离散时间系统模型是表示数字滤波器的方案。MATLAB 科学计算环境支持若干种离散时间系统模型,这些模型将在以下章节中介绍: 传递函数零极点增益状态空间部分分式展开式(残差形式)二阶节 (SOS)格型结构体卷积矩…...
Nginx学习(在 Docker 中使用 Nginx)
1. 安装Nginx 使用 docker pull nginx 下载最新的 Nginx Docker 镜像。 下载完毕后,使用 docker run -d -p 80:80 --name nginx nginx,即可启动 Nginx 容器。其中,-p 80:80 表示将容器的 80 端口映射到 主机的 80 端口;--name ng…...
【Java】集合(一)单列集合List
1.集合 可以动态保存任意多个对象,并提供了一系列的操作对象的方法:add、remove、set、get等。 2.集合框架体系 分为两大类: 单列集合和双列集合 3.List接口基本介绍 List接口是Collection接口的子接口 List集合类中元素有序࿰…...
实战 | 基于卷积神经网络的蘑菇识别微信小程序
一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2023.11.13 Last edited: 2023.11.13 导读:其实没啥难的,主要是随手搞了就发出来把,太久没有水过帖子了&…...
如何选择共享wifi项目服务商,需要注意哪些?
在移动互联网时代,无线网络已经成为人们生活中不可或缺的一部分。随着5G时代的到来,共享WiFi项目成为了市场上备受关注的焦点。在众多共享WiFi公司中,如何选择共享wifi项目服务商合作,今天我们就来盘点下哪些公司可靠!…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
