【SpringBoot项目】SpringBoot项目-瑞吉外卖【day03】分类管理

这篇具有很好参考价值的文章主要介绍了【SpringBoot项目】SpringBoot项目-瑞吉外卖【day03】分类管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌕博客x主页:己不由心王道长🌕!
🌎文章说明:SpringBoot项目-瑞吉外卖【day03】分类管理🌎
✅系列专栏:SpringBoot项目
🌴本篇内容:对黑马的瑞吉外卖项目的day03进行笔记和项目实现🌴
☕️每日一语:生活不可能像你想象得那么好,但也不会像你想象得那么糟。☕️
🚩 交流社区:己不由心王道长(优质编程社区)

前言

本次文章对应所属项目的第3天,我在想,我项目进度到底是快了还是慢了。这个问题有点深奥,如果对于官方给的进度,那我项目肯定是慢了;但是项目得消化,不能做完即可,图个完成任务的心态是不可取的,所以还是慢慢来吧。

公共字段自动填充

问题分析

我们在day02已经对后台的员工管理功能进行了开发,在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段信息,在编辑员工时需要设置修改时间和修改人等字段信息。这些字段都是属于公共字段,也就是很多表中都有的字段,如下所示:

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

基本每个表都有以上字段,而且我们在每一个需要用到的修改、新增时都用到了这些公共字段。

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
这些代码十分冗余,没有技术含量,每次都写一遍是不可接受的。那么我们能不能对于这些公共字段做一个统一的处理,以便简化开发,让代码更加美观呢?可以!
MybatisPlus为我们提供了公共字段自动填充功能。
Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。
实现步骤:

1、在实体类的属性上加入@TableField注解,指定自动填充的策略
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
可以看到,我们能在相应的公共字段上,添加@TableField注解,然后在括号里选择方式,最后选择填充策略。填充策略有默认、插入、插入和更新、更新四种。

@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;

以上是公共字段填充,为什么填充策略不同呢?这里解释一下:

因为createTime只有在新建的时候使用,而updateTime在插入的时候就已经算更新了,在后面的更新中当然也算。所以updateTime的策略是插入和更新时填充,同理可以理解其他几个。

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

代码实现
package com.example.commons;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

/**
 * 自定义公共字段自动填充
 * @author 不止于梦想
 * @date 2022/11/15 20:23
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * insert策略填充
     * @param metaObject
     */
    @Override
    public  void insertFill(MetaObject metaObject) {
        log.info(metaObject.toString());
        log.info("insert填充策略......");
    }

    /**
     * update策略填充
     * @param metaObject
     */

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info(metaObject.toString());
        log.info("update填充策略......");
    }
}

这里没有进行任何填充,先测试一下代码是否能够走通

功能测试

我们在update策略里输出日志并且打上断点,验证我们程序是否能够执行成功。
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
这是更新策略,所以我们修改员工信息:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
可以看到,代码是可以走通的。并且是在UPDATE之前,这就是我们想看到的
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

功能完善

这里其实把上面没写的代码一并在这里完成,这里原本是解决ThreadLocal问题的,一并解决了吧。
先把update的里面这几句注释掉,现在要用公共字段填充,这些不写了,拜拜勒:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
重启项目发送更新请求:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
注意看参数,update时间跟我当前时间不符合,说明了现在没有填充时间。下面依次完成需要的填充:

package com.example.commons;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 自定义公共字段自动填充
 * @author 不止于梦想
 * @date 2022/11/15 20:23
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * insert策略填充
     * @param metaObject
     */
    @Override
    public  void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime",LocalDateTime.now());
        log.info("insert填充策略......");
    }

    /**
     * update策略填充
     * @param metaObject
     */

    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime", LocalDateTime.now());
        log.info("update填充策略......");
    }
}

上面这段代码是不完整的,没有设置本次插入或者更新的人的id,我们能不能用session对象设置呢?不行,因为在方法执行的时候,真正的方法压根没有明着调用我们这个公共填充,而一次request请求你也给不了它。

解决办法,首先我们要知道的是一次request请求其实对应的是一次线程,而我们要用到的线程是JDK为我们提供的ThreadLocal.
这里我们先要确认一件事情,就是每当前台发一次http请求,我们后台对应的服务器是不是分配了一个新的线程来处理:

多余解释画蛇添足,下面是官方给的方法,我们可以试试:

在处理过程中涉及到下面类中的方法都属于相同的一个线程:
1、LoginCheckFilter的doFilter方法
2、EmployeeController的update方法
3、MyMetaObjectHandler的updateFill方法
可以在上面的三个方法中分别加入下面代码 (获取当前线程id):
long id Thread. current Thread() getId() :
Log. info(“线程id:1”,id) :
执行编辑员工功能进行验证,通过观察控制台输出可以发现,一次请求对应的线程id是相同的:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
可以知道的是一次请求确实是对应一个线程,还得验证一件事情,就是不同请求不是一次线程。再发一次:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
既然每次请求对应一个线程,我们不可以共有一个请求,一个线程我们是可以共享的,而且别的请求线程也影响不到你的线程。

介绍ThreadLocal:

还是看一下官方解释:
什么是ThreadLocal?
ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不
能访问。
ThreadLocal常用方法:

public void set(T value):设置当前线程的线程局部变量的值
public T get() :返回当前线程所对应的线程局部变量的值

我们可以在LoginCheckFilter的doFilter方法中获取当前登录用户id,并调用ThreadLocal的set方法来设置当前线程的线程局部变量的值(用户id),然后在MyMetaobjectHandler的updateFil方法中调用ThreadLocal的get方法来获得当前线程所对应的线程局部变量的值(用户id)。

有了步骤咱就整它,打它啊,打它mad!:

实现步骤:
1、编写BaseContext工具类,基于ThreadLocal封装的工具类

package com.example.commons;

/**
 * @author 不止于梦想
 * @date 2022/11/15 21:45
 */
public class BaseContext {
    //设置成静态属性
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    /**
     * 设置线程局部变量
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }

    /**
     * 获取线程局部变量的值
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

2、在LoginCheckFilter的doFilter方法中调用BaseContext来设置当前登录用户的id

if (httpServletRequest.getSession().getAttribute("employee")!=null) {
            log.info("用户已经登录"+httpServletRequest.getSession().getAttribute("employee"));
            //获取当前请求的用户id
            long empId = (long) httpServletRequest.getSession().getAttribute("employee");
           //设置当前线程的线程局部变量的值
            BaseContext.setCurrentId(empId);
            filterChain.doFilter(httpServletRequest,httpServletResponse);

只有已经登录过的用户才能获取到对应的id。
3、在MyMetaObjectHandler的方法中调用BaseContext获取登录用户的id

 metaObject.setValue("updateUser",BaseContext.getCurrentId());

测试:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

最后把所有公共字段去掉

新增分类

需求分析

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
在我们的分类管理中,有两个新增分类,分别是新增菜品分类和新增套餐分类。
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
新增菜品分类和新增套餐分类其实基本无差别,只是发给后台时的type属性不同。
在这个功能中,我们需要连接前端,并且在后端区分,然后把操作数据存入数据库。
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
调用了axios、方法是post方法。
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
只判断了code,所以新的controller应该是String类型。

模型

在这个功能中,我们的数据模型跟前面的不一样了,不再是employee,而是category
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
两个分类模式,数据其实存入了一张表之中。

需要注意的是这里的name设置了唯一性约束,如果名字重复是会抛出异常的
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

代码开发

这里直接导入类category:

package com.example.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;

}

接下来把service、mapper弄好。
然后·写好controller:

package com.example.controller;

import com.example.commons.R;
import com.example.entity.Category;
import com.example.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;

/**
 * @author 不止于梦想
 * @date 2022/11/17 18:21
 */
@RestController
@RequestMapping("/category")
@Slf4j
public class CategoryController {

    @Autowired
    CategoryService categoryService;

