vue左侧漏斗切换 echart图表动态更新

news2024/11/26 1:24:28

这个需求是根据点击左侧的箭头部分,右侧图表切换,左侧选中数据高亮(图片用的svg)

一、效果图

 

 二、vue组件

<template>
  <div class="funnel_wrap">
    <div class="flex_between">
      <div class="sec_title">测试</div>
        <!-- <el-checkbox label="平均值" v-model="averageCheck"  @change="changeAverage"></el-checkbox> -->
    </div>
    <div class="flex_center funnel_con" v-if="flowList.items&&flowList.items.length>0">
      <div class="flow_con">
        <div class="left_position pointer">
          <svg-icon icon-class="arrow" :style="`color:${chooseId==5||chooseId==6||chooseId==7?'green':'#DFE1EB'};position:absolute;right:0;bottom:-3px;width: 6px;height: 6px;`"></svg-icon>
          <div @click="changeFunnel(7)" :class="['left_top',chooseId==7?'leftactive':'']">
            <div class="left_title">{{radioList[6]}}%</div>
          </div>
          <div @click="changeFunnel(6)" :class="['left_cen',chooseId==6?'leftactive':'']"  :style="`${chooseId==7?'border-bottom:0':''}`">
            <div class="left_title">{{radioList[5]}}%</div>
          </div>
          <div @click="changeFunnel(5)" :class="['left_bot',chooseId==5?'leftactive':'']" :style="`${chooseId==7||chooseId==6?'border-bottom:0':''}`">
            <div class="left_title">{{radioList[4]}}%</div>
          </div>
        </div>
        <div :class="['flow_item',chooseList.includes(item.id)?'active':''] " :style="'width:'+(255-(12*index))+'px'" v-for="(item,index) in flowList.items" :key="index">
          <div class="item_lef">{{item.title}}</div>
          <div class="item_rig" >{{item.newValue}}
            <div class="funnle"></div>
          </div>
         <div class="svg_box" v-if="index!==4" :style="`color:${chooseId==index?'green':'#DFE1EB'};right:-${(15+12*index)}px`" >
          <svg-icon @click="changeFunnel(index)" class="pointer" :style="'height:42px;width:'+(26+index*12)+'px'" :icon-class="'funnel'+index"></svg-icon>
          <div class="title"  :style="`left:${(30+index*12)}px;color:${chooseId==index?'green':'#212848'}`">{{radioList[index]}}%</div>
         </div>
        </div>
      </div>
      <div class="flow_echart">
        <line-vue v-if="lineOpt.id" :opt="lineOpt" :heightNum="300"></line-vue>
     </div>
    </div>
    <div v-else class="none">暂无数据</div>
  </div>
</template>

