vue封装原生table表格方法

news2025/2/23 23:12:46

适用场景:有若干个表格,前面几列格式不一致,但是后面几列格式皆为占一个单元格,所以需要封装表格,表格元素自动根据数据结构生成即可;并且用户可新增列数据。

分类
固定数据部分 就是根据数据结构传参设置table单元格内容及格式,数据结构由前端定义;
可新增删除部分 是由用户操作,格式统一为占一格,返回数据结构以列为单位,其中,删除列以判断对应列是否有表头为依据。
在这里插入图片描述

展示效果如下:

封装原生表格演示

目录

  • 固定表格部分
    • 数据格式
    • 元素设置
  • 可新增删除部分
    • 数据格式
    • 元素设置
    • 新增的方法
    • 删除的方法
    • 数据转换
      • 将格式转化为以列
      • 将格式转化为以表格
  • 全部代码

固定表格部分

需要确定的是固定表格中的需要给单元格元素传哪些值:

  1. 单元格的内容;
  2. 单元格格式会有很多种情况,可能会占几行,也可能会占几列,所以就需要控制着每个单元格的colspan和rowspan;
  3. 单元格的内容长短不一致所以也需要控制着单元格的宽度;

其它参数可有可无,需要依照自身需求添加逻辑。

数据格式

数据格式有四大字段,分别控制着出表头以外的行数(tdRows),为了便于控制除表头的tr循环次数;表格名称(title);表头内容(ths)和表身内容(tds)。

