SpringBoot+SSM项目实战 苍穹外卖(4) day4作业

继续上一节的内容,本节是作业课程,要求独立完成套餐管理模块所有业务功能,包括:新增套餐、套餐分页查询、删除套餐、修改套餐、起售停售套餐。

目录

  • 新增套餐
    • 根据分类id查询菜品功能
    • 新增套餐功能
  • 套餐分页查询
  • 删除套餐
    • 根据id查询套餐功能
    • 删除套餐功能
  • 修改套餐
  • 起售停售套餐
    • 起售停售菜品
    • 起售停售套餐
      • 写法一
      • 写法二

新增套餐

页面原型:

请添加图片描述

其中的文件上传、和套餐分类查询已经完成。套餐分类查询的接口地址为/admin/category/list,根据请求参数的type值区分查询的分类类型:1为菜品分类,2为套餐分类,这里前端查询的是套餐分类。这些功能前面已经完成不再赘述。

请添加图片描述

在新增套餐时需要选择套餐里包含的菜品,所以需要先完成根据分类id查询菜品功能。

根据分类id查询菜品功能

根据分类id查询菜品接口:

请添加图片描述

先来完成根据分类id查询菜品:

Controller层

DishController.java

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

Service层实现类

DishServiceImpl.java

/*** 根据分类id查询菜品信息** @param categoryId*/
public List<Dish> getByCategoryID(Long categoryId) {return dishMapper.getByCategoryID(categoryId);
}

Mapper层

/*** 根据分类id查询菜品** @param categoryId*/
@Select("select * from dish where status = 1 and category_id = #{categoryId} order by create_time desc")
List<Dish> getByCategoryID(Long categoryId);

完成之后测试新增套餐时往套餐中加入菜品:

请添加图片描述

按道理来说,这里前端写了输入菜品名称进行搜索的,后端应该开发出动态条件查询菜品的功能,输入数据是分类id还有菜品名等,但是这里因为前后端的接口文档里这个接口只传入了一个分类id,所以楼主就没有写动态查询的功能,因此前端的添加菜品里的按名称进行搜索也是无法使用的,有兴趣的可以自己修改前端源码修改接口。

新增套餐功能

新增套餐接口:

请添加图片描述

下面来完成新增套餐:

Controller层

SetmealController

/*** 套餐管理*/
@RestController
@RequestMapping("/admin/setmeal")
@Slf4j
@Api(tags= "套餐相关接口") //描述类的作用
public class SetmealController {@Autowiredprivate SetmealService setmealServices;/*** 新增套餐** @param setmealDTO* @return*/@PostMapping@ApiOperation(value = "新增套餐")public Result save(@RequestBody SetmealDTO setmealDTO){log.info("新增套餐:{}",setmealDTO);setmealServices.save(setmealDTO);return Result.success();}
}

Service层实现类

SetmealServiceImpl

@Service
public class SetmealServiceImpl implements SetmealService {@Autowiredprivate SetmealMapper setmealMapper;@Autowiredprivate SetmealDishMapper setmealDishMapper;/*** 新增套餐,同时需要保存套餐和菜品的关联关系** @param setmealDTO* @return*/@Transactional // 事务public void save(SetmealDTO setmealDTO) {Setmeal setmeal = new Setmeal();BeanUtils.copyProperties(setmealDTO, setmeal); //套餐List<SetmealDish> setmealDishlist = setmealDTO.getSetmealDishes(); // 套餐菜品关系setmealMapper.insert(setmeal);long setmealId = setmeal.getId(); //返回自动生成的套餐菜品表主键idif (setmealDishlist != null && setmealDishlist.size() > 0) {setmealDishlist.forEach(setmealDish -> {setmealDish.setSetmealId(setmealId);});//向套餐菜品关系表插入n条数据setmealDishMapper.insertBatch(setmealDishlist);}}
}

Mapper层

SetmealMapper

/*** 新增套餐数据** @param setmeal*/
@AutoFill(OperationType.INSERT) // 公共字段填充
void insert(Setmeal setmeal);

SetmealMapper.xml

<?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.SetmealMapper"><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>
</mapper>

SetmealDishMapper

/*** 向套餐菜品关系表批量插入数据** @param setmealDishlist* @return*/
void insertBatch(List<SetmealDish> setmealDishlist);

SetmealDishMapper.xml