<script>
import { defineComponent, onMounted, computed,reactive,ref } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { roomflow } from "@/api/analyze/index.js";
import lineVue from "@/components/echartsChange/lineVue.vue";
import { thousandthis, valueTransfer,processingData,$formatTime,millionTransfer } from "@/utils/utils";
export default defineComponent({
  components:{
    lineVue
  },
  props: {
    opt: {
      type: Object,
      default: () => {
        return {
          roomId:'',
          userId:''
        };
      },
    },
    optIds: {
      type: Object,
      default: () => {
        return {
          lineId: "funnel_data_id", // echarts图表默认id 同一个页面多次引用当前组件 id不能相同
        };
      },
    },
  },
  setup(props,context) {
  const router = useRouter(),
    route = useRoute()
    let averageCheck=ref(false)//平均值flag
    const industryAvg=ref('')//平均值
    const formatTime=$formatTime
     const lineOpt = ref({});
    const chooseList=ref([0,1])//选中id
    const chooseListArr=ref([])//选中趋势图
    const flowList=ref([])//漏斗列表
    const trendList=ref([])//曲线图列表
    const chooseId=ref('0')
    let radioList=ref([])//占比
      let colors = [
      "#4CAF50",
      "#556FFD",
      "#91CC75",
      "#EA8533",
      "#283E81",
      "#097C38",
      "#48D9D9",
      "#93BEFF",
    ];
    let renderColors = colors;
    const initData = (res,arrline) => {
      let data = res;
      if (data && data.length > 0) {
        let xList = [];
        let seriesList = [];
        let maxArr=[]
        data.forEach((element, index) => {
          element.points=element.points||[]
          maxArr.push(element.points.length)
          let arrnew=[]
          // if(element.points.length>0){
             arrnew = element.points
            .map((obj) => {
              return obj.value;
            })
            .join(",")
            .split(",");
          // }     
          seriesList.push({
            name: element.title,
            type: "line",
            showSymbol: false,
            symbolSize: 6,
            seriesLayoutBy: "row",
            emphasis: { focus: "series" },
            data: [...arrnew],
            markLine : {
                symbol: ['none'],
                data : arrline?arrline:[],
                emphasis: {
                  lineStyle: {
                    width: 1,	// hover时的折线宽度
                  }
                },
            },
            lineStyle: {
              width: 1,
            },         
          });
        });
         let max=Math.max(...maxArr)
        let maxIndex=maxArr.map(item => item).indexOf(max)
        xList = data[maxIndex].points.map((item) => {
         return formatTime(item.date,'HH:mm');
        });
        lineOpt.value = {
          id: props.optIds.lineId,
          resize:true,
          options: {
            color: renderColors,
            title: {
              text: "",
            },
            legend: {
              icon: "circle",
              // selectedMode:'single',
              itemHeight: 6,
              itemWidth: 6,
              left: "0px",
              itemGap: 24,
              // top:'bottom',
              textStyle: {
                //图例文字的样式
                color: "#596076",
                fontSize: 14,
                padding: [0, 0, 0, 0], //文字与图形之间的左右间距
              },
              // data: ["签约汇总", "计划招募", "计划孵化"],
            },
            tooltip: {
              // 鼠标移入的展示
              trigger: "axis",
              // axisPointer: {
              //   type: "cross",
              //   label: {
              //     backgroundColor: "#6a7985",
              //   },
              // },
              formatter: function (params) {
                 let res = params[0].name+'分析数据\n';
                for (let i = 0; i < params.length; i++) {
                  res += `<div style="margin-top: 4px;font-size: 14px;line-height: 22px;color: #596076;">${
                    params[i].marker
                  } ${params[i].seriesName}:${thousandthis(
                    params[i].data
                  )}</div>`;
                }
                return res;
              },
              backgroundColor: "rgba(255,255,255,.9)",
              borderColor: "#E2E6F5",
              borderWidth: 1,
              padding: [12, 16, 16, 16],
            },
            grid: {
              // 图表距离容器的距离
              left: "1%",
              right: '4%',
              bottom: "3%",
              top:'22%',
              containLabel: true, // 是否显示刻度,默认不显示
            },
            xAxis: [
              {
                type: "category",
                boundaryGap: false,
                axisLabel: {
                  color: "#9095A7",
                  fontSize: 12,
                  margin: 13,
                },
                axisLine: {
                  lineStyle: {
                    color: "#DFE1EB",
                  },
                },
                axisTick: {
                  show: false,
                },
                data: xList,
              },
            ],
            yAxis: [
              {
                type: "value",
                // min: 0,
                // max: function (value) {
                //   return value.max < 400 ? 400 : value.max;
                // },
                // interval: 1000,
                // splitNumber: 4,
                axisLabel: {
                  color: "#9095A7",
                  formatter(v) {
                    return valueTransfer(Math.abs(v), 0, "w", true);
                  },
                },
                splitLine: {
                  lineStyle: {
                    type: "dashed", //虚线
                  },
                },
              },
            ],
            series: seriesList,
          },
        };
      }
    };
    //格式化选中线条
    const initChoosrArr=(arrList)=>{
      let arr=[]
      chooseList.value.forEach((ele)=>{
         arr.push(arrList[ele])
       })
      return arr
    }
   //获取漏斗列表
    const getList = () => {
      let param = {
        userId:props.opt.userId,
        roomId: props.opt.roomId,
      };
      // roomflow(param).then((res) => { 
        let res=    {
      "code": 200,
      "msg": "ok",
      "data": {
        "flowRank": {
            "name": "flowRank",
            "title": "测试数据",
            "items": [
                {
                    "title": "数据1",
                    "ratio": 1.0,
                    "value": 2833543
                },
                {
                    "title": "数据2",
                    "ratio": 0.12883587790974055,
                    "value": 365062
                },
                {
                    "title": "数据3",
                    "ratio": 0.85563822035709,
                    "value": 312361
                },
                {
                    "title": "数据4",
                    "ratio": 0.09972755881816232,
                    "value": 31151
                },
                {
                    "title": "数据5",
                    "ratio": 0.016532374562614364,
                    "value": 515
                }
            ],
        },
        "trends": [
            {
                "title": "数据1",
                "points": [
                    {
                        "value": 30000,
                        "date": "2023-07-02 09:25:00"
                    },
                    {
                        "value": 35000,
                        "date": "2023-07-02 09:30:00"
                    },
                    {
                        "value": 50000,
                        "date": "2023-07-02 09:35:00"
                    },
                    {
                        "value": 100000,
                        "date": "2023-07-02 09:40:00"
                    },
                    {
                        "value": 130003,
                        "date": "2023-07-02 09:45:00"
                    },
                    {
                        "value": 190000,
                        "date": "2023-07-02 09:50:00"
                    },
                    {
                        "value": 230000,
                        "date": "2023-07-02 09:55:00"
                    },
                    {
                        "value": 250000,
                        "date": "2023-07-02 10:00:00"
                    },
                ]
            },
            {
                "title": "数据2",
                "points": [
                    {
                        "value": 6000,
                        "date": "2023-07-02 09:25:00"
                    },
                    {
                        "value": 7000,
                        "date": "2023-07-02 09:30:00"
                    },
                    {
                        "value": 8000,
                        "date": "2023-07-02 09:35:00"
                    },
                    {
                        "value": 9000,
                        "date": "2023-07-02 09:40:00"
                    },
                    {
                        "value": 10000,
                        "date": "2023-07-02 09:45:00"
                    },
                    {
                        "value": 11000,
                        "date": "2023-07-02 09:50:00"
                    },
                    {
                        "value": 12000,
                        "date": "2023-07-02 09:55:00"
                    },
                    {
                        "value": 21810,
                        "date": "2023-07-02 10:00:00"
                    },
                ]
            },
            {
                "title": "数据3",
                "points": [
                    {
                        "value": 4500,
                        "date": "2023-07-02 09:25:00"
                    },
                    {
                        "value": 4700,
                        "date": "2023-07-02 09:30:00"
                    },
                    {
                        "value": 10000,
                        "date": "2023-07-02 09:35:00"
                    },
                    {
                        "value": 10214,
                        "date": "2023-07-02 09:40:00"
                    },
                    {
                        "value": 12000,
                        "date": "2023-07-02 09:45:00"
                    },
                    {
                        "value": 13000,
                        "date": "2023-07-02 09:50:00"
                    },
                    {
                        "value": 14000,
                        "date": "2023-07-02 09:55:00"
                    },
                    {
                        "value": 15000,
                        "date": "2023-07-02 10:00:00"
                    },
                ]
            },
            {
                "title": "数据4",
                "points": [
                    {
                        "value": 400,
                        "date": "2023-07-02 09:25:00"
                    },
                    {
                        "value": 800,
                        "date": "2023-07-02 09:30:00"
                    },
                    {
                        "value": 1100,
                        "date": "2023-07-02 09:35:00"
                    },
                    {
                        "value": 1200,
                        "date": "2023-07-02 09:40:00"
                    },
                    {
                        "value": 1400,
                        "date": "2023-07-02 09:45:00"
                    },
                    {
                        "value": 1600,
                        "date": "2023-07-02 09:50:00"
                    },
                    {
                        "value": 1800,
                        "date": "2023-07-02 09:55:00"
                    },
                    {
                        "value": 2000,
                        "date": "2023-07-02 10:00:00"
                    },
                ]
            },
            {
                "title": "数据5",
                "points": [
                    {
                        "value": 0,
                        "date": "2023-07-02 09:25:00"
                    },
                    {
                        "value": 2,
                        "date": "2023-07-02 09:30:00"
                    },
                    {
                        "value": 13,
                        "date": "2023-07-02 09:35:00"
                    },
                    {
                        "value": 14,
                        "date": "2023-07-02 09:40:00"
                    },
                    {
                        "value": 34,
                        "date": "2023-07-02 09:45:00"
                    },
                    {
                        "value": 40,
                        "date": "2023-07-02 09:50:00"
                    },
                    {
                        "value": 53,
                        "date": "2023-07-02 09:55:00"
                    },
                    {
                        "value": 63,
                        "date": "2023-07-02 10:00:00"
                    },
                ]
            }
        ],
        "industryAvg": 100
    }
}
        if (res.data) {
          if(res.data.flowRank.items){
            radioList.value=[]
          //格式漏斗右侧返回占比
          res.data.flowRank.items.forEach((ele,index) => {
            ele.id=index
            ele.newValue=millionTransfer(ele.value)
            if(index!==0){
              radioList.value.push(processingData(ele.ratio*100,2))
            }
          });
          // 漏斗左侧百分比计算
          radioList.value.push(processingData((res.data.flowRank.items[4].value/res.data.flowRank.items[2].value)*100,2))
          radioList.value.push(processingData((res.data.flowRank.items[4].value/res.data.flowRank.items[1].value)*100,2))          
          radioList.value.push(processingData((res.data.flowRank.items[4].value/res.data.flowRank.items[0].value)*100,2))
          }
          //绘制图表
          if(res.data.trends){
            chooseListArr.value=initChoosrArr(res.data.trends)
            initData(chooseListArr.value)
          }
          flowList.value=res.data.flowRank
          trendList.value=res.data.trends
          industryAvg.value=res.data.industryAvg
        }
      // });
    };
    //点击漏斗
    const changeFunnel=(val)=>{
      chooseId.value=val;
      if(val<5){
        chooseList.value=[val,val+1]
      }else if(val==5){
        chooseList.value=[2,4]
      }if(val==6){
        chooseList.value=[1,4]
      }if(val==7){
        chooseList.value=[0,4]
      }
      chooseListArr.value=initChoosrArr(trendList.value)
      // 先判断是否有平均线再重绘图表
      changeAverage(averageCheck.value)
    }
    //点击平均值 val=true有平均线
    const changeAverage=(val)=>{
      if(val){
        let arrline=[{
          symbol: "none",
          silent:false, //鼠标悬停事件 true没有,false有
          lineStyle:{ //警戒线的样式 ,虚实 颜色
                type:"dashed", //样式  ‘solid’和'dotted'
                color:"#E98433",
                width: 1   //宽度
            },
          label:{
            show:false,
            color:"#E98433",
            position:'middle',
            // padding: ['0', '0', '0',tableWidth.value],
            formatter: function (params) {
                let res = "";
                res += `${params.name}:${params.value}`;
                return res;
              },
          },
          name:'平均值',
          yAxis:industryAvg.value
        }]
        initData(chooseListArr.value,arrline)
      }else{
         initData(chooseListArr.value)
      }
    }
  watch(
    props,
    (newValue) => {
      console.log(newValue);
      if (newValue && newValue.opt && newValue.opt.roomId) {
          getList()
      }
    },
    {  deep: true }
  );
    onMounted(()=>{
      // getList()
    })
    return {
      flowList,
      chooseList,
      changeFunnel,
      chooseId,
      radioList,
       trendList,
      lineOpt,
      averageCheck,
      changeAverage
    }
  }
})
</script>

