Vue结合Element UI的el-table打造加工工序甘特图可视化解决方案

news2024/11/26 9:38:28

引言

在玻璃加工行业,高效管理切割、磨边、洗、钢化、丝印等复杂工序对于提升生产效率至关重要。本文将介绍如何利用Vue.js框架结合Element UI组件库,自定义实现一个工序甘特图,以可视化展示各道工序的时间线与进度,为生产调度带来便利。

效果

Vue结合Element UI的el-table打造加工工序甘特图可视化解决方案

小时高度,宽度改变动态效果

Vue结合Element UI的el-table打造加工工序甘特图可视化解决方案

全部代码:

视图部分

<template>
  <div class="home group">
    <el-card
      v-loading="loading"
      :span="24"
      element-loading-text="正在加载处理数据...."
      :xs="24"
      class="box-card"
      id="boxCard"
      ref="tableBox"
      append-to-body
    >
      <el-row>
        <el-col :span="1.5" style="margin-right: 10px">
          <el-button
            type="primary"
            plain
            icon="el-icon-view"
            size="mini"
            @click.native="switchView"
            >切换视图</el-button
          >
        </el-col>
        <el-col :span="1.5" style="margin-right: 10px">
          <el-button type="primary" plain size="mini" icon="el-icon-document"
            >查看物料到货计划</el-button
          >
        </el-col>
        <el-col :span="1.5" style="margin-right: 10px">
          <el-button type="primary" plain size="mini" icon="el-icon-upload2"
            >导出</el-button
          >
        </el-col>
        <el-col :span="1.5" style="margin-right: 10px">
          <el-button type="primary" plain icon="el-icon-printer" size="mini"
            >打印</el-button
          >
        </el-col>
        <el-col :span="1.5" style="margin-right: 10px">
          <el-button type="primary" plain icon="el-icon-lock" size="mini"
            >锁定排产</el-button
          >
        </el-col>
        <el-col :span="1.5" style="margin-right: 10px">
          <el-button type="primary" plain icon="el-icon-unlock" size="mini"
            >解锁排产</el-button
          ></el-col
        >
        <el-col :span="1.5" style="margin-right: 10px">
          <el-button type="primary" plain icon="el-icon-rank" size="mini"
            >拖拽排产</el-button
          ></el-col
        >
      </el-row>
      <el-table
        v-show="isView"
        class="ganteTable"
        ref="ganTeTable"
        :height="tableHeight"
        :style="timeArr.length > 0 ? 'width: 100%;' : 'width:239px;'"
        :key="tableKey"
        :cell-style="iCellStyle"
        :fit="false"
        :data="tableData"
        border
        align="center"
        size="mini"
        :span-method="tableSpanMethod"
      >
        <el-table-column
          fixed
          align="center"
          prop="index1"
          label="工作中心"
          class="index1"
          width="70px"
        >
          <template slot-scope="scope">
            <el-popover
              placement="top-start"
              title="工作中心"
              width="200"
              trigger="hover"
              :content="scope.row.index1.label"
            >
              <div
                slot="reference"
                :class="rowHeight < 36 ? 'oneLineCls' : 'twoLineCls'"
              >
                {{ scope.row.index1.label }}
              </div>
            </el-popover>
          </template>
        </el-table-column>
        <el-table-column
          fixed
          align="center"
          prop="index2"
          label="产线名称"
          class="index1"
          width="100px"
        >
          <template slot-scope="scope">
            <!-- {{ scope.row.index2.label }} -->
            <el-popover
              placement="top-start"
              title="产线名称"
              width="200"
              trigger="hover"
              :content="scope.row.index3.label"
            >
              <div
                slot="reference"
                :class="rowHeight < 36 ? 'oneLineCls' : 'twoLineCls'"
              >
                {{ scope.row.index2.label }}
              </div>
            </el-popover>
          </template>
        </el-table-column>
        <el-table-column
          fixed
          height="47px"
          align="center"
          prop="index3"
          label="设备名称"
          class="index1"
          width="100px"
        >
          <template slot-scope="scope">
            <!-- {{ scope.row.index3.label }} -->
            <el-popover
              placement="top-start"
              title="设备名称"
              width="200"
              trigger="hover"
              :content="scope.row.index3.label"
            >
              <div
                slot="reference"
                :class="rowHeight < 36 ? 'oneLineCls' : 'twoLineCls'"
              >
                {{ scope.row.index3.label }}
              </div>
            </el-popover>
          </template>
        </el-table-column>
        <!-- 表头遍历日期 -->
        <template v-for="(timeArrItem, index1) in timeArr">
          <el-table-column
            height="47px"
            align="center"
            :label="timeArrItem.substr(0, 10)"
            :key="timeArrItem + index1 + ''"
            width="500px"
          >
            <!-- 表头遍历时间 -->
            <template v-for="(hourArrItem, index2) in hourArr">
              <el-table-column
                height="47px"
                align="center"
                class="pc-box"
                :label="hourArrItem + ''"
                :key="index1 + '-' + index2 + 5 + timeArrItem + hourArrItem"
                :width="latticeWidth + 'px;'"
              >
                <template slot="header">
                  <div @mousemove="updateXY">
                    {{ hourArrItem }}
                  </div>
                  <div
                    ref="pointBox"
                    id="pointBox"
                    v-if="index2 === 0 && index1 === 0"
                  ></div>
                </template>
                <template
                  slot-scope="scope"
                  v-if="index2 === 0 && index1 === 0"
                >
                  <div
                    id="content-box"
                    @mousemove="updateXY"
                    class="content-box"
                    :ref="index1 + '-' + index2 + 5"
                    :style="
                      'width:' +
                      timeArr.length * 24 * latticeWidth +
                      'px;overflow:hidden;'
                    "
                  >
                    <el-tooltip
                      :draggable="true"
                      v-for="(workItem, index3) in scope.row.workPlanList.data"
                      :key="
                        workItem.itemId +
                        workItem.endTime +
                        workItem.startTime +
                        index2 +
                        index3
                      "
                      class="item"
                      effect="dark"
                      content="Bottom Right 提示文字"
                      placement="bottom-end"
                    >
                      <div slot="content">
                        <br />
                        <p>信息:</p>
                        <p>工作中心名称:{{ scope.row.index3.label }}</p>
                        <p>开始时间:{{ workItem.startTime }}</p>
                        <p>开始时间:{{ workItem.endTime }}</p>
                        <p>工作中心描述:{{ workItem.workCenterDesc }}</p>
                        <p>工作中心编码:{{ workItem.workCenterSn }}</p>
                      </div>
                      <div
                        :draggable="true"
                        class="AAA"
                        :style="
                          'background-color:' +
                          workItem.color +
                          ';' +
                          'width:' +
                          timeInterval(workItem.startTime, workItem.endTime)
                            .widthPx +
                          'px;' +
                          ' position: absolute;' +
                          'left:' +
                          timeInterval(workItem.startTime, workItem.endTime)
                            .startPx +
                          'px;'
                        "
                      ></div>
                    </el-tooltip>
                  </div>
                </template>
              </el-table-column>
            </template>
          </el-table-column>
        </template>
      </el-table>
      <!-- <day-table-view v-show="!isView"></day-table-view> -->
      <div class="slider-block" v-show="isView">
        <div class="slider-block-text">小时高度:</div>
        <!-- 
		  v-if="isSlider" -->
        <el-slider
          @change="sliderHeightChange"
          style="width: 200px"
          v-model="rowHeight"
          :min="24"
          :max="72"
          :step="12"
          show-stops
        >
        </el-slider>
      </div>
      <div class="slider-block" v-show="isView">
        <div class="slider-block-text">小时宽度:</div>
        <el-slider
          v-if="isSlider"
          @change="sliderWidthChange"
          style="width: 200px"
          v-model="latticeWidth"
          :min="minWidth"
          :max="maxWidth"
          :step="12"
          show-stops
        >
        </el-slider>
      </div>
    </el-card>
  </div>
