ElementUI实现el-table组件的合并行功能

news2024/11/16 21:50:47

前言

有时遇到一些需求,需要实现ElementUI中,el-tabled组件合并单元格的功能,稍微了解一下它的数据格式,不难可以写出比合并方法。但是在鼠标经过单元行时,会出现高亮的行与鼠标经过的行不一致的BUG。因此还需要实现@cell-mouse-enter和@cell-mouse-leave这两个方法,才可解决此问题。

一、多列合并

1.示例代码

<template>
  <div class="merge-cell">
    <div class="merge-cell-navbar">记录一下 el-table 合并行小技巧</div>

    <div class="merge-cell-content">
      <div class="merge-cell-content-container">
        <el-table
          :data="tableData"
          border
          height="100%"
          :header-cell-style="
            {
              padding: '4px', // 设置Table表头单元内边距
              backgroundColor: '#e7f0ff', // 设置Table表头背景颜色
              borderColor: '#b6d1ff', // 设置Table表头边框颜色
              color: '#000', // 设置Table表头文字颜色
              fontSize: '13px', // 设置Table表头文字大小
              fontWeight: 'normal', // 设置Table表头文字粗细
            }
          "
          :span-method="handleSpanMethod"
          :row-class-name="handleRowClassName"
          @cell-mouse-enter="handleCellMouseEnter"
          @cell-mouse-leave="handleCellMouseLeave"
        >
          <el-table-column prop="zone" label="GameZone / 服务器区域 / 游戏区域" align="center" />
          <el-table-column prop="career" label="职业" width="180" align="center" />
          <el-table-column label="英雄" align="center">
            <el-table-column prop="hero" label="英雄姓名" width="280" align="center" />
            <el-table-column prop="firstSkill" label="一技能" width="220" align="center" />
            <el-table-column prop="secondSkill" label="二技能" width="220" align="center" />
            <el-table-column prop="thirdSkill" label="三技能" width="220" align="center" />
            <el-table-column label="操作" width="180" align="center">
              <template #default="scope">
                <el-tooltip effect="dark" content="收藏" placement="top" :enterable="false" :hide-after="0" @click="handleEditClick(scope.$index, scope.row)">
                  <el-button size="small" circle>
                    <el-icon size="18"><StarFilled /></el-icon>
                  </el-button>
                </el-tooltip>
              </template>
            </el-table-column>
          </el-table-column>
        </el-table>
      </div>
    </div>
  </div>
</template>

