策略模式-类型统计

news2024/11/28 0:35:14

文章目录

  • 前言
  • 一、策略模式是什么?
  • 二、策略模式应用场景
  • 三、策略模式优点
  • 四、策略模式缺点
  • 五、场景案例:类型统计
    • 1.项目结构
    • 2.UML图解
    • 3.代码实现
      • 3.1 指标枚举
      • 3.2 请求体
      • 3.3 响应体
      • 3.4.分析统计指标策略
      • 3.5.接口
      • 3.6.扩展接口
      • 3.7.接口实现
      • 3.8.控制层
  • 六、PostMan测试
    • 1.测试getListData()接口
    • 2.测试getChartData()接口
    • 3.getObtainInventory()扩展接口
  • 总结


前言

在做统计的业务开发中,常常伴随着用户选择不同类型的统计而动态的加载数据,返回的数据也会动态的改变,比如说一张商超里面可能有贩卖肉蛋禽、蔬菜、饮料、水果等,我们需要根据这几种类型指标(算法不同)去生成各自的统计数据,如果根据不同的类型写不同的接口,可以实简单现该功能,但带来的问题是接口定义太多,重复方法定义过多,如果统一一个接口、内容使用if去走分支,也可以实现相同的效果,但还是不够理想化,理想的是不需要手动的添加if分支,而是做到自动匹配到对应算法执行指定的流程,那么这时候就需要策略模式来帮我们实现这一步操作了


一、策略模式是什么?

  • 策略模式是一种行为型设计模式,它定义了一系列算法或策略,并将它们封装起来,使它们可以互相替换。在使用策略模式时,可以通过改变不同的算法或策略来改变对象的行为。
  • 策略模式通常包含两部分:策略接口和策略实现类。策略接口定义了对某种行为的抽象,而策略实现类则提供了具体的算法或策略实现。

二、策略模式应用场景

  1. 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
  2. 需要动态选择算法和策略时。
  3. 当一个对象需要通过多种行为方式中的一种进行某种操作时。
  4. 在不希望客户端知道具体实现细节的情况下,可采用策略模式对外提供接口。
  5. 多个类只有在算法或行为上稍有不同的场景。
  6. 假设有一个系统需要根据用户的不同操作系统显示不同的界面风格。可以使用策略模式,将不同操作系统的界面风格作为不同的策略实现类,并通过定义一个策略接口来对外暴露相应的方法。
  7. 策略模式还可以用于设计游戏中的战斗系统,根据不同角色的属性和职业特点,选取最优的战斗策略进行战斗。
    总之,策略模式适用于多个类只有在算法或行为上稍有不同的场景,并且在运行时需要动态地选择不同的算法或策略的情况下。

三、策略模式优点

  1. 策略模式可以让算法或策略独立于使用它们的客户端而变化,从而实现代码复用。
  2. 策略模式可以让算法或策略在不影响代码结构的情况下灵活地变化,降低了代码维护的成本。
  3. 策略模式可以避免使用大量的 if-else 语句或者 switch 语句来进行分支处理,增强了代码的可读性和可维护性。
  4. 策略模式可以在运行时动态地改变算法或策略,因此可以根据需要进行适当的选择和组合。

四、策略模式缺点

  1. 策略模式会增加系统需要的类的数量,可能会导致代码变得更加复杂和难以理解。
  2. 策略模式需要客户端了解不同的策略之间的差异,增加了客户端的编码难度。
  3. 策略模式可能会导致不必要的运行时开销,因为需要动态地选择和组合算法或策略。

五、场景案例:类型统计

1.项目结构

在这里插入图片描述


2.UML图解

在这里插入图片描述


3.代码实现

3.1 指标枚举

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum StatisticalIndicatorsEnum {
    /**
     * 肉
     */
    MEAT(1, "肉", "meatAnalysisTableService"),
    /**
     * 水果
     */
    FRUIT(2, "水果", "fruitAnalysisTableService"),
    /**
     * 蔬菜
     */
    VEGETABLE(3, "蔬菜", "vegetableAnalysisTableService"),
    /**
     * 饮料
     */
    BEVERAGE(4, "饮料", "beverageAnalysisTableService");

    /**
     * 编码
     */
    private final Integer code;
    /**
     * 注释
     */
    private final String desc;
    /**
     * 对应策略
     */
    private final String strategyName;
}