</template>
<script>

js部分

export default {
  name: "dailyScheduling",
  components: {
    // dayTableView
  },
  data() {
    return {
      loading: false, //表格数据处理
      isView: true,
      content: "内容",
      isSlider: true, //是否显示缩放和拉长
      minWidth: 24, //最小缩放
      maxWidth: 72, //最大缩放
      rowHeight: 24, //每一行的高度
      pointObj: {
        pointX: 340,
        pointBoxLeft: 0, //指针盒子距离左侧的偏移量
      },
      eleData: {
        dayList:[ // 天数
          "2023-05-08",
          "2023-05-09",
          "2023-05-10",
        ],
        startTime: "2023-05-08 00:00:00",  // 开始时间
        endTime: "2023-05-10 00:00:00",  // 结束时间
         timeList:[],
         workcenterList:[],
         ],
      },
      tableHeight: 0, //table的高度
      oneHourPx: 24, //一小时间隔15px 一分钟间隔0.25px
      oneMinutePx: 0.4, //一分钟0.4px
      tableData: null, //表格数据
      latticeWidth: 30, //一个单元格的宽度最小24px
      timeArr: [], //天数集合
      hourArr: [ //小时集合
        "00",
        "01",
        "02",
        "03",
        "04",
        "05",
        "06",
        "07",
        "08",
        "09",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "20",
        "21",
        "22",
        "23",
        // "24",
      ],
      tableKey: 0, //值改变更新table
      earliestTime: "", //最早时间
      latestTime: "", //最晚时间
      conWidth: 0,
    };
  },
  created() {
    window.onload = function () {
      document.addEventListener("touchstart", function (event) {
        if (event.touches.length > 1) {
          event.preventDefault();
        }
      });
      document.addEventListener("gesturestart", function (event) {
        event.preventDefault();
      });
    };
    //初始化表格高度,和初始化指针数据
    this.$set(this.pointObj, "pointX", 0);
    this.$nextTick(() => {
      this.tableHeight = this.$refs.tableBox.offsetHeight - 110;
    });
  },
  mounted() {
    this.getGanttChartData();
    //禁止ctrl+滚轮缩放
    let scrollFunc = function (e) {
      e = e || window.event;
      if (e.wheelDelta && event.ctrlKey) {
        //IE/Opera/Chrome
        event.returnValue = false;
      } else if (e.detail) {
        //Firefox
        event.returnValue = false;
      }
    };
    /*注册事件*/
    if (document.addEventListener) {
      document.addEventListener("DOMMouseScroll", scrollFunc, false);
    } //W3C
    window.onmousewheel = document.onmousewheel = scrollFunc; //IE/Opera/Chrome/Safari
    //设置表格最大高度沾满全屏
    this.$nextTick(() => {
      this.tableHeight = document.getElementById("boxCard").offsetHeight - 110;
      window.addEventListener("scroll", this.handleScroll, true);
      //获取标针盒子距离浏览器左侧的距离
      //   this.pointObj.pointBoxLeft = document.getElementById("pointBox").getBoundingClientRect().left
      //监听浏览器窗口变化
      const that = this;
      window.onresize = () => {
        return (() => {
          //计算装有指针的盒子距离浏览器左侧的距离,指针减去这个盒子距离浏览器左侧的偏移量得到正确时间指针
          this.pointObj.pointBoxLeft = 0;
          console.log("窗口改变了");
        })();
      };
      //如果日期小于2天 则官渡为39
      if (this.timeArr.length <= 2) {
        this.latticeWidth = 39;
        this.minWidth = 39;
        this.maxWidth = 72;
      }
      console.log("我被执行了", this.timeArr.length);
      if (this.timeArr.length >= 3) {
        this.latticeWidth = 24;
        this.minWidth = 24;
        this.maxWidth = 72;
      }
      if (this.timeArr.length == 1) {
        this.latticeWidth = 66;
        this.isSlider = false;
      }
      this.widthAA = this.timeArr.length * 24 * this.latticeWidth;
    });
  },
  methods: {
    getGanttChartData() {
      //判断是否传递过来id
      let id = null;
      if (typeof this.$route.query.id !== "undefined") {
        id = JSON.parse(this.$route.query.id);
      }
      this.loading = true;
      // getGanttChartData({productPlanTaskId:id}).then(res=>{
      this.timeArr = [];
      this.eleData.dayList.forEach((element) => {
        this.timeArr.push(element + " 00:00:00");
      });
      this.eleData.workcenterList = this.eleData.workcenterList;
      this.treeToTableData();
      //如果日期小于2天 则为39
      if (this.timeArr.length <= 2) {
        this.latticeWidth = 39;
        this.minWidth = 39;
        this.maxWidth = 72;
      }
      if (this.timeArr.length >= 3) {
        this.latticeWidth = 21;
        this.minWidth = 21;
        this.maxWidth = 72;
      }
      if (this.timeArr.length == 1) {
        this.latticeWidth = 66;
        this.minWidth = 66;
        this.maxWidth = 66;
        this.isSlider = false;
      }
      this.widthAA = this.timeArr.length * 24 * this.latticeWidth;

      this.$nextTick(() => {
        this.$refs.ganTeTable.doLayout();
        this.$forceUpdate();
      });
      this.loading = false;
      // })
    },
    //切换视图
    switchView() {
      this.isView = !this.isView;
    },
    //物料信息展开
    //行高回调
    iCellStyle() {
      return "height:" + this.rowHeight + "px";
    },
    //改变行高
    sliderHeightChange() {
      //重新布局表格
      this.$nextTick(() => {
        this.iCellStyle();
        this.$refs.ganTeTable.doLayout();
        // this.tableKey = Math.random()
      });
    },
    //改变行宽
    sliderWidthChange() {
      //重新布局表格
      this.$nextTick(() => {
        this.$refs.ganTeTable.doLayout();
        // this.tableKey = Math.random()
      });
    },
    // 当鼠标移动时触发
    updateXY(e) {
      let x = e.clientX;
      //计算装有指针的盒子距离浏览器左侧的距离,指针减去这个盒子距离浏览器左侧的偏移量得到正确时间指针
      this.pointObj.pointBoxLeft = document
        .getElementById("pointBox")
        .getBoundingClientRect().left;
      this.$nextTick(() => {
        this.boble = false;
        document.querySelector(
          "#pointBox"
        ).innerHTML = `<div v-if="boble" style="width: 1px; height: 25px; position: absolute; background: red;left:${
          x - this.pointObj.pointBoxLeft
        }px;" id="head-pointer" class="head-pointer"> </div>`;
      });
      this.boble = false;
    },
    parentW(index1, index2) {
      if (this.$refs[index1 + "-" + index2 + 5]) {
        console.log(this.$refs[index1 + "-" + index2 + 5][0].clientWidth);
        return this.$refs[index1 + "-" + index2 + 5][0].clientWidth;
      } else {
        return 0;
      }
    },
    parentH(index1, index2) {
      if (this.$refs[index1 + "-" + index2 + 5]) {
        console.log(this.$refs[index1 + "-" + index2 + 5][0].clientHeight);
        return this.$refs[index1 + "-" + index2 + 5][0].clientHeight;
      } else {
        return 0;
      }
    },
    draggableStart() {
      // console.log(this.tableData[0].workPlanList.data);
    },
    draggableEnd() {
      // console.log(this.tableData[0].workPlanList.data);
    },
    /**
     * 计算两个时间的间隔
     * 入参 开始时间,结束时间
     * 回参 返回一个任务距离最开始时间的分钟[距离],和一个任务开始时间和结束时间的分钟[距离],
     */
    timeInterval(startTime, endTiem) {
      let time = new Date(endTiem) - new Date(startTime); //获取任务开始时间和任务结束时间的相差时间戳
      let minuteDiff = Math.floor(time / (60 * 1000)); //相差时间间隔
      let initialTime = new Date(startTime) - new Date(this.timeArr[0]); //获取距离最开始的距离
      let inittiDiff = Math.floor(initialTime / (60 * 1000));
      // console.log("latticeWidth",inittiDiff)
      return {
        widthPx: minuteDiff * (this.latticeWidth / 60),
        startPx: inittiDiff * (this.latticeWidth / 60),
      };
    },
    treeToTableData() {
      console.log("this.eleData.workcenterList", this.eleData.workcenterList);
      //将树状结构格式转换成二维数组表格形式
      let ewArr = this.parseTreeToRow(this.eleData.workcenterList);
      let tableData = [];
      ewArr.map((item) => {
        let obj = {};
        item.map((itemc, indexb) => {
          obj["index" + (indexb + 1)] = {
            id: itemc.id,
            label: itemc.label,
          };
          if (typeof itemc.workPlanList !== "undefined") {
            obj.workPlanList = { data: itemc.workPlanList };
          }
        });
        tableData.push(obj);
      });
      this.tableData = tableData;
      // console.log("tableData", this.tableData);
    },
    /**
     * 递归-----将树结构数据格式,转化为,二维数组 表格形式
     * @param node 树的源数据
     * @param data 树转化为二维数组的数据
     * @param row 临时存储数据
     * @returns {*[]}
     */
    parseTreeToRow(node, data = [], row = []) {
      node.map((item) => {
        let obj = {
          id: item.workCenterId || item.lineId || item.machineId,
          label: item.workCenterName || item.lineName || item.machineDescribe,
        };
        if (typeof item.workPlanList !== "undefined") {
          obj.workPlanList =
            item.workPlanList.length > 0 ? item.workPlanList : [];
        }
        if (item.children && item.children.length != 0) {
          this.parseTreeToRow(item.children, data, [...row, obj]);
        } else {
          data.push([...row, obj]);
        }
      });
      return data;
    },
    /**
     * 合并行或列的计算方法
     */
    tableSpanMethod({ row, column, rowIndex, columnIndex }) {
      // console.log("row, column, rowIndex, columnIndex");
      // console.log(
      //   "row, column, rowIndex, columnIndex",
      //   columnIndex,
      //   row,
      //   column,
      //   rowIndex,
      //   columnIndex
      // );
      return {
        rowspan:
          columnIndex < 3
            ? this.mergeRows(
                row[column.property],
                this.tableData,
                rowIndex,
                column.property
              )
            : 1,
        colspan: 1,
      };
    },
    /**
     * 表格单元格合并-----行
     * @param {Object} value      当前单元格的值
     * @param {Object} data       当前表格所有数据
     * @param {Object} index      当前单元格的值所在 行 索引
     * @param {Object} property   当前列的property
     * @returns {number}          待合并单元格数量
     */
    mergeRows(value, data, index, property) {
      // 判断 当前行的该列数据 与 上一行的该列数据 是否相等
      if (index !== 0 && value.label === data[index - 1][property].label) {
        // 返回 0 使表格被跨 行 的那个单元格不会渲染
        return 0;
      }
      // 判断 当前行的该列数据 与 下一行的该列数据 是否相等
      let rowSpan = 1;
      for (let i = index + 1; i < data.length; i++) {
        if (value.label !== data[i][property].label) {
          break;
        }
        rowSpan++;
      }
      return rowSpan;
    },
  },
};

