Java阶段五Day14

Java阶段五Day14

文章目录

  • Java阶段五Day14
    • 分布式事务
    • 整合demo案例中
        • 架构,代码关系
        • 发送半消息
        • 本地事务
        • 完成检查补偿
        • 购物车消费
    • 鲁班周边环境调整
      • 前端启动
        • 介绍
        • 启动前端
      • 直接启动的项目
        • gateway(网关)
        • login(登录注册)
        • attach(上传图片)
    • 分层开发和整洁架构
      • 分层开发(横向拆分)
      • 整洁架构
      • 整洁架构落地方案
      • 搭建worker项目架构
        • 顶级夫工程继承操作
        • 创建项目架构
        • 根据分层架构依赖关系,搭建创建8个模块
  • 附录
    • maven加载私服无法下载
    • 前端启动问题
    • mac运行passport
    • jar运行节省内存问题
    • 连接mysql失败
    • 演示项目和本地项目
    • 注册失败

分布式事务

整合demo案例中

架构,代码关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdBk2Jaz-1690455046510)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726091349572.png)]

发送半消息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nm1pGMCX-1690455046511)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726101954347.png)]

OrderServiceImpl

package cn.tedu.csmall.all.adapter.service.impl;import cn.tedu.csmall.all.adapter.mapper.OrderMapper;
import cn.tedu.csmall.all.service.ICartService;
import cn.tedu.csmall.all.service.IOrderService;
import cn.tedu.csmall.all.service.IStockService;
import cn.tedu.csmall.commons.exception.CoolSharkServiceException;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.pojo.order.entity.Order;
import cn.tedu.csmall.commons.pojo.stock.dto.StockReduceCountDTO;
import cn.tedu.csmall.commons.restful.JsonPage;
import cn.tedu.csmall.commons.restful.ResponseCode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import java.util.List;
import java.util.Map;import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;// order模块是具备生产者特征的,它会被business模块调用,所以也要加@DubboService注解
@DubboService(loadbalance = "random")
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {@Autowiredprivate OrderMapper orderMapper;/*** 防止消息异步消费逻辑中,重复消费的问题,业务方法* 设计成幂等的* @param orderAddDTO*/@Autowiredprivate RocketMQTemplate rocketMQTemplate;@Overridepublic void orderAdd(OrderAddDTO orderAddDTO) {int count=orderMapper.selectExists(orderAddDTO);if (count>0){log.debug("订单已经新增了");return;}//发送一个半消息,消息如果发送成功,是给购物车用的//只要包含当前订单用户,的订单商品是什么 消息特点精简准确//消息不仅只有消费者在使用,还有本地事务,和检查事务的方法都在使用//主要考虑check检查,如果消息本身携带的内容不足以支持检查逻辑//需要想办法携带更多信息String msgData=orderAddDTO.getUserId()+":"+orderAddDTO.getCommodityCode();Message message= MessageBuilder.withPayload(msgData).setHeader("name","王翠花").setHeader("orderId","1").build();//object参数表示业务数据,当前业务逻辑 减库存生单rocketMQTemplate.sendMessageInTransaction("order-add-topic",message,orderAddDTO);}// 分页查询所有订单的业务逻辑层方法// page是页码,pageSize是每页条数public JsonPage<Order> getAllOrdersByPage(Integer page, Integer pageSize){// PageHelper框架实现分页的核心操作:// 在要执行分页的查询运行之前,设置分页的条件// 设置的方式如下(固定的格式,PageHelper框架设计的)// PageHelper设置page为1就是查询第一页PageHelper.startPage(page,pageSize);// 下面开始持久层方法的调用// 此方法运行时因为上面设置了分页条件,sql语句中会自动出现limit关键字List<Order> list = orderMapper.findAllOrders();// 查询结果list中包含的就是分页查询范围的数据了// 但是这个数据不包含分页信息(总页数,总条数,是否是首页,是否是末页等)// 我们要利用PageHelper框架提供的PageInfo类型,来进行返回// PageInfo对象可以既包含分页数据,又包含分页信息// 这些信息会在PageInfo对象实例化时自动计算,并赋值到PageInfo对象中return JsonPage.restPage(new PageInfo<>(list));}
}

本地事务

本地事务方法调用顺序,在发送半消息之后执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fd3jWta4-1690455046512)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726102124502.png)]

OrderAddTransactionListener

