【自定义列表头】vue el-table表格自定义列显示隐藏,多级表头自定义列显示隐藏,自由搭配版本和固定列版本【注释详细】

news2024/11/29 7:43:05

前言 功能介绍

最近遇到一个功能,需要的是把表格的列可以配置,
用户可以根据自己想要看的数据来改变表头列显示哪些隐藏哪些。
于是我做了两个版本。第一个版本是自由搭配的。
就是提前顶号所有的列,然后自己可以拖拽到想要位置顺序。
也可以自己新增一个二级表头自定义一个名称把表头都拖进去组成多级表头表格。不过这种的毕竟复杂。
第二个版本就简单一些了,是固定的列,比如十列写好了,然后用户只能在这十列里面选择显示或隐藏哪些。
位置不能动,文字也不能动。就是单纯的显示隐藏列

效果图

外面的表格样子,点击右边的小齿轮开始设置
在这里插入图片描述
打开后是这样的。左边可以勾选需要的列,会添加到右边。然后右边可以拖拽到想要的顺序。也可以添加一个蓝色表头自定义名字,然后把黑色的拖进去组成一个多级表头的表格。
在这里插入图片描述
可以修改蓝色的表头名称
在这里插入图片描述

代码

html部分

<el-table :data="tableDatas" border style="width: 100%" v-loading="loadings" :height="height"
                    ref="configurationTable">
                    <el-table-column v-for="(arrd,index) in headers" :key="Math.random()" :label="arrd.title"
                        align="center" width='100' show-overflow-tooltip>
                        <!-- 有子级 -->
                        <el-table-column v-for="(arrd2,index2) in arrd.children" align="center" :label="arrd2.title"
                            show-overflow-tooltip width='100' :key="Math.random()">
                            <template slot-scope="{row, $index}">
                                <span>{{row[arrd2.key]}}</span>
                            </template>
                        </el-table-column>
                        <!-- 无子级 -->
                        <template slot-scope="{row, $index}">
                            <span>{{row[arrd.key]}}</span>
                        </template>
                    </el-table-column>
                    <el-table-column align="center" width="50">
                        <template slot="header" slot-scope="scope">
                            <i class="el-icon-setting" style="font-size:20px;cursor: pointer;color: #409EFF;"
                                @click="createInfo"></i>
                        </template>
                    </el-table-column>
                </el-table>
                <!-- 组件:自定义表头(getherders是接受返回的表头,deflist是默认表头) -->
                <dynamiccolumn ref="dynamic_column" @getherders="getherders" :deflist="defList"></dynamiccolumn>

data

defList:[{
                            type: 'zdy',
                            title: '基础数据',
                            id:Math.random(),
                            children: [{
                                title: 'ID',
                                key: 'id'
                            }, {
                                title: '姓名',
                                key: 'name'
                            }]
                        },
                        {
                            title: '年龄',
                            key: 'age'
                        },
                        {
                            title: '性别',
                            key: 'sex'
                        },
                        {
                            title: '挂号量',
                            key: 'ghl'
                        },
                        {
                            title: '到诊量',
                            key: 'dzl'
                        },
                    ]

methods

// 初始化表头
            createInfo(){
                this.$refs.dynamic_column.createInfo(this.defList) //打开编辑列弹框
            },
            // 修改表头返回
            getherders(arr){
                this.headers=arr //表头列数据
                this.$nextTick(() => {
                    this.$refs.configurationTable.doLayout(); // 解决表格错位
                });
            },

组件

简单说一下逻辑:
1,父页面通过createInfo初始化方法调用子组件弹框。并展示信息
2,子组件打开后调用方法getColumnConfig,获取到一个所有列的配置。然后展示在弹框内,并传一份给父组件表格
3,通过tree自带的拖拽事件实现表头列位置的移动,上面添加多级表头用来添加一个自定义的名称,比如你想要把几列放到某一个表头下面,这几列都属于基本信息,那我就可以新增一个蓝色的表头,点击他改名叫基础信息。然后把黑色表头都拖进去,就可以得到一个这种多级表头。

这里注意:
黑色只能拖到蓝色里面,黑色表头内不能嵌套表头
黑色表头的key对应后台的数据,所以要跟后台对好才行。这种自由搭配的写法需要互相配合,嫌麻烦的还是直接用下面的固定写法

