Vue2里CSS动画实际应用之transform属性和animation属性的使用

在这里插入图片描述
最近项目需要做个简单的动画,如上图,框出来的图片需要上下浮动在Y轴上来回循环的移动,这个要用到如下css代码:

.active-image-7 {
    animation: 5s float7 linear infinite normal;
 }
 @keyframes float7{
          0% {
            transform: translateY(0px);
          }
          50% {
            transform: translateY(-10px);
          }
          100% {
            transform: translateY(0px);
          }
 }

然后红色箭头处是来回循环的从左到右的循环往复流动的线条,UI给到的图是png格式的静态图片,如下图icon-line.png:
请添加图片描述

这就需要我们写CSS让其动起来。代码如下:

.active-part-11 {
    animation: 9s rowup11 linear infinite normal;
    position: absolute;
    top: 0;
    left: 0;
}
 @keyframes rowup11 {
          0% {
                transform: translateX(-70px);
          }
       
          100% {
                transform: translateX(60px);
                display: none;
          }
 }

思路就是上面的思路了,由于我们页面上有很多种这些需要浮动的图片和线条,我们在template里需要v-for分别对deviceList和lineList进行遍历,然后在mounted里调用封装的动画方法addImageAnimation,需注意的是我们在addImageAnimation方法里通过 document.getElementsByClassName(“topo-chart-item”)获取dom节点,然后forEach遍历分别加动画样式,这里还涉及到了document.createElement(“style”)创建style元素,调用封装的randomNum方法等,当前组件完整代码如下:

<template>
  <div class="topo-chart">
    <div
      class="tip-wrapper"
      :style="{ top: item.top + 'px', left: item.left + 'px' }"
      v-for="(item, index) in tipList"
      :key="index + item.left"
    >
      {{ item.label }}
    </div>
    <div
      class="topo-chart-item"
      :class="'active-image-' + index"
      v-show="!item.isHidden"
      v-for="(item, index) in deviceList"
      v-if="!item.isHidden"
      :key="index + item.top + item.left"
      :style="{ left: item.left + 'px', top: item.top + 'px' }"
    >
      <img
        class="topo-chart-item-image"
        @click="clickImage(item)"
        :src="item.unnormal ? item.unnormalUrl : item.url"
        :style="{ width: item.ImgWidth + 'px', height: item.ImgHeight + 'px' }"
      />
      <div class="count-wrapper" v-if="item.count">
        <span class="normal-count">{{ item.count.normal }}</span>
        <span class="unnormal-count">{{ item.count.unnormal }}</span>
      </div>
      <div class="device-count-wrapper" v-if="item.deviceCount">
        <span class="device-count">{{ item.deviceCount.count }}</span>
      </div>
      <p class="text-style">{{ item.label }}</p>
      <p class="count-style" v-if="item.mainCount">
        {{ item.mainCount.count }}
      </p>
    </div>
    <div
      class="topo-chart-line"
      v-for="(item, index) in lineList"
      :key="index"
      :style="{
        top: item.top + 'px',
        left: item.left + 'px',
        width: item.width + 'px',
        height: item.height + 'px',
        transform: item.deg ? `rotate(${item.deg}deg)` : 'none',
      }"
      v-show="!item.isHidden"
    >
      <img
        class="active-part"
        :style="{
          transform: item.width > item.height ? 'none' : `rotate(90deg)`,
        }"
        :class="'active-part-' + index"
        :src="
          item.normal
            ? require('@/assets/images/devices/icon-line.png')
            : require('@/assets/images/devices/icon-line-abnormal.png')
        "
        alt=""
      />
    </div>
    <div class="legend-wrapper">
      <div class="legend-wrapper-line">
        <img
          class="legend-wrapper-line-image"
          src="@/assets/images/devices/icon-line.png"
          alt=""
        />
        <p class="text">网络流向</p>
      </div>
      <div class="legend-wrapper-line">
        <img
          class="legend-wrapper-line-image"
          src="@/assets/images/devices/icon-line-abnormal.png"
          alt=""
        />
        <p class="text">网络异常</p>
      </div>
      <div class="legend-wrapper-text">
        <div class="run-count">
          <span class="signal">x</span>
          <span>运行数量</span>
        </div>
        <div class="online-count">
          <span class="signal">x</span>
          <span>在线数量</span>
        </div>
        <div class="offline-count">
          <span class="signal">x</span>
          <span>离线数量</span>
        </div>
      </div>
    </div>
    <div
      class="back-wrapper"
      v-if="
        showBackButton && (configLevel !== 'third' || configLevel !== 'second')
      "
      @click="goBack()"
    >
      <img src="@/assets/images/tupu/map-arrow.png" alt="" />
      <p class="back-text">返回上级</p>
    </div>
    <div class="assets-list-modal" v-if="showModal">
      <div class="assets-list-modal-top">
        <p class="fonts">{{ clickItem.typeName }}</p>
        <img
          class="arrow"
          src="@/assets/images/devices/icon-arrow-1.png"
          alt=""
        />
        <p class="fonts">视频网</p>
        <p class="fonts data-text">{{ clickItem.label }}</p>
        <img
          class="close"
          @click="closeModal"
          src="@/assets/images/devices/icon-close.png"
          alt=""
        />
      </div>
      <div class="assets-list-modal-detail">
        <div class="wrapper">
          <img
            class="image"
            src="@/assets/images/devices/icon-total.png"
            alt=""
          />
          <p>
            <span class="label">边界总数</span>
            <span class="count" @click="clickTotal">{{
              activeNumber.bjNum
            }}</span>
            <span class="unit"></span>
          </p>
        </div>
        <div class="wrapper">
          <img
            class="image"
            src="@/assets/images/devices/icon-online.png"
            alt=""
          />
          <p>
            <span class="label">在线边界</span>
            <span class="count" @click="clickOnline">{{
              activeNumber.zxbjNum
            }}</span>
            <span class="unit"></span>
          </p>
        </div>
        <div class="wrapper">
          <img
            class="image"
            src="@/assets/images/devices/icon-offline.png"
            alt=""
          />
          <p>
            <span class="label">离线边界</span>
            <span class="count" @click="clickOffline">{{
              activeNumber.lxbjNum
            }}</span>
            <span class="unit"></span>
          </p>
        </div>
      </div>
      <div class="assets-list-modal-table">
        <div class="table-header">
          <p class="header-text" style="width: 15%">状态</p>
          <p class="header-text" style="width: 35%">边界名称</p>
          <p class="header-text" style="width: 35%">边界走向</p>
          <p class="header-text" style="width: 15%">业务总数</p>
        </div>
        <div class="table-body">
          <div @click="clickTableItem($event)" v-if="tableData.length > 0">
            <vue-seamless-scroll
              :data="tableData"
              class="seamless-warp"
              :class-option="classOption"
            >
              <ul>
                <li
                  class="Carousel_li"
                  v-for="(item, index) in tableData"
                  :key="index"
                  :data-item="JSON.stringify(item)"
                >
                  <div class="first">
                    <p class="header-text status" style="width: 15%">
                      <img
                        class="body-image"
                        :src="
                          item.status == 0
                            ? require('@/assets/images/devices/icon-online.png')
                            : require('@/assets/images/devices/icon-offline.png')
                        "
                        alt=""
                      />
                      <span>{{ item.status == 0 ? "在线" : "离线" }}</span>
                    </p>
                    <p class="header-text" style="width: 35%">
                      {{ item.borderName }}
                    </p>
                    <p class="header-text" style="width: 35%">
                      {{ item.borderTrend }}
                    </p>
                    <p class="header-text" style="width: 15%">
                      {{ item.ywNum }}
                    </p>
                  </div>
                </li>
              </ul>
            </vue-seamless-scroll>
          </div>
          <div class="no-data-style" v-else>暂无数据</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