package cn.tedu.csmall.all.adapter.transaction;import cn.tedu.csmall.all.adapter.mapper.OrderMapper;
import cn.tedu.csmall.all.service.IStockService;
import cn.tedu.csmall.commons.exception.CoolSharkServiceException;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.pojo.order.entity.Order;
import cn.tedu.csmall.commons.pojo.stock.dto.StockReduceCountDTO;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;/*** @author liner* @version 1.0*/
@Component
@RocketMQTransactionListener
public class OrderAddTransactionListener implements RocketMQLocalTransactionListener {@DubboReferenceprivate IStockService stockService;@Autowiredprivate OrderMapper orderMapper;/*** 1.减库存* 1.1 减成功 进入第二步生单* 1.2 减失败 rollback* 2.生单* 2.1 生单成功 commit* 2.2 生单失败 补偿库存 unkonwn* 其他异常问题 unknown* @param message userId":"commodityCode* @param o OrderAddDTO* @return*/@Overridepublic RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {OrderAddDTO orderAddDTO=(OrderAddDTO)o;try{StockReduceCountDTO countDTO=new StockReduceCountDTO();countDTO.setCommodityCode(orderAddDTO.getCommodityCode());countDTO.setReduceCount(orderAddDTO.getCount());// 利用Dubbo调用stock模块减少库存的业务逻辑层方法实现功能stockService.reduceCommodityCount(countDTO);}catch (CoolSharkServiceException e){//返回rollbackreturn RocketMQLocalTransactionState.ROLLBACK;}catch (Throwable e){//返回unknownreturn RocketMQLocalTransactionState.UNKNOWN;}try{Order order=new Order();BeanUtils.copyProperties(orderAddDTO,order);orderMapper.insertOrder(order);}catch (Exception e){return RocketMQLocalTransactionState.UNKNOWN;}return RocketMQLocalTransactionState.COMMIT;}/*** 1. 检查订单是否成功.* 1.1 成功 commit* 1.2 没有成功 进入第2步* 2. 库存对当前订单是否已经减成功* 2.1 减成功,回退 第3步* 2.2 没减成功 rollback* 3.回退库存* 3.1 可能失败 unknown* 3.2 回退成功 rollback* @param message* @return*/@Overridepublic RocketMQLocalTransactionState checkLocalTransaction(Message message) {return null;}
}

完成检查补偿

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFIooeTp-1690455046513)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726105258826.png)]

利用检查补偿的方法,画的业务流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2dRz3mU-1690455046514)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726095854801.png)]

OrderAddTransactionListener

@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message message) {//状态不明确,回调check方法,检查库存是否减少,检查订单是否生成String userIdAndCommodityCode = (String) message.getPayload();Object name = message.getHeaders().get("name");Object orderId = message.getHeaders().get("orderId");String userId=userIdAndCommodityCode.split(":")[0];String commodityCode=userIdAndCommodityCode.split(":")[1];OrderAddDTO orderAddDTO=new OrderAddDTO();orderAddDTO.setUserId(userId);orderAddDTO.setCommodityCode(commodityCode);int exist = orderMapper.selectExists(orderAddDTO);if (exist>0){//当前检查的这个订单已经生成,说明库存肯定减了return RocketMQLocalTransactionState.COMMIT;}//存在一个库存的日志表格,记录减库存的日志数据//通过传递订单信息,查询日志,如果减了就回退,如果没减,没有操作//返回给调用者检查结果是成功还是失败try{stockService.checkStockData();}catch (CoolSharkServiceException e){//没有库存减少的日志 没有任何减库存的操作return RocketMQLocalTransactionState.ROLLBACK;}//补偿回退 TODOtry{//补偿System.out.println("订单没有生成.库存减少了,开始补偿");}catch (Exception e){//补偿失败return RocketMQLocalTransactionState.UNKNOWN;}return RocketMQLocalTransactionState.ROLLBACK;
}

购物车消费

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5fqhTpPV-1690455046514)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726110333112.png)]

购物车整合rocketmq

购物车编写消费逻辑

package cn.tedu.csmall.all.adapter.consumer;import cn.tedu.csmall.all.service.ICartService;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ScopeMetadata;
import org.springframework.stereotype.Component;/*** @author liner* @version 1.0*/
@Component
@RocketMQMessageListener(topic="order-add-topic",consumerGroup = "${rocketmq.consumer.group}",selectorExpression = "*")
public class CartDeleteConsumerListener implements RocketMQListener<String> {@Autowiredprivate ICartService cartService;@Overridepublic void onMessage(String msg) {String userId=msg.split(":")[0];String commodityCode=msg.split(":")[1];//删除购物车cartService.deleteUserCart(userId, commodityCode);}
}

鲁班周边环境调整

前端启动

介绍