<insert id="insertBatch">insert into setmeal_dish (setmeal_id, dish_id, name, price, copies) VALUES<foreach collection="setmealDishlist" item="sd" separator=",">(#{sd.setmealId},#{sd.dishId},#{sd.name},#{sd.price},#{sd.copies})</foreach>
</insert>

前后端联调测试新增套餐功能,由于未开发套餐分页查询功能,固在数据库中查看数据是否插入成功:

请添加图片描述

请添加图片描述

测试通过,提交代码。





套餐分页查询

接口信息:

请添加图片描述

Controller层

SetmealController

/*** 套餐分页查询* @param setmealPageQueryDTO* @return*/
@GetMapping("/page")
@ApiOperation("套餐分页查询")
public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO){log.info("套餐分页查询,参数为:{}", setmealPageQueryDTO);PageResult pageResult = setmealServices.pageQuery(setmealPageQueryDTO);return Result.success(pageResult);
}

Service层实现类

SetmealServiceImpl

/*** 套餐分页查询** @param setmealPageQueryDTO* @return*/
public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO){// select * from setmeal limit 0,10//开始分页查询PageHelper.startPage(setmealPageQueryDTO.getPage(), setmealPageQueryDTO.getPageSize());Page<SetmealVO> page = setmealMapper.pageQuery(setmealPageQueryDTO);long total = page.getTotal();List<SetmealVO> records = page.getResult();return new PageResult(total, records);
}

Mapper层

SetmealMapper

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

SetmealMapper.xml

<select id="pageQuery" resultType="com.sky.vo.SetmealVO">selects.*,c.name categoryNamefromsetmeal sleft joincategory cons.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>

测试:

请添加图片描述

测试通过,提交代码。





删除套餐

接口传入的套餐ids包含多个id,所以需要开发批量删除功能。

删除套餐的时候需要判断当前套餐是否在起售状态,否则不能删除,需要使用到根据id查询套餐功能里的查询套餐功能,根据id查询套餐功能里还包括了根据套餐id查询对应菜品的功能,所以干脆先把根据id查询套餐的功能开发了。

根据id查询套餐功能

接口如下:

请添加图片描述

Controller层

SetmealController

@GetMapping("/{id}")
@ApiOperation("根据id查询套餐")
public Result<SetmealVO> getById(@PathVariable Long id){log.info("根据id查询套餐:{}", id);SetmealVO setmealVO = setmealServices.getByIdWithDishes(id);return Result.success(setmealVO);
}

Service层实现类

SetmealServiceImpl

/*** 根据套餐id查询套餐和其对应菜品* @param id* @return*/
@Override
public SetmealVO getByIdWithDishes(Long id) {//根据id查询套餐数据Setmeal setmeal = setmealMapper.getById(id);//根据套餐id查询菜品数据List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);//将查询到的数据封装到VOSetmealVO setmealVO = new SetmealVO();BeanUtils.copyProperties(setmeal, setmealVO);setmealVO.setSetmealDishes(setmealDishes);return setmealVO;
}

Mapper层

SetmealMapper

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

SetmealDishMapper

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

删除套餐功能

接口如下:

请添加图片描述

Controller层

SetmealController

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

Service层实现类

SetmealServiceImpl

/*** 套餐批量删除* @param ids*/
@Transactional //事务
public void deleteBatch(List<Long> ids) {//判断当前套餐是否能够删除---是否存在起售中的套餐??for (Long id : ids) {Setmeal setmeal = setmealMapper.getById(id); //在这里需要使用到根据id查询套餐功能的查询套餐if (setmeal.getStatus() == StatusConstant.ENABLE) {//当前菜品处于起售中,不能删除throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);}}for (Long id : ids) {setmealMapper.deleteById(id);//删除套餐数据setmealDishMapper.deleteBySetmealId(id);//删除套餐菜品关系表中套餐关联的菜品数据}
}

Mapper层

SetmealMapper

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

SetmealDishMapper

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

测试略,由于还未开发套餐起售状态修改功能,固可以去数据库直接修改套餐的销售状态,然后去swagger或者前端测试删除起售中的套餐,同时测试批量删除功能。
测试通过后提交代码到git。






修改套餐

共涉及到5个接口:根据id查询套餐(在删除套餐里已完成)、根据类型查询分类(已完成)、根据分类id查询菜品(已完成)、图片上传(已完成)、修改套餐

修改套餐接口信息如下,传入的参数和新增套餐是一致的,只不过从insert改成了update。

请添加图片描述

Controller层

SetmealController

/*** 修改套餐** @param setmealVO* @return*/
@PutMapping
@ApiOperation("修改菜品")
public Result update(@RequestBody SetmealVO setmealVO) {log.info("修改菜品:{}", setmealVO);setmealServices.updateWithDishes(setmealVO);return Result.success();
}

