瑞吉外卖Day03

小张推荐:瑞吉外卖Day02 

1.启用/禁用员工账号

1.1 思路分析

1.2Controller层 

  @PutMapping()
    public R<String> update(@RequestBody Employee employee, HttpServletRequest request) {
        log.info(employee.toString());

        Long emp = (Long) request.getSession().getAttribute("employee");
        employee.setUpdateTime(LocalDateTime.now());
        employee.setUpdateUser(emp);
        employeeService.updateById(employee);
        return R.success("修改成功");
    }

2.编辑员工信息

2.1需求分析

2.2Controller实现 

 @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable("id") Long id) {
        log.info("根据员工查询");
        Employee employee = employeeService.getById(id);
        if (employee != null) {
            return R.success(employee);
        }
        return R.error("查询无果");
    }

3.公共字段自动填充

3.1公共字段何为

前面我们已经完成了后台系统的员工管理功能开发,在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间和修改人等字段。这些字段属于公共字段,也就是很多表中都有这些字段。

3.2字段自动填充 

  • 2.按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口

1.实体类添加@TalbeField

1.在实体类的属性上加入@TableField注解,指定自动填充的策略

@Data
@TableName("employee")
@NoArgsConstructor
@AllArgsConstructor
public class Employee {

    private Long id;
    private String username;
    private String name;
    private String password;
    private String phone;
    private String sex;
    private String idNumber;
    private Integer status;

    @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.ThreadLocal 

ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时, ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

  • 在拦截器里面获取当前登陆对象的id
  • 在用登录对象的id时直接调用即可 
/**
 * 基于ThreadLocal封装工具类,用于保存和获取当前登录用户的id
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal=new ThreadLocal<>();

    public static  void setThreadLocal(Long id){
        threadLocal.set(id);
    }

    public static Long getCurrentId(){
      return threadLocal.get();
    }
}

2.实现MetaObjectHandler接口

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入操作自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser",BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }

    /**
     * 更新操作自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
}

4.新增分类

4.1实体类

@Data
public class Category {
    private Long id;
    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 creteEmployee;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateEmployee;
}

4.2mapper层

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

4.3service层

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

4.4controller

@RestController
@RequestMapping("/category")
@Slf4j
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

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

}

 5.分类信息分页查询

    /**
     * 分页查询
     */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize) {
        //分页构造器
        Page<Category> pageInfo = new Page(page, pageSize);
        //条件构造器
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper();
        //根据sort排序
        queryWrapper.orderByAsc(Category::getSort);
        //查询
        categoryService.page(pageInfo, queryWrapper);
        return R.success(pageInfo); 
    }

6.删除分类

需要先查看分类是否关联的菜品或套餐