  • luban-front 前台

前台主要是给师傅用的

师傅抢单

签到 / 上传施工图片 / 完成订单

  • luban-admin-front

后台是管理用的

需求单

厂商 / 供应商 入住

启动前端

node.js版本是 16 X 保证能运行

  • luban-admin-front

启动顺序

1. npm install
2. npm run dev
  • luban-front

启动顺序

1. npm install
2. npm run dev:h5

直接启动的项目

gateway(网关)

  • 只需要nacos运行,默认连接localhost:8848 public DEFAULT_GROUP

login(登录注册)

  • 导入登录的数据库表格

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lU69rT3q-1690455046516)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726120328551.png)]

  • 本地有redis(略)
  • nacos localhost:8848(略)
  • 运行bat文件 / sh文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ug8LGhP8-1690455046516)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726120401051.png)]

通过 idea 配置 bat / sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQ1Q3j0H-1690455046517)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726120746467.png)]

attach(上传图片)

  • 文件上传路径,和访问的关系

图片上传关系到鲁班中许多功能的业务流转

spring.resources.static-lcations:上传图片存放的路径,也是访问这个项目静态资源的路径

spring.mvc.static-path-pattern:访问attach服务时,匹配静态资源的规则

例如:

E:/home/images/dev/attach/haha.txt

E:/home/images/dev/attach/123456.png

attach 启动默认运行端口8092

http://localhost:8092/static/123456.png

http://localhost:8092/static/a/b/c/d/1.png

E:/home/images/dev/attach/a/b/c/d/1.png

  • 导入数据库 sql 文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5jdnqzxB-1690455046518)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726144214786.png)]

分层开发和整洁架构

目标

  • 了解分层开发的概念
  • 理解分层开发实现结构的功能
  • 落地整洁架构最终鲁班的项目

概念:纵向拆分(横向拆分)

分层开发(横向拆分)

分层开发的概念:

maven 多模块开发项目管理

可以利用这种管理功能,实现一个项目的多层次模块开发——分层开发

比如,当前项目HelloController依赖HelloService

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DsZNHtGm-1690455046518)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726154642544.png)]

这样做目的: 复杂开发过程,解耦(不调整依赖关系,无法解耦)

分层开发(横向拆分)和纵向拆分的区别在于,拆出多层,最终运行也是一个项目

整洁架构

《代码整洁之道》作者Bob大叔曾经说过

翻译过来:

程序架构总是一样的

让程序运行很简单

让程序"正确"很难

让程序维护简单,扩展简单就是正确

controller--service-mapper 为例,按照直觉分层开发,做依赖关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSmv44UR-1690455046519)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726155318229.png)]

问题1: 没有实现控制层,对持久层之间的隔离关系,可以随意的在controller中注入,依赖mapper

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEz3EYka-1690455046519)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726155454560.png)]

问题2:架构分层之间是纯粹强耦合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G8csk1T3-1690455046519)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726155940348.png)]

分层开发没有达到最终的目的,实现解耦,实现扩展维护方便

对应以上问题,在bob大叔的 《整洁架构之道》中,提到的解决的思想

整洁架构落地方案

核心点: 分层的众多模块中,有最核心的业务模块(service)

其他的模块,包括controllerredisrocketmqmysqlmybatis这些模块切分出来,都是容易被替换掉的

核心稳定的模块,如果依赖了容易变动不稳定模块,不满足整洁架构的思想

解决方案: 依赖倒置(开发原则)

是程序要依赖于抽象接口,不要依赖于具体实现*

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZlRdeyK-1690455046520)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726163617995.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpmckijC-1690455046520)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726170145510.png)]

  • 分层数据封装
    • 入参(接收的参数)
      • query: 查询使用
      • param:写入使用(持久层写入转化成DO)
      • 远程调用:DTO
    • 出参(返回值)
      • service出参:BO
      • infrustructure出参: BO
      • dao出参:DO
      • adapter出参:VO
      • 远程调用: DTO

搭建worker项目架构

顶级夫工程继承操作

继承私服的父级项目tarena-mall-bom

创建项目架构

  • worker-admin:后台后端
  • worker-common(代码和依赖):worker公用
  • worker-po(代码和依赖):包含的内容就是 worker 所有数据库 entity 对象
  • worker-server:前台后端

根据分层架构依赖关系,搭建创建8个模块

worker-server