Service层实现类

SetmealServiceImpl

/*** 根据id修改套餐基本信息和对应的菜品信息* @param setmealVO*/
@Transactional //事务
public void updateWithDishes(SetmealVO setmealVO) {Setmeal setmeal = new Setmeal();BeanUtils.copyProperties(setmealVO, setmeal);//修改套餐表基本信息setmealMapper.update(setmeal);//删除原有的套餐菜品关系表数据setmealDishMapper.deleteBySetmealId(setmealVO.getId());//重新插入套餐菜品关系数据List<SetmealDish> setmealDishes = setmealVO.getSetmealDishes();if (setmealDishes != null && setmealDishes.size() > 0) {setmealDishes.forEach(setmealDish -> {setmealDish.setSetmealId(setmealVO.getId());});//向套餐菜品关系表插入n条数据setmealDishMapper.insertBatch(setmealDishes);}
}

Mapper层

SetmealMapper

/*** 根据id动态修改套餐数据* @param setmeal*/
@AutoFill(OperationType.UPDATE) // 公共字段填充
void update(Setmeal setmeal);

SetmealMapper.xml

<update id="update">update setmeal<set><if test="categoryId != null">category_id = #{categoryId},</if><if test="name != null">name = #{name},</if><if test="price != null">price = #{price},</if><if test="status != null">status = #{status},</if><if test="description != null">description = #{description},</if><if test="image != null">image = #{image},</if><if test="updateTime != null">update_time = #{updateTime},</if><if test="updateUser != null">update_user = #{updateUser},</if></set>where id = #{id}
</update>

测试:

请添加图片描述

数据库:

请添加图片描述

请添加图片描述

测试通过,提交代码到github。






起售停售套餐

写这一块的时候发现菜品管理里面的起售停售菜品好像老师也没有带我们写,所以干脆一块写了吧。

起售停售菜品

请添加图片描述

Controller层

DishController

@PostMapping("/status/{status}")
@ApiOperation("修改菜品销售状态")
public Result updateStatus(@PathVariable Integer status,Long id){log.info("根据分类id修改菜品销售状态:{}", status);dishService.updateStatusById(status,id);return Result.success();
}

Service层实现类

DishServiceImpl

/*** 根据菜品id修改菜品销售状态* @param status* @param id*/
public void updateStatusById(Integer status, Long id) {Dish dish = Dish.builder().id(id).status(status).build();dishMapper.update(dish);//直接调用以前的根据id动态修改菜品数据接口就行
}

Mapper层

这里直接调用以前的菜品修改的Mapper层接口。

DishMapper

/*** 根据id动态修改菜品数据** @param dish*/
@AutoFill(value = OperationType.UPDATE) // 公共字段填充
void update(Dish dish);

DishMapper.xml

<update id="update">update dish<set><if test="name != null">name = #{name},</if><if test="categoryId != null">category_id = #{categoryId},</if><if test="price != null">price = #{price},</if><if test="image != null">image = #{image},</if><if test="description != null">description = #{description},</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>

起售停售套餐

接口:

请添加图片描述

写法一

Controller层

SetmealController

@PostMapping("/status/{status}")
@ApiOperation("修改套餐销售状态")
public Result updateStatus(@PathVariable Integer status,Long id){log.info("根据套餐id修改套餐销售状态:{}", status);setmealServices.updateStatusById(status,id);return Result.success();
}

Service层实现类

SetmealServiceImpl

@Autowired
private DishMapper dishMapper;/*** 根据套餐id修改套餐销售状态** @param status* @param id*/
public void updateStatusById(Integer status, Long id) {//如果是将套餐的销售状态修改为起售,则需要保证套餐里所有的菜品的销售状态也是起售 否则抛出异常if(status==StatusConstant.ENABLE){List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);//根据套餐id去套餐菜品关系表里找到所有的菜品if(setmealDishes == null || setmealDishes.size()==0) return; //这里其实可以抛出一个异常给前端 套餐里没有菜品setmealDishes.forEach(setmealDish -> {//再根据菜品id去菜品表里找到菜品的销售状态if(dishMapper.getById(setmealDish.getDishId()).getStatus()==StatusConstant.DISABLE){throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);}});}Setmeal setmeal=Setmeal.builder().id(id).status(status).build();setmealMapper.update(setmeal);//直接调用之前写好的根据id动态修改套餐数据接口
}

Mapper层

这里直接调用之前写好的根据id动态修改套餐数据接口就行

SetmealMapper