3.2 请求体

import com.fasterxml.jackson.annotation.JsonFormat;
import com.mxf.code.strategy_factory.enums.StatisticalIndicatorsEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.bind.annotation.ModelAttribute;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

/**
 * 统计图Request
 */
@Data
@ApiModel(value = "统计图Request")
public class StatisticsRequest implements Serializable {
    private static final long serialVersionUID = 1L;

    @NotBlank(message = "统计指标不能为空")
    @ApiModelProperty(value = "统计指标")
    private StatisticalIndicatorsEnum statisticalIndicatorsEnum;

    @NotNull(message = "统计起始时间不能为空")
    @ApiModelProperty(value = "开始时间,格式:yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;

    @NotNull(message = "统计截止时间不能为空")
    @ApiModelProperty(value = "结束时间(格式:yyyy-MM-dd)")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;

    @ModelAttribute("statisticalIndicators")
    public void setStatisticalIndicatorsEnum(StatisticalIndicatorsEnum statisticalIndicatorsEnum) {
        this.statisticalIndicatorsEnum = statisticalIndicatorsEnum;
    }
}

3.3 响应体

import lombok.Data;

/**
 * @author mxf
 * @version 1.0
 * @description: 响应体Base
 * @date 2023/5/26
 */
@Data
public abstract class BaseResponse {
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * @author 28382
 */
@Data
@ApiModel(value = "蔬菜")
@EqualsAndHashCode(callSuper = true)
public class BeverageAvailabilityListResponse extends BaseResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "统计时间")
    private String xDate;

    @ApiModelProperty(value = "饮料类型名称")
    private String beverageTypeName;

    @ApiModelProperty(value = "销售件数")
    private Double salesQuantity;

    @ApiModelProperty(value = "销售金额")
    private BigDecimal salesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * @author 28382
 */
@Data
@ApiModel(value = "水果图表响应体")
@EqualsAndHashCode(callSuper = true)
public class FruitAvailabilityChartResponse extends BaseResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "统计时间")
    private String xDate;

    @ApiModelProperty(value = "本年销售总额")
    private BigDecimal currentYearSalesAmount;

    @ApiModelProperty(value = "去年销售金额")
    private BigDecimal previousYearSalesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * @author 28382
 */
@Data
@ApiModel(value = "水果")
@EqualsAndHashCode(callSuper = true)
public class FruitAvailabilityListResponse extends BaseResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "统计时间")
    private String xDate;

    @ApiModelProperty(value = "肉类名")
    private String fruitTypeName;

    @ApiModelProperty(value = "销售量kg")
    private Double salesVolume;

    @ApiModelProperty(value = "销售金额")
    private BigDecimal salesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * @author 28382
 */
@Data
@ApiModel(value = "肉")
@EqualsAndHashCode(callSuper = true)
public class MeatAvailabilityListResponse extends BaseResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "统计时间")
    private String xDate;

    @ApiModelProperty(value = "肉类名")
    private String meatTypeName;

    @ApiModelProperty(value = "销售量kg")
    private Double salesVolume;

    @ApiModelProperty(value = "销售金额")
    private BigDecimal salesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * @author 28382
 */
@Data
@ApiModel(value = "蔬菜")
@EqualsAndHashCode(callSuper = true)
public class VegetableAvailabilityListResponse extends BaseResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "统计时间")
    private String xDate;

    @ApiModelProperty(value = "肉类名")
    private String vegetableName;

    @ApiModelProperty(value = "销售量kg")
    private Double salesVolume;

    @ApiModelProperty(value = "销售金额")
    private BigDecimal salesAmount;
}

3.4.分析统计指标策略

管理策略bean

import com.mxf.code.strategy_factory.enums.StatisticalIndicatorsEnum;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 分析统计指标策略
 *
 * @author 28382
 */
@Service
public class AnalysisTableStrategyContext {
    private final Map<String, AnalysisTableService> analysisTableMap = new ConcurrentHashMap<>();