<template>
  <div>
    <!-- 表格列配置 -->
    <el-dialog title="配置表格列" :visible.sync="columnShow" width="60%">
      <el-row>
        <el-col :span="16">
          <p
            style="
              text-align: center;
              color: #333;
              font-weight: bold;
              margin-bottom: 10px;
            "
          >
            勾选需要展示的列
          </p>
          <el-checkbox-group v-model="columnCheckList" @change="getCheckList">
            <el-checkbox
              :label="item.key"
              v-for="(item, index) in columnAll"
              :key="'cols' + index"
              style="margin-bottom: 5px"
              >{{ item.title }}</el-checkbox
            >
          </el-checkbox-group>
          <p style="margin-top: 20px; color: #999">使用方法:</p>
          <p style="color: #999">1:左侧勾选需要的列</p>
          <p style="color: #999">2:右侧可拖动到想要的位置和顺序</p>
          <p style="color: #999">
            3:增加多级表头后会出现蓝色的自定义表头文字,可以点击修改名称,将黑色表头拖拽到蓝色内就是多级表头了
          </p>
          <p style="color: #999">
            注:<span style="color: red;font-weight:bold">不要在黑色表头内嵌套表头</span>
            ,表格数据根据黑色表头展示,二级表头不会显示数据
          </p>
        </el-col>
        <el-col :span="8" style="max-height: 500px; overflow: auto">
          <p
            style="
              text-align: center;
              color: #333;
              font-weight: bold;
              margin-bottom: 10px;
            "
          >
            拖拽排列表头顺序
          </p>
          <el-button
            @click="append2"
            size="mini"
            style="margin-left: 20px; margin-bottom: 10px"
            type="primary"
            >增加多级表头</el-button
          >
          <el-tree
            :data="data"
            node-key="id"
            default-expand-all
            :expand-on-click-node="false"
            draggable
            :props="defaultProps"
          >
            <span class="custom-tree-node" slot-scope="{ node, data }">
              <span
                :style="{ color: data.type == 'zdy' ? '#409EFF' : '' }"
                @click="editNodeInfo(data)"
                >{{ node.label }}</span
              >
              <span>
                <!-- <el-button type="text" size="mini" @click="() => append(data)">
                                    add
                                </el-button> -->
                <el-button
                  type="text"
                  size="mini"
                  @click="() => remove(node, data)"
                >
                  删除
                </el-button>
              </span>
            </span>
          </el-tree>
        </el-col>
      </el-row>
      <span slot="footer" class="dialog-footer">
        <el-button @click="columnShow = false">取 消</el-button>
        <el-button type="primary" @click="setUpColumn">确 定</el-button>
      </span>
    </el-dialog>
    <!-- 编辑tree表头内容 -->
    <el-dialog title="编辑内容" :visible.sync="columnShow2" width="400px">
      <div>
        <el-input placeholder="请输入内容" v-model="input" clearable>
        </el-input>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="columnShow2 = false" size="mini">取 消</el-button>
        <el-button type="primary" @click="setUpTitle" size="mini"
          >确 定</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>
  
<script>
module.exports = {
  name: "test",
  props: ["deflist"],//默认数据
  data() {
    return {
      eid: "",
      input: "", //编辑多级菜单名称
      data: [], //tree
      //tree配置
      defaultProps: {
        children: "children",
        label: "title",
      },
      columnShow: false, //设置也弹框显示
      columnShow2: false, //编辑tree表头内容
      columnAll: [], //表头总列
      columnCheckList: [], //列勾选项
      columnCheckList2: [], //列勾选项2
      pxHeader: [], //排序表头
      copyTreeList: [], //备份tree
    };
  },
  mounted() {
    this.pxHeader = this.deflist;
    this.getColumnConfig();
  },
  methods: {
    // 初始化
    createInfo(e) {
      this.pxHeader = e;
      this.getColumnConfig(); //获取所有列数据
      this.columnShow = true;
    },
    // 添加节点
    append(data) {
      const newChild = {
        id: id++,
        title: "自定义表头",
        children: [],
      };
      console.log(data, "data");
      if (!data.children) {
        this.$set(data, "children", []);
      }
      data.children.push(newChild);
    },
    // 添加一个节点
    append2() {
      const newChild = {
        id: id++,
        title: "自定义表头" + id,
        type: "zdy",
        children: [],
      };
      this.data.unshift(newChild);
    },
    // 编辑节点信息
    editNodeInfo(e) {
      if (e.type == "zdy") {
        this.eid = e.id;
        this.input = e.title;
        this.columnShow2 = true;
      }
    },
    // 保存节点信息
    setUpTitle() {
      this.data.forEach((item) => {
        if (item.id && item.id == this.eid) {
          item.title = this.input;
          return;
        }
        if (item.children) {
          item.children.forEach((i) => {
            if (i.id && i.id == this.eid) {
              i.title = this.input;
              return;
            }
          });
        }
      });
      this.columnShow2 = false;
    },
    // 删除节点信息
    remove(node, data) {
      const parent = node.parent;
      const children = parent.data.children || parent.data;
      const index = children.findIndex((d) => d.id === data.id);
      children.splice(index, 1);
      //删除节点时把勾选项取消
      let ckIndex = this.columnCheckList.indexOf(data.key);
      if (ckIndex !== -1) {
        this.columnCheckList.splice(ckIndex, 1);
        this.columnCheckList2 = JSON.parse(
          JSON.stringify(this.columnCheckList)
        );
      }
      if (data.type == "zdy") {
        this.columnCheckList = this.getAllId([], this.data);
        this.columnCheckList2 = JSON.parse(
          JSON.stringify(this.columnCheckList)
        );
      }
    },
    // 创建节点dom
    renderContent(h, { node, data, store }) {
      return `<span class="custom-tree-node">
                    <span>{node.label}</span>
                    <span>
                    <el-button size="mini" type="text" on-click={ () => this.append(data) }>Append</el-button>
                    <el-button size="mini" type="text" on-click={ () => this.remove(node, data) }>Delete</el-button>
                    </span>
                </span>`;
    },
    // 筛选勾选列表头
    getCheckList(e) {
      // 筛选勾选中的列数据
      let result = this.columnAll.filter((item) => {
        if (e.length == 0) {
          return this.columnAll;
        } else {
          return e.some((curVal) => curVal === item.key);
        }
      });
      let arr = [];
      // 按顺序把列头排列
      e.forEach((item) => {
        result.forEach((i) => {
          if (item == i.key) {
            arr.push(i);
          }
        });
      });
      this.pxHeader = arr; //排序展示出来
      let chazhi = [...this.columnCheckList2].filter((x) =>
        [...e].every((y) => y != x)
      ); //差值删除
      let chazhiDelete = [...e].filter((x) =>
        [...this.columnCheckList2].every((y) => y != x)
      ); //差值新增
      // 有差值变动
      if (chazhi.length && this.columnCheckList2.indexOf(chazhi[0]) !== -1) {
        this.removeObjects(this.data, chazhi[0]);
        this.columnCheckList2 = e;
      } else {
        this.columnAll.forEach((item) => {
          if (item.key == chazhiDelete[0]) {
            this.data.push(item);
          }
        });
        this.columnCheckList2 = e;
      }
    },
    // 获取所有表头配置
    getColumnConfig() {
      http
        .get(
          "group_data",
          {
            page: 1,
            limit: 1000,
            gid: 136,
            hospital_id: userinfo.hosId,
          },
          {
            headers: {
              hosId: userinfo.hospital_id,
            },
          }
        )
        .then((res) => {
          this.columnAll = res.data.data.list;
          this.columnCheckList = [];
          this.columnCheckList2 = [];
          // 默认排序列配置
          //   this.pxHeader = [];
          let headers = JSON.parse(JSON.stringify(this.pxHeader)); //默认表头展示
          this.$emit("getherders", headers); //列配置传给父组件
          this.columnCheckList = this.getAllId([], this.pxHeader); //默认列勾选项
          this.columnCheckList2 = this.getAllId([], this.pxHeader); //默认列勾选项保存副本(用于后面比对)
          this.data = this.pxHeader; //默认tree展示结构
        });
    },
    // 设置表格列展示
    setUpColumn() {
      let headers = JSON.parse(JSON.stringify(this.data)); //表头展示
      if (this.filterObjects(headers, "zdy")) {
        this.$emit("getherders", headers); //列配置传给父组件
        this.columnShow = false; //关闭弹框
      } else {
        this.$message({
          type: "info",
          message: "黑色表头内不能嵌套其他表头!",
        });
      }
    },
    // 递归:获取所有key值
    getAllId(keys, dataList) {
      if (dataList && dataList.length) {
        for (let i = 0; i < dataList.length; i++) {
          keys.push(dataList[i].key);
          if (dataList[i].children) {
            keys = this.getAllId(keys, dataList[i].children);
          }
        }
      }
      return keys;
    },
    // 递归:找到对应数据删除
    removeObjects(arr, key) {
      // 数组不存在不执行
      if (!arr) {
        return;
      }
      // 遍历数组
      for (let i = 0; i < arr.length; i++) {
        // 检查当前对象是否符合条件
        if (arr[i].key == key) {
          // 删除当前对象
          arr.splice(i, 1);
          // 由于已经删除了一个对象,所以需要调整索引以避免跳过下一个对象
          i--;
        } else {
          // 如果当前对象不符合条件,则递归检查其子对象
          this.removeObjects(arr[i].children, key);
        }
      }
    },
    // 递归:判断黑色表头是否有子级
    filterObjects(arr, key) {
      // 数组不存在不执行
      if (!arr) {
        return;
      }
      // 遍历数组
      for (let i = 0; i < arr.length; i++) {
        let item=arr[i]
        // 条件:数据如果没有type字段并且还有子级的,代表是黑色表头但是嵌套了表头,不允许通过
        if (!item.type && item.children && item.children.length > 0) {
          return false;
        }
        if (item.children) {
          this.filterObjects(item.children, key);
        }
      }
      return true;
    },
  },
};
</script>
  
  <style>
</style>

固定列,显示隐藏版本

效果图

外面表格的样子
在这里插入图片描述
打开组件弹框,左侧展示表头,右侧勾选表头,取消勾选就会隐藏列,然后保存就会返回表头到父组件上
在这里插入图片描述

html页面代码

引入组件然后页面上显示 getherders是返回给你勾选过后的表头的。
后面children和label是配置组件内tree和表格显示的

<!-- 组件:表格自定义列 -->
        <dynamiccolumnrole ref="dynamic_column_role" @getherders="getherders" :children="'children'" :label="'title'">
        </dynamiccolumnrole>

methods
这个方法就是调用组件内的方法并传入默认的表头数据

// 初始化表头
            createInfo() {
                this.$refs.dynamic_column_role.createInfo(this.headers) //打开编辑列弹框
            },

我的data默认数组结构,这里表头中id和isshow必须有,没有字段的,自行添加

headers: [{
                        title: '基础数据',
                        id: 7,
                        isshow: true,
                        children: [{
                            id: 5,
                            isshow: true,
                            title: 'ID',
                            key: 'id'
                        }, {
                            id: 6,
                            isshow: true,
                            title: '姓名',
                            key: 'name'
                        }]
                    },
                    {
                        id: 1,
                        isshow: true,
                        title: '年龄',
                        key: 'age'
                    },
                    {
                        id: 2,
                        isshow: true,
                        title: '性别',
                        key: 'sex'
                    },
                    {
                        id: 3,
                        isshow: true,
                        title: '挂号量',
                        key: 'ghl'
                    },
                    {
                        id: 4,
                        isshow: true,
                        title: '到诊量',
                        key: 'dzl'
                    },
                ],

组件代码

组件注释了,比较通俗易懂。
说一下注意点:使用这个组件,只需要引入他,然后当成组件使用就行
然后注意第一次默认传入一个表头,也就是你后端请求的表头。
然后这个表头结构里面需要有id和isshow这个字段(true是显示,false是隐藏),如果没有自行添加。

逻辑简单描述一下:通过tree展示表头的树形结构,然后通过勾选后的回调函数handleCheckChange监听到是取消还是勾选,然后通过递归找到对应id的数据给他isshow字段更改显示隐藏,表格中对应用v-if显示隐藏这个字段。通过itemKey变量更新表格数据显示。最后把表头数据返回给父组件,父组件表格也通过v-if控制显示隐藏

<template>
  <div>
    <!-- 表格列配置 -->
    <el-dialog title="配置表格列" :visible.sync="columnShow" width="60%">
      <el-row>
        <el-col :span="18">
          <p
            style="
              text-align: center;
              color: #333;
              font-weight: bold;
              margin-bottom: 10px;
            "
          >
            表头展示(右侧取消勾选可隐藏表头)
          </p>
          <div style="max-width: 100%; overflow: auto">
            <el-table
              :data="tableData"
              border
              style="width: 100%"
              ref="configurationTable"
              :key="itemKey"
            >
              <template v-for="(arrd, index) in headers">
                <el-table-column
                  :key="'yi' + index"
                  :label="arrd[label]"
                  align="center"
                  show-overflow-tooltip
                  v-if="arrd.isshow"
                >
                  <template v-for="(arrd2, index2) in arrd[children]">
                    <!-- 有子级 -->
                    <el-table-column
                      align="center"
                      :label="arrd2[label]"
                      show-overflow-tooltip
                      :key="'er' + index2"
                      v-if="arrd2.isshow"
                    >
                    </el-table-column>
                  </template>
                </el-table-column>
              </template>
            </el-table>
          </div>
        </el-col>
        <el-col :span="6" style="max-height: 500px; overflow: auto">
          <p
            style="
              text-align: center;
              color: #333;
              font-weight: bold;
              margin-bottom: 10px;
            "
          >
            自定义表头显示(勾选显示)
          </p>
          <el-tree
            ref="tree"
            :data="data"
            node-key="id"
            default-expand-all
            :expand-on-click-node="false"
            show-checkbox
            :props="defaultProps"
            @check-change="handleCheckChange"
            :default-checked-keys="defaultKeys"
          >
            <span class="custom-tree-node" slot-scope="{ node, data }">
              <span>{{ node.label }}</span>
            </span>
          </el-tree>
        </el-col>
      </el-row>
      <span slot="footer" class="dialog-footer">
        <el-button @click="columnShow = false">取 消</el-button>
        <el-button type="primary" @click="setUpColumn">保存配置</el-button>
      </span>
    </el-dialog>
  </div>
</template>
  
<script>
module.exports = {
  name: "column",
  props: {
    // tree节点和表格表头的子级的字段名
    children: {
      type: String,
      default() {
        return "children";
      },
    },
    // tree节点和表格表头的字段名
    label: {
      type: String,
      default() {
        return "title";
      },
    },
  },
  data() {
    return {
      itemKey: 0, //更新表格的key
      defaultKeys: [], //默认选中tree勾选框
      tableData: [], //表格数据
      headers: [], //表头
      data: [], //tree
      //tree配置
      defaultProps: {
        children: this.children,
        label: this.label,
      },
      columnShow: false, //设置弹框
    };
  },
  methods: {
    // tree勾选
    handleCheckChange(data, checked, indeterminate) {
      // 取消勾选
      if (checked == false&&indeterminate==false) {
        this.getTreeItem(this.headers, data.id, false);
      }
      // 勾选
      if (checked == true) {
        this.getTreeItem(this.headers, data.id, true);
      }
      // 多级表头判断:子级全部为隐藏状态,父级也隐藏,自己存在显示状态,父级就显示
      this.headers.forEach(item => {
        if(item[this.children]){
          let num=1
          item[this.children].forEach(i=>{
            if(i.isshow==true){
              num=2
            }
          })
          if(num==1){
            this.getTreeItem(this.headers, item.id, false);
          }
          if (num==2) {
            this.getTreeItem(this.headers, item.id, true);
          }
        }
      });
      this.itemKey++; //更新表格,防止数据不更新
    },

    // 初始化
    createInfo(e) {
      this.headers = JSON.parse(JSON.stringify(e)); //传入默认表头
      this.data = JSON.parse(JSON.stringify(this.headers)); //默认tree展示结构
      this.defaultKeys = this.getAllIds([], e); //默认tree选中勾选
      this.columnShow = true; //打开弹框
    },
    // 设置表格列展示
    setUpColumn() {
      this.$emit("getherders", this.headers); //处理好的表头传给父级
      this.columnShow = false; //关闭弹框
      this.$message({
        message: "保存配置成功!",
        type: "success",
      });
    },
    // 递归:获取所有id值
    getAllIds(keys, dataList) {
      if (dataList && dataList.length) {
        for (let i = 0; i < dataList.length; i++) {
          if (dataList[i].isshow == true) {
            keys.push(dataList[i].id);
          }
          if (dataList[i].children) {
            keys = this.getAllIds(keys, dataList[i].children);
          }
        }
      }
      return keys;
    },
    // 递归:找到对应id数据修改字段为true或者false
    getTreeItem(data, id, bool) {
      data.map((item) => {
        if (item.id == id) {
          item.isshow = bool; // 结果赋值
        } else {
          if (item.children) {
            this.getTreeItem(item.children, id, bool);
          }
        }
      });
    },
  },
};
</script>
  
  <style>
