【苍穹外卖】项目实战Day04

news2024/12/24 2:47:46

🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:苍穹外卖项目实战
🌠 首发时间:2024年5月5日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾

目录

  • 新增套餐
    • 需求分析和设计
    • 代码开发
    • 功能测试
  • 套餐分页查询
    • 需求分析和设计
    • 代码开发
    • 功能测试
  • 删除套餐
    • 需求分析和设计
    • 代码开发
    • 功能测试
  • 修改套餐
    • 需求分析和设计
    • 代码开发
    • 功能测试
  • 套餐启售停售
    • 需求分析和设计
    • 代码开发
    • 功能测试

新增套餐

需求分析和设计

产品原型:

在这里插入图片描述

在这里插入图片描述

业务规则:

  • 套餐名称唯一
  • 套餐必须属于某个分类
  • 套餐必须包含菜品
  • 名称、分类、价格、图片为必填项
  • 添加菜品窗口需要根据分类类型来展示菜品
  • 新增的套餐默认为停售状态

接口设计(共涉及到4个接口):

  • 根据类型查询分类(已完成)

  • 图片上传(已完成)

  • 根据分类 id 查询菜品(这个接口在添加菜品页面用到,分类 id 比如素菜或者荤菜再加上输入框的条件一起查询符合的菜品)

    在这里插入图片描述

  • 新增套餐

    在这里插入图片描述

数据库设计:

  • 套餐表 setmeal,用于存储套餐的信息。具体表结构如下:

    字段名数据类型说明备注
    idbigint主键自增
    namevarchar(32)套餐名称唯一
    category_idbigint分类id逻辑外键
    pricedecimal(10,2)套餐价格
    imagevarchar(255)图片路径
    descriptionvarchar(255)套餐描述
    statusint售卖状态1起售 0停售
    create_timedatetime创建时间
    update_timedatetime最后修改时间
    create_userbigint创建人id
    update_userbigint最后修改人id
  • 套餐菜品关系表 setmeal_dish,用于存储套餐和菜品的关联关系。具体表结构如下:

    字段名数据类型说明备注
    idbigint主键自增
    setmeal_idbigint套餐id逻辑外键
    dish_idbigint菜品id逻辑外键
    namevarchar(32)菜品名称冗余字段
    pricedecimal(10,2)菜品单价冗余字段
    copiesint菜品份数

代码开发

根据分类 id 查询菜品接口实现

DishController 中创建 list 方法:

/**
 * 根据分类id查询菜品
 *
 * @param categoryId
 * @return
 */
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<Dish>> list(Long categoryId) {
    List<Dish> list = dishService.list(categoryId);
    return Result.success(list);
}

DishService 接口中声明 list 方法:

/**
 * 根据分类id查询菜品
 *
 * @param categoryId
 * @return
 */
List<Dish> list(Long categoryId);

DishServiceImpl 接口中实现 list 方法:

/**
 * 根据分类id查询菜品
 *
 * @param categoryId
 * @return
 */
public List<Dish> list(Long categoryId) {
    Dish dish = Dish.builder()
            .categoryId(categoryId)
            .status(StatusConstant.ENABLE)
            .build();
    return dishMapper.list(dish);
}

DishMapper 中声明 list 方法:

/**
 * 动态条件查询菜品
 *
 * @param dish
 * @return
 */
List<Dish> list(Dish dish);

DishMapper.xml 中配置对应的 SQL