样式代码


<style lang="less" scoped>
#pointBox {
  position: relative;
  z-index: 2 !important;
  // background: red;
  // width: 100%;
  // height: 10px;
}
.aaaaa {
  width: 20px;
  background: red;
  height: 25px;
  position: relative;
}
//表头指针
.head-pointer {
  width: 1px;
  height: 18px;
  position: absolute;
  background: red;
  z-index: 2 !important;
}
//表头清楚内容
/deep/ .el-table th.el-table__cell {
  overflow: visible !important;
}
//占满屏幕
.box-card {
  height: calc(100vh - 100px); /*示例中顶部区域固定高度190px*/
}
/deep/ .el-table--enable-row-transition .el-table__body td.el-table__cell {
  //   height: 47px;
}
/deep/ .el-table_1_column_1 .el-table_1_column_2 .el-table_1_column_3 {
  z-index: 300 !important;
}
/deep/ .el-table_1_column_4_column_5_column_6 > .cell {
  // width: 3120px !important;
  padding: 0;
}
.content-box {
  //   width: 2000px !important;
  z-index: 2 !important;
  text-align: left;
  position: absolute;
  top: 0;
  bottom: 0;
}
.AAA {
  // left: -10px;
  // height: 30px;
  position: relative;
  width: 15px;
  height: 100%;
  z-index: 2 !important;
}
/deep/ .el-table_1_column_4_column_5_column_6 .is-center .el-table__cell {
  // width: 3060px !important;
  display: flex !important;
  // z-index: 1 !important;
}
//去除鼠标移入
/deep/ .group > .el-table--enable-row-hover .el-table__body tr:hover > td {
  background-color: white !important;
  height: 100%;
}
/deep/
  .group
  > .el-table--enable-row-hover
  .el-table__body
  tr:hover
  > td
  > div {
  height: 100%;
}
/deep/ .el-table .cell {
  overflow: visible !important;
  padding-left: 0px !important;
  display: flex; //横向排列
  padding-right: 0px !important;
  width: 100%;
  text-align: center;
}
/deep/ .el-table--mini .el-table__cell {
  // z-index: 1 !important;
  padding: 0 !important;
}
::v-deep .el-table th.el-table__cell > .cell {
  display: contents;
  line-height: 15px;
}
.timeItemBox {
  display: flex;
  width: 500px;
  margin-left: -10px;
  z-index: 1;
  z-index: 200 !important;
}
.timeItem {
  height: 37.9px;
  width: 30px;
}
.wl-real-start {
  left: 50%;
  &:after {
    position: absolute;
    top: 0;
    // left: -5px;
    left: 0;
    z-index: 1;
    content: "";
    width: 8px;
    height: 36px;
    // border-radius: 50%;
    background: #fcc300;
  }
}
.wl-real-start1 {
  left: 50%;
  &:after {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 200 !important;
    content: "";
  }
}
//伸缩加长
.slider-block {
  margin-top: 5px;
  margin-left: 20px;
  float: right;
  display: flex;
  line-height: 33px;
  .slider-block-text {
    margin-right: 5px;
    font-size: 16px;
  }
}
//超过一行显示
.oneLineCls {
  text-overflow: -o-ellipsis-lastline;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 1;
  line-clamp: 1;
  -webkit-box-orient: vertical;
}
.twoLineCls {
  text-overflow: -o-ellipsis-lastline;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
}
.ganteTable {
  margin-top: 20px;
}
</style>

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

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

相关文章

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…

浅谈一下VScode如何配置C环境

1.这几天突然发现在VScode写C程序比在DevC效果更好&#xff0c;因为在VScode中写代码有代码补全功能。所以我突然对在VScode中配置C环境变量产生了兴趣。 2.不过在VScode中配置C环境要是按照官方的来配置有点麻烦。 3.我这里有一个直接配置VScode中C环境变量的应用。 前提是…

K8S 集群节点缩容

环境说明&#xff1a; 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233&#xff08;需下线&#xff09;192.168.99.2332C4Gwoker1.23.1720.10.24 1. K8S 集群节点缩容 当集群中有…

8.12 矢量图层面要素单一符号使用十一(短划线渲染边界)

前言 本章介绍矢量图层线要素单一符号中短划线渲染边界的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 短划线渲染边界&#xff08;Outline: Hashed Line&#xff09; Outline系列只画边界&#xff0c;不填充内容以protected_areas.shp为例&#x…

羊了个羊:羊、羊、羊

一、I am me&#xff0c;羊羊羊 英文中的 我就是我&#xff08;I am me&#xff09;&#xff0c;其实就是&#xff1a;羊 羊 羊&#xff0c;为什么会有这么一个结论呢&#xff1f; 请往下看&#xff1a; I&#xff0c;就是羊 am&#xff08;是&#xff09;&#xff0c;也是羊 …