    /**
     * 新增分类
     * @param category
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("新增分类");
        boolean save = categoryService.save(category);
        if(save) {
            return R.success("新增分类成功");
        }
        return R.error("新增分类失败");
    }



}

功能测试

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
添加分类成功,接口异常是接下来要处理的信息分页查询。

这里还有一个问题就是,如果我们添加的菜品名字一样,会出异常的,因为我们设计表时就已经把name字段设置为非空了。我们测试一下
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
但是我们不会受到影响,因为我们在前面已经设置了一个全局处理异常“Duplicate entry”
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
所以会提示我们已经存在。

分类信息分页查询

需求分析

在上面的新增分类,我们已经提到了系统接口404异常,那么这个异常其实就是当我们点击分类管理时,页面就会发送请求去后台查询数据并且返回展示了:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
由上图,当我们点击新增分类时,vue就创建了钩子函数,并调用了getCategoryPage方法。并且传入了页码和页码所在页的大小。其实就是一个分页查询,我们在employee时已经做过,所以这里直接跟进getCategoryPage:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
细节如图。

代码开发
@GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        log.info("分页查询");
        //构造分页构造器
        Page pageInfo = new Page(page,pageSize);
        //构造条件构造器,输出时要用到
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByAsc(Category::getSort);
        //进行分页查询
        categoryService.page(pageInfo, queryWrapper);
        return R.success(pageInfo);
    }
功能测试

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

删除分类

需求分析

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
可以看到,我们的分类管理后面其实是可以操作的,而这里要介绍的操作就是删除分类。
这里需要注意是当分类关联了菜品或者套餐时,此分类是不允许删除的。这里解释一下,我们这里只是套餐分类,真正的细节并不是存在这个表里的,而是分别存在相应的表中:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
如上图,分类表只能表示有没有当前种类和添加种类,删除不归它管理,如果不存在该种类,查询时自然不显示。

代码开发

我们还是先做简单的删除
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
注意这里通过id删除,但参数传递时是ids

  @DeleteMapping
    public R<String> delete(Long ids){
        log.info("删除操作......");
        categoryService.removeById(ids);
        return  R.success("删除成功");
    }
功能完善

这里细节就不多说了。
上代码,不过那些需要导入和构建架构的代码就不上了,太水:
CustomExcption:

package com.example.commons;

/**
 * @author 不止于梦想
 * @date 2022/11/17 21:00
 */

/**
 * 自定义异常
 */
public class CustomerExcption extends RuntimeException{
    /**
     * 传入异常信息,交给父类
     * @param msg :异常信息
     */
    public CustomerExcption(String msg){
        super(msg);
    }
}

CategoryServiceImpl:

package com.example.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.commons.CustomerExcption;
import com.example.entity.Category;
import com.example.entity.Dish;
import com.example.entity.Setmeal;
import com.example.mapper.CategoryMapper;
import com.example.service.CategoryService;
import com.example.service.DishService;
import com.example.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 不止于梦想
 * @date 2022/11/17 18:19
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
    @Autowired
    DishService dishService;
    @Autowired
    SetmealService setmealService;

    /**
     * 通过id删除分类,删除之前检查有没有关联套餐(Setmeal)或者菜品(Dish),需要用到这两者的服务,所以在上边进行注入
     * @param id
     */
    @Override
    public void remove(Long id) {
        //判断是否关联Dish,设置查询条件
        LambdaQueryWrapper<Dish> dish = new LambdaQueryWrapper<>();
        //菜品分类id
        //    private Long categoryId;比较两者id是否相等
        //设置条件判断,条件为传入id与Dish表中的属性CategoryId相等
        dish.eq(Dish::getCategoryId,id);
        //调用dishService服务,查询相等的条数
        int count1 = dishService.count(dish);
        //如果存在,则说明关联,抛出异常,提示前台
        if(count1>0){
            throw new CustomerExcption("菜品已被关联,不能删除");
        }
        //判断是否关联Dish,设置查询条件
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //分类id
        //private Long categoryId;
        //设置查询条件
        setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
        //调用setmealService服务,查询相等的条数
        int count2 = setmealService.count(setmealLambdaQueryWrapper);
        //如果存在,则说明关联,抛出异常,提示前台
        if(count2>0){
            throw new CustomerExcption("套餐已被关联,不能删除");
        }
        //否则,则没有关联,正常关联分类,调用接口的ById方法
        super.removeById(id);

    }
}


别忘了再最开始的地方更改为你刚修改的方法:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
如果还是留着上次的方法,小心数据丢失(悲伤)。
测试:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
接下来验证没有关联的能不能删除,隆江猪脚饭是我刚添加的没有关联:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

修改分类

需求分析

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

当我们点击修改时,前端根据id进行查询,并进行了一个回显操作,这里就不细究了,我们可以看到这里可以更新两个信息,名称和排序。
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
当点击确定时,会把以上信息作为参数进行查询。
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
参数时id,name,和sort,但是更新时间什么的都会设置,所以这里直接用对象作为参数。返回值是code、请求时put,路径明细如下:

springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

代码实现
@PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("参数:{}",category.toString());
        categoryService.updateById(category);
        return R.success("修改成功");
    }

