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的图书个性化推荐系统 ,计算机毕业设计(带源码+论文)
源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流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 内容的增长,实施有效的资产管理工作流程对于提高生产力、减少错误、简化工作流程以及使…...
鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Blank)
空白填充组件,在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column/Flex时生效。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件…...
【手游联运平台搭建】游戏平台的作用
随着科技的不断发展,游戏行业也在不断壮大,而游戏平台作为连接玩家与游戏的桥梁,发挥着越来越重要的作用。游戏平台不仅为玩家提供了便捷的游戏体验,还为游戏开发者提供了广阔的市场和推广渠道。本文将从多个方面探讨游戏平台的作…...
手把手教会你 - StreamAPI基本用法
1. 简介 目前响应式编程的学习中很多时候都用到了Lambda表达式和StreamAPI,那么今天就在这里记录一下一些最基本的使用方法。 StreamAPI中引入了流的概念,其将集合看作一种流,流在管道中传输(动态的),可以…...
和为K的子数组
题目: 使用前缀和的方法可以解决这个问题,因为我们需要找到和为k的连续子数组的个数。通过计算前缀和,我们可以将问题转化为求解两个前缀和之差等于k的情况。 假设数组的前缀和数组为prefixSum,其中prefixSum[i]表示从数组起始位…...
Redis:java中redis的基本使用(springboot)
文章目录 springboot中使用redisspringboot 连接 redis三种方式导入依赖增删改查小练习 springboot中使用redis springboot 连接 redis三种方式 jedis (redis官方提供的)springboot自带的redisson (基于jedis优化的,性能最好,使…...
微型计算机技术
摘要:微型计算机是通用计算机的一个重要发展分支,自1981年美国IBM公司推出第一代商用微型计算机以来,微型计算机迅速进入社会各个领域,且技术不断更新、产品快速换代,已成为人们工作和生活中不可缺少的基本工具。 一、微型计算机技术发展历史 1.第一代微处理器(19…...
mysql下载教程
什么是mysql MySQL是一种开源的关系型数据库管理系统,由瑞典MySQL AB公司开发,现在由Oracle公司维护。MySQL支持多个操作系统,包括Linux、Windows、macOS等。它是一种客户端/服务器模式的数据库,提供高效、可靠、稳定的数据存储和…...
ResponseStatusException
目录 概述: 综合实例: 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…...
第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例
吴用说只有公孙胜可以破法术,于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经,于是到了二仙山,并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州,公孙胜说听师傅的。罗真人说出家人不管闲事&a…...
CSAPP-程序的机器级表示
文章目录 概念扫盲思想理解经典好图安全事件 概念扫盲 1.汇编代码使用文本格式,相较于汇编的二进制可读性更好 2.程序内存包括:可执行的机器代码、操作系统需要的信息、管理过程调用和返回的运行时栈、用户分配的内存块 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种不同形式编码: (1)用一个整数序列Pp1 p2 … pn编码,pi代表在S中第i个右圆括号的左圆括号数量。(记为…...
Android耗电分析之Battery Historian工具使用
Battery-Historian是谷歌推出的一款专门分析Bugreport的工具,是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具,是一款对于分析手机状态,历史运行情况很好的可视化分析工具。 …...
vue el-avatar 使用require提示无法找到图片
报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案...
深入理解 C# 中的 Task:异步编程的利器
深入理解 C# 中的 Task:异步编程的利器 前言一、Task 的基本概念什么是 Task?为什么要使用 Task? Task 的使用方法创建 Task等待 Task 完成Task 返回结果 Task 的进阶用法Task 异常处理Task 同步执行Task 并发限制 Task 的实际应用场景并行计…...
YOLOv9电动车头盔佩戴检测,详细讲解模型训练
向AI转型的程序员都关注了这个号👇👇👇 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来,已经在目标检测领域取得了显著的进展,以其快速和准确的特点而广受欢迎。 论文地址…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
docker容器互联
1.docker可以通过网路访问 2.docker允许映射容器内应用的服务端口到本地宿主主机 3.互联机制实现多个容器间通过容器名来快速访问 一 、端口映射实现容器访问 1.从外部访问容器应用 我们先把之前的删掉吧(如果不删的话,容器就提不起来,因…...
c++算法学习3——深度优先搜索
一、深度优先搜索的核心概念 DFS算法是一种通过递归或栈实现的"一条路走到底"的搜索策略,其核心思想是: 深度优先:从起点出发,选择一个方向探索到底,直到无路可走 回溯机制:遇到死路时返回最近…...
成工fpga(知识星球号)——精品来袭
(如需要相关的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!) 《孩子都能学会的FPGA》系列是成工完成的第一个系列,也有一年多的时…...
ai流式文字返回前端和php的处理办法
PHP后端 php端主要是用到ob_flush和flush,头改为流式。 基本代码 代码如下: <?php header(Content-Type:text/event-stream); header(Cache-Control:no-cache); header(Connection:keep-alive);function streamPostRequest($url,$data){$chcurl_…...
【人工智能 | 项目开发】Python Flask实现本地AI大模型可视化界面
文末获取项目源码。 文章目录 项目背景项目结构app.py(后端服务)index.html(前端界面)项目运行项目图示项目源码项目背景 随着人工智能技术的快速发展,大语言模型在智能交互领域展现出巨大潜力。本项目基于 Qwen3-1.7B 模型,搭建一个轻量化的智能聊天助手,旨在为用户提…...