<!--    根据动态条件查询菜品-->
<select id="list" resultType="com.sky.entity.Dish">
    select * from dish
    <where>
        <if test="name != null">
            and name like concat('%', #{name}, '%')
        </if>
        <if test="categoryId != null">
            and category_id = #{categoryId}
        </if>
        <if test="status != null">
            and status = #{status}
        </if>
    </where>
    order by create_time desc
</select>

新增套餐接口实现

新建 SetmealController,在其中创建 list 方法:

import com.sky.dto.SetmealDTO;
import com.sky.result.Result;
import com.sky.service.SetmealService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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;

@RestController
@RequestMapping("/admin/setmeal")
@Api("套餐相关接口")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    /**
     * 新增套餐
     *
     * @param setmealDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增套餐")
    public Result save(@RequestBody SetmealDTO setmealDTO) {
        setmealService.saveWithDish(setmealDTO);
        return Result.success();
    }
}

新建 SetmealService 接口,在其中声明 saveWithDish 方法:

import com.sky.dto.SetmealDTO;

public interface SetmealService {

    /**
     * 新增套餐, 同时需要保存套餐和菜品的关联关系
     *
     * @param setmealDTO
     */
    void saveWithDish(SetmealDTO setmealDTO);
}

新建 SetmealServiceImpl ,实现 saveWithDish 方法:

import com.sky.dto.SetmealDTO;
import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealDishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.service.SetmealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class SetmealServiceImpl implements SetmealService {

    @Autowired
    private SetmealMapper setmealMapper;

    @Autowired
    private SetmealDishMapper setmealDishMapper;

    @Autowired
    private DishMapper dishMapper;

    /**
     * 新增套餐, 同时需要保存套餐和菜品的关联关系
     *
     * @param setmealDTO
     */
    @Transactional
    public void saveWithDish(SetmealDTO setmealDTO) {
        //1. 保存套餐数据
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, setmeal);
        setmealMapper.insert(setmeal);

        //2. 保存套餐菜品关联信息
        //获取套餐插入后生成的id
        Long setmealId = setmeal.getId();

        //获取前端传过来的套餐菜品关系
        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();

        //设置套餐id
        setmealDishes.forEach(setmealDish -> {
            setmealDish.setSetmealId(setmealId);
        });

        setmealDishMapper.insertBatch(setmealDishes);
    }
}

SetmealMapper 中声明 insert 方法:

**
 * 插入套餐数据
 * @param setmeal
 */
@AutoFill(OperationType.INSERT)
void insert(Setmeal setmeal);

SetmealMapper.xml 中配置对应的 SQL

<!--插入套餐数据-->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
    insert into setmeal
    (category_id, name, price, status, description, image, create_time, update_time, create_user, update_user)
    values (#{categoryId}, #{name}, #{price}, #{status}, #{description}, #{image}, #{createTime}, #{updateTime},
            #{createUser}, #{updateUser})
</insert>

SetmealDishMapper 中声明 insertBatch 方法:

/**
 * 批量保存套餐和菜品的关联关系
 *
 * @param setmealDishes
 */
void insertBatch(List<SetmealDish> setmealDishes);

SetmealDishMapper.xml 中配置对应的 SQL

<!--    批量保存套餐和菜品的关联关系-->
<insert id="insertBatch">
    insert into setmeal_dish
    (setmeal_id, dish_id, name, price, copies)
    values
    <foreach collection="setmealDishes" item="sd" separator=",">
        (#{sd.setmealId}, #{sd.dishId}, #{sd.name}, #{sd.price}, #{sd.copies})
    </foreach>
</insert>

功能测试

可以进行接口测试,也可以进行前后端联调测试

在这里插入图片描述

随便添加一个套餐,因为分页查询还没写,套餐数据显示不出来,所以我们可以看看对应的表中是否有数据:

在这里插入图片描述

在这里插入图片描述

套餐分页查询

需求分析和设计

产品原型:

在这里插入图片描述

业务规则:

  • 根据页码进行分页展示
  • 每页展示 10 条数据
  • 可以根据需要,按照套餐名称、分类、售卖状态进行查询

接口设计:

在这里插入图片描述

代码开发

SetmealController 中创建 page 方法:

/**
 * 套餐分页查询
 *
 * @param setmealPageQueryDTO
 * @return
 */
@GetMapping("/page")
@ApiOperation("套餐分页查询")
public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO) {
    PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO);
    return Result.success(pageResult);
}