2-20 基于matlab的利用准二维发散喷嘴的特性法给出理想喷嘴的几何形状

基于matlab的利用准二维发散喷嘴的特性法给出理想喷嘴的几何形状。 假设气体从燃烧室排出&#xff0c;燃烧室内没有质量流量。 利用二维喷嘴流动关系&#xff0c;找到一个最佳喉管区域&#xff0c;该区域将在给定环境压力和燃烧室参数下产生最大推力。 该区域将自动设置并输入代…

【Verilog HDL-1】基本、向量、模块

HDL习题 1 阻塞型赋值‘’与非阻塞型赋值‘<’ 阻塞型赋值 b a ba ba&#xff1a;适用于纯组合电路 非阻塞型赋值 b < a b<a b<a&#xff1a;适用与时序逻辑电路 2 wire线型,assign连续赋值 wire a,b,c; assign b a; assign c a;与编程语言不同&#xff…

SpringDataJPA系列(2)Commons核心Repository

SpringDataJPA系列(2)Commons核心Repository Spring Data Commons依赖关系 我们通过 Gradle 看一下项目依赖&#xff0c;了解一下 Spring Data Common 的依赖关系 通过上图的项目依赖&#xff0c;不难发现&#xff0c;数据库连接用的是 JDBC&#xff0c;连接池用的是 HikariC…

Orangepi Zero2使用外设驱动库wiringOP配合定时器驱动SG90舵机

目录 一、舵机的基本认知和硬件接线 1.1 舵机的基本认知&#xff1a; 1.2 硬件接线&#xff1a; 1.3 怎么控制舵机旋转不同的角度&#xff1a; 二、Linux定时器 2.1 定时器setitimer()函数原型和头文件&#xff1a; 2.2 信号处理函数signal()原型和头文件&#xff1a; 2…

thymeleaf+mybatis(本文章用于期末考前10分钟速看)

期末速看 pom&#xff08;了解&#xff09;application.propertiessql代码Controller控制层视图service&#xff1a; 服务层mapper&#xff08;dao&#xff09;&#xff1a;持久层entity层(model层&#xff0c;domain层、 bean)&#xff1a;对应数据库表&#xff0c;实体类 效果…

【C语言】指针剖析(2)

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 一、数组名1.概念2.sizeof和&里面的数组名sizeof& 二、使用指针访问数组三、一维数组传参本质四、指针数组1.概念实例&#xff08;模拟二维数…

【GitOps】使用Google工具JIB实现本地无需安装容器推送镜像,加速SpringCloud项目开发

文章目录 一、效果展示二、简介三、安装Jib插件1、区分环境2、安装插件一、效果展示 本地是window系统,无docker环境,没有任何runtime,使用jib工具打包镜像并推送完成,用时20秒 二、简介 Jib 是 Google 开发的一款开源工具,旨在帮助 Java 开发者更高效地将 Java 应用程…

