当前位置: 首页 > news >正文

day16_购物车(添加购物车,购物车列表查询,删除购物车商品,更新选中商品状态,完成购物车商品的全选,清空购物车)

文章目录

  • 购物车模块
  • 1 需求说明
  • 2 环境搭建
  • 3 添加购物车
    • 3.1 需求说明
    • 3.2 远程调用接口开发
      • 3.2.1 ProductController
      • 3.2.2 ProductService
    • 3.3 openFeign接口定义
      • 3.3.1 环境搭建
      • 3.3.2 接口定义
      • 3.3.3 降级类定义
    • 3.4 业务后端接口开发
      • 3.4.1 添加依赖
      • 3.4.2 修改启动类
      • 3.4.3 CartInfo
      • 3.4.4 CartController
      • 3.4.5 CartService
      • 3.4.6 修改配置文件
      • 3.4.7 服务网关配置
  • 4 购物车列表查询
    • 4.1 需求说明
    • 4.2 后端接口
      • 4.2.1 CartController
      • 4.2.2 CartService
  • 5 删除购物车商品
    • 5.1 需求说明
    • 5.2 后端接口
      • 5.2.1 CartController
      • 5.2.2 CartService
  • 6 更新选中商品状态
    • 6.1 需求说明
    • 6.2 后端接口
      • 6.2.1 CartController
      • 6.2.2 CartService
  • 7 完成购物车商品的全选
    • 7.1 需求说明
    • 7.2 后端接口
      • 7.2.1 CartController
      • 7.2.2 CartService
  • 8 清空购物车
    • 8.1 需求说明
    • 8.2 后端接口
      • 8.2.1 CartController
      • 8.2.2 CartService

购物车模块

1 需求说明

购物车模块存储顾客所选的的商品,记录下所选商品,当用户决定购买时,用户可以选择决定购买的商品进入结算页面。

购物车模块功能说明:

1、添加商品到购物车

2、查询购物车列表数据

3、删除购物车商品数据

4、更新选中商品状态

5、完成购物车商品的全选

6、清空购物车商品数据

数据存储:为了提高对购物车数据操作的性能,可以使用Redis【HASH】存储购物车数据。

页面效果:

在这里插入图片描述

2 环境搭建

创建一个独立模块(service-cart)来完成购物车的相关功能。

步骤如下:

1、在spzx-service模块下创建一个service-cart模块,并加入如下的依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies>

2、准备application.yml、application-dev.yml、logback-spring.xml文件。文件内容如下所示:

# application.yml
spring:profiles:active: dev# application-dev.yml
server:port: 8513spring:application:name: service-cartcloud:nacos:discovery:server-addr: 192.168.136.142:8848sentinel:transport:dashboard: localhost:8080data:redis:host: 192.168.136.142port: 6379password: 1234

logback-spring.xml修改输出路径:

<property name="log.path" value="D://work//service-cart//logs" />

3、创建启动类

// com.atguigu.spzx.cart;
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)  // 排除数据库的自动化配置,Cart微服务不需要访问数据库
public class CartApplication {public static void main(String[] args) {SpringApplication.run(CartApplication.class , args) ;}}

3 添加购物车

3.1 需求说明

需求如下所示:

1、商品详情页加入购物车

2、加入购物车必须登录

加入购物车功能如图所示:

在这里插入图片描述

查看接口文档:

添加购物车接口地址及返回结果

get api/order/cart/auth/addToCart/{skuId}/{skuNum}
返回结果:
{"code": 200,"message": "操作成功","data": null
}

注意:购物车页面加减商品数量与商品详情页加入购物车是同一个接口

请求响应流程如下所示:

在这里插入图片描述

3.2 远程调用接口开发

在service-product微服务中提供一个远程调用接口,根据skuId查询ProductSku数据,操作模块:service-product。

3.2.1 ProductController

表现层代码:

@Operation(summary = "获取商品sku信息")
@GetMapping("getBySkuId/{skuId}")
public Result<ProductSku> getBySkuId(@Parameter(name = "skuId", description = "商品skuId", required = true) @PathVariable Long skuId) {ProductSku productSku = productService.getBySkuId(skuId);return Result.build(productSku , ResultCodeEnum.SUCCESS) ;
}

3.2.2 ProductService

业务层代码实现:

//业务接口
ProductSku getBySkuId(Long skuId);//业务接口实现
@Override
public ProductSku getBySkuId(Long skuId) {return productSkuMapper.getById(skuId);
}

启动service-product微服务进行测试。

3.3 openFeign接口定义

3.3.1 环境搭建

步骤如下所示:

1、spzx-service-client模块创建:在spzx-parent下面创建该子模块spzx-service-client,并导入如下依赖:

<dependencies><dependency><groupId>com.atguigu.spzx</groupId><artifactId>common-util</artifactId><version>1.0-SNAPSHOT</version><scope>provided </scope></dependency><dependency><groupId>com.atguigu.spzx</groupId><artifactId>spzx-model</artifactId><version>1.0-SNAPSHOT</version><scope>provided </scope></dependency><!-- openfeign依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- loadbalancer依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies>

注意:删除src目录

2、service-product-client模块创建:在spzx-service-client下面创建该子模块

3.3.2 接口定义

在service-product-client定义针对service-product微服务的远程调用接口,如下所示:

// com.atguigu.spzx.feign.product;
@FeignClient(value = "service-product")
public interface ProductFeignClient {@GetMapping("/api/product/getBySkuId/{skuId}")public abstract Result<ProductSku>  getBySkuId(@PathVariable Long skuId) ;}

3.3.3 降级类定义

针对该远程调用接口提供一个降级类,一旦远程调用接口调用发生异常以后执行降级逻辑。

步骤:

1、定义一个类实现ProductFeignClient接口

// com.atguigu.spzx.feign.product.fallback
@Slf4j
public class ProductFeignClientFallback implements ProductFeignClient {@Overridepublic Result<ProductSku> getBySkuId(Long skuId) {log.info("ProductFeignClientFallback...getBySkuId的方法执行了");return Result.build(null , ResultCodeEnum.SUCCESS) ;}}

2、ProductFeignClient接口使用该降级类

@FeignClient(value = "service-product" , fallback = ProductFeignClientFallback.class)

3、将该接口通过Spring Boot的自动化配置原理,将其纳入到Spring容器中

在resources目录下创建一个MATE-INF/spring文件夹,在该文件夹下创建一个

org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,文件的中的内容如下所示:

com.atguigu.spzx.feign.product.fallback.ProductFeignClientFallback

3.4 业务后端接口开发

操作模块:service-cart

3.4.1 添加依赖

在service-cart微服务中添加service-product-client接口的依赖:

<dependency><groupId>com.atguigu.spzx</groupId><artifactId>service-product-client</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

3.4.2 修改启动类

在启动类上添加对应的注解

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableFeignClients(basePackages = {"com.atguigu.spzx.feign.product"
})
@EnableUserWebMvcConfiguration
public class CartApplication {public static void main(String[] args) {SpringApplication.run(CartApplication.class , args) ;}}

3.4.3 CartInfo

定义一个实体类来封装购物车中的商品数据(购物项数据),该实体类的定义依据:购物车列表页面需要展示的数据。如下所示:

// com.atguigu.spzx.model.entity.h5;
@Data
@Schema(description = "购物车实体类")
public class CartInfo extends BaseEntity {private static final long serialVersionUID = 1L;@Schema(description = "用户id")private Long userId;@Schema(description = "skuid")private Long skuId;@Schema(description = "放入购物车时价格")private BigDecimal cartPrice;@Schema(description = "数量")private Integer skuNum;@Schema(description = "图片文件")private String imgUrl;@Schema(description = "sku名称 (冗余)")private String skuName;@Schema(description = "isChecked")private Integer isChecked;}

3.4.4 CartController

表现层代码:

@Tag(name = "购物车接口")
@RestController
@RequestMapping("api/order/cart")
public class CartController {@Autowiredprivate CartService cartService;@Operation(summary = "添加购物车")@GetMapping("auth/addToCart/{skuId}/{skuNum}")public Result addToCart(@Parameter(name = "skuId", description = "商品skuId", required = true) @PathVariable("skuId") Long skuId,@Parameter(name = "skuNum", description = "数量", required = true) @PathVariable("skuNum") Integer skuNum) {cartService.addToCart(skuId, skuNum);return Result.build(null, ResultCodeEnum.SUCCESS);}
}

3.4.5 CartService

业务层代码实现:

//业务接口
public interface CartService {void addToCart(Long skuId, Integer skuNum);
}//业务接口实现
// com.atguigu.spzx.cart.service.impl;
import java.util.Date;//业务接口实现
@Service
public class CartServiceImpl implements CartService {@Autowiredprivate RedisTemplate<String , String> redisTemplate;@Autowiredprivate ProductFeignClient productFeignClient;private String getCartKey(Long userId) {//定义key user:cart:userIdreturn "user:cart:" + userId;}@Overridepublic void addToCart(Long skuId, Integer skuNum) {// 获取当前登录用户的idLong userId = AuthContextUtil.getUserInfo().getId();String cartKey = getCartKey(userId);//获取缓存对象Object cartInfoObj = redisTemplate.opsForHash().get(cartKey, String.valueOf(skuId));CartInfo cartInfo = null ;if(cartInfoObj != null) {       //  如果购物车中有该商品,则商品数量 相加!cartInfo = JSON.parseObject(cartInfoObj.toString() , CartInfo.class) ;cartInfo.setSkuNum(cartInfo.getSkuNum() + skuNum);cartInfo.setIsChecked(1);cartInfo.setUpdateTime(new Date());}else {// 当购物车中没用该商品的时候,则直接添加到购物车!cartInfo = new CartInfo();// 购物车数据是从商品详情得到 {skuInfo}ProductSku productSku = productFeignClient.getBySkuId(skuId).getData() ;cartInfo.setCartPrice(productSku.getSalePrice());cartInfo.setSkuNum(skuNum);cartInfo.setSkuId(skuId);cartInfo.setUserId(userId);cartInfo.setImgUrl(productSku.getThumbImg());cartInfo.setSkuName(productSku.getSkuName());cartInfo.setIsChecked(1);cartInfo.setCreateTime(new Date());cartInfo.setUpdateTime(new Date());}// 将商品数据存储到购物车中redisTemplate.opsForHash().put(cartKey , String.valueOf(skuId) , JSON.toJSONString(cartInfo));}}

3.4.6 修改配置文件

在配置文件application-dev.yml中添加如下配置,完成openFeign和sentinel的整合:

feign:sentinel:enabled: true

3.4.7 服务网关配置

在spzx-server-gateway微服务网关中配置service-cart微服务的路由规则:

spring:cloud:gateway:routes:- id: service-carturi: lb://service-cartpredicates:- Path=/api/order/cart/**

启动服务进行测试。

4 购物车列表查询

4.1 需求说明

当用户在商品详情页面点击购物车按钮的时候,那么此时就需要将当前登录用户的所对应的所有的购物车数据在购物车页面展出出来。如下图所示:

在这里插入图片描述

查看接口文档:

购物车列表接口地址及返回结果

get api/order/cart/auth/cartList
返回结果:
{"code": 200,"message": "操作成功","data": [{"id": null,"createTime": "2023-06-13 10:27:30","updateTime": "2023-06-13 11:21:23","isDeleted": null,"userId": 1,"skuId": 5,"cartPrice": 1999.00,"skuNum": 2,"imgUrl": "http://139.198.127.41:9000/spzx/20230525/665832167-1_u_1.jpg","skuName": "小米 红米Note10 5G手机 颜色:黑色 内存:8G","isChecked": 1},...]
}

4.2 后端接口

4.2.1 CartController

表现层代码:

@Operation(summary = "查询购物车")
@GetMapping("auth/cartList")
public Result<List<CartInfo>> cartList() {List<CartInfo> cartInfoList = cartService.getCartList();return Result.build(cartInfoList, ResultCodeEnum.SUCCESS);
}

4.2.2 CartService

业务层代码实现:

//业务接口
List<CartInfo> getCartList();//业务接口实现
@Override
public List<CartInfo> getCartList() {// 获取当前登录的用户信息Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = this.getCartKey(userId);// 获取数据List<Object> cartInfoList = redisTemplate.opsForHash().values(cartKey);if (!CollectionUtils.isEmpty(cartInfoList)) {List<CartInfo> infoList = cartInfoList.stream().map(cartInfoJSON -> JSON.parseObject(cartInfoJSON.toString(), CartInfo.class)).sorted((o1, o2) -> o2.getCreateTime().compareTo(o1.getCreateTime())).collect(Collectors.toList());return infoList ;}return new ArrayList<>() ;}

5 删除购物车商品

5.1 需求说明

删除功能如图所示:

在这里插入图片描述

查看接口文档:

删除购物车商品接口地址及返回结果

get api/order/cart/auth/deleteCart/{skuId}
返回结果:
{"code": 200,"message": "操作成功","data": null
}

5.2 后端接口

5.2.1 CartController

表现层代码:

@Operation(summary = "删除购物车商品")
@DeleteMapping("auth/deleteCart/{skuId}")
public Result deleteCart(@Parameter(name = "skuId", description = "商品skuId", required = true) @PathVariable("skuId") Long skuId) {cartService.deleteCart(skuId);return Result.build(null, ResultCodeEnum.SUCCESS);
}

5.2.2 CartService

业务层代码实现:

//业务接口
void deleteCart(Long skuId);//业务接口实现
@Override
public void deleteCart(Long skuId) {// 获取当前登录的用户数据Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = getCartKey(userId);//获取缓存对象redisTemplate.opsForHash().delete(cartKey  ,String.valueOf(skuId)) ;
}

6 更新选中商品状态

6.1 需求说明

更新选中商品状态功能如图所示:

在这里插入图片描述

查看接口文档:

更新选中商品状态接口地址及返回结果

get api/order/cart/auth/checkCart/{skuId}/{isChecked}
返回结果:
{"code": 200,"message": "操作成功","data": null
}

6.2 后端接口

6.2.1 CartController

表现层代码:

@Operation(summary="更新购物车商品选中状态")
@GetMapping("/auth/checkCart/{skuId}/{isChecked}")
public Result checkCart(@Parameter(name = "skuId", description = "商品skuId", required = true) @PathVariable(value = "skuId") Long skuId,@Parameter(name = "isChecked", description = "是否选中 1:选中 0:取消选中", required = true) @PathVariable(value = "isChecked") Integer isChecked) {cartService.checkCart(skuId, isChecked);return Result.build(null, ResultCodeEnum.SUCCESS);
}

6.2.2 CartService

业务层代码实现:

//业务接口
void checkCart(Long skuId, Integer isChecked);//业务接口实现
@Override
public void checkCart(Long skuId, Integer isChecked) {// 获取当前登录的用户数据Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = this.getCartKey(userId);Boolean hasKey = redisTemplate.opsForHash().hasKey(cartKey, String.valueOf(skuId));if(hasKey) {String cartInfoJSON = redisTemplate.opsForHash().get(cartKey, String.valueOf(skuId)).toString();CartInfo cartInfo = JSON.parseObject(cartInfoJSON, CartInfo.class);cartInfo.setIsChecked(isChecked);redisTemplate.opsForHash().put(cartKey , String.valueOf(skuId) , JSON.toJSONString(cartInfo));}}

7 完成购物车商品的全选

7.1 需求说明

更新购物车商品全部选中状态功能如图所示:

在这里插入图片描述

查看接口文档:

更新购物车商品全部选中状态接口地址及返回结果

get api/order/cart/auth/allCheckCart/{isChecked}
返回结果:
{"code": 200,"message": "操作成功","data": null
}

7.2 后端接口

7.2.1 CartController

表现层代码:

@Operation(summary="更新购物车商品全部选中状态")
@GetMapping("/auth/allCheckCart/{isChecked}")
public Result allCheckCart(@Parameter(name = "isChecked", description = "是否选中 1:选中 0:取消选中", required = true) @PathVariable(value = "isChecked") Integer isChecked){cartService.allCheckCart(isChecked);return Result.build(null, ResultCodeEnum.SUCCESS);
}

7.2.2 CartService

业务层代码实现:

//业务接口
void allCheckCart(Integer isChecked);//业务接口实现
public void allCheckCart(Integer isChecked) {// 获取当前登录的用户数据Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = getCartKey(userId);// 获取所有的购物项数据List<Object> objectList = redisTemplate.opsForHash().values(cartKey);if(!CollectionUtils.isEmpty(objectList)) {objectList.stream().map(cartInfoJSON -> {CartInfo cartInfo = JSON.parseObject(cartInfoJSON.toString(), CartInfo.class);cartInfo.setIsChecked(isChecked);return cartInfo ;}).forEach(cartInfo -> redisTemplate.opsForHash().put(cartKey , String.valueOf(cartInfo.getSkuId()) , JSON.toJSONString(cartInfo)));}
}

8 清空购物车

8.1 需求说明

清空购物车功能如图所示:

在这里插入图片描述

查看接口文档:

清空购物车接口地址及返回结果

get api/order/cart/auth/clearCart
返回结果:
{"code": 200,"message": "操作成功","data": null
}

8.2 后端接口

8.2.1 CartController

表现层代码:

@Operation(summary="清空购物车")
@GetMapping("/auth/clearCart")
public Result clearCart(){cartService.clearCart();return Result.build(null, ResultCodeEnum.SUCCESS);
}

8.2.2 CartService

业务层代码实现:

//业务接口
void clearCart();//业务接口实现
@Override
public void clearCart() {Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = getCartKey(userId);redisTemplate.delete(cartKey);
}

相关文章:

day16_购物车(添加购物车,购物车列表查询,删除购物车商品,更新选中商品状态,完成购物车商品的全选,清空购物车)

文章目录 购物车模块1 需求说明2 环境搭建3 添加购物车3.1 需求说明3.2 远程调用接口开发3.2.1 ProductController3.2.2 ProductService 3.3 openFeign接口定义3.3.1 环境搭建3.3.2 接口定义3.3.3 降级类定义 3.4 业务后端接口开发3.4.1 添加依赖3.4.2 修改启动类3.4.3 CartInf…...

基于Spring Boot的图书个性化推荐系统 ,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1765769136268455938...

libevent源码解析:定时器事件(三)

文章目录 前言一、用例小根堆管理定时器事件小根堆和链表管理定时器事件区别 二、基本数据结构介绍结构体成员分析小根堆和链表common_timeout图示 三、源码分析小根堆管理定时器事件event_newevent_addevent_dispatch 链表common_timeout管理定时器事件event_base_init_common…...

3D资产管理

3D 资产管理是指组织、跟踪、优化和分发 3D 模型和资产以用于游戏、电影、AR/VR 体验等各种应用的过程。 3D资产管理也称为3D内容管理。 随着游戏、电影、建筑、工程等行业中 3D 内容的增长&#xff0c;实施有效的资产管理工作流程对于提高生产力、减少错误、简化工作流程以及使…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Blank)

空白填充组件&#xff0c;在容器主轴方向上&#xff0c;空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column/Flex时生效。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件…...

【手游联运平台搭建】游戏平台的作用

随着科技的不断发展&#xff0c;游戏行业也在不断壮大&#xff0c;而游戏平台作为连接玩家与游戏的桥梁&#xff0c;发挥着越来越重要的作用。游戏平台不仅为玩家提供了便捷的游戏体验&#xff0c;还为游戏开发者提供了广阔的市场和推广渠道。本文将从多个方面探讨游戏平台的作…...

手把手教会你 - StreamAPI基本用法

1. 简介 目前响应式编程的学习中很多时候都用到了Lambda表达式和StreamAPI&#xff0c;那么今天就在这里记录一下一些最基本的使用方法。 StreamAPI中引入了流的概念&#xff0c;其将集合看作一种流&#xff0c;流在管道中传输&#xff08;动态的&#xff09;&#xff0c;可以…...

和为K的子数组

题目&#xff1a; 使用前缀和的方法可以解决这个问题&#xff0c;因为我们需要找到和为k的连续子数组的个数。通过计算前缀和&#xff0c;我们可以将问题转化为求解两个前缀和之差等于k的情况。 假设数组的前缀和数组为prefixSum&#xff0c;其中prefixSum[i]表示从数组起始位…...

Redis:java中redis的基本使用(springboot)

文章目录 springboot中使用redisspringboot 连接 redis三种方式导入依赖增删改查小练习 springboot中使用redis springboot 连接 redis三种方式 jedis &#xff08;redis官方提供的&#xff09;springboot自带的redisson (基于jedis优化的&#xff0c;性能最好&#xff0c;使…...

微型计算机技术

摘要&#xff1a;微型计算机是通用计算机的一个重要发展分支,自1981年美国IBM公司推出第一代商用微型计算机以来,微型计算机迅速进入社会各个领域,且技术不断更新、产品快速换代,已成为人们工作和生活中不可缺少的基本工具。 一、微型计算机技术发展历史 1.第一代微处理器(19…...

mysql下载教程

什么是mysql MySQL是一种开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现在由Oracle公司维护。MySQL支持多个操作系统&#xff0c;包括Linux、Windows、macOS等。它是一种客户端/服务器模式的数据库&#xff0c;提供高效、可靠、稳定的数据存储和…...

ResponseStatusException

目录 概述&#xff1a; 综合实例&#xff1a; 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…...

第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例

吴用说只有公孙胜可以破法术&#xff0c;于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经&#xff0c;于是到了二仙山&#xff0c;并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州&#xff0c;公孙胜说听师傅的。罗真人说出家人不管闲事&a…...

CSAPP-程序的机器级表示

文章目录 概念扫盲思想理解经典好图安全事件 概念扫盲 1.汇编代码使用文本格式&#xff0c;相较于汇编的二进制可读性更好 2.程序内存包括&#xff1a;可执行的机器代码、操作系统需要的信息、管理过程调用和返回的运行时栈、用户分配的内存块 3.链接器为函数调用找到匹配的可…...

TCP传输收发

TCP通信: TCP发端: socket connect send recv close TCP收端: socket bind listen accept send recv close 1.connect int connect(int sockfd, const struct sockaddr *addr, socklen_t ad…...

OJ习题之——圆括号编码

圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码&#xff1a; &#xff08;1&#xff09;用一个整数序列Pp1 p2 … pn编码&#xff0c;pi代表在S中第i个右圆括号的左圆括号数量。&#xff08;记为…...

Android耗电分析之Battery Historian工具使用

Battery-Historian是谷歌推出的一款专门分析Bugreport的工具&#xff0c;是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具&#xff0c;是一款对于分析手机状态&#xff0c;历史运行情况很好的可视化分析工具。 …...

vue el-avatar 使用require提示无法找到图片

报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案...

深入理解 C# 中的 Task:异步编程的利器

深入理解 C# 中的 Task&#xff1a;异步编程的利器 前言一、Task 的基本概念什么是 Task&#xff1f;为什么要使用 Task&#xff1f; Task 的使用方法创建 Task等待 Task 完成Task 返回结果 Task 的进阶用法Task 异常处理Task 同步执行Task 并发限制 Task 的实际应用场景并行计…...

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来&#xff0c;已经在目标检测领域取得了显著的进展&#xff0c;以其快速和准确的特点而广受欢迎。 论文地址&#xf…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...