    public AnalysisTableStrategyContext(Map<String, AnalysisTableService> strategyMap) {
        this.analysisTableMap.putAll(strategyMap);
    }

    /**
     * @param statisticalIndicatorsEnum 指标枚举
     * @return com.mxf.code.strategy_factory.service.AnalysisTableService
     * @author mxf
     * @description 获取实际统计策略
     * @createTime 2023/5/26 14:08
     * @paramType [com.mxf.code.strategy_factory.enums.StatisticalIndicatorsEnum]
     */
    public AnalysisTableService getResource(StatisticalIndicatorsEnum statisticalIndicatorsEnum) {

        return analysisTableMap.get(statisticalIndicatorsEnum.getStrategyName());
    }
}

3.5.接口

import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;

import java.util.List;


/**
 * 统计分析
 */
public interface AnalysisTableService {


    /**
     * 获取统计图数据
     *
     * @param requestParams 入参
     * @return
     */
    List<BaseResponse> getChartData(StatisticsRequest statisticsRequest);


    /**
     * 获取列表数据
     *
     * @param requestParams 入参
     * @return
     */
    List<BaseResponse> getListData(StatisticsRequest statisticsRequest);
}

3.6.扩展接口

import com.mxf.code.strategy_factory.request.StatisticsRequest;

/**
 * @author mxf
 * @version 1.0
 * @description: 水果(自定义接口)
 * @date 2023/5/26
 */
public interface FruitAnalysisTableService {

    /**
     * 获取水果库存
     *
     * @param statisticsRequest 入参
     * @return
     */
    Double getObtainInventory(StatisticsRequest statisticsRequest);
}

3.7.接口实现

import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.BeverageAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author mxf
 * @version 1.0
 * @description: 饮料
 * @date 2023/5/26
 */
@Service("beverageAnalysisTableService")
public class BeverageAnalysisTableServiceImpl implements AnalysisTableService {

    @Override
    public List<BaseResponse> getChartData(StatisticsRequest requestParams) {
        return null;
    }

    @Override
    public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {
        List<BeverageAvailabilityListResponse> resultList = new ArrayList<>();
        BeverageAvailabilityListResponse beverageAvailabilityListResponse = new BeverageAvailabilityListResponse();
        beverageAvailabilityListResponse.setXDate("");
        beverageAvailabilityListResponse.setBeverageTypeName("");
        beverageAvailabilityListResponse.setSalesQuantity(0.0D);
        beverageAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));
        resultList.add(beverageAvailabilityListResponse);
        return new ArrayList<>(resultList);
    }
}
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.FruitAvailabilityChartResponse;
import com.mxf.code.strategy_factory.response.FruitAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import com.mxf.code.strategy_factory.service.FruitAnalysisTableService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author mxf
 * @version 1.0
 * @description: 水果
 * @date 2023/5/26
 */
@Service("fruitAnalysisTableService")
public class FruitAnalysisTableServiceImpl implements AnalysisTableService, FruitAnalysisTableService {
    @Override
    public List<BaseResponse> getChartData(StatisticsRequest requestParams) {
        List<FruitAvailabilityChartResponse> resultList = new ArrayList<>();
        FruitAvailabilityChartResponse fruitAvailabilityChartResponse = new FruitAvailabilityChartResponse();
        fruitAvailabilityChartResponse.setXDate("2022-05-25");
        fruitAvailabilityChartResponse.setCurrentYearSalesAmount(new BigDecimal("4"));
        fruitAvailabilityChartResponse.setPreviousYearSalesAmount(new BigDecimal("5"));
        FruitAvailabilityChartResponse fruitAvailabilityChartResponse2 = new FruitAvailabilityChartResponse();
        fruitAvailabilityChartResponse2.setXDate("2022-05-26");
        fruitAvailabilityChartResponse2.setCurrentYearSalesAmount(new BigDecimal("1"));
        fruitAvailabilityChartResponse2.setPreviousYearSalesAmount(new BigDecimal("2"));
        resultList.add(fruitAvailabilityChartResponse);
        resultList.add(fruitAvailabilityChartResponse2);
        return new ArrayList<>(resultList);
    }