/*** 根据id动态修改套餐数据* @param setmeal*/
@AutoFill(OperationType.UPDATE) // 公共字段填充
void update(Setmeal setmeal);
<update id="update">update setmeal<set><if test="categoryId != null">category_id = #{categoryId},</if><if test="name != null">name = #{name},</if><if test="price != null">price = #{price},</if><if test="status != null">status = #{status},</if><if test="description != null">description = #{description},</if><if test="image != null">image = #{image},</if><if test="updateTime != null">update_time = #{updateTime},</if><if test="updateUser != null">update_user = #{updateUser},</if></set>where id = #{id}
</update>

测试:

请添加图片描述

测试通过,提交代码。




写法二

这里再分享另外一种写法,上面这种写法其实比较偷懒,因为调用的都是现成的mapper接口,得先通过套餐id去套餐菜品关系表里找到套餐菜品关联数据,然后拿到所有的菜品id去菜品表里拿到菜品的销售状态。

其实可以直接通过套餐id、套餐表联合菜品表直接拿到菜品数据,把逻辑写在sql语句就行:

SetmealServiceImpl

@Autowired
private DishMapper dishMapper;/*** 套餐起售、停售* @param status* @param id
*/
public void startOrStop(Integer status, Long id) {//起售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未启售菜品,无法启售"if(status == StatusConstant.ENABLE){//select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = ?List<Dish> dishList = dishMapper.getBySetmealId(id);if(dishList != null && dishList.size() > 0){dishList.forEach(dish -> {if(StatusConstant.DISABLE == dish.getStatus()){throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);}});}}Setmeal setmeal = Setmeal.builder().id(id).status(status).build();setmealMapper.update(setmeal);
}

DishMapper

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

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

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

相关文章

Java二阶知识点总结(一)Maven

一、Maven概念 Maven是一个项目管理工具&#xff0c;其主要作用有2点 依赖管理&#xff1a;管理项目依赖的各种jar包自动构建&#xff1a;项目构建的过程&#xff0c;从编译、测试、运行、打包到安装的过程可以一键执行 二、Maven工程的目录结构 src/main/java&#xff1a;…

【S32K144】MCAL基础工程搭建

目录 一、在S32DS创建Application Project 二、MCAL工程 三、基于MCAL的集成 以下示例基于S32K144EVB开发板进行。 一、在S32DS创建Application Project &#xff08;1&#xff09;新建工程Application Project &#xff08;2&#xff09;工程配置 &#xff08;3&#xff…

正则表达式(5):常用符号

正则表达式&#xff08;5&#xff09;&#xff1a;常用符号 小结 本博文转载自 在本博客中&#xff0c;”正则表达式”为一系列文章&#xff0c;如果你想要从头学习怎样在Linux中使用正则&#xff0c;可以参考此系列文章&#xff0c;直达链接如下&#xff1a; 在Linux中使用正…

二叉平衡树

一直想深入的研究一下&#xff0c;并手写平衡二叉树的插入、删除代码。 二叉树是动态查找的典范&#xff0c;但在极限情况下&#xff0c;二叉树的查找效果等同于链表&#xff0c;而平衡二叉树可以完美的达到 log ⁡ 2 n \log_2 n log2​n。 AVL简称平衡二叉树&#xff0c;缩写…

Linux系统调试课:I2C tools调试工具

文章目录 一、如何使用I2C tools测试I2C外设1、I2C tools概述: 2、下载I2C tools源码:3、编译I2C tools源码: 4、i2cdetect 5、i2cget 6、i2cdump

Vue+ElementUI技巧分享:结合Sortablejs实现表格行拖拽

文章目录 前言准备工作示例代码代码说明1. 引入依赖和组件结构2. 组件数据和生命周期3. 实现拖拽功能4. 更新数据和服务器同步 运行效果总结 前言 在很多动态网页应用中&#xff0c;用户界面的交互性是提高用户体验的关键。在 Vue.js 中&#xff0c;结合 Element UI 和 sortab…

初识树型结构与二叉树

1. 树型结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff08;它是根朝上&#xff0c;而叶朝下的&#xff09;&#xff0c;其物理结构如下图所示&#x…

Ubuntu 20.04 安装 mysql8 LTS

Ubuntu 20.04 安装 mysql8 LTS sudo apt-get update sudo apt-get install mysql-server mysql --version mysql Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) Ubuntu20.04 是自带了 MySQL8. 几版本的&#xff0c;低于 20.04 则默认安装是 MySQL5.7.33 s…

rpm安装gitlab