<script>
export default {
    
    
  data: () => ({
    
    
    tableData: [
      {
    
    
        zone: "王者一区",
        career: "坦克",
        hero: "亚瑟",
        firstSkill: "誓约之盾",
        secondSkill: "回旋打击",
        thirdSkill: "圣剑裁决",
      },
      {
    
    
        zone: "王者一区",
        career: "坦克",
        hero: "吕布",
        firstSkill: "方天画斩",
        secondSkill: "贪狼之握",
        thirdSkill: "魔神降世",
      },
      {
    
    
        zone: "王者一区",
        career: "坦克",
        hero: "项羽",
        firstSkill: "无畏冲锋",
        secondSkill: "破釜沉舟",
        thirdSkill: "霸王斩杀",
      },
      {
    
    
        zone: "王者一区",
        career: "战士",
        hero: "云缨",
        firstSkill: "断月",
        secondSkill: "追云",
        thirdSkill: "逐星",
      },
      {
    
    
        zone: "王者一区",
        career: "战士",
        hero: "赵怀真",
        firstSkill: "拨云见明",
        secondSkill: "气定神凝",
        thirdSkill: "阴阳逆转",
      },
      {
    
    
        zone: "王者二区",
        career: "刺客",
        hero: "镜",
        firstSkill: "开锋",
        secondSkill: "裂空",
        thirdSkill: "见影",
      },
      {
    
    
        zone: "王者二区",
        career: "刺客",
        hero: "澜",
        firstSkill: "破浪",
        secondSkill: "断空",
        thirdSkill: "处决",
      },
      {
    
    
        zone: "王者二区",
        career: "刺客",
        hero: "李白",
        firstSkill: "将进酒",
        secondSkill: "神来之笔",
        thirdSkill: "青莲剑歌",
      },
      {
    
    
        zone: "王者三区",
        career: "法师",
        hero: "妲己",
        firstSkill: "灵魂冲击",
        secondSkill: "偶像魅力",
        thirdSkill: "女王崇拜",
      },
      {
    
    
        zone: "王者三区",
        career: "射手",
        hero: "后羿",
        firstSkill: "多重箭矢",
        secondSkill: "落日余晖",
        thirdSkill: "灼日之矢",
      },
      {
    
    
        zone: "王者三区",
        career: "射手",
        hero: "鲁班7号",
        firstSkill: "河豚手雷",
        secondSkill: "无敌鲨嘴炮",
        thirdSkill: "空中支援",
      },
      {
    
    
        zone: "王者三区",
        career: "辅助",
        hero: "孙膑",
        firstSkill: "时空爆弹",
        secondSkill: "时之波动",
        thirdSkill: "时光流逝",
      },
      {
    
    
        zone: "王者三区",
        career: "辅助",
        hero: "庄周",
        firstSkill: "化蝶",
        secondSkill: "蝴蝶效应",
        thirdSkill: "天人合一",
      },
    ],

    first_row: {
    
    },
    second_row: {
    
    },
  }),
  methods: {
    
    
    /**
     * 合并单元格句柄方法
     */
    handleSpanMethod({
    
    
      row, // 行
      column, // 列
      rowIndex, // 行索引
      columnIndex, // 列索引
    }) {
    
    
      if (columnIndex === 0 || columnIndex === 1) {
    
    
        // 获取当前单元格的值
        const currentValue = row[column.property];

        // 获取上一行相同列的值
        const preRow = this.tableData[rowIndex - 1];
        const preValue = preRow ? preRow[column.property] : null;

        // 如果当前值和上一行的值相同,则将当前单元格隐藏
        if (currentValue === preValue) {
    
    
          return {
    
     rowspan: 0, colspan: 0 };
        } else {
    
    
          // 否则计算当前单元格应该跨越多少行
          let rowspan = 1;
          for (let i = rowIndex + 1; i < this.tableData.length; i++) {
    
    
            const nextRow = this.tableData[i];
            const nextValue = nextRow[column.property];
            if (nextValue === currentValue) {
    
    
              rowspan++;
            } else {
    
    
              break;
            }
          }
          return {
    
     rowspan, colspan: 1 };
        }
      }
    },

    /**
     * 鼠标移入表格事件句柄方法
     */
    handleCellMouseEnter(row, column, cell, event) {
    
    
      this.second_row = this.tableData.filter((item) => {
    
    
        return this.filterSameKeys(item, row, ["zone", "career"]);
      })[0];

      this.first_row = this.tableData.filter((item) => {
    
    
        return this.filterSameKeys(item, row, ["zone"]);
      })[0];
    },

    /**
     * 鼠标移出表格事件句柄方法
     */
    handleCellMouseLeave() {
    
    
      this.currentIndex = "";
      this.currentColumnIndex = "";
      this.first_row = {
    
    };
      this.second_row = {
    
    };
    },

    /**
     * 根据 keys 数组所有字段去做合并
     */
    filterSameKeys(item, row, keys) {
    
    
      let flag = true;
      keys.forEach((key) => {
    
    
        flag = flag && item[key] === row[key];
      });
      return flag;
    },

    /**
     * 给表格行添加自定义类名
     */
    handleRowClassName({
    
     row }) {
    
    
      let flag1 = this.first_row == row ? "first_row" : "";
      let flag2 = this.second_row == row ? "second_row" : "";
      return `${
      
      flag1} ${
      
      flag2}`;
    },
  },
};
</script>

<style lang="less" scoped>
  .merge-cell {
    
    
    display: flex;
    flex-direction: column;
    position: relative;
    width: 100%;
    height: 100%;
    overflow: hidden;

    .merge-cell-navbar {
    
    
      position: relative;
      width: 100%;
      height: 100px;
      background-color: #686868;
      text-align: center;
      line-height: 100px;
      color: #fff;
      font-size: 25px;
    }

    .merge-cell-content {
    
    
      position: relative;
      flex: 1;
      padding: 100px;
      overflow: hidden;

      .merge-cell-content-container {
    
    
        position: relative;
        width: 100%;
        height: 100%;
        overflow: auto;
      }
    }

    :deep(.el-table) {
    
    

      td .cell {
    
    
        padding: 2.5px 0;
        color: #686868;
        font-size: 13px;
      }

      .first_row td:nth-child(1),
      .second_row td:nth-child(1),
      .first_row.second_row td:nth-child(2) {
    
    
          background: #f5f7fa !important;
      }
    }

    /* ^ 设置Table表格边框颜色 */
    :deep(.el-table--border) {
    
    
      &::before {
    
    
        background-color: #b6d1ff;
      }
      &::after {
    
    
        background-color: #b6d1ff;
      }
      .el-table__cell {
    
    
        border-color: #b6d1ff;
      }
      .el-table__inner-wrapper {
    
    
        &::before {
    
    
          background-color: #b6d1ff;
        }
        &::after {
    
    
          background-color: #b6d1ff;
        }
        .el-table__border-left-patch {
    
    
          background-color: #b6d1ff;
        }
      }
    }
    /* / 设置Table表格边框颜色 */
  }