验证:
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis
springboot 获取当前线程id,SpringBoot,spring boot,java,mybatis

结尾

创作不易,喜欢的给个三连。文章来源地址https://www.toymoban.com/news/detail-835346.html

到了这里,关于【SpringBoot项目】SpringBoot项目-瑞吉外卖【day03】分类管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot项目外卖管理 day09-mysql主从复制以及nginx入门

    示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 目前我们所有的读和写的压力都是由一台数据库来承担, 如果数据库服务器磁盘损坏,则数据会丢失(没有备份) 解决这个问题,就可以用MySQL的主从复制,写操作交给主库,读操作交给从库

    2024年02月12日
    浏览(40)
  • 【SpringBoot项目实战+思维导图】瑞吉外卖①(项目介绍、开发环境搭建、后台登陆/退出功能开发)

    全文主体框架来源于黑马瑞吉外卖的项目资料,我在文中会嵌入如下五个方面的个人内容: 项目中易发生错误的地方 项目中涉及的一些难理解知识点 一些遗忘知识点的回顾 业务的多种实现方法 我在做项目时的思考和一些踩坑 作为一名软件开发工程师,我们需要了解在软件开

    2024年02月05日
    浏览(53)
  • JavaWeb_瑞吉外卖_项目优化Day10-Spring Cache

    提交步骤: 生成空仓库, 不要加任何文件 右键项目, add整个项目 commit和push, push时添加远程仓库地址 新建分支步骤: 在本地新建一个分支 push 注入redis对象 将验证码保存到redis, 有效期5分钟 获取验证码, 登录成功后删除验证码 获取缓存数据 删除缓存数据 Spring Cache是一个框架,

    2024年02月13日
    浏览(44)
  • 基于Spring boot和Mybatis外卖项目瑞吉外卖Day9-Redis的快速入门

    4.1 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 贴心小建议:命令不要死记,学会查询就好啦 Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( https://redis.io/commands )可以查看到不同的命令: 当然我们

    2023年04月09日
    浏览(51)
  • JavaWeb_瑞吉外卖_业务开发Day5-套餐管理, 短信发送, 手机验证码登录

    总结 接收List数据时, 需要加上 @RequestParam 注解 操作2个及2个以上表, 加上 @Transactional 事务注解, 保持数据的一致性. 发送短信 生成验证码 黑马程序员. 瑞吉外卖项目

    2024年02月12日
    浏览(37)
  • 粤嵌实训医疗项目--day03(Vue + SpringBoot)

     往期回顾 粤嵌实训医疗项目day02(Vue + SpringBoot)-CSDN博客 粤嵌实训医疗项目--day01(Vue+SpringBoot)-CSDN博客 目录 一、SpringBoot AOP的使用 二、用户模块-注册功能(文件上传) 三、用户模块-注册实现 四、用户模块-登录-校验码   在vaccinum包下创建aspect包并输入以下代码 再在v

    2024年02月08日
    浏览(35)
  • 瑞吉外卖day4

    介绍  服务端要接收客户端页面上传的文件,通常都会使用Apache的两个组件 1.commons-file upload 2.commons-io Spring框架在spring-web包中对文件上传进行了封装。只需要在Controller的方法中声明一个MultipartFile类型的参数即可接受上传的文件 代码实现 upload方法里的形参名要保证与前端提

    2024年02月04日
    浏览(44)
  • 瑞吉外卖-Day01

    软件开发整体介绍 瑞吉外卖项目介绍 开发环境搭建 后台登录功能开发 后台退出功能开发 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这

    2024年02月12日
    浏览(33)
  • 瑞吉外卖day1

    本项目(瑞吉外卖)是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,包括系统管理后台和移动端应用两部分。其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的菜品、套餐、订单等进行管理维护。移动端应用 心 主要提供给消费者使用,可以在线浏

    2024年02月03日
    浏览(39)
  • 最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理

    黑马程序员最新Java项目实战《苍穹外卖》,最适合新手的SpringBoot+SSM的企业级Java项目实战。 设计 DTO 类 我们需要根据新增员工接口设计对应的 DTO 类去接收前端传递的参数,前端传递参数列表如下: 注意: 当前端提交的数据和实体类中对应的属性差别比较大时,建议使用

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包