    @Override
    public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {
        List<FruitAvailabilityListResponse> resultList = new ArrayList<>();
        FruitAvailabilityListResponse fruitAvailabilityListResponse = new FruitAvailabilityListResponse();
        fruitAvailabilityListResponse.setXDate("");
        fruitAvailabilityListResponse.setFruitTypeName("");
        fruitAvailabilityListResponse.setSalesVolume(0.0D);
        fruitAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));
        resultList.add(fruitAvailabilityListResponse);
        return new ArrayList<>(resultList);
    }

    @Override
    public Double getObtainInventory(StatisticsRequest statisticsRequest) {
        return 334423423.44;
    }
}
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.MeatAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author mxf
 * @version 1.0
 * @description: 肉
 * @date 2023/5/26
 */
@Service("meatAnalysisTableService")
public class MeatAnalysisTableServiceImpl implements AnalysisTableService {
    @Override
    public List<BaseResponse> getChartData(StatisticsRequest requestParams) {
        return null;
    }

    @Override
    public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {
        List<MeatAvailabilityListResponse> resultList = new ArrayList<>();
        MeatAvailabilityListResponse meatAvailabilityListResponse = new MeatAvailabilityListResponse();
        meatAvailabilityListResponse.setXDate("");
        meatAvailabilityListResponse.setMeatTypeName("");
        meatAvailabilityListResponse.setSalesVolume(0.0D);
        meatAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));
        resultList.add(meatAvailabilityListResponse);
        return new ArrayList<>(resultList);
    }
}
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.VegetableAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author mxf
 * @version 1.0
 * @description: 蔬菜
 * @date 2023/5/26
 */
@Service("vegetableAnalysisTableService")
public class VegetableAnalysisTableServiceImpl implements AnalysisTableService {
    @Override
    public List<BaseResponse> getChartData(StatisticsRequest requestParams) {
        return null;
    }

    @Override
    public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {
        List<VegetableAvailabilityListResponse> resultList = new ArrayList<>();
        VegetableAvailabilityListResponse vegetableAvailabilityListResponse = new VegetableAvailabilityListResponse();
        vegetableAvailabilityListResponse.setXDate("");
        vegetableAvailabilityListResponse.setVegetableName("");
        vegetableAvailabilityListResponse.setSalesVolume(0.0D);
        vegetableAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));
        resultList.add(vegetableAvailabilityListResponse);
        return new ArrayList<>(resultList);
    }
}

3.8.控制层

import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import com.mxf.code.strategy_factory.service.AnalysisTableStrategyContext;
import com.mxf.code.strategy_factory.service.FruitAnalysisTableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author mxf
 * @version 1.0
 * @description: 统计分析
 * @date 2023/5/26
 */
@RestController
@RequestMapping("statistical/indicators")
public class StatisticalIndicatorsController {

    @Autowired
    private AnalysisTableStrategyContext analysisTableStrategyContext;
    @Autowired
    private FruitAnalysisTableService fruitAnalysisTableService;

    @GetMapping("listData")
    public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {
        AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());
        Assert.notNull(resource, "未知策略");
        return resource.getListData(statisticsRequest);
    }

    @GetMapping("chartData")
    public List<BaseResponse> getchartData(StatisticsRequest statisticsRequest) {
        AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());
        Assert.notNull(resource, "未知策略");
        return resource.getChartData(statisticsRequest);
    }

    @GetMapping("getFruitObtainInventory")
    public Double getFruitObtainInventory(StatisticsRequest statisticsRequest) {
        return fruitAnalysisTableService.getObtainInventory(statisticsRequest);
    }
}

六、PostMan测试

1.测试getListData()接口

@GetMapping("listData")
public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {
    AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());
    Assert.notNull(resource, "未知策略");
    return resource.getListData(statisticsRequest);
}

在这里插入图片描述


2.测试getChartData()接口

@GetMapping("chartData")
public List<BaseResponse> getchartData(StatisticsRequest statisticsRequest) {
   AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());
   Assert.notNull(resource, "未知策略");
   return resource.getChartData(statisticsRequest);
}

在这里插入图片描述


3.getObtainInventory()扩展接口

@GetMapping("getFruitObtainInventory")
 public Double getFruitObtainInventory(StatisticsRequest statisticsRequest) {
     return fruitAnalysisTableService.getObtainInventory(statisticsRequest);
 }