</style>

2.运行效果

二、单列合并

1.示例代码

<template>
  <div class="merge-cell">
    <div class="merge-cell-navbar">记录一下 el-table 合并行小技巧</div>

    <div class="merge-cell-content">
      <div class="merge-cell-content-container">
        <el-table
          :data="tableData"
          border
          height="100%"
          :header-cell-style="
            {
              padding: '4px', // 设置Table表头单元内边距
              backgroundColor: '#e7f0ff', // 设置Table表头背景颜色
              borderColor: '#b6d1ff', // 设置Table表头边框颜色
              color: '#000', // 设置Table表头文字颜色
              fontSize: '13px', // 设置Table表头文字大小
              fontWeight: 'normal', // 设置Table表头文字粗细
            }
          "
          :span-method="handleSpanMethod"
        >
          <el-table-column prop="zone" label="GameZone / 服务器区域 / 游戏区域" align="center" />
          <el-table-column prop="career" label="职业" width="180" align="center" />
          <el-table-column label="英雄" align="center">
            <el-table-column prop="hero" label="英雄姓名" width="280" align="center" />
            <el-table-column prop="firstSkill" label="一技能" width="220" align="center" />
            <el-table-column prop="secondSkill" label="二技能" width="220" align="center" />
            <el-table-column prop="thirdSkill" label="三技能" width="220" align="center" />
            <el-table-column label="操作" width="180" align="center">
              <template #default="scope">
                <el-tooltip effect="dark" content="收藏" placement="top" :enterable="false" :hide-after="0" @click="handleEditClick(scope.$index, scope.row)">
                  <el-button size="small" circle>
                    <el-icon size="18"><StarFilled /></el-icon>
                  </el-button>
                </el-tooltip>
              </template>
            </el-table-column>
          </el-table-column>
        </el-table>
      </div>
    </div>
  </div>
</template>

<script>
export default {
    
    
  data: () => ({
    
    
    tableData: [
      {
    
    
        zone: "王者一区",
        career: "坦克",
        hero: "亚瑟",
        firstSkill: "誓约之盾",
        secondSkill: "回旋打击",
        thirdSkill: "圣剑裁决",
      },
      {
    
    
        zone: "王者一区",
        career: "坦克",
        hero: "吕布",
        firstSkill: "方天画斩",
        secondSkill: "贪狼之握",
        thirdSkill: "魔神降世",
      },
      {
    
    
        zone: "王者一区",
        career: "坦克",
        hero: "项羽",
        firstSkill: "无畏冲锋",
        secondSkill: "破釜沉舟",
        thirdSkill: "霸王斩杀",
      },
      {
    
    
        zone: "王者一区",
        career: "战士",
        hero: "云缨",
        firstSkill: "断月",
        secondSkill: "追云",
        thirdSkill: "逐星",
      },
      {
    
    
        zone: "王者一区",
        career: "战士",
        hero: "赵怀真",
        firstSkill: "拨云见明",
        secondSkill: "气定神凝",
        thirdSkill: "阴阳逆转",
      },
      {
    
    
        zone: "王者二区",
        career: "刺客",
        hero: "镜",
        firstSkill: "开锋",
        secondSkill: "裂空",
        thirdSkill: "见影",
      },
      {
    
    
        zone: "王者二区",
        career: "刺客",
        hero: "澜",
        firstSkill: "破浪",
        secondSkill: "断空",
        thirdSkill: "处决",
      },
      {
    
    
        zone: "王者二区",
        career: "刺客",
        hero: "李白",
        firstSkill: "将进酒",
        secondSkill: "神来之笔",
        thirdSkill: "青莲剑歌",
      },
      {
    
    
        zone: "王者三区",
        career: "法师",
        hero: "妲己",
        firstSkill: "灵魂冲击",
        secondSkill: "偶像魅力",
        thirdSkill: "女王崇拜",
      },
      {
    
    
        zone: "王者三区",
        career: "射手",
        hero: "后羿",
        firstSkill: "多重箭矢",
        secondSkill: "落日余晖",
        thirdSkill: "灼日之矢",
      },
      {
    
    
        zone: "王者三区",
        career: "射手",
        hero: "鲁班7号",
        firstSkill: "河豚手雷",
        secondSkill: "无敌鲨嘴炮",
        thirdSkill: "空中支援",
      },
      {
    
    
        zone: "王者三区",
        career: "辅助",
        hero: "孙膑",
        firstSkill: "时空爆弹",
        secondSkill: "时之波动",
        thirdSkill: "时光流逝",
      },
      {
    
    
        zone: "王者三区",
        career: "辅助",
        hero: "庄周",
        firstSkill: "化蝶",
        secondSkill: "蝴蝶效应",
        thirdSkill: "天人合一",
      },
    ],

    first_row: {
    
    },
    second_row: {
    
    },
  }),
  methods: {
    
    
    /**
     * 合并单元格句柄方法
     */
    handleSpanMethod({
    
    
      row, // 行
      column, // 列
      rowIndex, // 行索引
      columnIndex, // 列索引
    }) {
    
    
      const rowspanArr = this.formatRowspanAndColspan(this.tableData, 'zone')
      if (columnIndex === 0) {
    
    
        // console.log('row =>', row)
        // console.log('column =>', column)
        // console.log('rowIndex =>', rowIndex)
        // console.log('columnIndex =>', columnIndex)
        // console.log('\n')
        return {
    
    
          rowspan: rowspanArr[rowIndex],
          colspan: 1
        }
      }
    },

    /**
     * 合并单元格辅助 
     */
    formatRowspanAndColspan(tableList, keyName) {
    
    
      const keyNameList = []
      tableList.forEach(
        t => {
    
    keyNameList.push(t[keyName])}
      )
      // console.log('keyNameList =>', keyNameList)

      let prev // 上一个键名的索引
      let contin = 0 // 连续相同键名个数
      const computedList = [] // 计算后的键名列表
      for (let i = 0; i < keyNameList.length; i++) {
    
    
        if (computedList.length === 0) {
    
    
          computedList.push({
    
     'key': keyNameList[i], 'val': 1 })
        } else {
    
    
          if (keyNameList[prev] === keyNameList[i]) {
    
    
            contin++
            computedList.push({
    
     'key': keyNameList[i], 'val': 0 })
          } else {
    
    
            if (contin > 0) {
    
    
              const index = computedList.length - 1 - contin
              const key = computedList[index].key
              const val = computedList[index].val
              const obj = {
    
     'key': key, 'val': val + contin}
              computedList.splice(index, 1, obj)
            }
            computedList.push({
    
     'key': keyNameList[i], 'val': 1 })
            contin = 0
          }
        }

        prev = i // 将 i 赋值给 prev,以便当下一次循环时获取上一个键值的索引
      }
      if (contin > 0) {
    
    
        const index = computedList.length - 1 - contin
        const key = computedList[index].key
        const val = computedList[index].val
        const obj = {
    
     'key': key, 'val': val + contin}
        computedList.splice(index, 1, obj)
      }
      // console.log('computedList =>', computedList)

      const finalList = []
      computedList.forEach(
        t => {
    
    finalList.push(t.val)}
      )
      // console.log('finalList =>', finalList)

      return finalList
    },
  },
};
</script>