</style>

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

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

相关文章

云表|低代码软件开发“外挂”,新时代的黑科技

随着技术的日新月异&#xff0c;现代企业对于软件开发的需求愈加迫切&#xff0c;传统的软件开发方式已然无法满足快速迭代和创新的需求。在这种背景下&#xff0c;低代码开发平台如破茧而出&#xff0c;应运而生。这种平台通过提供可视化的开发工具和预构建的组件&#xff0c;…

不可思议!中国人民大学与加拿大女王大学金融硕士还能解决金融职场的倦怠期!

职业倦怠期是指在职业生涯中&#xff0c;个体对工作产生的一种疲惫、厌倦和失去兴趣的状态。在这个阶段&#xff0c;人们可能会感到无法集中精力、缺乏动力和创造力&#xff0c;工作效率下降&#xff0c;甚至出现情绪波动和身体健康问题。职业倦怠期是一种常见的心理现象&#…

【微信小程序开发】小程序的事件处理和交互逻辑(最详细)

前言 在微信小程序中&#xff0c;事件处理和交互逻辑是开发过程中非常重要的环节&#xff0c;它们直接影响到用户体验和功能实现。今天为大家继续详解小程序的事件处理和交互逻辑 文章目录 前言为什么要学习事件处理和交互逻辑&#xff1f;事件处理基础事件类型和触发条件事件绑…

具有mDNS功能的串口服务器

1.概述: 通过mDNS协议可以获得设备的ID、mac、IP、port等信息&#xff0c;方便计算机在同一个局域网内连接到具有该服务的模块。支持产品有串口服务器、串口转以太网模块、RS485串口转网口芯片等。 图 1 mDNS网络结构图 当具有mDNS的服务的设备接入网络的时候&#xff0c;首先…

【腾讯云 HAI域探秘】——自行搭建Stable Diffusion模型服务用于生成AI图片 | 自行搭建ChatGL M26BAI模型服务用于AI对话 | Pytorch2.0 AI框架视频处理

自行搭建Stable Diffusion模型服务用于生成AI图片 一、服务创建 1、服务地址&#xff1a; 高性能应用服务HAI 新品内测 2、等待审核(大概24小时) 二、创建服务 1、新建服务 2、选择AI模型&#xff1a;Stable Diffusion 高性能&#xff0c;效率更快。 3、等待创建(5~8分钟&a…

SpringBoot3自动配置流程及原理、SpringBootApplication注解详解

参考尚硅谷课程: https://www.yuque.com/leifengyang/springboot3/vznmdeb4kgn90vrx https://www.yuque.com/leifengyang/springboot3/lliphvul8b19pqxp 1.自动配置流程及原理 核心流程总结: 1.导入starter&#xff0c;就会导入autoconfigure包 2.autoconfigure 包里面 有一个…

[Mac软件]Infuse 7 PRO v7.6.3 一个强大的视频播放器(激活版)

使用Infuse制作您的视频内容&#xff0c;这是在iPhone、iPad、Apple TV和Mac上观看几乎任何格式的视频的好方法。无需转换文件&#xff01;Infuse针对macOS 12进行了优化&#xff0c;具有强大的流媒体选项、Trakt同步以及对AirPlay和字幕的无与伦比的支持。华丽的界面。精确控制…

【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引

前言 自学Java怎么学&#xff0c;找对方向很关键&#xff01;在这里为大家分享最全的架构师级Java全栈学习路线及知识清单&#xff01; 包含JavaSE基础&#xff0c;JavaWeb&#xff0c;SSM框架&#xff0c;Linux运维&#xff0c;分布式与微服务&#xff0c;大数据开发~ 本人研究…

4-flask-cbv源码、Jinja2模板、请求响应、flask中的session、flask项目参考

1 flask中cbv源码 2 Jinja2模板 3 请求响应 4 flask中的session 5 flask项目参考 1 flask中cbv源码 ***flask的官网文档&#xff1a;***https://flask.palletsprojects.com/en/3.0.x/views/1 cbv源码执行流程1 请求来了&#xff0c;路由匹配成功---》执行ItemAPI.as_view(item…

Leetcode hot100之“结合递归+二分“题目详解

1 总结 题目 215 (“数组中的第 K 个最大元素”) 和题目 4 (“寻找两个正序数组的中位数”) 之间的联系主要体现在它们都涉及到寻找一个有序集合中的第 k 个元素的问题。尽管这两个问题的具体应用场景和所处理的数据结构不同&#xff0c;它们共享相似的算法思想和技术。 题目…

系列十、堆参数调优

一、堆内存调优参数 -Xms堆空间的最小值&#xff0c;默认为物理内存的1/64-Xmx堆空间的最大值&#xff0c;默认为物理内存的1/4-XX:PrintGCDetails输出详细的GC处理日志 二、获取堆内存的默认物理内存 /*** Author : 一叶浮萍归大海* Date: 2023/11/16 14:50* Description: 获…

基于springboot的医护人员排班系统 全套代码 全套文档

基于springboot的医护人员排班系统,springboot vue mysql (毕业论文10411字以上,共27页,程序代码,MySQL数据库) 代码下载链接&#xff1a;https://pan.baidu.com/s/177HdCGtTvqiHP4O7qWAgxA?pwd0jlf 提取码&#xff1a;0jlf 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue …

荣誉榜再度添彩!热烈祝贺旭帆科技荣获安徽省大数据企业!

2023年11月3日&#xff0c;安徽省数据资源管理局网站发布《关于2023年度安徽省大数据企业名单的公示》&#xff0c;经企业申报、各市初审推荐、专家评审、审查认定等程序&#xff0c;安徽旭帆信息科技有限公司&#xff08;以下简称“旭帆科技”&#xff09;凭借在视频大数据应用…

[PyTorch][chapter 63][强化学习-时序差分学习]

目录&#xff1a; 蒙特卡罗强化学习的问题 基于转移的策略评估 时序差分评估 Sarsa-算法 Q-学习算法 一 蒙特卡罗强化学习的的问题 有模型学习&#xff1a; Bellman 等式 免模型学习: 蒙特卡罗强化学习 迭代&#xff1a; 使用策略 生成一个轨迹&#xff0c; for t…

VMware17虚拟机Linux安装教程(详解附图,带VMware Workstation 17 Pro安装)

一、安装 VMware 附官方下载链接&#xff08;VM 17 pro&#xff09;&#xff1a;https://download3.vmware.com/software/WKST-1701-WIN/VMware-workstation-full-17.0.1-21139696.exe 打开下载好的VMware Workstation 17 Pro安装包&#xff1b; 点击下一步&#xff1b; 勾选我…

损失函数——KL散度(Kullback-Leibler Divergence,KL Divergence)

KL散度&#xff08;Kullback-Leibler Divergence&#xff0c;简称KL散度&#xff09;是一种度量两个概率分布之间差异的指标&#xff0c;也被称为相对熵&#xff08;Relative Entropy&#xff09;。KL散度被广泛应用于信息论、统计学、机器学习和数据科学等领域。 KL散度衡量的…

kafka个人笔记

大部分内容源于https://segmentfault.com/a/1190000038173886, 本人手敲一边加强印象方便复习 消息系统的作用 解耦 冗余 扩展性 灵活性&#xff08;峰值处理 可恢复 顺序保证 缓冲 异步 解耦&#xff1a;扩展两边处理过程&#xff0c;只需要让他们遵守约束即可冗余&#xf…

ubuntu 20通过docker安装onlyoffice,并配置https访问

目录 一、安装docker &#xff08;一&#xff09;更新包列表和安装依赖项 &#xff08;二&#xff09;添加Docker的官方GPG密钥 &#xff08;三&#xff09;添加Docker存储库 &#xff08;四&#xff09;安装Docker &#xff08;五&#xff09;启动Docker服务并设置它随系…

MySQL覆盖索引的含义

覆盖索引&#xff1a;SQL只需要通过索引就可以返回查询所需要的数据&#xff0c;而不必通过二级索引查到主键之后再去查询数据&#xff0c;因为查询主键索引的 B 树的成本会比查询二级索引的 B 的成本大。 也就是说我select的列就是我的索引列&#xff08;或者主键&#xff0c;…

整理笔记——MOS管、三极管、IGBT

一、MOS管 在实际生活要控制点亮一个灯&#xff0c;例如家里的照明能&#xff0c;灯和电源之间就需要一个开关需要人为的打开和关闭。 再设计电路板时&#xff0c;如果要使用MCU来控制一个灯的开关&#xff0c;通常会用mos管或是三极管来做这个开关元件。这样就可以通过MCU的信…