25届近5年北京交通大学自动化考研院校分析

北京交通大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…

vue使用scrollreveal和animejs实现页面滑动到指定位置后再开始执行动画效果

效果图 效果链接&#xff1a;http://website.livequeen.top 介绍 一、Scrollreveal ScrollReveal 是一个 JavaScript 库&#xff0c;用于在元素进入/离开视口时轻松实现动画效果。 ScrollReveal 官网链接&#xff1a;ScrollReveal 二、animejs animejs是一个好用的动画库…

LabVIEW电压电流实时监测系统

开发了一种基于LabVIEW和研华&#xff08;Advantech&#xff09;数据采集卡的电压电流实时监测系统&#xff0c;通过高效的数据采集和处理&#xff0c;为工业和科研用户提供高精度、实时的电压电流监测解决方案。系统采用研华USB-4711A数据采集卡&#xff0c;结合LabVIEW编程环…

【自然资源】国家历史文化名城你知道多少?

【自然资源】国家历史文化名城你知道多少&#xff1f; 中国五千年的历史孕育出了一些因深厚的文化底蕴和发生过重大历史事件而青史留名的城市。根据《中华人民共和国文物保护法》&#xff0c;“历史文化名城”是指保存文物特别丰富&#xff0c;具有重大历史文化价值和革命意义…

数据恢复篇: 如何在数据丢失后恢复照片

数据丢失的情况并不少见。如果您曾经遇到过图像丢失的情况&#xff0c;您可能想过照片恢复工具是如何工作的&#xff1f;可能会丢失多少数据图像&#xff1f;即使是断电也可能导致照片和媒体文件丢失。 话虽如此&#xff0c;如果你认为删除的照片无法恢复&#xff0c;那你就错…

sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理

目录 搭建hadoop 下载hadoop JAVA 下载bin windows 改环境变量 将winutils.exe和hadoop.dll放到C:\Windows\System32下&#xff0c;然后重启 修改配置 vim core-site.xml vim hdfs-site.xml hadoop-env.sh mapred-site.xml yarn-site.xml 格式化命令 启动集群 …

大数据可视化实验(七):Python数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;绘制带颜色的柱状图。.. 1 2&#xff09;绘制堆叠柱状图。.. 3 3&#xff09;绘制数学函数曲线图。.. 4 4&#xff09;使用seaborn绘制组合图形。... 5 5&#xff09;使用Boken绘制多个三角形…

区块链技术与数字货币

1.起源 ➢中本聪(Satoshi Nakamoto), 2008 ➢比特币:一种点对点的电子现金系统 2.分布式账本技术原理 1.两个核心技术&#xff1a; ➢以链式区块组织账本数据实现账本数据的不可篡改 ➢分布式的可信记账机制 2.共识机制&#xff1a;由谁记账 ➢目的&#xff1a; ⚫ 解…