Java阶段五Day14

news2024/11/15 20:11:33

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 {
    @Autowired
    private OrderMapper orderMapper;
    /**
     * 防止消息异步消费逻辑中,重复消费的问题,业务方法
     * 设计成幂等的
     * @param orderAddDTO
     */
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    @Override
    public 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 {
    @DubboReference
    private IStockService stockService;
    @Autowired
    private OrderMapper orderMapper;

    /**
     * 1.减库存
     * 1.1 减成功 进入第二步生单
     * 1.2 减失败 rollback
     * 2.生单
     * 2.1 生单成功 commit
     * 2.2 生单失败 补偿库存 unkonwn
     * 其他异常问题 unknown
     * @param message userId":"commodityCode
     * @param o OrderAddDTO
     * @return
     */
    @Override
    public 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){
            //返回rollback
            return RocketMQLocalTransactionState.ROLLBACK;
        }catch (Throwable e){
            //返回unknown
            return 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
     */
    @Override
    public 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;
    }
    //补偿回退 TODO
    try{
        //补偿
        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> {
    @Autowired
    private ICartService cartService;
    @Override
    public 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.coloradmin.cn/o/798436.html

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

相关文章

DSA之图(4):图的应用

文章目录 0 图的应用1 生成树1.1 无向图的生成树1.2 最小生成树1.2.1 构造最小生成树1.2.2 Prim算法构造最小生成树1.2.3 Kruskal算法构造最小生成树1.2.4 两种算法的比较 1.3 最短路径1.3.1 两点间最短路径1.3.2 某源点到其他各点最短路径1.3.3 Dijkstra1.3.4 Floyd 1.4 拓扑排…

数据库表结构导出成文档

1.需求说明 在系统交付的过程中&#xff0c;有时候需要交付数据库的表结构&#xff0c;如果系统做的比较大&#xff0c;比如几百张表的时候&#xff0c;靠人力一张表一张的写&#xff0c;那就是一个奔溃啊。所以今天特意找了一下工具&#xff0c;小巧安装。比较好用。 2.安装…

新型恶意软件DecoyDog正大规模入侵DNS

安全厂商 Infoblox 的调查研究显示&#xff0c;一个名为 DecoyDog&#xff08;诱饵狗&#xff09;的复杂恶意工具包通过域名系统&#xff08;DNS&#xff09;&#xff0c;从事网络间谍活动已达1年以上。 目前尚不清楚该恶意软件的幕后黑手是谁&#xff0c;但 Infoblox 的研究人…

通过REST API接口上传Nexus仓库

一、Nexus API文档 API文档链接&#xff1a;Components API 二、上传API接口说明 在Nexus中可以直接调试api接口&#xff0c;url参考&#xff1a;http://localhost:8081/#admin/system/api 三、上传请求案例 $ curl -X POST "http://localhost:8081/service/rest/v1/c…

营销系统积分数据库设计

营销系统总体数据-业务功能模型 在当今日益竞争的市场中&#xff0c;如何提高客户留存率和忠诚度&#xff0c;已成为各大企业迫切需要解决的问题。而积分商城/系统作为一种新型的营销方式&#xff0c;受到青睐。 积分商城/系统是指将用户在使用产品或服务时产生的积分&#xf…

2023扩散模型最新技术进展汇总

随着Stable Diffusion和Midjourney等图像生成模型的爆火&#xff0c;今年在模型领域&#xff0c;扩散模型稳占主导地位。因此&#xff0c;与之相关的新技术也层出不穷&#xff0c;短短1个月&#xff0c;扩散模型相关的论文就有上百篇了&#xff0c;可见其发展的火热趋势。 这次…

java注解@FeignClient修饰的类路径不在spring boot入口类所在的包下,有哪几种处理方式?

一、注解EnableFeignClients 修饰在spring boot入口类&#xff0c;使得openfeign的FeignClient注解生效。 我们进一步看看注解EnableFeignClients的使用方式。 String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] clie…

额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

1365 暴力解法也能过 class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> result(nums.size(), 0);for (int i0; i<nums.size(); i) {int count 0;for (int j0; j<nums.size(); j) {if (nums[j]<…

互联网时代,企业经营管理面临的挑战有哪些?

随着科学技术的进步和社会经济的发展&#xff0c;大数据已经被应用到各个行业领域中&#xff0c;尤其在企业经营管理方面。通过对企业内部数据信息的利用&#xff0c;企业内部经营管理能力得到提升&#xff0c;那么在大数据时代&#xff0c;企业经营管理面临的挑战有哪些呢&…

C/C++几个关键知识点记录

1.将一个数值作为函数执行 (*(void(*)())0x13)();同理也可以将数值换成一个变量&#xff1a; int var0x13; (*(void(*)())var)();2.断言assert 用于判断输入的参数是否正确&#xff0c;实际就是判断输入的参数是否为0&#xff0c;如STM32的固件库中常用的assert_param()&…

Ceph入门到精通- Linux 磁盘管理(block 与 inode)

1 硬盘 block 与 inode 详解 1.1 Sector&#xff08;扇区&#xff09;与 Block&#xff08;块&#xff09; 1&#xff09; 硬盘的最小存储单位&#xff1a;sector&#xff08;扇区&#xff09;&#xff0c;每个扇区储存 512 字节&#xff1b;操作系统会一次性连续读取多个…

抖音短视频seo矩阵系统源码开发部署技术分享

抖音短视频的SEO矩阵系统是一个非常重要的部分&#xff0c;它可以帮助视频更好地被搜索引擎识别和推荐。以下是一些关于开发和部署抖音短视频SEO矩阵系统的技术分享&#xff1a; 一、 抖音短视频SEO矩阵系统的技术分享&#xff1a; 关键词研究&#xff1a;在开发抖音短视频SEO矩…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头。

✍️作者简介&#xff1a;沫小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北 CSDN、51cto博客、稀土掘金、简书、知乎、开源中国、博客园、慕课网 &#x1f310;系列专栏&#xff1a;码农小北 &#x1f514;如果文…

防止连点..

1.连点js文件 let timer; letflag /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次** param {Function} func 要执行的回调函数* param {Number} wait 延时的时间* param {Boolean} immediate 是否立即执行* return null*/ function throttle(func, wait 500…

[Java] 单例设计模式详解

模式定义&#xff1a;保证一个类只有一个实例&#xff0c;并且提供一个全局访问点&#xff0c;时一种创建型模式 使用场景&#xff1a;重量级的对象&#xff0c;不需要多个实例&#xff0c;如线程池&#xff0c;数据库连接池 单例设计模式的实现 1.懒汉模式&#xff1a;延迟…

牛客上面的约瑟夫环问题

对于本题 我感觉还是链表做起来舒服 数组也可以做 但是数组需要去控制循环 不太好控制 我之前搞了 最后看别人的实现 但是链表搞了一次就搞好了 香的嘞~ 下面是代码 用单链表实现循环 再去删除要删除的人 5个人 数到2 你们在纸上画图 我就不画了 对于数组实现你们可以去…

python读取json文件

import json# 文件路径(同目录文件名即可,不同目录需要绝对路径) path 1.json# 读取JSON文件 with open(path, r, encodingutf-8) as file:data json.load(file)#data为字典 print(data) print(type(data))

前端Vue入门-day03-用Vue实现工程化、组件化开发

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 生命周期 Vue 生命周期 和 生命周期的四个阶段 Vue 生命周期函数&#xff08;钩子函数&#xff09; 案例…

为公网远程访问树莓派配置一个固定TCP地址

今天我们就为大家介绍&#xff0c;如何设置cpolar&#xff0c;为树莓派的SSH构建一个永久固定TCP地址。 如果看过我们之前的文章介绍&#xff0c;就会很轻易的发现&#xff0c;能够让公共互联网通过SSH访问树莓派的关键&#xff0c;是cpolar打通的数据隧道&#xff0c;因此想要…

【双指针优化DP】The 2022 Hangzhou Normal U Summer Trials H

Problem - H - Codeforces 题意&#xff1a; 思路&#xff1a; 首先很明显是DP 因为只有1e6个站点&#xff0c;因此可以以站点作为阶段 注意到K很小&#xff0c;因此可以尝试把这个当作第二维 设dp[i][j]为到达第i个站点&#xff0c;已经花了j元钱的最小步数 然后就想了一…