- adapter
- main
- client-api
- infrustructure
- dao-api
- dao-impl
- daomain
- protocol

附录

maven加载私服无法下载

现象: 拒绝连接远程私服,settings配置的

关键字: http://0.0.0.0 blocked

原因: idea默认的 maven 中settings.xml配置,禁止使用 http 协议访问私服

解决方法: 拦截删除

  • 使用一个正常的 maven项目 执行mvn clean compile -X

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1AX0cgx7-1690455046521)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726140429152.png)]

  • 进入文件夹,修改内容,将mirror(不是mirrors)注释或者删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lH0wOXih-1690455046521)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726140753674.png)]

前端启动问题

现象: npm install 报错 npm run 报错

原因:

  • 命令执行错了

  • 网络不通畅

  • node.js(16.X) npm(8.5)版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7Ivg2qq-1690455046521)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726141050521.png)]

mac运行passport

现象: 无法运行java -jar命令

原因: 代码内配置属性,不是针对mac设置的

解决方案:

master 提交了新版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WwC8Am7l-1690455046522)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726141215418.png)]

jar运行节省内存问题

可以在java -jar命令中添加选项,限制内存上限

128m 参数:

java -jar ***.jar -Xmx128M -Xms128M -XX:MaxMetaspaceSize=128M -XX:MetaspaceSize=128M

idea跑的 java 程序能加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BXUyWpmh-1690455046522)(E:/TeduWork/notes-2303/%25E8%25AF%25BE%25E5%25A0%2582%25E7%25AC%2594%25E8%25AE%25B0/Day14/assets/image-20230726142040993.png)]

连接mysql失败

现象: Access to "root@localhost:3306" denied

原因: 你的数据库 密码用户名 不是root root

解决方案: 运行passport.jar 默认使用root / root 需要覆盖 jar 内的springboot项目代码配置文件application.yaml

java -jar passport-provider-1.0-SNAPSHOT.jar -Xmx128M -Xms128M -XX:MaxMetaspaceSize=128M -XX:MetaspaceSize=128M --server.port=8099 --spring.profiles.active=local –spring.datasource.password=root

演示项目和本地项目

现象:

http://dev.front.luban.p.yufeiworld.com/

http://localhost:8989

访问演示页面测试本地代码功能

注册失败

现象: insert 语句中缺少 avator字段

关键字: unknown column 'avator'

原因: 导入的不是commont-passport.sql 而是common_passort.sql

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nmuADt0b-1690455046522)(assets/image-20230726161929264.png)]

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

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

相关文章

网络请求fetch

fetch()是 XMLHttpRequest 的升级版&#xff0c;用于在 JavaScript 脚本里面发出 HTTP 请求。浏览器原生提供这个对象 fetch()的功能与 XMLHttpRequest 基本相同&#xff0c;但有三个主要的差异。 与 Ajax 类似&#xff0c;Fetch 也是前后端通信的一种方式。Fetch 要比 Ajax …

React Flow

// 创建项目 npm create vitelatest my-react-flow-app -- --template react // 安装插件 npm install reactflow npm install antd // 运行项目 npm run dev 1、App.jsx import { useCallback, useState } from react; import ReactFlow, {addEdge,ReactFlowProvider,MiniMap…

享元模式——实现对象的复用

1、简介 1.1、概述 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。例如&#xff0c;在一个文本字符串中存在很多重复的字符&#xff0c;如果每个字符都用一个单独的对象来表示&#xff0c;将会占用较多的内存…

39.手机导航

手机导航 html部分 <div class"phone"><div class"content"><img class"active" src"./static/20180529205331_yhGyf.jpeg" alt"" srcset""><img src"./static/20190214214253_hsjqw…

【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

测试|自动化测试(了解)

测试|自动化测试&#xff08;了解&#xff09; 1.什么是自动化测试☆☆☆☆ 自动化测试相当于把人工测试手段进行转换&#xff0c;让代码执行。 2.自动化测试的分类☆☆☆☆ 注&#xff1a;这里只是常见的自动化测试&#xff0c;并不全部罗列。 1.单元自动化测试 其中Java…

嵌入式硬件系统的基本组成

嵌入式硬件系统的基本组成 嵌入式系统的硬件是以包含嵌入式微处理器的SOC为核心&#xff0c;主要由SOC、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 每个嵌入式系统至少包含一个嵌入式微处理器 嵌入式微处理器体系结构可采用冯.诺依曼&#xff08;Von Neumann&…

前后端分离实现博客系统

