Vue前端的一些表格组件的思考

当我们需要在前端中展示一些表格内容时,我们往往使用Vuetable来实现

1. 原生态实现

<template>
  <div>
    <table class="no-gap-table">
        <thead>
          <tr>
            <th class="styled-header" colspan="4">Column1</th>
            <th class="styled-header" colspan="3">column2</th>
            <th class="styled-header" colspan="2">Column3</th>
            <th class="styled-header" rowspan="3">Column4</th>
            <th class="styled-header" colspan="2">Column5</th>
          </tr>
          <tr>
            <th class="styled-header" colspan="2">SubColumn1 aaaa</th>
            <th class="styled-header" colspan="2">SubColumn1 bbbb</th>
            <th class="styled-header" colspan="2">SubColumn2 cccc</th>
            <th class="styled-header" colspan="1">SubColumn2 dddd</th>
            <th class="styled-header" colspan="1">SubColumn3 eeee</th>
            <th class="styled-header" colspan="1">SubColumn3 ffff</th>
            <th class="styled-header" colspan="1" rowspan="2">SubColumn5 ffff</th>
            <th class="styled-header" colspan="1" rowspan="2">SubColumn5 ffff</th>
          </tr>
          <tr>
            <th class="styled-header">ChildColumn aaaa</th>
            <th class="styled-header">ChildColumn bbbb</th>
            <th class="styled-header">ChildColumn cccc</th>
            <th class="styled-header">ChildColumn dddd</th>
            <th class="styled-header">ChildColumn eeee</th>
            <th class="styled-header">ChildColumn ffff</th>
            <th class="styled-header">ChildColumn dddd</th>
            <th class="styled-header">ChildColumn eeee</th>
            <th class="styled-header">ChildColumn ffff</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="(item) in items" :key="item.id">
            <td>{{ item.column1 }}</td>
            <td>{{ item.column2_1 }}</td>
            <td>{{ item.column2_2 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
          </tr>
        </tbody>
      </table>
  </div>
</template>

  

<script>
export default {
  name:"MyTable",
  props:['columnTreeInfo','tableDataSource'],
  data() {
    return {
      data:{
        items: [
          { id: 1, column1: 'Item 1', column2_1: 'Subitem 1', column2_2: 'Subitem 2', column3: 'Value 1' },
          { id: 2, column1: 'Item 2', column2_1: 'Subitem 1', column2_2: 'Subitem 2', column3: 'Value 2' },
        ]
      }
    };
  },
  methods:{
  },
  created(){
    this.$refs['columnInfo'].appendChild(this.template)
  },
  beforeCreate(){
    console.log(this);
  }
};
</script>

<style scoped>
.no-gap-table {
  border-collapse: collapse; /* Merge adjacent cell borders */
  width: 100%; /* Set the table width to 100% */
}
.no-gap-table th,
.no-gap-table td {
  border: 1px solid #000; /* Add a border around each cell */
  padding: 0; /* Remove cell padding */
  margin: 0; /* Remove cell margin */
}
.styled-header {
  border:  solid #000; /* Add a 2px solid black underline */
  padding: 2 px; /* Add some padding for better visual appearance */
}
</style>

当前实现如下:

在这里插入图片描述

2. 动态递归封装组件

2.1. 层级递归实现

<template>
    <div>
      <table class="no-gap-table">
        <MyTableChildRow :columns="headerColumns" />
        <tbody>
            <tr v-for="(item) in items" :key="item.id">
              <td>{{ item.column1 }}</td>
              <td>{{ item.column2_1 }}</td>
              <td>{{ item.column2_2 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
              <td>{{ item.column3 }}</td>
            </tr>
        </tbody>
      </table>
    </div>
  </template>
  <script>
  import MyTableChildRow from './MyTableChildRow.vue';
  export default {
    components: {
      MyTableChildRow
    },
    data() {
      return {
        headerColumns: [
          {
            key:1,
            children:[
              {
                label:"Column1",
                colspan:1,
              },
              {
                label:"Column2",
                colspan:1,
              },
              {
                label:"Column3",
                colspan:1,
              },
              {
                label:"Column4",
                colspan:2,
              }
            ]
          },
          {
            key:2,
            children:[
              {
                label:"Column1",
                colspan:1,
              },
              {
                label:"Column2",
                colspan:1,
              },
              {
                label:"Column3",
                colspan:1,
              },
              {
                label:"Column4",
                colspan:1,
              },
              {
                label:"Column5",
                colspan:1,
              }
            ]
          },
          {
            key:3,
            children:[
              {
                label:"Column1",
                colspan:1,
              },
              {
                label:"Column2",
                colspan:1,
              },
              {
                label:"Column3",
                colspan:1,
              },
              {
                label:"Column4",
                colspan:1,
              },
              {
                label:"Column5",
                colspan:1,
              }
            ]
          },
          {
            key:4,
            children:[
              {
                label:"Column1",
                colspan:1,
              },
              {
                label:"Column2",
                colspan:1,
              },
              {
                label:"Column3",
                colspan:1,
              },
              {
                label:"Column4",
                colspan:1,
              },
              {
                label:"Column5",
                colspan:1,
              }
            ]
          },
        ],
        items: [
          { id: 1, column1: 'Item 1', column2_1: 'Subitem 1', column2_2: 'Subitem 2', column3: 'Value 1' },
          { id: 2, column1: 'Item 2', column2_1: 'Subitem 1', column2_2: 'Subitem 2', column3: 'Value 2' },
        ]
      };
    }
  };
  </script>
  <style scoped>
  .no-gap-table {
    border-collapse: collapse; /* Merge adjacent cell borders */
    width: 100%; /* Set the table width to 100% */
  }
  .no-gap-table th,
  .no-gap-table td {
    border: 1px solid #000; /* Add a border around each cell */
    padding: 0; /* Remove cell padding */
    margin: 0; /* Remove cell margin */
  }
  </style>
<template>
  <div>
    <table class="no-gap-table">
      <thead>
        <MyTableChildCol :columns="headerColumns" />
      </thead>
      <tbody>
          <tr v-for="(item) in items" :key="item.id">
            <td>{{ item.column1 }}</td>
            <td>{{ item.column2_1 }}</td>
            <td>{{ item.column2_2 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
            <td>{{ item.column3 }}</td>
          </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
import MyTableChildCol from './MyTableChildCol.vue';
  
export default {
  components: {
    MyTableChildCol
  },
  data() {
    return {
      headerColumns: [
        { key: 'header1', label: 'Header 1', colspan: 2 },
        {
          key: 'header2', label: 'Header 2', rowspan: 2,
          children: [
            { key: 'subheader2_1', label: 'Subheader 2.1' },
            { key: 'subheader2_2', label: 'Subheader 2.2', colspan: 2,
              children: [
                { key: 'subsubheader2_2_1', label: 'Sub-subheader 2.2.1' },
                { key: 'subsubheader2_2_2', label: 'Sub-subheader 2.2.2' }
              ]
            }
          ]
        },
        { key: 'header3', label: 'Header 3', colspan: 2 }
      ],
      items: [
        { id: 1, column1: 'Item 1', column2_1: 'Subitem 1', column2_2: 'Subitem 2', column3: 'Value 1' },
        { id: 2, column1: 'Item 2', column2_1: 'Subitem 1', column2_2: 'Subitem 2', column3: 'Value 2' },
      ]
    };
  }
};
</script>

<style scoped>
.no-gap-table {
  border-collapse: collapse; /* Merge adjacent cell borders */
  width: 100%; /* Set the table width to 100% */
}
.no-gap-table th,
.no-gap-table td {
  border: 1px solid #000; /* Add a border around each cell */
  padding: 0; /* Remove cell padding */
  margin: 0; /* Remove cell margin */
}
</style>

在这里插入图片描述

3. 开源好用的一些Vue table 组件汇总

3.1. Vue easytable

Vue Easytable 是一个基于Vue2的表格组件,支持单元格合并、单元格编辑、多表头固定、多列固定、列拖动、排序、自定义列、分页、单元格编辑、多选、条件过滤、footer 汇总等功能。

3.1.1. 功能

  • 自适应,可以随着浏览器窗口改变自动适应
  • 固定列,表头固定
  • 支持列宽拖动
  • 支持单个字段排序和多个字段排序
  • 自定义列、自定义单元格样式
  • loading效果、自定义loading 等
  • 自带分页组件
  • 单元格编辑
  • 支持单元格合并 (colSpan and rowSpan)
  • 支持 checkbox 多选功能
  • footer 汇总功能
  • 添加条件过滤功能
  1. 安装 Vue EasyTable:

首先,在你的 Vue 项目中安装 Vue EasyTable:

npm install vue-easytable --save

3.1.2. git地址和官方地址

  • git地址:Happy-Coding-Clans/vue-easytable: A powerful data table based on vuejs. You can use it as data grid、Microsoft Excel or Google sheets. It supports virtual scroll、cell edit etc. (github.com)
  • 官网地址:Table Component/ Data Grid / Data Table.Support Virtual Scroll,Column Fixed,Header Fixed,Header Grouping,Filter,Sort,Cell Ellipsis,Row Expand,Row Checkbox (gitee.io)

3.1.3. 内容介绍

  • 官网首页效果图

在这里插入图片描述

  • 复合表头效果以及代码

在这里插入图片描述

<template>
    <ve-table border-y :columns="columns" :table-data="tableData" />
</template>

<script>
    export default {
        data() {
            return {
                columns: [
                    { 
	                    field: "col1", 
	                    key: "a", 
	                    title: "col1", 
	                    width: "10%" 
	                },
                    {
                        title: "col2-col3",
                        children: [
                            {
                                field: "col2",
                                key: "b",
                                title: "col2",
                                width: 100,
                            },
                            {
                                field: "col3",
                                key: "c",
                                title: "col3",
                                width: 110,
                            },
                        ],
                    },
                    {
                        title: "col4-col5-col6",
                        children: [
                            {
                                title: "col4-col5",
                                children: [
                                    {
                                        field: "col4",
                                        key: "d",
                                        title: "col4",
                                        width: 130,
                                    },
                                    {
                                        field: "col5",
                                        key: "e",
                                        title: "col5",
                                        width: 140,
                                    },
                                ],
                            },
                            {
                                title: "col6",
                                field: "col6",
                                key: "f",
                                width: 140,
                            },
                        ],
                    },
                    { 
	                    field: "col7", 
	                    key: "g", 
	                    title: "col7", 
	                    width: 150 
	                },
                    { 
	                    field: "col8", 
	                    key: "h", 
	                    title: "col8", 
	                    width: 160 
	                },
                ],
                tableData: [],
            };
        },
        methods: {
            initTableData() {
                let data = [];
                for (let i = 0; i < 6; i++) {
                    data.push({
                        rowKey: i,
                        col1: i,
                        col2: i,
                        col3: i,
                        col4: i,
                        col5: i,
                        col6: i,
                        col7: i,
                        col8: i,
                    });
                }
                this.tableData = data;
            },
        },
        created() {
            this.initTableData();
        },
    };
</script>
  • 单元格编辑
1、通过 `editOption`属性配置单元格编辑功能  
2、通过 `columns` 对象设置`edit=true`允许编辑的列

在这里插入图片描述

<template>
    <div>
        <button class="button-demo" @click="startEditingCell(0,'name')">编辑单元格0-0</button>
        <button class="button-demo" @click="startEditingCell(2,'hobby','')">
            编辑并清空单元格2-2
        </button>
        <br />
        <br />
        <ve-table
            ref="tableRef"
            rowKeyFieldName="rowKey"
            :max-height="300"
            :fixed-header="true"
            :columns="columns"
            :table-data="tableData"
            :editOption="editOption"
            :row-style-option="rowStyleOption"
            border-y
        />
    </div>
</template>

<script>
    export default {
        data() {
            return {
                rowStyleOption: {
                    clickHighlight: false,
                    hoverHighlight: false,
                },
                // edit option 可控单元格编辑
                editOption: {
                    // cell value change
                    cellValueChange: ({ row, column }) => {
                        console.log("cellValueChange row::", row);
                        console.log("cellValueChange column::", column);
                    },
                },
                columns: [
                    {
                        field: "",
                        key: "a",
                        title: "",
                        width: 50,
                        align: "center",
                        operationColumn: true,
                        renderBodyCell: ({ row, column, rowIndex }, h) => {
                            return ++rowIndex;
                        },
                    },
                    {
                        field: "name",
                        key: "name",
                        title: "Name",
                        align: "left",
                        width: "15%",
                        edit: true,
                    },
                    {
                        field: "date",
                        key: "date",
                        title: "Date",
                        align: "left",
                        width: "15%",
                        edit: true,
                    },
                    {
                        field: "hobby",
                        key: "hobby",
                        title: "Hobby",
                        align: "left",
                        width: "30%",
                        edit: true,
                    },
                    {
                        field: "address",
                        key: "address",
                        title: "Address",
                        align: "left",
                        width: "40%",
                        edit: true,
                    },
                ],
                // table data
                tableData: [
                    {
                        name: "John",
                        date: "1900-05-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Shanghai",
                        rowKey: 0,
                    },
                    {
                        name: "Dickerson",
                        date: "1910-06-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Beijing",
                        rowKey: 1,
                    },
                    {
                        name: "Larsen",
                        date: "2000-07-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Chongqing",
                        rowKey: 2,
                    },
                    {
                        name: "Geneva",
                        date: "2010-08-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Xiamen",
                        rowKey: 3,
                    },
                    {
                        name: "Jami",
                        date: "2020-09-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Shenzhen",
                        rowKey: 4,
                    },
                ],
            };
        },
        methods: {
            // start editing cell
            startEditingCell(rowKey, colKey, defaultValue) {
                this.$refs["tableRef"].startEditingCell({ rowKey, colKey, defaultValue });
            },
        },
    };
</script>
  • 自定义事件

在这里插入图片描述

<template>
    <div>
        打开F12 查看 console 信息
        <ve-table
            :columns="columns"
            :table-data="tableData"
            :event-custom-option="eventCustomOption"
        />
    </div>
</template>

<script>
    export default {
        data() {
            return {
                eventCustomOption: {
                    bodyRowEvents: ({ row, rowIndex }) => {
                        return {
                            click: (event) => {
                                console.log("click::", row, rowIndex, event);
                            },
                            dblclick: (event) => {
                                console.log("dblclick::", row, rowIndex, event);
                            },
                            contextmenu: (event) => {
                                console.log("contextmenu::", row, rowIndex, event);
                            },
                            mouseenter: (event) => {
                                console.log("mouseenter::", row, rowIndex, event);
                            },
                            mouseleave: (event) => {
                                console.log("mouseleave::", row, rowIndex, event);
                            },
                        };
                    },
                },
                columns: [
                    {
                        field: "",
                        key: "a",
                        title: "",
                        width: 50,
                        align: "center",
                        renderBodyCell: ({ row, column, rowIndex }, h) => {
                            return ++rowIndex;
                        },
                    },
                    {
                        field: "name",
                        key: "b",
                        title: "Name",
                        width: 200,
                        align: "left",
                    },
                    {
                        field: "hobby",
                        key: "c",
                        title: "Hobby",
                        width: 300,
                        align: "left",
                    },
                    {
                        field: "address",
                        key: "d",
                        title: "Address",
                        width: "",
                        align: "left",
                    },
                ],
                tableData: [
                    {
                        rowKey: 1001,
                        name: "John",
                        date: "1900-05-20",
                        hobby: "coding",
                        address: "No.1 Century Avenue, Shanghai",
                    },
                    {
                        rowKey: 1002,
                        name: "Dickerson",
                        date: "1910-06-20",
                        hobby: "coding",
                        address: "No.1 Century Avenue, Beijing",
                    },
                    {
                        rowKey: 1003,
                        name: "Larsen",
                        date: "2000-07-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Chongqing",
                    },
                    {
                        rowKey: 1004,
                        name: "Geneva",
                        date: "2010-08-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Xiamen",
                    },
                    {
                        rowKey: 1005,
                        name: "Jami",
                        date: "2020-09-20",
                        hobby: "coding and coding repeat",
                        address: "No.1 Century Avenue, Shenzhen",
                    },
                ],
            };
        },
    };
</script>
  • 更多特性和API请前往官网文档查看

3.2. Vue Good Table

Vue Good Table是一款基于Vue.js的易于使用、高度可配置且灵活的表格组件,使得在Web应用中呈现大量数据非常容易。Vue Good Table允许您对表格进行排序、分页、筛选、编辑、导出、自定义列、自定义行、悬停和展开/收缩行等操作。

Vue Good Table使用简单,只需要导入并在Vue实例中注册即可:

3.2.1. 安装使用

npm i vue-good-table

3.2.2. git地址和官网地址

  • git地址:xaksis/vue-good-table: An easy to use powerful data table for vuejs with advanced customizations including sorting, column filtering, pagination, grouping etc (github.com)
  • 官网地址:vue-good-table (xaksis.github.io)

3.2.3. 内容介绍

  1. 文档内容,官网文档首页

在这里插入图片描述

  1. 暂未在goodtable中找到复合表头实现的样例,有样例或实现api留言评论唤醒笔者即可!

3.3. Vue vxe-table

一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式为零代码而设计…

  • 设计理念

    • 面向现代浏览器,高效的简洁 API 设计
    • 模块化表格、按需加载
    • 为单行编辑表格而设计,支持增删改查及更多扩展,强大的功能的同时兼具性能

3.3.1 功能

  • 基础表格
  • 配置式表格
  • 基础表单
  • 配置式表单
  • 斑马线条纹
  • 多种边框
  • 单元格样式
  • 列宽拖动
  • 最小/最大高度
  • 自适应宽高
  • 固定列
  • 多级表头
  • 表尾数据
  • 高亮行或列
  • 序号
  • 单选框
  • 复选框
  • 下拉选项
  • 开关
  • 排序
  • 多字段排序
  • 筛选
  • 合并单元格
  • 合并表尾
  • 导入/导出/打印
  • 显示/隐藏列
  • 加载中
  • 格式化内容
  • 自定义插槽 - 模板
  • 快捷菜单
  • 展开行
  • 分页
  • 工具栏
  • 下拉容器
  • 虚拟列表
  • 虚拟树
  • 增删改查
  • 数据校验
  • 数据代理
  • 键盘导航
  • 弹窗
  • 渲染器
  • 虚拟滚动
  • 虚拟合并
  • CSS 变量主题
  • (pro) 单元格区域选取
  • (pro) 单元格复制/粘贴
  • (pro) 单元格查找和替换

3.3.2. 安装使用

npm install xe-utils vxe-table@next

3.3.3 git地址和官网地址

  • git地址:x-extends/vxe-table: vxe-table vue 表单/表格解决方案 (github.com)
  • 官网地址:vxe-table v4 (vxetable.cn)

3.3.4. 内容介绍

  1. 官网内容

在这里插入图片描述

  1. 复合表头的实现

在这里插入图片描述

<template>
  <div>
    <vxe-grid v-bind="gridOptions"></vxe-grid>
  </div>
</template>

<script setup>
import { reactive } from 'vue'
const gridOptions = reactive({
  border: true,
  stripe: true,
  height: 500,
  columnConfig: {
    resizable: true
  },
  columns: [
    { type: 'seq', width: 50 },
    {
      title: '基本信息',
      children: [
        { field: 'name', title: 'Name' },
        {
          title: '其他信息',
          children: [
            { field: 'nickname', title: 'Nickname' },
            { field: 'age', title: 'Age', sortable: true }
          ]
        },
        { field: 'sex', title: 'Sex' }
      ]
    },
    { field: 'address', title: 'Address', sortable: true, showOverflow: true }
  ],
  data: [
    { id: 10001, name: 'Test1', nickname: 'T1', role: 'Develop', sex: 'Man', age: 28, address: 'Shenzhen' },
    { id: 10002, name: 'Test2', nickname: 'T2', role: 'Test', sex: 'Women', age: 22, address: 'Guangzhou' },
    { id: 10003, name: 'Test3', nickname: 'T3', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai' },
    { id: 10004, name: 'Test4', nickname: 'T4', role: 'Designer', sex: 'Women', age: 23, address: 'Shenzhen' },
    { id: 10005, name: 'Test5', nickname: 'T5', role: 'Develop', sex: 'Women', age: 30, address: 'Shanghai' },
    { id: 10006, name: 'Test6', nickname: 'T6', role: 'Designer', sex: 'Women', age: 21, address: 'Shenzhen' },
    { id: 10007, name: 'Test7', nickname: 'T7', role: 'Test', sex: 'Man', age: 29, address: 'Shenzhen' },
    { id: 10008, name: 'Test8', nickname: 'T8', role: 'Develop', sex: 'Man', age: 35, address: 'Shenzhen' }
  ]
})
</script>

3.4. Tabulator

Tabulator 是一个基于 JavaScript 的交互式数据表格库,它提供了丰富的功能和灵活性,可以用于在 Web 应用中展示和操作数据表格。Tabulator 允许你快速创建可排序、可筛选、可分页的表格,还支持自定义样式、模板、事件处理等。

一些 Tabulator 的特点和功能包括:

  • 丰富的特性: Tabulator 提供了排序、筛选、分页、编辑、行选择、复制粘贴、拖放等一系列功能,使得数据表格更具交互性和可操作性。

  • 自定义模板: 你可以自定义单元格内容的模板,以便在表格中显示自定义格式的数据。

  • 可扩展的插件: Tabulator 允许你使用插件来扩展功能,如导出数据、打印表格等。

  • 多种数据源: Tabulator 支持从本地数据、远程数据、Ajax 请求等多种数据源中获取数据。

  • 适应不同设备: Tabulator 是响应式的,可以在不同的设备上展示适应性强的表格。

  • 支持多种主题: Tabulator 提供多种内置主题,也支持自定义样式。

  • 强大的 API: Tabulator 提供了丰富的 API,可以通过编程方式控制表格的行为和状态。

  • 跨浏览器支持: Tabulator 支持各种现代浏览器,包括 Chrome、Firefox、Safari、Edge 等。

  • 开源免费: Tabulator 是开源项目,可以免费使用和修改。

你可以访问官方网站和 GitHub 仓库以获取更多关于 Tabulator 的信息、文档和示例。

3.4.1. 安装使用

npm install tabulator-tables --save

3.4.2. git地址和官网地址

官方网站: http://tabulator.info/

GitHub 仓库: https://github.com/olifolkerd/tabulator

3.4.3. 内容介绍

在这里插入图片描述

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

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

相关文章

Linux 操作系统实战视频课 - GPIO 基础介绍

文章目录 一、GPIO 概念说明二、视频讲解沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解 GPIO 。 一、GPIO 概念说明 ARM 平台中的 GPIO(通用输入/输出)是用于与外部设备进行数字输入和输出通信的重要硬件接口。ARM 平台的 GPIO 特性可以根据具体的芯…

六、高并发内存池--Central Cache

六、高并发内存池–Central Cache 6.1 Central Cache的工作原理 central cache也是一个哈希桶结构&#xff0c;他的哈希桶的映射关系跟thread cache是一样的。不同的是他的每个哈希桶位置挂是SpanList链表结构&#xff0c;不过每个映射桶下面的span中的大内存块被按映射关系切…

IPV4地址说明

设想一个场景&#xff1a; 你有两台电脑A和B&#xff0c;需要把A的数据传输到B&#xff0c;怎么办&#xff1f; 1 我们可以用U盘进行拷贝&#xff0c;就是把A的数据拷贝到B 2 我们可以用一根网线把AB连接起来 显然&#xff0c;两台电脑用一根网线。那要是n台电脑呢&#xff1f;…

进程管理死死的学

进程管理 文件属性 chattr【扩展】 chattr chattr i 文件名 # 添加权限 a 可追加&#xff0c;不可修改 i 只可查看 A 不修改访问时间 charrt -i 文件名 # 取消权限 -R 递归处理&#xff0c;将指令目录下的所有文件及子目录一并处理&#xff1b;lsattr 查看文件属性 lsattr …

事务的总结

数据库事务 数据库事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整地执行&#xff0c;要么完全不执行。事务管理是一个重要组成部分&#xff0c;RDBMS 面向企业应用程序&#xff0c;以确保数据完整性和一致性。事务的概念可以描述为具有以下四个关键属性描述…

js对中文进行base64编码和解码操作,解决中文乱码问题

我使用github api的接口获取文件内容&#xff0c;然后使用atob进行解码&#xff0c;但是发现&#xff1a;乱码.......糟心啊 所以就有了我封装的方法&#xff1a; export const encode64 (str) > {// 首先&#xff0c;我们使用 encodeURIComponent 来获得百分比编码的UTF…

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

案例背景 最近总看到《消失的她》票房多少多少&#xff0c;《孤注一掷》票房又破了多少多少..... 于是我就想自己爬虫一下获取中国高票房的电影数据&#xff0c;然后分析一下。 数据来源于淘票票&#xff1a;影片总票房排行榜 (maoyan.com) 爬它就行。 代码实现 首先爬虫获…

Django传递dataframe对象到前端网页

在django前端页面上展示的数据&#xff0c;还是使用django模板自带的语法 方式1 不推荐使用 直接使用 【df.to_html(indexFalse)】 使用to_html他会生成一个最基本的表格没有任何的样式&#xff0c;一点都不好看&#xff0c;如果有需要的话可以自行修改表格的样式&#xff0c;…

【教程】部署apprtc服务中安装google-cloud-cli组件的问题及解决

#0# 前置条件 已经安装完成node&#xff0c;grunt&#xff0c;node 组件和python pip包等。需要安装google-cloud-cli组件。 Ubuntu安装google-cloud-cli组件 apprtc项目运行需要google-cloud-cli前置组件&#xff0c;且运行其中的dev_appserver.py。 根据google官方的关于安…

如何使用CSS实现一个自适应等高布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Flexbox 布局⭐ 使用 Grid 布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发…

Linux(实操篇三)

Linux实操篇 Linux(实操篇三)1. 常用基本命令1.7 搜索查找类1.7.1 find查找文件或目录1.7.2 locate快速定位文件路径1.7.3 grep过滤查找及"|"管道符 1.8 压缩和解压类1.8.1 gzip/gunzip压缩1.8.2 zip/unzip压缩1.8.3 tar打包 1.9 磁盘查看和分区类1.9.1 du查看文件和…

RT_Thread内核机制学习(六)信号量

要传输较大数据时&#xff0c;使用队列。 传输较小数值时&#xff0c;使用邮箱。 队列、邮箱用来传递数据。 如果只是用来传递资源的个数&#xff0c;可以使用信号量。 A车与B车只需要传递信号量&#xff08;代表资源&#xff09;。 信号量 获取信号量 如果value>0&…

AI工人操作行为流程规范识别算法

AI工人操作行为流程规范识别算法通过yolov7python网络模型框架&#xff0c;AI工人操作行为流程规范识别算法对作业人员的操作行为进行实时分析&#xff0c;根据设定算法规则判断操作行为是否符合作业标准规定的SOP流程。Yolo意思是You Only Look Once&#xff0c;它并没有真正的…

记1次前端性能优化之CPU使用率

碰到这样的一个问题&#xff0c;用户反馈页面的图表一直加载不出来&#xff0c;页面还卡死 打开链接页面&#xff0c;打开控制台 Network 看到有个请求一直pending&#xff0c;结合用户描述&#xff0c;页面一直loading,似乎验证了我的怀疑&#xff1a;后端迟迟没有相应。 但是…

华为---OSPF协议优先级、开销(cost)、定时器简介及示例配置

OSPF协议优先级、开销、定时器简介及示例配置 路由协议优先级&#xff1a;由于路由器上可能同时运行多种动态路由协议&#xff0c;就存在各个路由协议之间路由信息共享和选择的问题。系统为每一种路由协议设置了不同的默认优先级&#xff0c;当在不同协议中发现同一条路由时&am…

【Go 基础篇】Go语言结构体之间的转换与映射

在Go语言中&#xff0c;结构体是一种强大的数据类型&#xff0c;用于定义和组织不同类型的数据字段。当我们处理复杂的数据逻辑时&#xff0c;常常需要在不同的结构体之间进行转换和映射&#xff0c;以便实现数据的转移和处理。本文将深入探讨Go语言中结构体之间的转换和映射技…

【算法与数据结构】112、LeetCode路径总和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题通过计算根节点到叶子节点路径上节点的值之和&#xff0c;然后再对比目标值。利用文章【算法和数据…

SpringBoot集成JWT token实现权限验证

JWTJSON Web Token 1. JWT的组成 JWTHeader,Payload,Signature>abc.def.xyz 地址&#xff1a;JSON Web Tokens - jwt.er 1.1 Header Header:标头。 两个组成部分&#xff1a;令牌的类型&#xff08;JWT&#xff09;和所使用的签名算法&#xff0c;经过Base64 Url编码后形成…

一、Mycat2介绍与下载安装

第一章 入门概述 1.1 是什么 Mycat 是数据库中间件。 1、数据库中间件 中间件&#xff1a;是一类连接软件组件和应用的计算机软件&#xff0c;以便于软件各部件之间的沟 通。 例子&#xff1a;Tomcat&#xff0c;web中间件。 数据库中间件&#xff1a;连接java应用程序和数据库…

CSS3D+动画

CSS3D 1.css3D 给父元素设置 perspective:景深:近大远小的效果900-1200px这个范围内 transform-style:是否设置3D环境 flat 2D环境 默认值 perserve-3D环境 3D功能函数 1.位移: translateZ()translate3D(x,y,z) <!DOCTYPE html> <html lang"en"><h…