const x = 100;
const y = 100;
import { getModalData } from "@/api/assets-topo.js";
export default {
  computed: {
    classOption() {
      return {
        step: 0.5, // 数值越大速度滚动越快
        // limitMoveNum: 10, // 开始无缝滚动的数据量 this.dataList.length
        hoverStop: true, // 是否开启鼠标悬停stop
        direction: 1, // 0向下 1向上 2向左 3向右
        // openWatch: true, // 开启数据实时监控刷新dom
        singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
        singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
        waitTime: 1000, // 单步运动停止的时间(默认值1000ms)
      };
    },
  },
  props: {
    centerTopoData: {
      type: Object,
      default: () => {},
    },
  },
  watch: {
    centerTopoData(val) {
      this.deviceList[0].count = {
        normal: val.hlwSjZxNum,
        unnormal: val.hlwSjLxNum,
      };
      this.deviceList[1].count = {
        normal: val.hlwSpZxNum,
        unnormal: val.hlwSpLxNum,
      };
      this.deviceList[2].count = {
        normal: val.qtzwSjZxNum,
        unnormal: val.qtzwSjLxNum,
      };
      this.deviceList[3].count = {
        normal: val.qtzwSpZxNum,
        unnormal: val.qtzwSpLxNum,
      };
      this.deviceList[4].deviceCount = { count: val.zrkzsbNum };
      this.deviceList[5].deviceCount = { count: val.spjkNum };
      this.deviceList[6].mainCount = { count: val.hlwNum };
      this.deviceList[7].mainCount = { count: val.qtzwNum };
      this.dealAllData(val);
    },
    level(val) {
      this.setLevel(val);
    },
  },
  data() {
    return {
      deviceList: [
        // index 0 互联网行
        {
          left: x + 510,
          top: y + 50,
          unnormal: false,
          label: "数据边界",
          count: { normal: 0, unnormal: 0 },
          typeName: "互联网",
          isClick: true,
          typeId: 1,
          url: require("@/assets/images/devices/icon-data.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-data-grey.png"),
          ImgWidth: 180,
          ImgHeight: 144,
        },
        // index 1 互联网行
        {
          left: x + 510,
          top: y + 210,
          unnormal: false,
          label: "视频边界",
          count: { normal: 0, unnormal: 0 },
          typeName: "互联网",
          isClick: true,
          typeId: 2,
          url: require("@/assets/images/devices/icon-video.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-video-grey.png"),
          ImgWidth: 180,
          ImgHeight: 144,
        },
        // index 2 其他专网行
        {
          left: x + 510,
          top: y + 380,
          unnormal: false,
          label: "数据边界",
          count: { normal: 0, unnormal: 0 },
          typeName: "其他专网",
          isClick: true,
          typeId: 3,
          url: require("@/assets/images/devices/icon-data.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-data-grey.png"),
          ImgWidth: 180,
          ImgHeight: 144,
        },
        // index 3 其他专网行
        {
          left: x + 510,
          top: y + 550,
          unnormal: false,
          label: "视频边界",
          count: { normal: 0, unnormal: 0 },
          typeName: "其他专网",
          isClick: true,
          typeId: 4,
          url: require("@/assets/images/devices/icon-video.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-video-grey.png"),
          ImgWidth: 180,
          ImgHeight: 144,
        },
        // index 4 后置行
        {
          left: x + 950,
          top: y + 400,
          unnormal: false,
          label: "准入控制",
          deviceCount: { count: 0 },
          typeName: "后置",
          isHidden: true,
          url: require("@/assets/images/devices/icon-NAC.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-NAC-grey.png"),
          ImgWidth: 120,
          ImgHeight: 112,
        },
        // index 5 后置行
        {
          left: x + 1250,
          top: y + 270,
          unnormal: false,
          label: "视频监控",
          deviceCount: { count: 0 },
          typeName: "后置",
          url: require("@/assets/images/devices/icon-monitoring.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-monitoring-grey.png"),
          ImgWidth: 120,
          ImgHeight: 112,
        },
        // index 6 互联网行
        {
          left: x,
          top: y + 130,
          unnormal: false,
          label: "互联网接入单位",
          mainCount: { count: 0 },
          typeName: "互联网",
          url: require("@/assets/images/devices/icon-Internet.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-Internet-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 7 其他专网行
        {
          left: x,
          top: y + 500,
          unnormal: false,
          label: "其他专网接入单位",
          mainCount: { count: 0 },
          typeName: "其他专网",
          url: require("@/assets/images/devices/icon-other.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-other-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 8 互联网行
        {
          left: x + 170,
          top: y + 130,
          unnormal: false,
          label: "防火墙",
          typeName: "互联网",
          url: require("@/assets/images/devices/icon-fw01.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-fw01-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 9 互联网行
        {
          left: x + 350,
          top: y,
          unnormal: false,
          label: "入侵检测",
          typeName: "互联网",
          url: require("@/assets/images/devices/icon-IDS.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-IDS-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 10 互联网行
        {
          left: x + 350,
          top: y + 130,
          unnormal: false,
          label: "交换机",
          typeName: "互联网",
          url: require("@/assets/images/devices/icon-switch01.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-switch01-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 11 互联网行
        {
          left: x + 350,
          top: y + 250,
          unnormal: false,
          label: "集控探针",
          typeName: "互联网",
          url: require("@/assets/images/devices/icon-probe.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-probe-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },

        {
          left: x + 750,
          top: y + 50,
          unnormal: false,
          label: "上级共享平台",
          isHidden: false,
          url: require("@/assets/images/devices/icon-up-down.png"),
          ImgWidth: 160,
          ImgHeight: 115,
        },
        {
          left: x + 750,
          top: y + 250,
          unnormal: false,
          label: "本级共享平台",
          url: require("@/assets/images/devices/icon-this.png"),
          ImgWidth: 180,
          ImgHeight: 135,
        },
        {
          left: x + 750,
          top: y + 450,
          unnormal: false,
          label: "下级共享平台",
          isHidden: false,
          url: require("@/assets/images/devices/icon-up-down.png"),
          ImgWidth: 160,
          ImgHeight: 115,
        },
        // index 15 其他专网行
        {
          left: x + 170,
          top: y + 500,
          unnormal: false,
          label: "防火墙",
          typeName: "其他专网",
          url: require("@/assets/images/devices/icon-fw01.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-fw01-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 16 其他专网行
        {
          left: x + 350,
          top: y + 370,
          unnormal: false,
          label: "入侵检测",
          typeName: "其他专网",
          url: require("@/assets/images/devices/icon-IDS.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-IDS-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 17 其他专网行
        {
          left: x + 350,
          top: y + 500,
          unnormal: false,
          label: "交换机",
          typeName: "其他专网",
          url: require("@/assets/images/devices/icon-switch01.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-switch01-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },
        // index 18 其他专网行
        {
          left: x + 350,
          top: y + 620,
          unnormal: false,
          label: "集控探针",
          typeName: "其他专网",
          url: require("@/assets/images/devices/icon-probe.png"),
          unnormalUrl: require("@/assets/images/devices/unnormal/icon-probe-grey.png"),
          ImgWidth: 150,
          ImgHeight: 120,
        },

        {
          left: x + 950,
          top: y + 270,
          unnormal: false,
          label: "交换机",
          url: require("@/assets/images/devices/icon-switch02.png"),
          ImgWidth: 120,
          ImgHeight: 112,
        },
        {
          left: x + 1100,
          top: y + 270,
          unnormal: false,
          label: "防火墙",
          url: require("@/assets/images/devices/icon-fw02.png"),
          ImgWidth: 120,
          ImgHeight: 112,
        },
      ],
      lineList: [
        // index 0 互联网-->防火墙
        {
          left: x + 130,
          top: y + 170,
          width: 60,
          height: 4,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 1 防火墙--> 交换机
        {
          left: x + 300,
          top: y + 170,
          width: 60,
          height: 4,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 2 防火墙--> 入侵检测
        {
          left: x + 290,
          top: y + 110,
          width: 110,
          height: 4,
          deg: -45,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 3 防火墙--> 集控探针
        {
          left: x + 290,
          top: y + 225,
          width: 110,
          height: 4,
          deg: 45,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 4 交换机 --> 视频边界
        {
          left: x + 450,
          top: y + 225,
          width: 100,
          height: 4,
          deg: 45,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 5 交换机 --> 数据边界
        {
          left: x + 460,
          top: y + 140,
          width: 60,
          height: 4,
          deg: -30,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 6 数据边界--> 本级平台
        {
          left: x + 620,
          top: y + 225,
          width: 200,
          height: 4,
          deg: 45,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 7 视频边界--> 本级平台
        {
          left: x + 650,
          top: y + 285,
          width: 100,
          height: 4,
          deg: 15,
          isHidden: false,
          normal: true,
          tag: "互联网",
        },
        // index 8 本级平台 --> 上级平台
        {
          left: x + 785,
          top: y + 200,
          width: 100,
          height: 4,
          deg: -90,
          isHidden: false,
          normal: true,
        },
        // index 9 本级平台 --> 下级平台
        {
          left: x + 795,
          top: y + 410,
          width: 70,
          height: 4,
          deg: 90,
          isHidden: false,
          normal: true,
        },
        // index 10 本级平台 --> 交换机
        {
          left: x + 910,
          top: y + 315,
          width: 60,
          height: 4,
          isHidden: false,
          normal: true,
        },
        // index 11 交换机 --> 防火墙
        {
          left: x + 1050,
          top: y + 315,
          width: 60,
          height: 4,
          isHidden: false,
          normal: true,
        },
        // index 12 防火墙 --> 视频监控
        {
          left: x + 1190,
          top: y + 315,
          width: 60,
          height: 4,
          isHidden: false,
          normal: true,
        },
        // index 13 交换机 --> 准入控制
        {
          left: x + 980,
          top: y + 385,
          width: 50,
          height: 4,
          deg: 90,
          isHidden: true,
          normal: true,
        },
        // ********* index 14 其他专网 --> 防火墙
        {
          left: x + 130,
          top: y + 540,
          width: 60,
          height: 4,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
        // index 15防火墙 --> 交换机
        {
          left: x + 300,
          top: y + 540,
          width: 60,
          height: 4,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
        // index 16 防火墙 --> 入侵检测
        {
          left: x + 290,
          top: y + 480,
          width: 110,
          height: 4,
          deg: -45,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
        // index 17 防火墙 --> 集控探针
        {
          left: x + 260,
          top: y + 595,
          width: 130,
          height: 4,
          deg: 45,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
        // index 18 交换机 --> 视频边界
        {
          left: x + 450,
          top: y + 580,
          width: 110,
          height: 4,
          deg: 30,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
        // index 19 交换机 --> 数据边界
        {
          left: x + 450,
          top: y + 480,
          width: 80,
          height: 4,
          deg: -40,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
        // index 20 视频边界 --> 本级平台
        {
          left: x + 600,
          top: y + 450,
          width: 250,
          height: 4,
          deg: -55,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
        // index 21 数据边界 --> 本级平台
        {
          left: x + 650,
          top: y + 380,
          width: 120,
          height: 4,
          deg: -25,
          isHidden: false,
          normal: true,
          tag: "其他专网",
        },
      ],
      tipList: [
        { label: "接入对象", left: x + 50, top: y - 35 },
        { label: "边界保护服务区", left: x + 365, top: y - 35 },
        { label: "安全隔离区", left: x + 545, top: y - 35 },
        { label: "视频专网", left: x + 780, top: y - 35 },
      ],
      parentId: "",
      showBackButton: false,
      level: "",
      currentLevel: "first",
      currentItem: {},
      showModal: false,
      clickItem: {
        count: { normal: 0, unnormal: 0 },
      },
      currentNation: window.g.activeAreaCode,
      activeNumber: {},
      tableData: [],
      currentTypeId: "",
      configLevel: window.g.topoLevel,
    };
  },
  methods: {
    randomNum(minNum, maxNum) {
      switch (arguments.length) {
        case 1:
          return parseInt(Math.random() * minNum + 1, 10);
          break;
        case 2:
          return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
          break;
        default:
          return 0;
          break;
      }
    },
    addLineAnimation() {
      const line = document.getElementsByClassName("active-part");
      const domList = [];
      for (let i = 0; i < line.length; i++) {
        domList[i] = line[i];
      }
      domList.forEach((item, index) => {
        const p = item.parentNode;
        const width = p.style.width;
        // 关键帧动画
        const runkeyframes = ` @keyframes ${"rowup" + index} {
          0% {
            transform: translateX(-70px);
          }
          100% {
            transform: translateX(${width});
            display: none;
          }
        }`;
        const style = document.createElement("style");
        const randomTime = this.randomNum(3, 10);
        const styleObj = `.active-part-${index} { animation: ${randomTime}s rowup${index} linear infinite normal;position: absolute;top: 0;left:0;}`;
        style.type = "text/css";
        style.innerHTML =
          runkeyframes + "\n" + JSON.stringify(styleObj).replace('"', ""); // 将字符串换行并生成css文本格式
        item.appendChild(style);
      });
    },
    addImageAnimation() {
      const line = document.getElementsByClassName("topo-chart-item");
      const domList = [];
      for (let i = 0; i < line.length; i++) {
        domList[i] = line[i];
      }
      domList.forEach((item, index) => {
        // 关键帧动画
        const runkeyframes = `@keyframes ${"float" + index} {
          0% {
            transform: translateY(0px);
          }
          50% {
            transform: translateY(-10px);
          }
          100% {
            transform: translateY(0px);
          }
        }`;
        const style = document.createElement("style");
        const randomTime = this.randomNum(5, 8);
        const styleObj = `.active-image-${index} { animation: ${randomTime}s float${index} linear infinite normal;position: absolute;top: 0;left:0;}`;
        style.type = "text/css";
        style.innerHTML =
          runkeyframes + "\n" + JSON.stringify(styleObj).replace('"', ""); // 将字符串换行并生成css文本格式
        item.appendChild(style);
      });
    },
    setLevel(val) {
      if (val === "first") {
        // 1级 省级 无上级平台
        this.$set(this.deviceList[12], "isHidden", true);
        this.$set(this.deviceList[14], "isHidden", false);
        this.$set(this.lineList[8], "isHidden", true);
        this.$set(this.lineList[9], "isHidden", false);
      } else if (val === "second") {
        // 2级 市级  上下级平台都有
        this.$set(this.deviceList[12], "isHidden", false);
        this.$set(this.deviceList[14], "isHidden", false);
        this.$set(this.lineList[8], "isHidden", false);
        this.$set(this.lineList[9], "isHidden", false);
      } else if (val === "third") {
        // 3级 县级 无下级平台
        this.$set(this.deviceList[12], "isHidden", false);
        this.$set(this.deviceList[14], "isHidden", true);
        this.$set(this.lineList[8], "isHidden", false);
        this.$set(this.lineList[9], "isHidden", true);
      }
      this.addLineAnimation();
    },
    goBack() {
      // if (this.currentLevel === 'first') { // 返回到省级
      //   this.showBackButton = false
      //   this.$EventBus.$emit("zcchildGoBack", window.g.activeAreaCode);
      //   if (window.g.activeAreaCode === '420000') {
      //     this.level = 'first'
      //   } else {
      //     this.level = 'second'
      //   }
      //   this.currentNation = window.g.activeAreaCode
      // } else if(this.currentLevel === 'second') {
      //   this.showBackButton = true
      //   this.$EventBus.$emit("zcchildGoBack", this.currentItem.parent_id);
      //   this.currentLevel = 'first'
      //   this.level = 'second' // 级联等级
      //   this.currentNation = this.currentItem.parent_id
      // }
      this.showBackButton = false;
      this.$EventBus.$emit("zcchildGoBack", window.g.activeAreaCode);
      this.currentLevel = "first";
      if (window.g.activeAreaCode === "420000") {
        this.level = "first";
      } else {
        this.level = "second";
      }
      this.currentNation = window.g.activeAreaCode;

      // this.$EventBus.$emit("childSendData", this.nameList, 0);
    },
    dealAllData(val) {
      if (val.hlwNum == 0) {
        // 互联网数量为0 所有图标置灰 线条没有
        this.lineList.forEach((item) => {
          if (item.tag === "互联网") {
            item.isHidden = true;
          }
        });
        this.deviceList.forEach((item) => {
          if (item.typeName == "互联网") {
            item.unnormal = val.hlwNum != 0 ? false : true;
          }
        });
      } else {
        // 不为0 判断数据边界和视频边界
        // 互联网-->数据边界
        this.lineList.forEach((item) => {
          if (item.tag === "互联网") {
            item.isHidden = false;
          }
        });
        this.deviceList.forEach((item) => {
          if (item.typeName == "互联网") {
            item.unnormal = val.hlwNum != 0 ? false : true;
          }
        });
        if (val.hlwSjZxNum == 0 && val.hlwSjLxNum == 0) {
          // 如果2个值都为0 这条链路置灰
          this.deviceList[0].unnormal = true;
          this.lineList[5].isHidden = true; // 线为红色
          this.lineList[6].isHidden = true;
        } else {
          // 都不为0 或有一个为0
          if (val.hlwSjLxNum > 0) {
            this.deviceList[0].unnormal = false;
            this.lineList[5].normal = false; // 线为红色
            this.lineList[6].normal = false;
          } else {
            if (val.hlwSjZxNum > 0) {
              this.deviceList[0].unnormal = false;
              this.lineList[5].normal = true; // 线为红色
              this.lineList[6].normal = true;
            } else {
              this.deviceList[0].unnormal = true;
            }
          }
        }
        // 互联网--> 视频边界
        if (val.hlwSpZxNum == 0 && val.hlwSpLxNum == 0) {
          this.deviceList[1].unnormal = true;
          this.lineList[4].isHidden = true; // 线为红色
          this.lineList[7].isHidden = true;
        } else {
          // 都不为0 或有一个为0
          if (val.hlwSpLxNum > 0) {
            this.deviceList[1].unnormal = false;
            this.lineList[4].normal = false; // 线为红色
            this.lineList[7].normal = false;
          } else {
            if (val.hlwSpZxNum > 0) {
              this.deviceList[1].unnormal = false;
              this.lineList[4].normal = true; // 线为红色
              this.lineList[7].normal = true;
            } else {
              this.deviceList[1].unnormal = true;
            }
          }
        }
      }
      if (val.qtzwNum == 0) {
        this.lineList.forEach((item) => {
          if (item.tag === "其他专网") {
            item.isHidden = true;
          }
        });
        this.deviceList.forEach((item) => {
          if (item.typeName == "其他专网") {
            item.unnormal = val.qtzwNum != 0 ? false : true;
          }
        });
      } else {
        this.lineList.forEach((item) => {
          if (item.tag === "其他专网") {
            item.isHidden = false;
          }
        });
        this.deviceList.forEach((item) => {
          if (item.typeName == "其他专网") {
            item.unnormal = val.qtzwNum != 0 ? false : true;
          }
        });
        if (val.qtzwSjZxNum == 0 && val.qtzwSjLxNum == 0) {
          // 其他专网--> 数据边界
          this.deviceList[2].unnormal = true;
          this.lineList[19].isHidden = true;
          this.lineList[21].isHidden = true;
        } else {
          if (val.qtzwSjLxNum > 0) {
            // 如果离线数据大于0 线为红色
            this.deviceList[2].unnormal = false;
            this.lineList[19].normal = false;
            this.lineList[21].normal = false;
          } else {
            if (val.qtzwSjZxNum > 0) {
              this.deviceList[2].unnormal = false;
              this.lineList[19].normal = true;
              this.lineList[21].normal = true;
            } else {
              this.deviceList[2].unnormal = true;
            }
          }
        }
        if (val.qtzwSpZxNum == 0 && val.qtzwSpLxNum == 0) {
          // 其他专网 --> 视频边界
          this.deviceList[3].unnormal = true;
          this.lineList[18].isHidden = true;
          this.lineList[20].isHidden = true;
        } else {
          if (val.qtzwSpLxNum > 0) {
            // 如果离线数据大于0 线为红色
            this.deviceList[3].unnormal = false;
            this.lineList[18].normal = false;
            this.lineList[20].normal = false;
          } else {
            if (val.qtzwSpZxNum > 0) {
              this.deviceList[3].unnormal = false;
              this.lineList[18].normal = true;
              this.lineList[20].normal = true;
            } else {
              this.deviceList[3].unnormal = true;
            }
          }
        }
      }
      if (val.zrkzsbNum == 0) {
        // 准入控制
        this.deviceList[4].unnormal = true;
        this.lineList[13].isHidden = true;
      } else {
        this.deviceList[4].unnormal = false;
        this.lineList[13].isHidden = false;
      }
      if (val.spjkNum == 0) {
        // 视频监控
        this.deviceList[5].unnormal = true;
        this.lineList[12].isHidden = true;
      } else {
        this.deviceList[5].unnormal = false;
        this.lineList[12].isHidden = false;
      }
    },
    clickImage(item) {
      if (!item.isClick) return false;
      this.currentTypeId = item.typeId;
      getModalData({ nation: this.currentNation, type: item.typeId }).then(
        (res) => {
          this.showModal = true;
          this.activeNumber = res.data.zctsTppopVo;
          this.tableData = res.data.zctsTppopVo.itemList || [];
        }
      );
      this.clickItem = item;
    },
    closeModal() {
      this.showModal = false;
    },
    clickTableItem(e) {
      if (!e.target.parentNode.parentNode.dataset.item) {
        return;
      }
      const item = JSON.parse(e.target.parentNode.parentNode.dataset.item);
      var dataT = {
        linkId: item.borderId,
        linkType: "",
      };
      this.$router.push({ name: "bj_detail", query: dataT });
    },
    clickTotal() {
      console.log(this.currentNation);
      this.$router.push({
        name: "assets_search",
        params: {
          nation: this.currentNation,
          dataEx: JSON.stringify({ borderType: this.currentTypeId }),
          tabIndex: "3",
        },
      });
    },
    clickOnline() {
      this.$router.push({
        name: "assets_search",
        params: {
          nation: this.currentNation,
          dataEx: JSON.stringify({
            borderType: this.currentTypeId,
            runStatus: 0,
          }),
          tabIndex: "3",
        },
      });
    },
    clickOffline() {
      this.$router.push({
        name: "assets_search",
        params: {
          nation: this.currentNation,
          dataEx: JSON.stringify({
            borderType: this.currentTypeId,
            runStatus: 1,
          }),
          tabIndex: "3",
        },
      });
    },
  },
  created() {
    this.$EventBus.$on("zcshowBackButton", (data, item, notShowButton) => {
      this.currentLevel = data;
      this.currentItem = item;
      this.currentNation =
        item.nation_code == "x" ? item.parent_id : item.nation_code;
      if (notShowButton) {
        this.showBackButton = false;
      } else {
        this.showBackButton = true;
      }
      // if (item.nation_code === window.g.activeAreaCode) {
      //   this.showBackButton = false
      // }
      // if (item.nation_code) {
      //   this.currentNation = item.nation_code
      // }
    });
    this.$EventBus.$on("zcgetCurrentLevel", (level) => {
      this.level = level;
    });
  },
  mounted() {
    this.$nextTick(() => {
      this.addImageAnimation();
    });
    $(document).mouseup((e) => {
      var _con = $(".assets-list-modal"); // 设置目标区域
      if (!_con.is(e.target) && _con.has(e.target).length === 0) {
        // Mark 1
        this.showModal = false;
      }
    });
  },
  beforeDestroy() {
    this.$EventBus.$off("zcshowBackButton");
    this.$EventBus.$off("zcchildGoBack");
    this.$EventBus.$off("zcgetCurrentLevel");
  },
};
</script>
<style lang="less" scoped>
.topo-chart {
  width: 100%;
  height: 100%;
  padding-top: 5%;
  position: relative;
  &-item {
    position: absolute;
    z-index: 2;
    &-image {
      cursor: pointer;
      transition: 0.2s linear;
    }
    &-image:hover {
      transform: scale(1.1);
    }
    .text-style {
      margin-top: -30px;
      text-align: center;
      color: #d0dfef;
    }
    .count-style {
      font-size: 20px;
      text-align: center;
      color: #d0dfef;
    }
  }
  &-line {
    position: absolute;
    z-index: 1;
    background: url("./../../../assets/images/devices/icon-back-line.png")
      no-repeat;
  }
}
.count-wrapper {
  // height: 20px;
  line-height: 20px;
  display: flex;
  // border-radius: 10px;
  border: 1px solid #6c8097;
  position: absolute;
  left: 105px;
  top: 10px;

  height: 28px;
  line-height: 28px;
  border-radius: 14px;
  font-size: 20px;
  padding-left: 5px;
  padding-right: 5px;

  .normal-count {
    padding: 0 10px 0 5px;
    color: #07f1bc;
    font-family: YouSheBiaoTiHei;
  }
  .unnormal-count {
    padding-right: 5px;
    color: #fa6c6d;
    font-family: YouSheBiaoTiHei;
  }
}
.device-count-wrapper {
  // height: 20px;
  // line-height: 20px;
  display: flex;
  // border-radius: 10px;
  border: 1px solid #6c8097;
  position: absolute;
  left: 85px;
  top: 10px;
  height: 28px;
  line-height: 28px;
  border-radius: 14px;
  font-size: 20px;
  padding-left: 5px;
  padding-right: 5px;
  .device-count {
    padding: 0 10px;
    color: #007eff;
    font-family: YouSheBiaoTiHei;
  }
}
.tip-wrapper {
  color: #d0dfef;
  font-family: YouSheBiaoTiHei;
  font-size: 18px;
  position: absolute;
}
.legend-wrapper {
  position: absolute;
  bottom: 9%;
  right: 50px;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  &-line {
    margin-bottom: 15px;
  }
  &-text {
    border: 1px solid #6c8097;
    border-radius: 14px;
    height: 28px;
    display: flex;
    line-height: 28px;
    padding: 0 10px;
    .signal {
      font-weight: bold;
      font-family: YouSheBiaoTiHei;
      font-size: 16px;
      padding: 0 10px;
    }
    .run-count {
      color: #007eff;
    }
    .online-count {
      color: #07f1bc;
    }
    .offline-count {
      color: #fa6c6d;
    }
  }
}
.back-wrapper {
  display: flex;
  flex-direction: row;
  align-items: center;
  cursor: pointer;
  position: absolute;
  right: 5%;
  top: 8%;
  p {
    margin-bottom: 18px;
    color: #fff;
    font-family: YouSheBiaoTiHei;
    font-size: 18px;
  }
}
.assets-list-modal {
  width: 800px;
  height: 450px;
  background: url("./../../../assets/images/devices/common-bg.png") no-repeat;
  position: fixed;
  top: 36%;
  left: 58%;
  transform: translate(-50%, -50%);
  z-index: 9999999;
  &-top {
    display: flex;
    position: relative;
    padding: 10px 0 0 15px;
    .fonts {
      color: #d0dfef;
      font-family: YouSheBiaoTiHei;
      font-size: 18px;
    }
    .data-text {
      margin-left: 20px;
      font-size: 16px;
      padding-top: 3px;
    }
    .arrow {
      margin-right: 10px;
      margin-left: 10px;
      width: 28px;
      height: 8px;
      margin-top: 8px;
    }
    .close {
      position: absolute;
      right: 10px;
      top: 15px;
      cursor: pointer;
    }
  }
  &-detail {
    display: flex;
    padding: 10px 0 0 0;
    .wrapper {
      display: flex;
      align-items: center;
      margin-left: 20px;
      .label {
        font-size: 14px;
        color: #fff;
        margin-left: 10px;
      }
      .unit {
        font-size: 12px;
        color: #fff;
      }
      .count {
        font-size: 22px;
        color: #fff;
        font-family: YouSheBiaoTiHei;
        margin: 0 8px;
        cursor: pointer;
      }
      .count:hover {
        color: #007eff;
      }
      .image {
        width: 20px;
        height: 20px;
        margin-top: 4px;
      }
    }
  }
  &-table {
    margin-top: 10px;
    .table-header {
      display: flex;
      margin: 0 20px;
      border-left: 6px solid #0163e8;
      border-right: 6px solid #0163e8;
      border-top: 1px solid #0163e8;
      border-bottom: 1px solid #0163e8;
      padding: 5px;
      background: rgba(1, 99, 232, 0.1);
      .header-text {
        color: #fff;
        padding-left: 5px;
      }
    }
    .table-body {
      overflow: hidden;
      margin: 0 20px;
      height: 320px;
      .status {
        display: flex;
        align-items: center;
        span {
          margin-left: 8px;
        }
      }
    }
  }
}
.no-data-style {
  text-align: center;
  color: #e9e9e9;
  padding-top: 10px;
}
.first {
  display: flex;
  font-size: 14px;
  padding: 10px 0;
  cursor: pointer;
  .header-text {
    color: #fff;
    padding-left: 5px;
  }
}
.first:hover .header-text {
  color: #0095ff;
}
// .icon-active-line {
//   position: absolute;
//   left: 0;
// }
// ::-webkit-scrollbar-track-piece { //滚动条凹槽的颜色,还可以设置边框属性
//   background-color:#f8f8f8;
// }
// ::-webkit-scrollbar {//滚动条的宽度
//   width:5px;
//   height: 0;
// }
// ::-webkit-scrollbar-thumb {//滚动条的设置
//   background-color:#dddddd;
//   background-clip:padding-box;
//   min-height:28px;
// }
// ::-webkit-scrollbar-thumb:hover {
//   background-color:#bbb;
// }
</style>

transform属性

补充一下,transform属性可以对元素进行移动、缩放、转动、拉长或拉伸。
有四个常用方法:rotate(x,y)旋转,scale(x,y)缩放,translate(x,y)移动(平移)和skew(x-angle,y-angle)倾斜。

animation属性

animation 最常用的几种属性有以下几种:

  1. animation-name(动画名称)
    animation-name属性是必须存在的,因为animation-name的值默认是none,没有动画。

  2. animation-duration(动画执行一次所需时间)
    animation-duration属性也是必须存在的,因为animation-duration的值默认是0,没有动画。

  3. animation-delay(动画在开始前的延迟时间)
    animation-delay的值可以是秒(s)或者是毫秒(ms),默认值是0,没有延迟。

  4. animation-timing-function(动画以何种运行轨迹完成一个周期)
    animation-timing-function,默认值是ease,表示动画以低速开始,然后加速,最后在结束前变慢。 最常用的值有以下几个:

(1)linear:表示动画从头到尾的速度都是相同的。
(2)ease-in:表示动画以低速开始。
(3)ease-out:表示动画以低速结束。
(4)ease-in-out:表示动画以低速开始和结束。

  1. animation-iteration-count(动画播放次数)
    animation-iteration-count属性值有两种:

(1)直接写数字,自定义想要播放动画的次数。
(2)infinite:设置动画无线循环播放。

  1. animation-fill-mode(定义元素动画结束以后或者未开始的元素样式)
    默认值为none,标示,不会在动画结束或者未开始时给元素 添加样式

常用属性值为:

(1)forwards:表示动画结束后,元素直接接使用当前样式。
(2)backwards:表示在动画延迟时间元素使用关键帧中from的属性值或者to属性值(当animation-direction为reverse或者alternate-reverse时)

  1. animation-direction(是否轮流反向播放动画)
    默认值是normal,动画正常播放。如果动画只播放一次,则该属性无效。

常用的属性值为:

(1)reverse:表示动画反向播放。
(2)alternate:表示动画在奇数次播放时为正向播放,为偶数次播放时为反向播放。
(3)alternate-reverse: :表示动画在奇数次播放时为反向播放,为偶数次播放时为正向播放。

animation属性在书写通常合并在一起,除非需要单独设置的属性值,animation属性的简写形式为:animation:code 2s 2s linear infinite alternate forwards;

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

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

相关文章

毫米波雷达阵列天线设计综合1(MATLAB仿真)

1 天线设计目标 毫米波雷达探测目标的距离、速度和角度&#xff0c;其中距离和角度和天线设计相关性较强。天线增益越高&#xff0c;则根据雷达方程可知探测距离越远&#xff1b;天线波束越窄&#xff0c;则角度分辨率越高&#xff1b;天线副瓣/旁瓣越低&#xff0c;则干扰越少…

C++第二十三弹---深入理解STL中list的使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、list的介绍 2、list的使用 2.1、构造函数 2.2、赋值操作符重载 2.3、迭代器使用 2.4、容量操作 2.5、元素访问 2.6、修改操作 2.7、其…

从0-1实现大模型

github: LLMs-from-scratch/ch02/01_main-chapter-code 数据 Data sampling with a sliding window We train LLMs to generate one word at a time, so we want to prepare the training data accordingly where the next word in a sequence represents the target to predi…

【设计模式】JAVA Design Patterns——Observer(观察者模式)

&#x1f50d;目的 定义一种一对多的对象依赖关系这样当一个对象改变状态时&#xff0c;所有依赖它的对象都将自动通知或更新。 &#x1f50d;解释 真实世界例子 在遥远的土地上生活着霍比特人和兽人的种族。他们都是户外生活的人所以他们密切关注天气的变化。可以说他们不断地…

Baidu Comate帮开发者“代码搬砖”,2天搞定原先3周工作量

日常项目基础工作耗费大量时间、紧急任务一连“肝”几个大夜……对于一个计算机相关专业研究生来说&#xff0c;几乎是家常便饭。随着大模型能力赋能编码工具&#xff0c;被开发者们戏称的“代码搬砖”生活有了起色。 从去年开始&#xff0c;PPDE 飞桨开发者技术专家、澳门理工…

Quantlab 4.1:基于Deap遗传算法多股票因子挖掘

原创文章第549篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 遗传算法本身并不复杂&#xff0c;但gplearn的实现&#xff0c;把问题复杂化了&#xff0c;尤其在因子挖掘这个场景。 使用deap进行因子挖掘的代码在如下位置&#xff1a; import …

JDBC 学习笔记(一)基础篇 - JDBC 搭建的六大步骤

JDK 版本使用&#xff1a;JDK 21 框架思想&#xff1a;实体类及ORM思想 反射技术&#xff1a;BaseDAO 封装的过程 解决现有问题的角度&#xff0c;主要是 JDBC的基础应用 一、、JDBC 可以解决的问题 1.1 数据存储的问题 解决数据长期的存储问题&#xff1a; 数据通过 I/O 流…

24.Labview移位寄存器的使用及数据流解析

本文讲解移位寄存器的常用场景及其数据流的方向解析。 在Labview中移位寄存器是存在于循环结构中的&#xff0c;也就是说for循环和while循环中&#xff0c;在了解移位寄存器之前首先要了解一下for循环和while循环的原理及其数据流的流动方向&#xff0c;题主之前讲过for循环的文…

使用python绘制华夫饼图

使用python绘制华夫饼图 华夫饼图效果代码 华夫饼图 华夫饼图&#xff08;Waffle Chart&#xff09;是一种数据可视化图表&#xff0c;用于显示数据在一个网格中的分布情况。它类似于饼图&#xff0c;通过将数据划分为等大小的方块来表示不同类别的比例。华夫饼图的优势在于它…

国联易安:网络反不正当竞争,要防患于未然

据市场监管总局官网消息&#xff0c;为预防和制止网络不正当竞争&#xff0c;维护公平竞争的市场秩序&#xff0c;鼓励创新&#xff0c;保护经营者和消费者的合法权益&#xff0c;促进数字经济规范健康持续发展&#xff0c;市场监管总局近日发布《网络反不正当竞争暂行规定》&a…

I2C通信协议

I2C通信协议 项目要求是&#xff0c;通过通信线&#xff0c;是实现单片机读写外挂模块寄存器的功能&#xff0c;至少实现&#xff0c;在指定位置写寄存器和在指定位置读寄存器&#xff0c;实现了读写寄存器&#xff0c;就实现对模块的控制。 MPU6050&#xff0c;OLED&#xf…

第六篇 移位寄存器

实验六 移位寄存器 6.1实验目的 掌握移位寄存器的工作原理&#xff1b; 掌握利用移位寄存器实现串行与并行的相互转换&#xff1b; 掌握使用移位寄存器实现乘除法运算&#xff1b; 6.2 原理介绍 6.2.1 基本移位寄存器 在实验四中&#xff0c;我们主要介绍了寄存器的结构…

QGIS 根据点图层上的点 画线生成线图层

使用节点捕捉功能 空白处鼠标右键---》勾选捕捉工具栏----》选中磁铁工具 创建线图层---》编辑模式---》点击新增线工具--》鼠标靠近点&#xff0c;会有高亮提醒&#xff0c;左键选中&#xff0c;右键结束当前线段绘制

千帆 AppBuilder 工作流编排功能直播总结

千帆 AppBuilder 工作流编排功能直播总结 ​ 上个月&#xff0c;千帆AppBuilder推出了一项引人瞩目的新功能——工作流编排。在官方直播中&#xff0c;百度产品经理不仅深入介绍了这项功能&#xff0c;而且还通过创建多个组件&#xff0c;生动展示了AppBuilder组件工作流的强大…

网络工程师---第四十六天

1、逻辑网络结构设计阶段中&#xff0c;要想实现核心层与汇聚层交换机全部互相连接&#xff0c;组网技术有哪些&#xff1f; 2、工作区子系统的通信布线规范有哪些&#xff1f; 3、综合布线中施工规范有哪些&#xff1f; 4、综合布线系统中核心机房通常包括哪些设备&#xff1f…

API商品数据接口(电商数据api)返回京东淘宝商品详情数据提高开发效率

众多品牌选择使用比价工具进行采购&#xff0c;主要是出于以下几个重要原因&#xff1a; 提高开发效率&#xff1a;电商数据采集API接口允许不同的应用程序之间高效地进行交互&#xff0c;节省了大量的人力物力成本&#xff0c;使得开发者可以将更多时间和精力集中于自身的核心…

分库分表方案

文章目录 分库分表设计思路hash取模和范围方案最终方案采用hash取模和rang范围两者相结合 分库分表设计思路 首先分库分表有两种方式&#xff0c;一种是垂直拆分&#xff0c;一种是水平拆分。 垂直拆分 垂直拆分比较简单&#xff0c;也就是本来一个数据库&#xff0c;数据量大…

小红书前端2轮面试期望22K,全程问低代码设计

一面&#xff08;通过&#xff09; 1、好&#xff0c;那我们开始把&#xff0c;先简单介绍一下自己的一个经历&#xff0c;以及自己有亮点的项目&#xff1f;balabala 2、你可以这样介绍&#xff1a;在这里边主要负责哪几个项目&#xff0c;哪些项目是比较有亮点的&#xff0…

超市管理系统设计1——基本功能设计

超市管理系统基础功能类设计 1. 概述 本设计文稿提供一个基础的超市管理系统&#xff0c;包含基本的功能设计。该系统将管理商品、顾客、员工和交易记录&#xff0c;不需要接入数据库&#xff0c;通过文件存储数据&#xff0c;并满足面向对象编程的基本要求&#xff08;继承、…

LabVIEW开发EOL功能测试系统

LabVIEW开发EOL功能测试系统 介绍了一种基于LabVIEW开发的EOL功能测试系统方案&#xff0c;涵盖软件架构、工作流程、模块化设计、低耦合性、易于修改与维护、稳定性及硬件选型。系统通过高效的CAN通信实现对电机控制器的全面测试&#xff0c;确保运行可靠并支持未来的升级需求…