SetmealService 接口中声明 pageQuery 方法:

/**
 * 分页查询
 *
 * @param setmealPageQueryDTO
 * @return
 */
PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);

SetmealServiceImpl 中实现 pageQuery 方法:

/**
 * 分页查询
 *
 * @param setmealPageQueryDTO
 * @return
 */
public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
    //开始分页查询
    PageHelper.startPage(setmealPageQueryDTO.getPage(), setmealPageQueryDTO.getPageSize());

    Page<SetmealVO> page = setmealMapper.pageQuery(setmealPageQueryDTO);
    return new PageResult(page.getTotal(), page.getResult());
}

SetmealMapper 中声明 pageQuery 方法:

/**
 * 分页查询
 *
 * @param setmealPageQueryDTO
 * @return
 */
Page<SetmealVO> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);

SetmealMapper.xml 中配置对应的 SQL

<!--分页查询-->
<select id="pageQuery" resultType="com.sky.vo.SetmealVO">
    select s.*, c.name categoryName
    from setmeal s
    left join category c on s.category_id = c.id
    <where>
        <if test="name != null">
            and s.name like concat('%', #{name}, '%')
        </if>
        <if test="status != null">
            and s.status = #{status}
        </if>
        <if test="categoryId != null">
            and s.category_id = #{categoryId}
        </if>
    </where>
    order by s.create_time desc
</select>

功能测试

可以进行接口测试,也可以进行前后端联调测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

删除套餐

需求分析和设计

产品原型:

在这里插入图片描述

业务规则:

  • 可以一次删除一个套餐,也可以批量删除套餐
  • 起售中的套餐不能删除

接口设计:

在这里插入图片描述

代码开发

SetmealController 中创建 delete 方法:

/**
 * 批量删除套餐
 *
 * @param ids
 * @return
 */
@DeleteMapping
@ApiOperation("批量删除套餐")
public Result delete(@RequestParam List<Long> ids) {
    setmealService.deleteBatch(ids);
    return Result.success();
}

SetmealService 接口中声明 deleteBatch 方法:

/**
 * 批量删除套餐
 *
 * @param ids
 */
void deleteBatch(List<Long> ids);

SetmealServiceImpl 中实现 deleteBatch 方法:

/**
 * 批量删除套餐
 *
 * @param ids
 */
@Transactional
public void deleteBatch(List<Long> ids) {
    //判断套餐集合中是否存在启售状态的套餐
    ids.forEach(id -> {
        Setmeal setmeal = setmealMapper.getById(id);
        if (setmeal.getStatus().equals(StatusConstant.ENABLE)) {
            throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
        }
    });

    //删除套餐
    ids.forEach(setmealId -> {
        //删除套餐表中的数据
        setmealMapper.deleteById(setmealId);

        //删除套餐菜品关系表中的数据
        setmealDishMapper.deleteBySetmealId(setmealId);
    });
}

SetmealMapper 中声明 getById 方法和 deleteById 方法,并配置 SQL

/**
 * 根据id查询套餐
 *
 * @param id
 * @return
 */
@Select("select * from setmeal where id = #{id}")
Setmeal getById(Long id);

/**
 * 根据id删除套餐
 *
 * @param setmealId
 */
@Delete("delete from setmeal where id = #{id}")
void deleteById(Long setmealId);

SetmealDishMapper 中声明 deleteBySetmealId 方法并配置 SQL

/**
 * 根据套餐id删除套餐和菜品的关联关系
 *
 * @param setmealId
 */
@Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
void deleteBySetmealId(Long setmealId);

功能测试

可以进行接口测试,也可以进行前后端联调测试

先随便添加一个套餐:

在这里插入图片描述

在这里插入图片描述

将其删除:

在这里插入图片描述

在这里插入图片描述

修改套餐

需求分析和设计

产品原型:

在这里插入图片描述

接口设计(共涉及到5个接口):

  • 根据 id 查询套餐

    在这里插入图片描述 在这里插入图片描述

  • 根据类型查询分类(已完成)

  • 根据分类 id 查询菜品(已完成)

  • 图片上传(已完成)

  • 修改套餐

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

代码开发

根据 id 查询套餐接口开发

SetmealController 中创建 getById 方法:

/**
 * 根据id查询套餐
 *
 * @param id
 * @return
 */
@GetMapping("/{id}")
@ApiOperation("根据id查询套餐")
public Result<SetmealVO> getById(@PathVariable Long id) {
    SetmealVO setmealVO = setmealService.getByIdWithDish(id);
    return Result.success(setmealVO);
}

SetmealService 接口中声明 getByIdWithDish 方法:

/**
 * 根据id查询套餐和关联的菜品数据
 *
 * @param id
 * @return
 */
SetmealVO getByIdWithDish(Long id);

SetmealServiceImpl 中实现 getByIdWithDish 方法:

/**
 * 根据id查询套餐和关联的菜品数据
 *
 * @param id
 * @return
 */
@Override
public SetmealVO getByIdWithDish(Long id) {
    //获取套餐和套餐关联的菜品数据
    Setmeal setmeal = setmealMapper.getById(id);
    List<SetmealDish> setmealDishes = setmealDishMapper.getDishesBySetmealId(id);

    //封装数据
    SetmealVO setmealVO = new SetmealVO();
    BeanUtils.copyProperties(setmeal, setmealVO);
    setmealVO.setSetmealDishes(setmealDishes);

    return setmealVO;
}

SetmealDishMapper 中声明 getDishesBySetmealId 方法并配置 SQL

/**
 * 根据套餐id查询套餐和菜品的关联关系
 *
 * @param id
 * @return
 */
@Select("select * from setmeal_dish where setmeal_id = #{setmealId}")
List<SetmealDish> getDishesBySetmealId(Long id);

修改套餐接口开发

SetmealController 中创建 update 方法:

/**
 * 修改套餐
 *
 * @param setmealDTO
 * @return
 */
@PutMapping
@ApiOperation("修改套餐")
public Result update(@RequestBody SetmealDTO setmealDTO) {
    setmealService.update(setmealDTO);
    return Result.success();
}

SetmealService 接口中声明 update 方法:

/**
 * 修改套餐
 *
 * @param setmealDTO
 */
void update(SetmealDTO setmealDTO);

SetmealServiceImpl 中实现 update 方法:

/**
 * 修改套餐
 *
 * @param setmealDTO
 */
@Transactional
public void update(SetmealDTO setmealDTO) {
    //拷贝套餐数据
    Setmeal setmeal = new Setmeal();
    BeanUtils.copyProperties(setmealDTO, setmeal);

    //修改套餐表
    setmealMapper.update(setmeal);

    //获取套餐id
    Long setmealId = setmealDTO.getId();

    //删除原套餐和菜品的关联关系
    setmealDishMapper.deleteBySetmealId(setmealId);

    //给新的关联菜品添加套餐id
    List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
    setmealDishes.forEach(setmealDish -> {
        setmealDish.setSetmealId(setmealId);
    });

    //重新插入套餐和菜品的关联关系
    setmealDishMapper.insertBatch(setmealDishes);
}

功能测试

可以进行接口测试,也可以进行前后端联调测试

在这里插入图片描述

在这里插入图片描述

套餐启售停售

需求分析和设计

产品原型:

在这里插入图片描述

业务规则:

  • 可以对状态为启售的套餐进行停售操作,可以对状态为停售的套餐进行启售操作
  • 启售的套餐可以展示在用户端,停售的套餐不能展示在用户端
  • 启售套餐时,如果套餐内包含停售的菜品,则不能启售

接口设计:

在这里插入图片描述

代码开发

SetmealController 中创建 startOrStop 方法:

/**
 * 套餐启售停售
 *
 * @param status
 * @param id
 * @return
 */
@PostMapping("/status/{status}")
@ApiOperation("套餐启售停售")
public Result startOrStop(@PathVariable Integer status, Long id) {
    setmealService.startOrStop(status, id);
    return Result.success();
}

SetmealService 接口中声明 startOrStop 方法:

/**
 * 套餐启售停售
 *
 * @param status
 * @param id
 */
void startOrStop(Integer status, Long id);

SetmealServiceImpl 中实现 startOrStop 方法:

/**
 * 套餐启售停售
 *
 * @param status
 * @param id
 */
@Transactional
public void startOrStop(Integer status, Long id) {
    //启售套餐时, 需要判断套餐内是否有停售的菜品, 有则不能启售
    if (status.equals(StatusConstant.ENABLE)) {
        //获取套餐内所有菜品
        List<Dish> dishes = dishMapper.getBySetmealId(id);
        if (dishes != null && dishes.size() > 0) {
            dishes.forEach(dish -> {
                //判断菜品的状态
                if (dish.getStatus().equals(StatusConstant.DISABLE)) {
                    throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
                }
            });
        }
    }

    //更新套餐信息
    Setmeal setmeal = Setmeal.builder()
            .id(id)
            .status(status)
            .build();
    setmealMapper.update(setmeal);
}

SetmealMapper 中声明 getBySetmealId 方法并配置 SQL

/**
 * 根据套餐id查询关联的菜品
 *
 * @param id
 * @return
 */
@Select("select * from dish d left join setmeal_dish sd on d.id = sd.dish_id where sd.setmeal_id = #{setmealId}")
List<Dish> getBySetmealId(Long id);

功能测试

可以进行接口测试,也可以进行前后端联调测试

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

TwinCAT3 实时内核调度算法

前言 TwinCAT3 支持多核心CPU并行运行实时任务&#xff0c;根据官方网站的帮助信息“实时”定义取自DIN44300&#xff0c;而且实时任务的调度算法默认是 RMS算法&#xff08;速率单调调度算法&#xff09; RMS算法 来看一下百度百科的解释&#xff1a; RMS&#xff08;单调速…

探究Android的多分辨率支持以及各种类型图标尺寸大小

术语和概念 屏幕尺寸 屏幕的物理尺寸&#xff0c;以屏幕的对角线长度作为依据&#xff08;比如 2.8寸&#xff0c; 3.5寸&#xff09;。 简而言之&#xff0c; Android把所有的屏幕尺寸简化为三大类&#xff1a;大&#xff0c;正常&#xff0c;和小。 程序可以针对这三种尺寸…

大厂案例 - 通用的三方接口调用方案设计(中)

文章目录 Pre阿里云华为云【AK和SK生成方案】最佳实践1. 创建API密钥管理系统2. 生成AK和SK3. 存储和管理AK和SK4. 提供API密钥分发机制5. 安全性6. 其他注意事项 DB Model Design表结构Next考虑其他建议 API接口设计指导1. 使用POST作为接口请求方式2. 客户端IP白名单3. 单个接…

ROS服务器通信

目录 一、角色 二、流程 注意 三、例子描述 四、srv文件 编译配置文件 vscode配置 五、Server.cpp编写例子 编写CMakeList 六、观察server的效果 七、Client编写例子 编写CMakeList 八、观察Client的结果 九、Client优化&#xff08;动态输入&#xff09; 了解argc…

【网络编程下】五种网络IO模型

目录 前言 一.I/O基本概念 1.同步和异步 2.阻塞和非阻塞 二.五种网络I/O模型 1.阻塞I/O模型 2.非阻塞式I/O模型 ​编辑 3.多路复用 4.信号驱动式I/O模型 5. 异步I/O模型 三.五种I/O模型比较​编辑 六.I/O代码示例 1. 阻塞IO 2.非阻塞I/O 3.多路复用 (1)select …

STM32 F103C8T6学习笔记16:1.3寸OLED的驱动显示日历

今天尝试使用STM32 F103C8T6驱动显示 1.3寸的OLED&#xff0c;显示数字、字符串、汉字、图片等 本质与0.96寸的OLED是完全相同的原理&#xff1a; 而且经过我的研究发现: 1.3寸大小的OLED并未比0.96寸的有更多的显示像素点数来显示&#xff0c;也是128*64的像素点数显示: 也…

2024-5-4

今日流水账&#xff1a; 上午&#xff1a; 之前的那道 kernel pwn 已经成功构造了 dirty pipe 原语&#xff08;&#xff1a;但是不知道为啥修改 /bin/busybox 一直报段错误&#xff0c;悲&#xff0c;后面在探索探索&#xff08;&#xff1a;这里简单尝试写下 /etc/passwd&…

【架构系列】RabbitMQ应用场景及在实际项目中如何搭建可靠的RabbitMQ架构体系

作者:后端小肥肠 创作不易&#xff0c;未经允许禁止转载。 1. 前言 RabbitMQ&#xff0c;作为一款高性能、可靠的消息队列软件&#xff0c;已经成为许多企业和开发团队的首选之一。它的灵活性和可扩展性使得它适用于各种应用场景&#xff0c;从简单的任务队列到复杂的分布式系统…

eNSP-动态路由(ospf协议)

一、拓扑结构搭建 二、主机配置 pc1 pc2 三、路由器配置 1.AR2配置 <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.2 24 #设置ip地址 [Huawei-GigabitEthernet0/0/0]q #返回上一级 [Huawei]int g0/0/1 …

asp.net结课作业中遇到的问题解决2

目录 1、如何实现评论交流的界面 2、如果想要将文字添加到数据库中&#xff0c;而不是乱码&#xff0c;该怎么修改 3、如果想要添加的数据已经存在于数据库&#xff0c;就不允许添加了&#xff0c;该如何实现 4、想要实现某个模块下有好几个小的功能该如何实现 5、想要实现…

Unity 性能优化之数据面板(Statistics)(一)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity 统计数据面板&#xff08;Statistics&#xff09;1.Audio属性2.Graphics属性 二、什么是Draw Call&#xff1f;三、Unity3D stats也可以通过代…

大型语言模型的新挑战:AMR语义表示的神秘力量

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 引言&#xff1a;AMR在大型语言模型中的作用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;抽象意义表示&…

【Android学习】自定义文本框和输入监听

实现功能 以上代码可实现功能&#xff1a; 1 自定义文本框样式 2. 文本框触发形式转变 3. 文本框输入长度监听&#xff0c;达到最大长度关闭软键盘 4. password框触发检测phone框内容 1. drawable自定义形状 我创建了editor_focus.xml 和 editor_unfocus.xml&#xff0c;两者仅…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

3.2Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用- Vuex

Vuex简介 Vuex概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规 则保证状态以一种可预测的方式发生变化. 试想这样的场景, 比如一个Vue的根实例下面有一个根组件名为App.vue, 它下面有两个子组件A.vue和B.vu…

巧记英语单词

页面 在输入框中填写英语单词的谐音 这样的话就进行了一次英语单词的记忆练习。 页面代码 <% layout(/layouts/default.html, {title: 英语单词管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main">&l…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…

练习题(2024/5/4)

1 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

学习Rust的第26天:Rust中的cp

在本文中复刻了 cp 实用程序的功能&#xff0c;我想默认使其递归&#xff0c;因为每次我想复制时都输入 -R 文件夹都会觉得有点重复&#xff0c;本文代码将与前文代码保持相似&#xff0c;我们只会更改程序的核心功能和一些变量名称以匹配用例 Pseudo Code 伪代码 function cop…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …