vue封装原生table表格方法

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

分类
固定数据部分 就是根据数据结构传参设置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> 


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

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

相关文章

docker配置redis主从复制

下载redis,复制redis.conf 主节点(6379) 修改redis.conf # bind 127.0.0.1 # 注释掉这里 protected-mode no # 改为no port 6379从节点(6380) 修改redis.conf bind 127.0.0.1 protected-mode no # 改为no port 6380 replicaof 172.17.0.2 6379 # 这里的ip为主节点容器的i…

SpringSecutrity原理

一、基于RBAC实现的权限管理通常需要涉及以下几张表&#xff1a; 1. 用户表&#xff08;user&#xff09;&#xff1a;记录系统中的所有用户&#xff0c;包括用户ID、用户名、密码等信息。 2. 角色表&#xff08;role&#xff09;&#xff1a;记录系统中的所有角色&#xff0…

【项目管理体系】代码评审规范

1完整性检查 2一致性检查 3正确性检查 4可预测性检查 5健壮性检查 6结构性检查 7可追溯性检查 8可理解性检查 9可验证性检查 软件开发全套资料获取&#xff1a;&#xff08;本文末个人名片直接获取&#xff09; 软件产品&#xff0c;特别是行业解决方案软件产品不同于一般的商品…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…

在Linux Ubuntu系统中使用Pascal语言

Pascal是一种结构化编程语言&#xff0c;而Free Pascal作为其现代编译器&#xff0c;不仅支持跨多种操作系统和处理器架构&#xff0c;还提供了高效的内存使用和函数重载等先进功能。Free Pascal继承了Pascal语言的核心特性&#xff0c;同时进行了扩展和优化&#xff0c;使其成…

【算法】单调队列 - 基础与应用-滑动窗口最大值

题目 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 思路 暴力&#xff1a;遍历一遍的过程中每次从窗口找到最大的数组&#…

Springboot 项目启动时扫描所有枚举并存入缓存(redis)

为什么这么做? 为了springboot 注解属性转换字典方便一点(使用缓存的方式在Springboot 启动时获取字典数据) 在启动时会扫描com.vehicle.manager.core.enumerate包下的所有枚举(包括类中的内部枚举),并取出对应属性以json的方式存入redis 目录结构如下: RedisUtil可以在Red…

无线领夹麦克风怎么挑选,能让声音变好听的领夹麦推荐大全

近年来&#xff0c;随着直播销售和个人视频日志&#xff08;Vlog&#xff09;的流行&#xff0c;自媒体内容创作已经成为一种文化现象。这一现象不仅改变了人们获取信息的方式&#xff0c;也极大地推动了相关音频设备的发展。无线领夹麦克风&#xff0c;以其轻巧的设计和出色的…

GPT-5即将登场,AI赋能未来:我们该如何迎接这场技术变革?

文章目录 从高中生到博士生&#xff1a;GPT-4到GPT-5的飞跃科技界的惊叹与期待GPT-5的影响与应用场景1. 更强的自然语言处理能力2. 智能助理的升级3. 教育与培训4. 创意产业5. 数据分析与决策支持 如何迎接GPT-5的到来&#xff1f;1. 学习与适应2. 探索与创新3. 合作与共赢4. 关…

gin-vue -admin 初始化安装后 进入 后台首页报错

报错原因&#xff1a; 因为 我是使用的phpstudy 小皮的数据库 默认的是MySam 的引擎 mysql 引擎需要是 innoDB 解决办法 &#xff1a; 在linux 的环境下 配置一个数据库 &#xff0c; 我是用的是vmware 虚拟机

windows系统如何快速查看显卡详情信息

winR&#xff0c;输入dxdiag 打开DirectX诊断工具&#xff0c;可以看到显卡的详细硬件信息

帝国cms未审核文章可视化预览效果

有时候为了让编辑更加清楚的看到别人审核之后的效果&#xff0c;同时文章有需要下一级审核才能在前端展示出来&#xff0c;今天就来展示一个未审核文章预览审核后的效果 这次给某出版社开发的时候&#xff0c;他们需要实现编辑能够预览自己发布之后的审核效果&#xff0c;所以就…

深度學習筆記14-CIFAR10彩色圖片識別(Pytorch)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、我的環境 電腦系統&#xff1a;Windows 10 顯卡&#xff1a;NVIDIA GeForce GTX 1060 6GB 語言環境&#xff1a;Python 3.7.0 開發…

一本顶三本?入门LLM大模型必读《大模型应用开发极简入门》附PDF书籍

今天带来的是最近刚出版的新书&#xff1a; 《大模型应用开发极简入门&#xff1a;基于 GPT-4 和ChatGPT》 。 这本书是 O’Reilly 出版的&#xff0c;两位共同作者是来自 Worldline 公司的机器学习研究员 Olivier Caelen 和 数据工程师 Marie-Alice Blete。这两位作者一位侧重…

Zynq7000系列FPGA中的定时器详细介绍

每个Cortex-A9处理器都有自己的专用32位定时器和32位看门狗定时器。两个处理器共享一个全局64位定时器。这些定时器总是以CPU频率&#xff08;CPU_3x2x&#xff09;的1/2进行计时。 在系统级&#xff0c;有一个24位看门狗定时器和两个16位三重定时器/计数器。 系统看门狗定时器…

域名 Whois 检测:企业网络安全与品牌保护的利器

域名是企业在互联网上的重要标识&#xff0c;其安全性和合规性直接影响着企业的业务运营和品牌声誉。而域名 Whois 检测通过全面分析和监控域名的 Whois 信息&#xff0c;为企业提供了多方面的保障&#xff0c;帮助企业识别潜在的网络威胁、保护品牌资产、优化域名管理。 那么什…

向量数据库原理之向量索引

向量索引 在前面的文章中讲解了milvus的源码安装——向量数据库milvus源码剖析之开篇&#xff0c;向量数据库通常具备以下特点&#xff1a; 向量索引&#xff1a;用来支持高效的搜索&#xff0c;快速定位与查询向量相关的数据集。相似度搜索&#xff1a;支持余弦、欧式距离等的…

MySQL数据库基础练习系列:科研项目管理系统

DDL CREATE TABLE Users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,gender ENUM(男, 女) NOT NULL COMMENT 性别,email VARCHAR(100) UNIQUE COMMENT 邮箱 …

@PathVariable注解的使用及源码解析

前言 PathVariable 注解是我们进行JavaEE开发&#xff0c;最常见的几个注解之一&#xff0c;这篇博文我们以案例和源码相结合&#xff0c;帮助大家更好的了解PathVariable 注解 使用案例 1.获取 URL 上的值 RequestMapping("/id/{id}") public Object getId(Path…

Kubernetes Artemis系列 | 使用 ArtemisCloud Operator 部署 artemis

目录 一、ArtemisCloud Operator 介绍二、部署ArtemisCloud Operator三、使用 ArtemisCloud Operator 部署 artemis四、管理队列五、缩减规模时消息迁移 一、ArtemisCloud Operator 介绍 ArtemisCloud Operator 是一个用于管理和部署云端基础设施的工具。它基于 Kubernetes 平…