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

这个需求是根据点击左侧的箭头部分,右侧图表切换,左侧选中数据高亮(图片用的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,
  },

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于TSO-XGBoost金枪鱼算…

基于YOLO v5的病虫害检测与优化

《A fast and lightweight detection algorithm for passion fruit pests based on improved YOLOv5》 a new point-line distance loss function is proposed to reduce redundant computations and shorten detection timethe attention module is added to the network for…

【人工智能】—_神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵&#xff08;Cros…

设计模式行为型-模板模式

文章目录 一&#xff1a;模板方法设计模式概述1.1 简介1.2 定义和目的1.3 关键特点1.4 适用场景 二&#xff1a;模板方法设计模式基本原理2.1 抽象类2.1.1 定义和作用2.1.2 模板方法2.1.3 具体方法 2.2 具体类2.2.1 定义和作用2.2.2 实现抽象类中的抽象方法2.2.3 覆盖钩子方法 …

3.1.6 练习 基于GPA排名计算本专业保研名单

C自学精简教程 目录(必读) GPA概念回顾 平均学分绩点GPA(Grade Point Average)是对一个学生大学学习成绩的综合的衡量指标。 在前面的文章 本科生学分绩点GPA计算 中&#xff0c;我们知道了什么是平均学分绩点GPA&#xff0c;以及如何计算它。 基于GPA给学生排名 现在我们…

OB Cloud助力泡泡玛特打造新一代分布式抽盒机系统

作为中国潮玩行业的领先者&#xff0c;泡泡玛特凭借 MOLLY、DIMOO、SKULLPANDA 等爆款 IP&#xff0c;以及线上线下全渠道营销收获了千万年轻人的喜爱&#xff0c;会员数达到 2600 多万。2022 年&#xff0c;泡泡玛特实现 46.2 亿元营收&#xff0c;其中线上渠道营收占比 41.8%…

ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图

文章目录 1 AMD 引用 ArcGIS Maps SDK for JavaScript2 加载相应模块3 创建地图4 创建 2D 视图 view5 确定页面内容6 CSS 样式7 完整代码 本教程使用 AMD 模块&#xff0c;指导您如何在二维地图视图中创建一个简单的地图。 1 AMD 引用 ArcGIS Maps SDK for JavaScript 在 <…

智慧电力方案:安防监控/视频分析/智能分析网关AI识别技术在电力领域中的应用

一、行业痛点 随着经济的飞速发展&#xff0c;电力已经是人们生活中必不可少的&#xff0c;无论是在生活还是工作中&#xff0c;电的存在都是不可或缺的。但电力的高效运维&#xff0c;一直是一个难题&#xff0c;当前普通的电力运维系统已无法满足人们的管理需求&#xff0c;…

宏基官网下载的驱动怎么安装(宏基笔记本如何安装系统)

本文为大家介绍宏基官网下载的驱动怎么安装宏基笔记本驱动(宏基笔记本如何安装系统)&#xff0c;下面和小编一起看看详细内容吧。 宏碁笔记本怎么一键更新驱动 1. 单击“开始”&#xff0c;然后选择“所有程序”。 2. 单击Acer&#xff0c;然后单击Acer eRecovery Management。…

Hive3第六章:更换引擎

系列文章目录 Hive3第一章&#xff1a;环境安装 Hive3第二章&#xff1a;简单交互 Hive3第三章&#xff1a;DML数据操作 Hive3第三章&#xff1a;DML数据操作(二) Hive3第四章&#xff1a;分区表和分桶表 Hive3第五章&#xff1a;函数 Hive3第六章&#xff1a;更换引擎 文章目…

stable diffusion实践操作-embedding(TEXTUAL INVERSION)

本文专门开一节写图生图相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 中文名为文本反转&#xff0c;可以理解为提示词的集合&#xff0c;提示词打包&#xff0c;可以省略大量的提示词。后缀safetensors&#xff0c;大小几十…

15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized

Synchronized 本篇文章将围绕synchronized关键字&#xff0c;使用大量图片、案例深入浅出的描述CAS、synchronized Java层面和C层面的实现、锁升级的原理、源码等 大概观看时间17分钟 可以带着几个问题去查看本文&#xff0c;如果认真看完&#xff0c;问题都会迎刃而解&…

【CI/CD技术专题】「Docker实战系列」本地进行生成镜像以及标签Tag推送到DockerHub

背景介绍 Docker镜像构建成功后&#xff0c;只要有docker环境就可以使用&#xff0c;但必须将镜像推送到Docker Hub上去。创建的镜像最好要符合Docker Hub的tag要求&#xff0c;因为在Docker Hub注册的用户名是liboware&#xff0c;最后利用docker push命令推送镜像到公共仓库…

实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

ITIL 4—创建、交付和支持—利用信息和技术创建、交付和支持服务

3.1 集成和数据共享 服务设计通常依赖于多个系统之间的集成&#xff08;integration&#xff09;&#xff0c;在这种情况下&#xff0c;理解集成建模的不同层次相当重要。例如&#xff1a; 应用程序级 应用程序之间是相互交互的。企业级 已集成的应用程序共同提供价值。业务…

无涯教程-JavaScript - GAMMADIST函数

GAMMADIST函数取代了Excel 2010中的GAMMA.DIST函数。 描述 该函数返回伽马分布。您可以使用此功能来研究可能具有偏斜分布的变量。伽马分布通常用于排队分析。 语法 GAMMADIST(x,alpha,beta,cumulative)争论 Argument描述Required/OptionalXThe value at which you want t…

手摸手2-springboot编写基础的增删改查

目录 手摸手2-springboot编写基础的增删改查创建controller层添加service层接口service层实现添加mapper层mapper层对应的sql添加扫描注解,对应sql文件的目录 手摸手2-springboot编写基础的增删改查 创建controller层 实现 test 表中的添加、修改、删除及列表查询接口&#x…

技术领导力实战笔记25

25&#xff5c;用心做好“鼓励式”管理 激发正能量 授权 分工作&#xff1a; 老人干新事&#xff0c;新人干老事&#xff0c;强者干难事&#xff0c;弱者干细事 新人干老事 所谓新人&#xff0c;是对业务产品不了解&#xff0c;对工作流程不清晰的岗位新人。对于新人来说&…

java八股文面试[多线程]——线程间通信方式

多个线程在并发执行的时候&#xff0c;他们在CPU中是随机切换执行的&#xff0c;这个时候我们想多个线程一起来完成一件任务&#xff0c;这个时候我们就需要线程之间的通信了&#xff0c;多个线程一起来完成一个任务&#xff0c;线程通信一般有4种方式&#xff1a; 通过 volat…

解决Linux Ubuntu上安装RabbitMQ服务后的公网远程访问问题,借助cpolar内网穿透技术

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…