<style lang="less" scoped>
  .merge-cell {
    
    
    display: flex;
    flex-direction: column;
    position: relative;
    width: 100%;
    height: 100%;
    overflow: hidden;

    .merge-cell-navbar {
    
    
      position: relative;
      width: 100%;
      height: 100px;
      background-color: #686868;
      text-align: center;
      line-height: 100px;
      color: #fff;
      font-size: 25px;
    }

    .merge-cell-content {
    
    
      position: relative;
      flex: 1;
      padding: 100px;
      overflow: hidden;

      .merge-cell-content-container {
    
    
        position: relative;
        width: 100%;
        height: 100%;
        overflow: auto;
      }
    }

    :deep(.el-table) {
    
    

      td .cell {
    
    
        padding: 2.5px 0;
        color: #686868;
        font-size: 13px;
      }

      .first_row td:nth-child(1),
      .second_row td:nth-child(1),
      .first_row.second_row td:nth-child(2) {
    
    
          background: #f5f7fa !important;
      }
    }

    /* ^ 设置Table表格边框颜色 */
    :deep(.el-table--border) {
    
    
      &::before {
    
    
        background-color: #b6d1ff;
      }
      &::after {
    
    
        background-color: #b6d1ff;
      }
      .el-table__cell {
    
    
        border-color: #b6d1ff;
      }
      .el-table__inner-wrapper {
    
    
        &::before {
    
    
          background-color: #b6d1ff;
        }
        &::after {
    
    
          background-color: #b6d1ff;
        }
        .el-table__border-left-patch {
    
    
          background-color: #b6d1ff;
        }
      }
    }
    /* / 设置Table表格边框颜色 */
  }
</style>

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

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

相关文章

超级右键 - 为 Mac 的右键菜单升级一下

是不是有很多小伙伴&#xff0c;希望 Mac 也能像 Windows 一样&#xff0c;拥有丰富的右键菜单&#xff0c;快速完成新建、剪切、发送文件等操作。 一个叫作超级右键的工具就能做到&#xff0c;它能为 Mac 右键菜单增添多个功能选项&#xff0c;如 Win 系统般一键新建 / 剪切文…

vue通过html2canvas+jspdf生成PDF问题全解(水印,分页,截断,多页,黑屏,空白,附源码)

前端导出PDF的方法不多&#xff0c;常见的就是利用canvas画布渲染&#xff0c;再结合jspdf导出PDF文件&#xff0c;代码也不复杂&#xff0c;网上的代码基本都可以拿来即用。 如果不是特别追求完美的情况下&#xff0c;或者导出PDF内容单页的话&#xff0c;那么基本上也就满足业…

我的大模型岗位面试总结!太卷了!!!—我面试了24家大模型岗位 只拿了9个offer!

这段时间面试了很多家&#xff08;共24家&#xff0c;9个offer&#xff0c;简历拒了4家&#xff0c;剩下是面试后拒的&#xff09;&#xff0c;也学到了超级多东西。 大模型这方向真的卷&#xff0c;面试时好多新模型&#xff0c;新paper疯狂出&#xff0c;东西出的比我读的快…

传统CV算法——基于opencv的答题卡识别判卷系统

基于OpenCV的答题卡识别系统&#xff0c;其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术&#xff0c;自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述&#xff1a; 1. 导入必要的库 系统首先导入…

误删的PPT怎么恢复回来?

在日常工作和学习中&#xff0c;PPT已成为我们不可或缺的工具。然而&#xff0c;有时不小心误删重要的PPT文件&#xff0c;可能会让人倍感焦虑。别担心&#xff0c;本文将为你提供几种实用的方法&#xff0c;帮助你轻松恢复误删的PPT文件。 一、从回收站恢复 当你误删文件时&…

【Grafana】Prometheus结合Grafana打造智能监控可视化平台

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

香港一带一路研究院国际事务研究中心副主任陈景才阐述香港在一带一路建设及区块链金融领域的关键作用

2024年8月28日&#xff0c;香港金管局举行Ensemble项目沙盒&#xff08;以下简称沙盒&#xff09;启动仪式&#xff0c;并宣布首阶段试验将涵盖四大代币化资产用例主题&#xff0c;标志着金融业在代币化技术的实际应用进程中迈出重要一步。香港一带一路研究院国际事务研究中心副…

解剖学上合理的分割:通过先验变形显式保持拓扑结构|文献速递--基于深度学习的医学影像病灶分割

Title 题目 Anatomically plausible segmentations: Explicitly preserving topology through prior deformations 解剖学上合理的分割&#xff1a;通过先验变形显式保持拓扑结构 01 文献速递介绍 进行环向应变或壁厚度的计算&#xff0c;这些测量通常用于诊断肥厚性心肌病…

IDEA 安装lombok插件不兼容的问题及解决方法

解决&#xff1a;IDEA 安装lombok插件不兼容问题&#xff0c;plugin xxxx is incompatible 一、去官网下载最新的2024版本 地址传送通道&#xff1a; lombok插件官网地址https://plugins.jetbrains.com/plugin/6317-lombok/versions/stable 二、修改参数的配置 在压缩包路径…