1.rpm包下载 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 2.进行安装 rpm -ivh gitlab-ce-15.9.7-ce.0.el7.x86_64.rpm --nodeps --force 3.配置访问地址 vim /etc/gitlab/gitlab.rb 4.重新加载配置以及重启服务 gitlab-ctl reconfiguregitlab-ctl resta…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(2)》(26)

《Linux操作系统原理分析之Linux文件管理&#xff08;2&#xff09;》&#xff08;26&#xff09; 8 Linux文件管理8.4 虚拟文件系统 VFS8.4.1 VFS 的工作原理8.4.2 VFS 超级块8.4.3VFS 的 inode 8.5 文件系统的安装与注册8.5.2 文件系统的注册 8 Linux文件管理 8.4 虚拟文件系…

HarmonyOS4.0从零开始的开发教程05 应用程序入口—UIAbility的使用

HarmonyOS&#xff08;三&#xff09;应用程序入口—UIAbility的使用 UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 每一个UIAbility实例&#xff0c;…

python数据分析基础

前言 2023年10月以来&#xff0c;一位在商学院就读的可爱同学遇上了一门课——python数据分析&#xff0c;并遇到了许多问题&#xff0c;找上了我&#xff0c;就此&#xff0c;我也开始了学习之路&#xff0c;虽然很浅显&#xff0c;但这些东西对部门同学来说也是受用的&#…

Weblogic CVE-2023-21839(metasploit版)

Step1&#xff1a;用docker搭建环境 Step2&#xff1a;docker查看映射端口 Step3&#xff1a;访问特定端口&#xff0c;然后靶标应用。 Step4&#xff1a;用metasploit进行攻击&#xff1a; 首先&#xff0c;打开metasploit&#xff0c;然后查询需要攻击的板块&#xff0…

指定分隔符对字符串进行分割 numpy.char.split()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定分隔符对字符串进行分割 numpy.char.split() 选择题 请问下列程序运行的的结果是&#xff1a; import numpy as np print("【执行】np.char.split(I.Love.China, sep .)") p…

Linux进程解析(冯诺依曼体系结构,操作系统,进程初步解析)

冯诺依曼体系结构&#xff1a; 我们常见的计算机&#xff0c;如笔记本。我们常见的计算机&#xff0c;服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成&#xff1a; 中央处理器(CPU)&am…

Linux socket编程(12):Unix套接字之socketpair、sendmsg和recvmsg详解

在上一篇文章Unix套接字编程及通信例子中&#xff0c;我们对Unix套接字编程有一个基本的了解。但在Unix套接字编程的领域中&#xff0c;有一组特殊而强大的工具&#xff1a;socketpair、sendmsg 和 recvmsg&#xff0c;它们为实现本地进程间通信提供了便捷的方式。 文章目录 1 …

绝地求生:NH究极天命圈惊险吃鸡,17斩获单日积分第一,4AM梦游暂居倒数

绝地求生PGC小组赛B组第一轮的比赛即将结束&#xff0c;在刚刚那场决赛圈中NH和17给我们上演了非常精彩的较量&#xff0c;双方战至最后一人&#xff0c;最终由NH击败17收获一鸡&#xff0c;这两支PCL老牌强队总分都超过了40分&#xff0c;晋级胜者组对他们来说压力不大了。新队…

【FPGA图像处理实战】- FPGA图像处理仿真测试工程(读写BMP图片)

FPGA开发过程中“行为功能仿真”是非常必要的一个过程&#xff0c;如果仿真都没通过&#xff0c;则上板测试必定失败。 FPGA图像处理需要读写大量的图像数据&#xff0c;单看这些图像数据实际是没有规则的&#xff0c;如果直接上板测试&#xff0c;调试起来非常困难&#xff0…

看图学源码之— HashMap源码分析

简介&#xff1a; 是基于 哈希表 实现的&#xff0c;存放 k-v 键值对&#xff0c;非同步的方式&#xff08;未加 synchronized &#xff09;非线程安全的&#xff0c;hashmap 无序的数据结构&#xff1a; 数组 链表 > 数组 链表 红黑树「链表 和 链表 红黑树 都是为了解…

QT+Unity3D 超详细(将unity3D与QT进行连接,并实现信息传递)

QTUnity3D连接 在QT中连接unity3D&#xff0c;首先要有一个unity.exe执行文件。在这里不提供unity执行文件的编写&#xff0c;只提供QT这边与unity3D连接和信息传递。 创建项目 创建一个新的项目&#xff0c;我创建的项目名称如下。 下图是我建立新项目的文件。APP文件就是…