在这里插入图片描述


总结

上述案例实现策略模式同时,针对入参、出参、接口扩展做了更好的兼容。

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

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

相关文章

2023年本科应届生,金融转行做数据分析有前景吗?

当然有前景的&#xff0c;尤其是数据分析本身的发展前景是无限的&#xff1b;而作为个人而言&#xff0c;只要你专业技能掌握得好&#xff0c;对于业务的理解分析能力过关&#xff0c;也是非常有发展前景的&#xff0c;尤其是在数据分析人才紧缺的阶段&#xff0c;众多行业领域…

直播预告:聚焦盗号 企业邮件安全的威胁分析与应对

根据Coremail邮件安全人工实验室数据监测&#xff0c;2023年Q1全国企业级用户遭受超过17.45亿次暴力破解&#xff0c;虽然无差别的暴力破解攻击从去年Q4开始有相当幅度的下降趋势&#xff0c;但在今年2-3月&#xff0c;全域暴力破解攻击次数又开始回升。 根据Coremail邮件安全专…

Go 存储系列:Hash存储引擎 Bitcask

Hash 存储引擎 在现代软件系统中&#xff0c;存储和检索数据是一个非常重要的任务。随着数据量的不断增长&#xff0c;如何高效地存储和检索数据变得越来越重要。Hash 存储引擎是一种常见的存储引擎&#xff0c;它可以快速地存储和检索数据。 在本文中&#xff0c;我们将介绍…

深入篇【C++】类与对象:友元函数与友元类

深入篇【C】类与对象&#xff1a;友元函数与友元类 ①.提出问题&#xff1a;重载operator<<②.解决问题&#xff1a;友元Ⅰ.友元函数【特点】 Ⅱ.友元类【特点】 ③.总结问题 ①.提出问题&#xff1a;重载operator<< 如果我们尝试去重载运算符operator<<,你…

【JavaSE】Java基础语法(十八):接口

文章目录 1. 接口的概述2. 接口的特点3. 接口的成员特点4. 类和接口的关系5. 抽象类和接口的关系 1. 接口的概述 接口就是一种公共的规范标准&#xff0c;只要符合规范标准&#xff0c;大家都可以通用。Java中接口存在的两个意义 用来定义规范用来做功能的拓展 2. 接口的特点…

SpringBoot3.0升级遇到关于Invalid bound statement (not found)处理方案

前言 今天升级SpringBoot3时尝试兼容Mybatis和MybatisPlus出现多个异常。顺带写写排查方案&#xff0c;springboot2其实也一样用 排查方向&#xff1a;mapper接口中的方法名和mapper.xml中的id标签不一致 仔细核对抛出异常的接口和xml文件名。方法名排查方向&#xff1a;.map…

基于docker容器化的jenkins2.406升级迁移(jdk8升级jdk11)

查看基础配置 查看jenkins的home路径: 查看磁盘占比: 发现占比比较大的是: 主要子目录&#xff1a; jobs&#xff1a;包含Jenkins管理的构建作业的配置细节、构建产物和数据&#xff1b;logs&#xff1a;Jenkins的日志目录&#xff1b;plugins&#xff1a;包含所有已经安装了…

低代码开发平台助力门店管理创新,提升用户体验

随着信息技术的飞速发展&#xff0c;低代码开发成为了近年来热门的开发方式。同时&#xff0c;在零售业中&#xff0c;门店管理也成为了一个重要的议题。本文将结合低代码开发和门店管理两个主题&#xff0c;探讨如何应用低代码技术优化门店管理。 一、门店管理的挑战 门店管…

Ansible从入门到精通【二】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 专栏名称&#xff1a;Ansible从入门到精通 立志成为ansible大佬 文章目录 ansible常用命令ansibleansible-d…

Revit幕墙:用幕墙巧做屋面瓦及如何快速幕墙?

一、Revit中用幕墙巧做屋面瓦 屋面瓦重复性很高&#xff0c;我们如何快速的创建呢?下面我们来学会快速用幕墙来创建屋面瓦的技巧。 1.新建“公制轮廓-竖挺”族&#xff0c;以此来创建瓦的族(以便于载入项目中使用) 2.在轮廓族中绘制瓦的轮廓(轮廓需要闭合)&#xff0c;将族名称…