<style scoped lang="scss">
.funnel_wrap{
  margin-top: 24px;
  padding: 24px;
  color: #212848;
  font-size: 14px;
  background-color: #fff;
  .sec_title{
    font-size: 18px;
    font-weight: 500;
  }
  .funnel_con{
    padding: 24px;

  }
  .flow_con{
    position: relative;
    padding-left: 100px;
    padding-right: 112px;
    .left_position{
      position: absolute;
      top: 30px;
      left:0;
      .left_top{
        width: 100px;height: 198px;color:#DFE1EB;border:1px solid #DFE1EB;border-right:0;
      }
      .left_cen{
        width: 72px;height: 146px;position:absolute;left:24px;bottom:-0.5px;color:#DFE1EB;border:1px solid #DFE1EB;border-right:0;
      }
      .left_bot{
        width: 25px;height: 92px;position:absolute;left:72px;color:#DFE1EB;bottom:0px;border:1px solid #DFE1EB;border-right:0;
      }
      .left_title{
          position: absolute;
          line-height: 20px;
          top: -24px;
          right: 0;       
          color: #212848;
        }
      .leftactive{
        border:1px solid green;
        border-right:0;
        color: green;
         .left_title{
          color: green;
        }
      }

    }
    .flow_item{
      background-color:#F8F9FB ;
      margin-bottom: 12px;
      height: 40px;
      line-height: 40px;
      display: flex;
      align-items: center;
      position: relative;
      .item_lef{
        width: 116px;
        text-align: center;
        box-sizing: border-box;
      }
      .item_rig{padding-left: 16px;
      position: relative;
      flex: 1;
      .funnle{
        position: absolute;
        border-bottom:40px solid #fff;
        border-left: 12px solid transparent;
        right: 0;
        top: 0;
        }
      }
    }
     .active{
      .item_lef{background-color: green;color: #fff;}
      .item_rig{background-color: #EEF1FF;}
    }
    .svg_box{
      position: absolute;
      top: 25px;
      right: -10px;
      .title{
        position: absolute;
        left:0;
        top: 0;
      }
    }
  }
  .flow_echart{
    flex: 1;
  }
  .none{
    margin-top: 12px;
    color: #9095A7;
    text-align: center;
    }
}
// .svg-icon {
//   height: 3em;
// }
</style>

三、utils.js方法

export function millionTransfer(
  value,
  digits = 4,
  unit = "w",
  decimal = 2,
  removeZero = false
) {
  // unit = unit || "w"
  const valueNum = Number(value)
  const transferNum = Math.pow(10, digits)
  if (!isNaN(valueNum)) {
    if (valueNum < transferNum && valueNum >= 0) {
      return value
    }
    const num = floatDivideMethod(valueNum, transferNum)
    if (removeZero) {
      return `${parseFloat(num.toFixed(decimal))}${unit}`
    }
    return `${num.toFixed(decimal)}${unit}`
  }
  return value
}

export function thousandthis(num) {
  if (!num && num !== 0) return null
  if (num === '--') return '--'
  if (!(!isNaN(Number(num)) && typeof Number(num) === 'number')) {
    return '0'
  }
  return (num || 0).toString().replace(/\d+/, function(n) {
    const len = n.length
    if (len % 3 === 0) {
      return n.replace(/(\d{3})/g, ',$1').slice(1)
    }
    return n.slice(0, len % 3) + n.slice(len % 3).replace(/(\d{3})/g, ',$1')
  })
}

/* 最早的数据没有亿,只有万,兼容之前数据,后面转换万和亿的数据用这个方法 */
export function valueTransfer(value, decimal = 2, unit = "万", removeZero = false) {
  let outputVal = value
  const valueNum = Number(value)
  const transferNum1 = Math.pow(10, 4)
  const transferNum2 = Math.pow(10, 8)
  if (!isNaN(valueNum)) {
    if (valueNum < transferNum1) {
      outputVal = value
    } else if (valueNum >= transferNum1 && valueNum < transferNum2) {
      outputVal = millionTransfer(value, 4, unit, decimal, removeZero)
    } else {
      outputVal = millionTransfer(value, 8, "亿", decimal, removeZero)
    }
  }
  return outputVal
}

//保留两位小数
export function processingData(data,length){
  data=Number(data);
  data=Number((parseInt(data * 100) / 100).toFixed((length!=undefined?length:2)))
  data=data+''
  return data
}

import moment from "moment"
export function $formatTime (time, format = "YYYY-MM-DD HH:mm:ss") {
  if (time && time !== "--") {
    if (format === "timestamp") {
      return Number(moment(time).utcOffset(8).format("x"))
    }
    return moment(time).format(format)
  }
  return time
}

四、父组件调用

import flowFunnel from "./components/flowFunnel.vue";

  components:{
    flowFunnel,
  },

 

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

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

相关文章

家政服务小程序制作教程:从设计到开发的详细步骤

在当今的数字化时代&#xff0c;小程序已经成为了一种趋势&#xff0c;不仅提供了方便快捷的应用体验&#xff0c;也成为了各种行业进行营销和客户管理的有力工具。特别是对于家政行业&#xff0c;通过小程序的应用&#xff0c;可以更好地进行业务管理&#xff0c;提升服务质量…

自动化PLC工程师能否转到c#上位机开发?

成功从自动化PLC工程师转向C#上位机开发的经历可能因人而异&#xff0c;以下是一些分享的思路和建议&#xff1a;扩展编程技能&#xff1a;学习C#语言和相关的开发工具和框架&#xff0c;掌握语言的基础知识和常用的编程技巧。可以通过在线教程、培训课程、书籍等途径进行学习&…

深度学习-4-二维目标检测-YOLOv3理论模型

单阶段目标检测模型YOLOv3 R-CNN系列算法需要先产生候选区域&#xff0c;再对候选区域做分类和位置坐标的预测&#xff0c;这类算法被称为两阶段目标检测算法。近几年&#xff0c;很多研究人员相继提出一系列单阶段的检测算法&#xff0c;只需要一个网络即可同时产生候选区域并…

基于数据湖的多流拼接方案-HUDI实操篇

目录 一、前情提要 二、代码Demo &#xff08;一&#xff09;多写问题 &#xff08;二&#xff09;如果要两个流写一个表&#xff0c;这种情况怎么处理&#xff1f; &#xff08;三&#xff09;测试结果 三、后序 一、前情提要 基于数据湖对两条实时流进行拼接&#xff0…

AI代码生成辅助工具

有许多AI代码生成辅助工具和平台可用&#xff0c;它们可以帮助开发人员生成、优化和理解代码。以下是一些常见的AI代码生成辅助工具&#xff0c;以及它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交…

大规模网络爬虫系统架构设计 - 云计算和Docker部署

在大规模网络爬虫系统中&#xff0c;合理的架构设计和高效的部署方式是确保系统稳定性和可扩展性的关键。本文将介绍如何利用云计算和Docker技术进行大规模网络爬虫系统的架构设计和部署&#xff0c;帮助你构建高效、可靠的爬虫系统。 1、架构设计原则 在设计大规模网络爬虫系…

字符设备驱动(内核态用户态内存交互)

前言 内核驱动&#xff1a;运行在内核态的动态模块&#xff0c;遵循内核模块框架接口&#xff0c;更倾向于插件。 应用程序&#xff1a;运行在用户态的进程。 应用程序与内核驱动交互通过既定接口&#xff0c;内核态和用户态访问依然遵循内核既定接口。 环境搭建 系统&#…

安防监控视频平台EasyCVR视频汇聚平台调用接口出现跨域现象的问题解决方案

视频监控汇聚EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视…

科技云报道:软件供应链安全如此重要,但为什么难以解决?

科技云报道原创。 软件供应链安全如今已经成了一个世界性难题。从2021年底Apache Log4j“核弹级”风险爆发&#xff0c;时至今日影响仍然存在&#xff0c;保障软件供应链安全已成为业界关注焦点。 但近2年时间过去了&#xff0c;软件供应链安全问题似乎并没有得以缓解&#x…

微服务事务管理(Dubbo)

Seata 是什么 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 一、示例架构说明 可在此查看本示例完整代码地址&#x…

FreeSWITCH 1.10.10 简单图形化界面6 - 配置讯时网关落地

FreeSWITCH 1.10.10 简单图形化界面6 - 配置讯时网关落地 0、 界面预览1、 创建一个话务台2、 创建PBX SIP中继并设置呼入权限3、 设置呼叫权限4、 设置分机呼出权限5、 设置FXO 网关相关信息6、 设置FXO网关呼叫路由&#xff08;呼入及呼出&#xff09;7、 查看SIP中继状态 0、…

研磨设计模式day15策略模式

场景 问题描述 经常会有这样的需要&#xff0c;在不同的时候&#xff0c;要使用不同的计算方式。 解决方案 策略模式 定义&#xff1a; 解决思路&#xff1a;

HEGERLS智能四向穿梭车是如何解决机械制造领域内SKU种类复杂且量多的问题?

伴随着电子商务和智能制造技术的快速发展&#xff0c;对于自动化立体仓库系统、密集存储系统、自动输送系统、自动识别系统、无线通讯系统、条码扫描、手持终端及其系统集成的需求急剧增加&#xff0c;物流装备系统密集化、自动化、智能化、绿色环保等技术特征日益明显。密集存…

简单的springboot应用部署后内存占用量过大问题排查

1.问题背景 需要部署一个演示环境。所有组件都要部署到一台服务器&#xff0c;采用Docker容器部署&#xff0c;发现多个简单的springboot应用占用内存高达2G&#xff0c;后续的应用因为内存不足就部署不了了。排查下内存占用大的原因&#xff1a; docker stats命令&#xff1a…

ucharts修改ToolTip边框阴影文字居中

ucharts修改ToolTip边框阴影文字居中 效果 Demo 链接&#xff1a; https://pan.baidu.com/s/1k0FxmBPKAHlHksFR3YQSlQ 提取码&#xff1a;ytv7

在vue.config.js中配置文件路径代理名

今天在公司项目中看到一个非常有趣的导入路径 crud 先是一蒙 这是个啥 突然想起一个被自己遗漏的知识点 在vue.config.js中配置路径指向 这里 我们随便找一个vue项目 在src下找到 components 目录 如果没有就创建一个 下面找到HelloWorld.vue 如果没有也是自己创建一个就好 然…

LabVIEW开发异步电动机定子故障在线诊断系统

LabVIEW开发异步电动机定子故障在线诊断系统 三相感应电机&#xff08;IM&#xff09;因其简单性、坚固性和可靠性而广泛用于许多工业应用。然而&#xff0c;对于需要高可靠性的特定领域&#xff0c;如汽车、航空航天、军事和核能&#xff0c;使用经典的三相IM似乎不再适用&am…

JavaScript函数复习

这节课我们来通过我们之前学过的函数来逐渐完善&#xff01; const yearsUntilRetiremen (birthyear, firstName) > {const age 2037 - birthyear;const retirement 65 - age;return ${firstName}还有${retirement}年就退休了&#xff01;;}这个是我们之前写的代码&…

循环结构(个人学习笔记黑马学习)

while循环语句 在屏幕中打印0~9这十个数字 #include <iostream> using namespace std;int main() {int i 0;while (i < 10) {cout << i << endl;i;}system("pause");return 0; } 练习案例: 猜数字 案例描述:系统随机生成一个1到100之间的数字&…

数字电路-二进制学习

什么是二进制&#xff1f; 数字电路 中 只有 高电平 和低电平 就是 1 和0 进位规则是“逢二进一”&#xff0c;借位规则是“借一当二”。 二进制、八进制 、十进制、十六进制 二进制 有两个数来表示 &#xff1a; 0、1 八进制 有8个数来表示 &#xff1a; 0、1、2、3、4、…