文章目录 博客系统前言1. 前端1.1 登陆页面1.2 博客列表页面1.3 博客详情页面1.4 博客编辑页面 2. 后端2.1 项目部署2.1.1 创建maven项目2.1.2 引入依赖2.1.3 创建目录结构2.1.4 部署程序 2.2 逻辑设计2.2.1 数据库设计2.2.2 实体类设计2.2.3 Dao层设计2.2.3.1 BlogDao 2.2.4 D…

qt添加图标

1.添加资源 选择QtWidgetsApp.qrc文件打开 添加图标文件路径 添加图标文件 2.按钮添加图标 图标路径为:/res/res/swicth.jpg &#xff08;1&#xff09;代码设置图标 ui.pushButton_OPen->setIcon(QIcon(":/res/res/swicth.jpg")); &#xff08;2&#xff09;属…

apple pencil到底值不值得买?好用的iPad电容笔

随着ipad平板型号版本的不断更新&#xff0c;其的功能越来越多&#xff0c;现在它的性能已经可以和笔记本电脑相媲美了。而现在&#xff0c;随着技术的进步&#xff0c;IPAD已经不再是单纯的娱乐&#xff0c;而是一种功能强大的学习、绘画、工作等等。要增加生产效率&#xff0…

【数据结构与算法】归并排序

归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治&#xff08;divide-and-conquer&#xff09;策略&#xff08;分治法将问题分&#xff08;divide&#xff09;成一些小的问题然后递归求解&#xff0c;而…

stm32内存杂记

从上图中可以看出SRAM空间用来存放&#xff1a;1.各个文件中声明和定义的全局变量、静态数据和常量&#xff1b;2.未初始化的全局变量&#xff1b;3.HEAP区&#xff1b;4.STACK区 这是在.map文件中&#xff0c;双击工程target打开 堆栈是处于以0x2000xx地址处的 EQU伪代码&…

学C的第三十一天【通讯录的实现】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十天【自定义类型&#xff1a;结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求&#xff1a; 实现一个通讯录&#xff0c; 通讯录中存放保存人的信息&#xff1…

华为鸿蒙4本周发布:官方海报大有玄机!告别“人工智障”!

一年一度的华为开发者大会2023(HDC.Together)将于8月4日至8月6日在东莞松山湖举办。相比去年&#xff0c;今年的华为开发者大会足足提前了三个月&#xff0c;而本次大会主角之一无疑是全新国产操作系统鸿蒙4&#xff08;HarmonyOS 4&#xff09;。 官方之前用了三个词来形容鸿蒙…

C#文件操作从入门到精通(1)——INI文件操作

点击这里:微软官方文档查看writePrivateProfileString函数定义 常见错误: 1、中文路径写入失败,为啥? 2、文件不是全路径,只有文件名也会写入失败: 3、GetLastError怎么使用? GetLastError错误代码含义: (0)-操作成功完成。 (1)-功能错误。 (2)- 系统找不到指定的文件…

3个命令定位CPU飙高

top 指令找出消耗CPU最厉害的那个进程的pid top -H -p 进程pid 找出耗用CPU资源最多的线程pid printf ‘0x%x\n’ 线程pid 将线程pid转换为16进制 结合jstack 找出哪个代码有问题 jstack 进程pid | grep 16进制的线程pid -A 多少行日志 jstack 进程pid | grep 16进制的线程…

C语言指针进阶-1

本篇文章带来 1. 字符指针 2. 数组指针 3. 指针数组的相关知识详细讲解&#xff01; 如果您觉得文章不错&#xff0c;期待你的一键三连哦&#xff0c;你的鼓励是我创作的动力之源&#xff0c;让我们一起加油&#xff0c;一起奔跑&#xff0c;让我们顶峰相见&#xff01;&#…

04 http连接处理(上)

基础知识&#xff1a;epoll、http报文格式、状态码和有限状态机 代码&#xff1a;对服务端处理http请求的全部流程进行简要介绍&#xff0c;然后结合代码对http类及请求接收进行详细分析。 epoll epoll_create函数 #include <sys/epoll.h> int epoll_create(int size)…

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂&#xff0c;学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…

【计算机网络】408统考2014年题36

题目描述 【2014年题36】主机甲与主机乙之间使用后退N帧(GBN)协议传输数据&#xff0c;甲的发送窗口尺寸为1000&#xff0c;数据帧长为1000字节&#xff0c;信道带宽为100Mbps&#xff0c;乙每收到一个数据帧就立即利用一个短帧&#xff08;忽略其传输延迟&#xff09;进行确认…