SafetyTableData:
      {
        tdRows: 3,//除表头的tbody所占行数
        title: '表格名称表格名称表格名称表格名称表格名称',
        ths: [
          {
            thName: 'Safety/安全',
            colspan: 1,
            rowspan: 4,
            isEdit: false,
            width: 100,
          },
          {
            thName: '关键指标KPI',
            colspan: 2,
            rowspan: 1,
            isEdit: false,
            width: 100,
          },
          {
            thName: '输出部门',
            colspan: 1,
            rowspan: 1,
            isEdit: false,
            width: 100,
          },
          {
            thName: '公式',
            colspan: 1,
            rowspan: 1,
            isEdit: false,
            width: 180,
          },
          {
            thName: '单位',
            colspan: 1,
            rowspan: 1,
            isEdit: false,
            width: 100,
          },
        ],
        tds: [
          [
            { tdName: '伤害', colspan: 1, rowspan: 3, isEdit: false, width: 30, },
            { tdName: '占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '(损失工时/ 投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },
            { tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
          ],
          [
            { tdName: '一些值', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: 'ABCDEFG', colspan: 1, rowspan: 1, isEdit: false, width: 180, },
            { tdName: 'absolute', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
          ],
          [
            { tdName: '实际占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '(实际损失工时/实际投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },
            { tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
          ],
          // Repeat similar structure for other rows as needed
        ],
      },

元素设置

detailTableData为表格固定格式需要显示的数据,前面已设置了SafetyTableData的数据格式,可以直接将SafetyTableData赋值给detailTableData。若还有其他固定表格格式同理视情况赋值即可。

<table border="1">
        <tr ref="tableHeader">
          <th v-for="(thItem, index) in detailTableData.ths" :key="'th-' + index" :rowspan="thItem.rowspan" :colspan="thItem.colspan" :style="'width:'+thItem.width+'px'">
            {{thItem.thName}}
          </th>
        </tr>
        <tr v-for="rowIndex in detailTableData.tdRows" :key="rowIndex">
          <td v-for="(tdItem, colIndex) in detailTableData.tds[rowIndex-1]" :key="'td-' + rowIndex + '-' + colIndex" :rowspan="tdItem.rowspan" :colspan="tdItem.colspan" :style="'width:'+tdItem.width+'px'">
            {{tdItem.tdName}}
          </td>
        </tr>
</table>

可新增删除部分

既然可新增删除部分都是占一个单元格,那么可以确定的是colspan和rowspan都为1。

数据格式

全局参数(newTableData)用于存放所有用户新增的数据;newThObj为新增表头时的数据;newTdObj为新增表身时的数据。

newTableData: {
        ths: [],
        tds: [], // 初始包含一个空数组
},
newThObj: {
        thName: '',
        colspan: 1,
        rowspan: 1,
        isEdit: true,
},
newTdObj: {
        tdName: '',
        colspan: 1,
        rowspan: 1,
        isEdit: true,
},

元素设置

<table border="1">
        <tr ref="tableHeader">
          <th v-for="(newThItem,newindex) in newTableData.ths" :key="newindex" class="item" :id="'test'+newindex">
            <el-input v-if="newThItem.isEdit && editTableSate" v-model="newThItem.thName" placeholder="请输入时间"></el-input>
            <span v-else>{{newThItem.thName}}</span>
          </th>

        </tr>
        <tr v-for="rowIndex in detailTableData.tdRows" :key="rowIndex">
          <td v-for="(newTdItem, newColIndex) in newTableData.tds[rowIndex-1]" :key="newColIndex">
            <el-input v-if="newTdItem.isEdit && editTableSate" v-model="newTdItem.tdName" placeholder="请输入"></el-input>
            <span v-else>{{newTdItem.tdName}}</span>
          </td>
        </tr>
</table>

新增的方法

// 新增列的点击事件
    addTableColBtn() {
      // 向 newTableData.ths 添加一个新的表头对象
      this.newTableData.ths.push({ ...this.newThObj });

      // 如果 tds 为空,需要初始化它
      if (this.newTableData.tds.length === 0) {
        for (let i = 0; i < this.detailTableData.tdRows; i++) {
          this.newTableData.tds.push([]);
        }
      }

      // 遍历每一行,添加空单元格以匹配表头列数
      this.newTableData.tds.forEach(row => {
        row.push({ ...this.newTdObj });
      });
    },

删除的方法

// 反向遍历以避免删除元素时影响索引 -- 以表头为准,若表头为空,则提交后对应列为空
      for (let i = this.newTableData.ths.length - 1; i >= 0; i--) {
        if (!this.newTableData.ths[i].thName) {
          let shouldDeleteColumn = true;
          for (let row = 0; row < this.newTableData.tdRows; row++) {
            if (this.newTableData.tds[row][i].tdName) {
              shouldDeleteColumn = false;
              break;
            }
          }
          // 如果该列满足删除条件,则删除
          if (shouldDeleteColumn) {
            this.newTableData.ths.splice(i, 1);
            this.newTableData.tds.forEach(row => {
              row.splice(i, 1);
            });
          }
        }
      }

数据转换

在这里插入图片描述

将格式转化为以列

将newTableData{ths: [], tds: [],}转化为data[{SORT:‘’,TIME:‘’,TLLRGOAL:‘’,AF:‘’,ACTUALTLLR:‘’,}]格式

/**
     * 用于表格封装方法
     * @param {*object} newTableData:{ths:[],tds:[],} 
     * @param {*string} type
     * @returns {*array} array:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]
     */
    transformTableData(newTableData, type) {
      const transformedData = [];
      newTableData.ths.forEach((th, index) => {
        const thName = th.thName;
        const colIndex = index;
        var transformedObj = {};
        switch (type) {
          case 'Safety'://安全
            transformedObj = {
              SORT: (colIndex + 1).toString(),//列数
              TIME: thName,//表头内容
              Cells1: newTableData.tds[0][colIndex].tdName,//单元格内容1
              Cells2: newTableData.tds[1][colIndex].tdName,//单元格内容2
              Cells3: newTableData.tds[2][colIndex].tdName//单元格内容3
            };
            break;
          default:
            break;
        }
        transformedData.push(transformedObj);
      });
      return transformedData;
    }

将格式转化为以表格

将data[{SORT:‘’,TIME:‘’,TLLRGOAL:‘’,AF:‘’,ACTUALTLLR:‘’,}]格式转化为newTableData{ths: [], tds: [],}

/**
     * 用于将获取数据返回至符合表格的封装方法
     * @param {*array} data:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]
     * @returns {*object} newTableData:{ths:[],tds:[],} 
     */
    transformData(data) {
      // 初始化 newTableData 结构
      let newTableData = {
        ths: [],
        tds: []
      };
      // 提取所有的列名,除了 "SORT" 和 "TIME"、"ID",因为这三个是固定的
      const columns = Object.keys(data[0]).filter(key => key !== "SORT" && key !== "TIME" && key !== "ID");
      // 填充 ths 数组
      newTableData.ths = data.map(item => ({
        thName: item.TIME,
        colspan: 1,
        rowspan: 1,
        isEdit: true
      }));
      // 填充 tds 数组
      for (let column of columns) {
        let columnData = data.map(item =>
        (
          {
            tdName: item[column],
            colspan: 1,
            rowspan: 1,
            isEdit: true
          }
        )
        );
        // 将每个字段的值按顺序插入 tds 数组
        newTableData.tds.push([...columnData]);
      }
      return newTableData;
    }

全部代码

<template>
  <div class="testbox">
    <div class="bartype-class">
      <div class="verticalbar-class"></div>
      <h4>Details</h4>
      <el-button v-if="!editTableSate" @click="editTableBtn" size="mini" icon="el-icon-edit" style="margin-left:2%;">编 辑</el-button>
      <div v-else style="margin-left: auto;display:flex;">
        <el-button @click="addTableColBtn" size="mini" icon="el-icon-plus">新增列</el-button>
        <el-button @click="saveTableBtn" size="mini" icon="el-icon-upload">提 交</el-button>
      </div>
    </div>
    <div class="tabletitle-class" v-if="detailTableData.title">{{detailTableData.title}}</div>
    <div class="bar-class mytable" style="overflow: auto;">
      <table border="1">
        <tr ref="tableHeader">
          <th v-for="(thItem, index) in detailTableData.ths" :key="'th-' + index" :rowspan="thItem.rowspan" :colspan="thItem.colspan" :style="'width:'+thItem.width+'px'">
            {{thItem.thName}}
          </th>
          <th v-for="(newThItem,newindex) in newTableData.ths" :key="newindex" class="item" :id="'test'+newindex">
            <el-input v-if="newThItem.isEdit && editTableSate" v-model="newThItem.thName" placeholder="请输入时间"></el-input>
            <span v-else>{{newThItem.thName}}</span>
          </th>

        </tr>
        <tr v-for="rowIndex in detailTableData.tdRows" :key="rowIndex">
          <td v-for="(tdItem, colIndex) in detailTableData.tds[rowIndex-1]" :key="'td-' + rowIndex + '-' + colIndex" :rowspan="tdItem.rowspan" :colspan="tdItem.colspan" :style="'width:'+tdItem.width+'px'">
            {{tdItem.tdName}}
          </td>
          <td v-for="(newTdItem, newColIndex) in newTableData.tds[rowIndex-1]" :key="newColIndex">
            <el-input v-if="newTdItem.isEdit && editTableSate" v-model="newTdItem.tdName" placeholder="请输入"></el-input>
            <span v-else>{{newTdItem.tdName}}</span>
          </td>
        </tr>
      </table>
    </div>

  </div>
</template>

<script>

export default {
  components: {},
  data() {
    return {
      detailTableData: {},//表格显示的数据
      // 安全表格固定数据;ID: 6
      SafetyTableData:
      {
        tdRows: 3,//除表头的tbody所占行数
        title: '表格名称表格名称表格名称表格名称表格名称',
        ths: [
          {
            thName: 'Safety/安全',
            colspan: 1,
            rowspan: 4,
            isEdit: false,
            width: 100,
          },
          {
            thName: '关键指标KPI',
            colspan: 2,
            rowspan: 1,
            isEdit: false,
            width: 100,
          },
          {
            thName: '输出部门',
            colspan: 1,
            rowspan: 1,
            isEdit: false,
            width: 100,
          },
          {
            thName: '公式',
            colspan: 1,
            rowspan: 1,
            isEdit: false,
            width: 180,
          },
          {
            thName: '单位',
            colspan: 1,
            rowspan: 1,
            isEdit: false,
            width: 100,
          },
        ],
        tds: [
          [
            { tdName: '伤害', colspan: 1, rowspan: 3, isEdit: false, width: 30, },
            { tdName: '占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '(损失工时/ 投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },
            { tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
          ],
          [
            { tdName: '一些值', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: 'ABCDEFG', colspan: 1, rowspan: 1, isEdit: false, width: 180, },
            { tdName: 'absolute', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
          ],
          [
            { tdName: '实际占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
            { tdName: '(实际损失工时/实际投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },
            { tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },
          ],
          // Repeat similar structure for other rows as needed
        ],
      },
      newTableData: {
        ths: [],
        tds: [], // 初始包含一个空数组
      },
      newThObj: {
        thName: '',
        colspan: 1,
        rowspan: 1,
        isEdit: true,
      },
      newTdObj: {
        tdName: '',
        colspan: 1,
        rowspan: 1,
        isEdit: true,
      },
      editTableSate: false,//表格编辑状态
    };
  },
  created() {

  },
  computed: {

  },
  mounted() {
    this.detailTableData = this.SafetyTableData;
  },
  methods: {
    // 编辑表格按钮
    editTableBtn() {
      this.editTableSate = true;
    },
    // 新增列的点击事件
    addTableColBtn() {
      // 向 newTableData.ths 添加一个新的表头对象
      this.newTableData.ths.push({ ...this.newThObj });

      // 如果 tds 为空,需要初始化它
      if (this.newTableData.tds.length === 0) {
        for (let i = 0; i < this.detailTableData.tdRows; i++) {
          this.newTableData.tds.push([]);
        }
      }

      // 遍历每一行,添加空单元格以匹配表头列数
      this.newTableData.tds.forEach(row => {
        row.push({ ...this.newTdObj });
      });
    },
    // 保存表格的点击事件
    saveTableBtn() {
      // 反向遍历以避免删除元素时影响索引 -- 以表头为准,若表头为空,则提交后对应列为空
      for (let i = this.newTableData.ths.length - 1; i >= 0; i--) {
        if (!this.newTableData.ths[i].thName) {
          let shouldDeleteColumn = true;
          for (let row = 0; row < this.newTableData.tdRows; row++) {
            if (this.newTableData.tds[row][i].tdName) {
              shouldDeleteColumn = false;
              break;
            }
          }
          // 如果该列满足删除条件,则删除
          if (shouldDeleteColumn) {
            this.newTableData.ths.splice(i, 1);
            this.newTableData.tds.forEach(row => {
              row.splice(i, 1);
            });
          }
        }
      }
      this.saveTableDataFun();
    },
    // 保存表格数据函数
    async saveTableDataFun() {
      var data = [];
      if (this.newTableData.ths.length) {
        data = this.transformTableData(this.newTableData, 'Safety');
      }
      console.log('data:', data);
      this.editTableSate = false;
    },
    /**
     * 用于表格封装方法
     * @param {*object} newTableData:{ths:[],tds:[],} 
     * @param {*string} type
     * @returns {*array} array:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]
     */
    transformTableData(newTableData, type) {
      const transformedData = [];
      newTableData.ths.forEach((th, index) => {
        const thName = th.thName;
        const colIndex = index;
        var transformedObj = {};
        switch (type) {
          case 'Safety'://安全
            transformedObj = {
              SORT: (colIndex + 1).toString(),//列数
              TIME: thName,//表头内容
              Cells1: newTableData.tds[0][colIndex].tdName,//单元格内容1
              Cells2: newTableData.tds[1][colIndex].tdName,//单元格内容2
              Cells3: newTableData.tds[2][colIndex].tdName//单元格内容3
            };
            break;
          default:
            break;
        }
        transformedData.push(transformedObj);
      });
      return transformedData;
    },
    /**
     * 用于将获取数据返回至符合表格的封装方法
     * @param {*array} data:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]
     * @returns {*object} newTableData:{ths:[],tds:[],} 
     */
    transformData(data) {
      // 初始化 newTableData 结构
      let newTableData = {
        ths: [],
        tds: []
      };
      // 提取所有的列名,除了 "SORT" 和 "TIME"、"ID",因为这三个是固定的
      const columns = Object.keys(data[0]).filter(key => key !== "SORT" && key !== "TIME" && key !== "ID");
      // 填充 ths 数组
      newTableData.ths = data.map(item => ({
        thName: item.TIME,
        colspan: 1,
        rowspan: 1,
        isEdit: true
      }));
      // 填充 tds 数组
      for (let column of columns) {
        let columnData = data.map(item =>
        (
          {
            tdName: item[column],
            colspan: 1,
            rowspan: 1,
            isEdit: true
          }
        )
        );
        // 将每个字段的值按顺序插入 tds 数组
        newTableData.tds.push([...columnData]);
      }
      return newTableData;
    }
  },
  watch: {

  }
};
</script>

<style scoped>
.testbox {
  width: 100%;
  height: 100%;
}
.bartype-class {
  display: flex;
  align-items: center;
  height: 25px;
  margin: 10px 0;
}
.verticalbar-class {
  width: 4px;
  height: 100%;
  background: #555555;
  margin-right: 9px;
}

.mytable table {
  border-collapse: collapse;
  width: 100%;
  font-size: 12px;
}
.mytable table td:first-child,
th:first-child {
  /* font-weight: bold; */
  /* background-color: pink; */
  width: 15%;
}
.mytable table th,
td {
  border: 1px solid #ddd;
  text-align: center;
  padding: 8px;
}

.mytable table th {
  background-color: #f2f2f2;
}
.text-left {
  text-align: left;
}
.mytable .el-input {
  width: 80px;
}
.mytable .el-input__inner {
  padding: 0 5px;
}
.item {
  cursor: pointer;
}
.tabletitle-class {
  background: #0070c0;
  color: #fff;
  margin: 0.5% 0;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 30px;
  font-weight: bold;
  letter-spacing: 2px;
}
</style> 


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

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

相关文章

合合信息智能文档抽取:赋能不良资产管理行业的数字化转型

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 随着数字化浪潮的汹涌澎湃&#xff0c;全球各行各业正经历着前所未有的变革。人工智能技术的快速发展&#xff0c;以其独特的创新能力和应用潜力&#xff0c;正在深刻地改变着业务模式&#xff0c;推动产业效率的…

【AIGC】AI技术兴起,设计师要大量失业了吗?

一、前言 随着技术的不断迭代&#xff0c;AIGC 能力的可控性得到了进一步提升&#xff0c;可应用的场景也越来越多&#xff0c;在文本、图像、视频等多个领域都有了广泛应用。 用户已经可以用自然语言来与 AI 工具进行交互&#xff0c;革新传统办公方式&#xff0c;工作任务可…

【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间

文章目录 前言一、datetime模块简介二、常用类和方法三、date类四、time类五、datetime类六、timedelta类七、常用的函数和属性八、代码及其演示 前言 Python的datetime模块提供了日期和时间的类&#xff0c;用于处理日期和时间的算术运算。这个模块包括date、time、datetime和…

通过命令行配置调整KVM的虚拟网络

正文共&#xff1a;1234 字 20 图&#xff0c;预估阅读时间&#xff1a;2 分钟 在上篇文章中&#xff08;最小化安装的CentOS7部署KVM虚拟机&#xff09;&#xff0c;我们介绍了如何在最小化安装的CentOS 7系统中部署KVM组件和相关软件包。因为没有GUI图形界面&#xff0c;我们…

【Java Web】XML格式文件

目录 一、XML是什么 二、常见配置文件类型 *.properties类型&#xff1a; *.xml类型&#xff1a; 三、DOM4J读取xml配置文件 3.1 DOM4J的使用步骤 3.2 DOM4J的API介绍 一、XML是什么 XML即可扩展的标记语言&#xff0c;由标记语言可知其基本语法和HTML一样都是由标签构成的文件…

深度之眼(二十六)——神经网络基础知识(一)

文章目录 一、前言二、神经网络与多层感知机2.1 人工神经元2.2 人工神经网络2.3 多层感知机2.4 激活函数 一、前言 看了下课程安排&#xff0c;自己还是没安排好&#xff0c;刚刚捋清了一下思路。 基础&#xff1a;python、数理 认识&#xff1a;神经网络基础、opencv基础、py…

一探究竟:板式家具生产线如何实现精细加工?

随着科技的进步&#xff0c;板式家具行业正经历着一场由传统手工加工向自动化、智能化生产的转变。板式家具生产线如何实现精细加工&#xff0c;已成为行业内关注的焦点。那么&#xff0c;一条完整的板式家具生产线如何实现精细加工的呢&#xff1f;本文将深入探讨。 板式家具生…

直流电机双闭环调速Simulink仿真

直流电机参数&#xff1a; 仿真模型算法介绍&#xff1a; 1&#xff09;三相整流桥&#xff0c;采用半控功率器件SCR晶闸管&#xff1b; 2&#xff09;采用转速环、电流环 双闭环控制算法&#xff1b; 3&#xff09;外环-转速环&#xff0c;采用PI 比例积分控制&#xff1b;…

vue3 层级选择器 el-cascader展示 更多的信息

cascader 正常情况下可以满足我们所需&#xff0c;一般展示的就是 {label:‘’ &#xff1b;value:‘’} 但有时候需要展示更多的信息工用户查看&#xff0c;如下图。此时就需要我们进行一定的改造。 代码如下&#xff1a; <el-form-item label"相关人员"><…

240626_昇思学习打卡-Day8-稀疏矩阵

240626_昇思学习打卡-Day8-稀疏矩阵 稀疏矩阵 在一些应用场景中&#xff0c;比如训练二值化图像分割时&#xff0c;图像的特征是稀疏的&#xff0c;使用一堆0和极个别的1表示这些特征即费事又难看&#xff0c;此时就可以使用稀疏矩阵。通过参考大佬博文&#xff0c;结合个人理…

第十八课,函数基本语法规则

一&#xff0c;编程中函数的介绍 函数像一个黑盒子、加工厂、榨汁机等等&#xff08;你能想到的任何类似的比喻&#xff09;&#xff0c;它会经过一个固定的规则将你送入其中的参数变成另一个样子、或者实现某种预想的功能&#xff08;比如print()函数、input()函数、以及在tu…

npm-check【实用教程】升级项目中的依赖

安装 npm-check npm i -g npm-check检查项目中的依赖 npm-check会显示项目中没有使用&#xff0c;以及有新版本的依赖 升级项目中的依赖 npm-check -u方向键上下可以移动图中左侧的箭头空格键可选中/取消选中标注为 Major Update 和 Non-semver 类的版本&#xff0c;需去官网查…

对抗生成网络GANP52-

1.对抗生成网络的重点&#xff1a;有原始的输入&#xff0c;按照需求&#xff0c;生成新的数据。 eg1:超分辨率重构(首先先告诉神经网络什么是低分辨率&#xff0c;什么是高分辨率&#xff0c;让计算机学习两者的联系。 eg2:警察抓小偷的时候&#xff0c;由于录像太过模糊&…

STM32 HAL库里 串口中断回调函数是在怎么被调用的?

跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑&#xff0c;使用HAL_UART_Receive_IT开启接收中断后&#xff0c;为啥处理函数要写在HAL_UART_RxCpltCallback里&#xff0c;中断发生的时候是怎么到这个回调函数里去的&#xff1f; void MX_USART1_UART_Init(void) {h…

three.js基础环境搭建

three.js three.js介绍安装threejs文件资源目录介绍本地静态服务器vscode配置live-server插件nodejs配置本地静态服务器项目的开发环境引入threejs 基础知识右手坐标系程序结构 three.js介绍 three.js官网 Three.js是一款基于WebGL的JavaScript 3D库&#xff0c;它使得开发者能…

【PythonWeb开发】Flask自定义模板路径和静态资源路径

在大型的 Flask 项目中&#xff0c;确实可能会有多个子应用&#xff08;Blueprints&#xff09;&#xff0c;每个子应用可能都有自己的静态文件和模板。为了更好地管理和组织这些资源&#xff0c;可以使用static_folder 和template_folder 属性来统一管理。必须同时设置好主应用…

jenkins nginx自动化部署 php项目

在当今快速发展的IT领域&#xff0c;自动化部署已成为提高工作效率和减少错误的关键。Jenkins作为持续集成/持续部署&#xff08;CI/CD&#xff09;的佼佼者&#xff0c;结合Docker容器技术和PHP编程语言&#xff0c;以及Ansible自动化工具&#xff0c;可以实现高效、可靠的自动…

PHP 界的扛把子 Swoole 异步通信利器

大家好&#xff0c;我是码农先森。 引言 我今天主要介绍的内容是包括但不仅限于 Swoole &#xff0c;也有一部分 Go 语言的内容。 为什么要介绍 Swoole ? 先说一说背景吧&#xff0c;我们项目组之前要为《香港 01》开发一个积分系统的项目&#xff0c;这个系统的主要功能包…

Spring Boot整合RocketMQ实现延迟消息消费

导包 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.3</version></dependency>添加配置信息 application配置文件 # rocketMq地址 rocketmq.name…