6.1Service层

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

    @Autowired
    private DishService dishService;

    @Autowired
    private SetmealService setmealService;

    /**
     * 根据id删除分类,删除之前判断是否关联菜品
     *
     * @param id
     */
    @Override
    public void remove(Long id) {
        //查询当前分类是否关联了菜品,如果已经关联,抛出一个异常
        LambdaQueryWrapper<Dish> dishQueryWrapper = new LambdaQueryWrapper<>();
        //根据id查询
        dishQueryWrapper.eq(Dish::getCategoryId, id);
        long count1 = dishService.count(dishQueryWrapper);
        if (count1 > 0) {//说明关联菜品
            throw new CustomException("当前分类下关联菜品");
        }

        //查询当前分类是否关联了套餐,如果已经关联,抛出一个异常
        LambdaQueryWrapper<Setmeal> setmealQueryWrapper = new LambdaQueryWrapper<>();
        //根据id查询
        setmealQueryWrapper.eq(Setmeal::getCategoryId, id);
        long count2 = setmealService.count(setmealQueryWrapper);
        if (count2 > 0) {//说明关联套餐
            throw new CustomException("当前分类下关联套餐");
        }

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

6.2controller层

  /**
     * 删除分类
     */
    @DeleteMapping
    public R<String> delete(Long id) {
        categoryService.remove(id);
        return R.success("删除成功");
    }

7.修改分类

 @PutMapping()
    public R<String> update(@RequestBody Category category){
        categoryService.updateById(category);
        return R.success("修改成功");
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚力未来!云起无垠成为光合组织成员单位

近日&#xff0c;云起无垠正式加入海光产业生态合作组织&#xff08;简称“光合组织”&#xff09;。云起无垠将与光合组织联合打造安全、好用、开放的产品与解决方案&#xff0c;满足企业的安全检测需求&#xff0c;帮助企业解决业务系统上线前的安全检测和修复问题。 图1 光合…

未来之光:十八数藏的文化数字化新篇章

在时代的浪潮中&#xff0c;十八数藏显现出文化数字化的新时代光芒。这一数字化的新篇章不仅仅是对传统文化的延续&#xff0c;更是一场对未来的引领。通过数字化&#xff0c;十八数藏打开了文化传承的崭新大门&#xff0c;为传统工艺注入了新的生命力。 数字技术为十八数藏带来…

培养财务团队协作,冲破市场经济逆境

在过去&#xff0c;企业财务发展道路上往往只有分析师&#xff0c;财务分析也十分简单&#xff0c;只需要业务上挖掘部分有用数据或做一些简单的“数学题”。这些内容都是由财务分析师来完成的。但随着科技发展、大数据时代的到来&#xff0c;越来越多的企业发现还有许多其他未…

2019年五一杯数学建模A题让标枪飞解题全过程文档及程序

2020年五一杯数学建模 A题 让标枪飞 原题再现 标枪的投掷是一项历史悠久的田径比赛项目。标枪投掷距离的远近受到运动员水平&#xff08;出手速度、出手角、初始攻角、出手高度、出手时标枪的初始俯仰角速度等&#xff09;&#xff0c;标枪的技术参数&#xff08;标枪的长度、…

Electronica Samtec展台连接器Demo回顾 | 224Gbps PAM4:令人瞠目的速率

【摘要/前言】 最近&#xff0c;我们正在为大家带来2023慕尼黑上海电子展虎家展台Demo演示回顾系列。 今天虎家工程师团队再次为大家带来系列第一期&#xff1a; 我们邀请到了合作伙伴Keysight&#xff0c;与我们一同带来了Samtec NovaRay高密度、高性能阵列连接器以及Keysig…

车载通信与DDS标准解读系列(1):DDS-RPC

▎RPC & DDS-RPC RPC&#xff1a;Remote Procedure Call&#xff0c;远程过程调用。 远程过程调用是一种进程间通信&#xff0c;它允许计算机程序在另一个地址空间中执行子程序&#xff0c;就好像用别人的东西像用自己的一样&#xff0c;常用于分布式系统。 远程过程调用…

Cesium 实战 - 调整饱和度、对比度等参数,加载夜晚模式

Cesium 实战 - 调整饱和度、对比度等参数&#xff0c;加载夜晚模式 渲染美化影像底图核心代码完整代码&#xff1a;在线示例 三维地图夜晚模式一般用于大屏展示以及体现晚上效果。 设置参与跟暗黑模式类似&#xff0c;只是这里加了大气参数。 本文包括渲染美化影像底图核心代…

Leetcode—122.买卖股票的最佳时机II【中等】

2023每日刷题&#xff08;二十八&#xff09; Leetcode—122.买卖股票的最佳时机II 实现代码 int maxProfit(int* prices, int pricesSize) {int totalProfit 0;if(pricesSize < 1) {return 0;}for(int i 1; i < pricesSize; i) {if(prices[i] - prices[i - 1] > …

RabbitMq防止消息丢失

RabbitMq防止消息丢失 消息的传递路径出现消息丢失的位置解决 消息的传递路径 消息发送方 --> MQ --> 消息消费方 出现消息丢失的位置 消息发送方: 消息传输过程中丢失MQ: MQ收到消息后,存在内存中,还未被消费就宕机了,导致数据丢失消息消费方: 消息到达消费方后, 服务…

CentOS 7镜像下载;VMware安装CentOS 7;解决新安装的虚拟机没有网络,无法ping通网络的问题

CentOS 7镜像下载&#xff1b;VMware安装CentOS 8.5&#xff1b;解决新安装的虚拟机没有网络&#xff0c;无法ping通网络的问题 CentOS 8.5镜像下载VMware安装CentOS 7解决新安装的虚拟机没有网络&#xff0c;无法ping通网络的问题写入配置文件 CentOS 8.5镜像下载 阿里提供的…

线程的互斥

目录 线程互斥 线程互斥的背景知识 多线程抢票 多线程抢票加锁 锁的原理 可重入函数与线程安全 常见的线程安全的情况 常见的不可重入情况 常见的可重入情况 总结 线程互斥 线程互斥的背景知识 临界资源&#xff1a;临界资源就是多个执行流共享的资源就叫做临界资源…

idea maven 构建本地jar包及pom文件

1、设置模块build 本地输出路径 <build><defaultGoal>compile</defaultGoal><resources><resource><directory>${basedir}/src/main/resources</directory><includes><include>**/**</include></includes>…

企业年报API:打开企业经营大数据的新视角

引言 随着数字化转型的深入推进&#xff0c;企业年报API作为企业信息化建设中的重要组成部分&#xff0c;受到了越来越多企业和机构的关注和重视。而且&#xff0c;随着中国经济的快速发展&#xff0c;企业年报也成为投资者、监管机构以及相关利益方了解企业经营状况的重要途径…

在以BUF,字节存储区中,存放有n个带符号整数。试编写统计其中负偶数个数(假设≤9)并且显示。

;默认认采用ML6.11汇编程序 DATAS SEGMENT;此处输入数据段代码BUF DB -2,2,3,4,-4N$-BUF DATAS ENDS STACKS SEGMENT;此处处输入堆栈段代码 STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS: DATAS, SS:STACKS START:MOV AX, DATASMOV DS,AXMOV BX,0MOV CX,0 LOP: mov AX,[BX] RO…

成都优优聚美团代运营:打造高效电商运营的利器

一、引人注目的标题 在繁杂的电商市场中&#xff0c;成都优优聚美团代运营以其专业的服务&#xff0c;为商家提供了一站式的解决方案。那么&#xff0c;这个备受瞩目的代运营平台有何特别之处呢&#xff1f;今天&#xff0c;我们就来一探究竟。 二、平台背景与优势 成都优优聚…

微信小程序用户隐私API

用户隐私保护 由于用户隐私保护的政策执行&#xff0c;我们在调用涉及到用户隐私的API时&#xff0c;未更新用户隐私保护协议是无法直接调用的&#xff0c;小程序会默认判断是否更新用户隐私保护 &#xff0c;并根据用户隐私保护中的协议来判断是否可以调用对应的API&#xff…

5个高质量的实用办公软件,每一款都是良心推荐

在现代办公环境中&#xff0c;高效的办公软件可以极大地提升工作效率&#xff0c;简化工作流程&#xff0c;帮助我们更好地完成工作。今天就给大家分享5个高质量的实用办公软件&#xff0c;每一款都是良心推荐。 01、FastStone Capture&#xff08;截图工具&#xff09; FastSt…

安装表面应变计的方法及注意事项

安装表面应变计的方法及注意事项 表面应变计被广泛用于水利工程和混凝土结构中&#xff0c;用于测量埋设点的线性变形&#xff08;应变&#xff09;和应力&#xff0c;同时也可以测量温度。它们可以分为表面安装式和埋入式两种。 一、埋入式表面应变计 1、混凝土应变计的安装…

FAN73832MX 350mA-650mA 高压600V 能驱动MOSFET和IGBT 半桥栅极驱动IC

FAN73832MX是一款半桥、栅极驱动 IC&#xff0c;带关断和可编程死区时间控制功能&#xff0c;能驱动 MOSFET 和 IGBT&#xff0c;工作电压高达 600 V。飞兆的高压工艺和共模噪声消除技术可使高侧驱动器在高 dv/dt 噪声环境下稳定运行。先进的电平转换电路允许高侧驱动器的工作偏…

木柴的舒适:燃木壁炉带来的温暖

火的温暖和光芒一直伴随着我们。如今&#xff0c;虽然电暖和中央暖气等现代供暖方式逐渐普及&#xff0c;但燃木壁炉依然保留了其独特的魅力&#xff0c;成为许多人家居的亮点。 燃木壁炉在寒冷的冬天为您的家带来温暖。燃烧的木柴散发出温暖的光芒和令人陶醉的木材香气&#…