理解C++的【内部链接】和【外部链接】

一、前言 最近在看《大规模C程序设计》一书&#xff0c;看第一章关于内部链接和外部链接这部分时&#xff0c;有点不太明白。通过书本理解和网上查阅文献&#xff0c;在此记录一下自己对这部分知识点的理解。 首先&#xff0c;提几个问题&#xff1a; 什么是内部链接&#x…

全域运营公司哪家做得好?全域运营系统综合评测结果揭晓!

作为当前火爆的风口项目&#xff0c;一直以来&#xff0c;全域运营都以其广阔的业务范围和巨大的收益潜力吸引着一批又一批的创业者入局分羹&#xff0c;使得全域运营公司哪家做得好等问题一度成为了相关创业者交流群内的讨论重点。 从目前的市场情况来看&#xff0c;由于进入…

定期加强医疗器械维修技能学习重要性

医学影像技术是现代医疗的重要支撑,是辅助临床诊断和治疗不可或缺的技术手段。影像医疗设备成像质量的优劣程度在一定程度上决定了疾病诊断结果的准确性,而术中使用的影像设备的优劣甚至可能影响手术的成功率。因此保证设备正常使用是重中之重&#xff0c;设备售后维修保养也就…

Langchain-Chatchat+Qwen实现本地知识库

1.基础介绍 Langchain-Chatchat一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。大致过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化…

《OpenCV计算机视觉》—— 对图片的各种操作

文章目录 1、安装OpenCV库2、读取、显示、查看图片3、对图片进行切割4、改变图像的大小5、图片打码6、图片组合7、图像运算8、图像加权运算 1、安装OpenCV库 使用pip是最简单、最快捷的安装方式 pip install opencv-python3.4.2还需要安装一个包含了其他一些图像处理算法函数的…

vector中的push_back()和emplace_back()的区别、以及使用场景

目录 前言 1. 基本区别 2. 性能差异 3. 构造参数传递 4. 使用场景总结 前言 push_back() 更适合在已经有对象实例的情况下使用。emplace_back() 则更适合需要在容器内部直接构造对象的场景&#xff0c;特别是在性能敏感的情况下。 1. 基本区别 push_back(): 作用&#xff…

酒店智能触摸开关在酒店管理中的作用

在众多智能化设备中&#xff0c;酒店智能触摸开关以其便捷性、高效性和节能环保的特性&#xff0c;正逐步成为提升住客体验、优化酒店运营管理的关键元素。本文将深入探讨酒店智能触摸开关在酒店管理中的多重作用。 一、提升住客体验&#xff0c;增强服务品质 便捷操作&#xf…

护眼灯真的可以保护眼睛吗?曝光劣质护眼台灯常见的三个特征

护眼灯真的可以保护眼睛吗&#xff1f;随着时代的发展&#xff0c;我们注意到越来越多的孩子开始佩戴眼镜。这一趋势引起了许多细心家长的关注&#xff0c;他们认识到这不仅是个别情况&#xff0c;而是现代生活方式和环境对孩子视力健康的挑战。自然而然地&#xff0c;“儿童是…

【淘宝采集项目经验分享】商品评论采集 |商品详情采集 |关键词搜索商品信息采集

商品评论采集 1、输入商品ID 2、筛选要抓取评论类型 3、填写要抓取的页数 4、立刻提交-启动测试 5、等爬虫结束后就可以到“爬取结果”里面下载数据 商品详情采集 1、输入商品ID 2、立刻提交-启动爬虫 3、等爬虫结束后就可以到“爬取结果”里面下载数据 taobao.item_…

报名开启!IDEA研究院编程语言MoonBit全球编程创新挑战赛启动

"懂语言者得天下"。探索编程之革新&#xff0c;参与AI时代编程语言之构建。2024年MoonBit全球编程创新挑战赛&#xff0c;为你开启&#xff01; 我们向每一位怀揣才华与创意的编程爱好者发出邀请&#xff0c;一起在这场创新与挑战的盛会中&#xff0c;将理想照进现实…

针对IP专用https证书的详细申请教程

IP&#xff08;Internet Protocol&#xff09;地址是网络中最基本的标识之一&#xff0c;它是互联网上设备之间通信的基础。 IP SSL作为一种强大的技术&#xff0c;不仅可以保护网站和应用程序的数据传输安全&#xff0c;还能为企业和个人提供一个更加安全的网络环境。本文将探…