淘宝天猫618预售活动时间是从几号什么时候开始2023天猫淘宝618预售定金能退吗?

2023年淘宝天猫618预售什么时候开始&#xff1f; 2023年5月26日20:00淘宝天猫618预售活动开始截至到5月31日18:00结束&#xff1b; 2023年淘宝天猫618预售定金支付后可退吗&#xff1f; 淘宝天猫618预售定金支付后如不想要该预售商品了&#xff0c;可以在5月31日20:00后完成尾…

如何获得高清、4K无水印视频素材?教你轻松拥有高清视频

随着短视频越来越火爆&#xff0c;大家也都加入到了视频创作的行业中&#xff0c;平时也会喜欢剪辑一些视频发布到平台上&#xff0c;那高清的短视频肯定是最受欢迎的&#xff0c;我们自己又如何获得高清的视频呢&#xff1f; 一、为什么需要高清的视频素材&#xff1f; 1. 视…

基于非靶向和靶向代谢组学分析婴幼儿血管瘤的氨基酸代谢

文章标题&#xff1a;Integrated nontargeted and targeted metabolomics analyses amino acids metabolism in infantile hemangioma 发表期刊&#xff1a;Frontiers in Oncology 影响因子&#xff1a;5.738 作者单位&#xff1a;四川大学华西医院 百趣提供服务&#xf…

prometheus 部署安装

prometheus 部署安装 监控系统硬件&#xff08;node-exporter&#xff09;监控mysql &#xff08;mysql_exporter&#xff09;监控redis&#xff08;redis_exporter&#xff09;监控docker &#xff08;cadvisor&#xff09;监控可视化展示 (Grafana)监控报警 &#xff08;Ale…

Adams几何元素

简单学了一下Adams的几何元素&#xff0c;记录一下面板。 1.几何点 Point Add to Ground 添加到大地 Add to Part 添加到现有构件 Attach Near 关联构件 Don’t Attach 不关联构件 创建添加行&#xff0c;输入点坐标。创建好的点可以在导航栏右键删除和修改。 2. 坐标系Mar…

ROS学习——利用电脑相机标定

一、 安装usb-cam包和标定数据包 sudo apt-get install ros-kinetic-usb-cam sudo apt-get install ros-kinetic-camera-calibration 要把kinetic改成你自己的ros版本 。 二、启动相机 roslaunch usb_cam usb_cam-test.launch 就会出现一个界面 可以通过下面命令查看相机…

leetcode 1140. Stone Game II(石头游戏II)

涉及game的问题&#xff0c;2个player, 现有几堆石头&#xff0c;每堆石头个数为piles[i], 刚开始M1, player1先拿石头&#xff0c;可以拿走前 x 堆&#xff08;假设从第 i 堆开始拿&#xff0c;可以拿 i ~ ix-1 堆&#xff09;&#xff0c;1 < x < 2M, 拿完之后&#xf…

2023.5.19Hadoop具体操作(四种)

大作业 1、ens33没有地址 查看虚拟机的NAT8网段 使用ip a显示ens33的ip ip a设置静态ip 编辑网络接口配置文件&#xff1a;输入以下命令来编辑网络接口的配置文件&#xff1a; sudo vi /etc/network/interfaces在打开的文件中&#xff0c;找到要设置为静态IP的网络接口&am…

来领走你的AI老师

现在很多大学生不上课&#xff0c;在b站学习。 有没有想过有一天&#xff0c;你的大多数时间都在跟AI学习&#xff1f; 未来已来&#xff0c;这里有一份万能提示词&#xff0c;让你立马拥有一位AI导师。 这位导师可了不得&#xff0c;除了啥都知道之外&#xff0c;还能&…

C# 队列(Queue)

目录 一、概述 二、基本的用法 1.添加元素 2.取出元素 1&#xff09;Dequeue 方法 2&#xff09;Peek 方法 3.判断元素是否存在 4.获取队列的长度 5.遍历队列 6.清空容器 7.Queue 泛型类 三、结束 一、概述 表示对象的先进先出集合。 队列和其他的数据结构一样&a…