vue3使用simple-mind-map,分分钟开发思维导图

news2024/9/24 19:19:21
这几天又来了新需求,老板想在系统里一眼可以看到所有部门的相关信息,并且可以编辑,分配任务。所以需要实现一个可编辑的思维导图页面。

思维导图?感觉很复杂的样子,这种很牛p的东西应该不是我三两天就能手写搞定的,于是我github转了一圈,果然不出我所料,对比了几个插件以后我是先选择了 vue3-mindmap 简单易用。既然好用那就直接npm install
到项目里使用就完了,可是不知道是我使用的方式方法不对还是咋的,很多参数都不生效。于是发现了更好的思维到图库 simple-mind-map ,最终也是和它长相厮守。

simple-mind-map的介绍:

1.一个 js 思维导图库,不依赖任何框架,可以使用它来快速完成 Web 思维导图产品的开发。
开发文档:https://wanglin2.github.io/mind-map-docs/

2.一个 Web 思维导图,基于思维导图库、Vue2.x、ElementUI 开发,可以操作电脑本地文件,可以当做一个在线版思维导图应用使用,也可以自部署和二次开发。
在线地址:https://wanglin2.github.io/mind-map/

先看下我vue3实现的效果,写的比较简单,因为没有很复杂的需求,够用即可。

在这里插入图片描述

1.vue3使用步骤

使用npm安装
npm install simple-mind-map
提供一个宽高不为 0 的容器元素

<div class="mindMapContainer" ref="mindMapContainerRef"></div>

// 样式
.mindMapContainer {
  margin: 0;
  padding: 0;
  width: 100%;
  height: calc(100vh - 190px); // 按自己需求修改
}
然后创建一个实例(官方是vue2例子,我使用的是vue3,所以使用方式略微不同,需要手动注册组件),代码如下:
import MindMap from 'simple-mind-map'
import MiniMap from 'simple-mind-map/src/plugins/MiniMap.js'
import Watermark from 'simple-mind-map/src/plugins/Watermark.js'
import KeyboardNavigation from 'simple-mind-map/src/plugins/KeyboardNavigation.js'
import ExportPDF from 'simple-mind-map/src/plugins/ExportPDF.js'
import ExportXMind from 'simple-mind-map/src/plugins/ExportXMind.js'
import Export from 'simple-mind-map/src/plugins/Export.js'
import Drag from 'simple-mind-map/src/plugins/Drag.js'
import Select from 'simple-mind-map/src/plugins/Select.js'
import RichText from 'simple-mind-map/src/plugins/RichText.js'
import AssociativeLine from 'simple-mind-map/src/plugins/AssociativeLine.js'
import TouchEvent from 'simple-mind-map/src/plugins/TouchEvent.js'
import NodeImgAdjust from 'simple-mind-map/src/plugins/NodeImgAdjust.js'
import SearchPlugin from 'simple-mind-map/src/plugins/Search.js'
import Painter from 'simple-mind-map/src/plugins/Painter.js'
import ScrollbarPlugin from 'simple-mind-map/src/plugins/Scrollbar.js'
import Formula from 'simple-mind-map/src/plugins/Formula.js'
import Cooperate from 'simple-mind-map/src/plugins/Cooperate.js'

// 注册插件
MindMap.usePlugin(MiniMap)
  .usePlugin(Watermark)
  .usePlugin(Drag)
  .usePlugin(KeyboardNavigation)
  .usePlugin(ExportPDF)
  .usePlugin(ExportXMind)
  .usePlugin(Export)
  .usePlugin(Select)
  .usePlugin(AssociativeLine)
  .usePlugin(NodeImgAdjust)
  .usePlugin(TouchEvent)
  .usePlugin(SearchPlugin)
  .usePlugin(Painter)
  .usePlugin(Formula)


const mindMapContainerRef = ref()
let mindMap = null;

const mindData = {
    "data": {
      "text": "Root Node",
    },
    "children": [
      {
        "data": {
          "text": "Child Node 1",
          "image": "",
          "imageTitle": "",
          "hyperlink": "",
          "note": ""
        },
        "children": []
      },
      {
        "data": {
          "text": "Child Node 2",
          "image": "",
          "imageTitle": "",
          "hyperlink": "",
          "note": ""
        },
        "children": []
      }
    ]
};

async function init() {
  mindMap = new MindMap({
      el: mindMapContainerRef.value,
      data: mindData
  });
}

onMounted( async () => {
  init()
})

根据以上使用步骤,得到的效果如下图:

在这里插入图片描述

当前效果:节点文字可编辑,Tab键可新增子节点。怎样让它更丰富一点呢!再往下瞅瞅。

2.功能实现步骤

小小的列一下要实现的功能:
  1. 右键点击节点可弹出操作框。
  2. 新增子节点,增加同级节点,删除节点,复制节点,粘贴节点。
  3. 保存,导出。

更多功能实现,可以根据需求参考下 官方开发文档 进行开发。

2.1 右键点击节点可弹出操作框
2.1.1 弹出的元素
<!-- 右键菜单 -->
<div v-if="showContextMenu" 
  class="context-menu" 
  :style="{ top: `${menuPosition.y}px`, left: `${menuPosition.x}px` }"
  >
  <ul>
    <li>添加子节点</li>
    <li>添加同级节点</li>
    <li>删除节点</li>
    <li>复制节点</li>
    <li>粘贴节点</li>
  </ul>
</div>
2.1.2 属性设置
// 当前右键点击的类型
const type = ref('')
// 如果点击的节点,那么代表被点击的节点
const currentNode = shallowRef(null)
// 是否显示菜单
const showContextMenu = ref(false);
// 菜单显示的位置
const menuPosition = ref({ x: 0, y: 0 });
2.1.2 节点右击事件
mindMap.on('node_contextmenu', (e, node) => {
  if (e.which == 3) {
    menuPosition.value = { x: e.clientX +10, y: e.clientY+10 };
    showContextMenu.value = true;
    currentNode.value = node
  }
})
2.1.3 css样式
.top-menu-fixed{
  position: fixed;
  top: 100px;
  left: 50%;
  width: 180px;
  z-index: 1000;
  display: flex;
  justify-content: space-around;
  background-color: #fff;
  padding: 10px 20px;
  border-radius: 6px;
  box-shadow: 0 2px 16px 0 rgba(0, 0, 0, .06);
  border: 1px solid rgba(0, 0, 0, .06);
  margin-right: 20px;
  .top-menu-item{
    width: 50px;
    text-align: center;
    border: 1px solid rgba(0, 0, 0, .06);
    cursor: pointer;
    padding: 3px 0px;
    border-radius: 5px;
    .top-menu-item--text{
      font-size: 14px;
    }
  }
}

.context-menu {
  position: fixed;
  background-color: white;
  border: 1px solid #ccc;
  box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
  z-index: 1000;
  padding: 10px;
  border-radius: 4px;
}

.context-menu ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

.context-menu li {
  padding: 8px 12px;
  cursor: pointer;
}

.context-menu li:hover {
  background-color: #f0f0f0;
}
2.1 完整代码
<template>
  <div>
    <div class="mindMapContainer" ref="mindMapContainerRef"></div>

    <!-- 右键菜单 -->
    <div
      v-if="showContextMenu" 
      class="context-menu" 
      :style="{ top: `${menuPosition.y}px`, left: `${menuPosition.x}px` }"
      >
      <ul>
        <li @click="addChildNode">添加子节点</li>
        <li @click="addSameNode">添加同级节点</li>
        <li @click="removeNode">删除节点</li>
        <li @click="copyNode">复制节点</li>
        <li @click="pasteNode">粘贴节点</li>
      </ul>
    </div>
  </div>
</template>

<script setup>
import MindMap from 'simple-mind-map'
import MiniMap from 'simple-mind-map/src/plugins/MiniMap.js'
import Watermark from 'simple-mind-map/src/plugins/Watermark.js'
import KeyboardNavigation from 'simple-mind-map/src/plugins/KeyboardNavigation.js'
import ExportPDF from 'simple-mind-map/src/plugins/ExportPDF.js'
import ExportXMind from 'simple-mind-map/src/plugins/ExportXMind.js'
import Export from 'simple-mind-map/src/plugins/Export.js'
import Drag from 'simple-mind-map/src/plugins/Drag.js'
import Select from 'simple-mind-map/src/plugins/Select.js'
import RichText from 'simple-mind-map/src/plugins/RichText.js'
import AssociativeLine from 'simple-mind-map/src/plugins/AssociativeLine.js'
import TouchEvent from 'simple-mind-map/src/plugins/TouchEvent.js'
import NodeImgAdjust from 'simple-mind-map/src/plugins/NodeImgAdjust.js'
import SearchPlugin from 'simple-mind-map/src/plugins/Search.js'
import Painter from 'simple-mind-map/src/plugins/Painter.js'
import ScrollbarPlugin from 'simple-mind-map/src/plugins/Scrollbar.js'
import Formula from 'simple-mind-map/src/plugins/Formula.js'
import Cooperate from 'simple-mind-map/src/plugins/Cooperate.js'

// 注册插件
MindMap.usePlugin(MiniMap)
  .usePlugin(Watermark)
  .usePlugin(Drag)
  .usePlugin(KeyboardNavigation)
  .usePlugin(ExportPDF)
  .usePlugin(ExportXMind)
  .usePlugin(Export)
  .usePlugin(Select)
  .usePlugin(AssociativeLine)
  .usePlugin(NodeImgAdjust)
  .usePlugin(TouchEvent)
  .usePlugin(SearchPlugin)
  .usePlugin(Painter)
  .usePlugin(Formula)


const mindMapContainerRef = ref()
let mindMap = null;
// 当前右键点击的类型
const type = ref('')
// 如果点击的节点,那么代表被点击的节点
const currentNode = shallowRef(null)
// 是否显示菜单
const showContextMenu = ref(false);
// 菜单显示的位置
const menuPosition = ref({ x: 0, y: 0 });

const mindData = {
    "data": {
      "text": "Root Node",
    },
    "children": [
      {
        "data": {
          "text": "Child Node 1",
          "image": "",
          "imageTitle": "",
          "hyperlink": "",
          "note": ""
        },
        "children": []
      },
      {
        "data": {
          "text": "Child Node 2",
          "image": "",
          "imageTitle": "",
          "hyperlink": "",
          "note": ""
        },
        "children": []
      }
    ]
};

async function init() {
  mindMap = new MindMap({
      el: mindMapContainerRef.value,
      data: mindData
  });

  // 节点右键事件
  mindMap.on('node_contextmenu', (e, node) => {
    if (e.which == 3) {
      menuPosition.value = { x: e.clientX +10, y: e.clientY+10 };
      showContextMenu.value = true;
      currentNode.value = node
    }
  })

  // 点击空白处
  mindMap.on('node_click', hide)
  mindMap.on('draw_click', hide)
  mindMap.on('expand_btn_click', hide)
}

// 隐藏右侧菜单
const hide = () => {
  menuPosition.value = { x: 0, y: 0 };
  showContextMenu.value = false;
  currentNode.value = null
}

onMounted( async () => {
  init()
})
</script>
<style lang="scss" scoped>
.mindMapContainer {
  margin: 0;
  padding: 0;
  width: 100%;
  height: calc(100vh - 190px);
}
.top-menu-fixed{
  position: fixed;
  top: 100px;
  left: 50%;
  width: 180px;
  z-index: 1000;
  display: flex;
  justify-content: space-around;
  background-color: #fff;
  padding: 10px 20px;
  border-radius: 6px;
  box-shadow: 0 2px 16px 0 rgba(0, 0, 0, .06);
  border: 1px solid rgba(0, 0, 0, .06);
  margin-right: 20px;
  .top-menu-item{
    width: 50px;
    text-align: center;
    border: 1px solid rgba(0, 0, 0, .06);
    cursor: pointer;
    padding: 3px 0px;
    border-radius: 5px;
    .top-menu-item--text{
      font-size: 14px;
    }
  }
}

.context-menu {
  position: fixed;
  background-color: white;
  border: 1px solid #ccc;
  box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
  z-index: 1000;
  padding: 10px;
  border-radius: 4px;
}

.context-menu ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

.context-menu li {
  padding: 8px 12px;
  cursor: pointer;
}

.context-menu li:hover {
  background-color: #f0f0f0;
}
</style>

2.2、2.3的实现是一样的,代码如下:
// 添加节点
const addChildNode = () => {
  if (mindMap) {
    mindMap.execCommand('INSERT_CHILD_NODE')
  }
  showContextMenu.value = false; // 关闭菜单
};

// 添加同级节点
const addSameNode = () => {
  if (mindMap) {
    mindMap.execCommand('INSERT_NODE')
  }
  showContextMenu.value = false; // 关闭菜单
};
// 删除节点
const removeNode = () => {
  if (mindMap && currentNode.value) {
    mindMap.execCommand('REMOVE_NODE')
  }
  showContextMenu.value = false; // 关闭菜单
};

// 复制节点
const copyNode = () => {
  if (mindMap && currentNode.value) {
    mindMap.renderer.copy()
  }
  showContextMenu.value = false; // 关闭菜单
};

// 粘贴节点
const pasteNode = () => {
  if (mindMap && currentNode.value) {
    mindMap.renderer.paste()
  }
  showContextMenu.value = false; // 关闭菜单
};

// 导出为图片
const exportMindMap = () => {
  if (mindMap) {
    mindMap.export('png', true, '底格里斯任务中心图')
  }
};

3.效果图完整代码实现

<template>
  <!-- vue3-mindmap https://github.com/hellowuxin/vue3-mindmap  -->
  <div>
    <div class="mindMapContainer" ref="mindMapContainerRef"></div>

    <div class="top-menu-fixed">
      <div class="top-menu-item" @click="saveMindMap">
        <div class="top-menu-item--img"><el-icon><Suitcase /></el-icon></div>
        <div class="top-menu-item--text">保存</div>
      </div>
      <div class="top-menu-item" @click="submitMindMap">
        <div class="top-menu-item--img"><el-icon><SuitcaseLine /></el-icon></div>
        <div class="top-menu-item--text">提交</div>
      </div>
      <div class="top-menu-item" @click="exportMindMap">
        <div class="top-menu-item--img"><el-icon><TakeawayBox /></el-icon></div>
        <div class="top-menu-item--text">导出</div>
      </div>
    </div>

    <!-- 右键菜单 -->
    <div v-if="showContextMenu" class="context-menu" :style="{ top: `${menuPosition.y}px`, left: `${menuPosition.x}px` }">
      <ul>
        <li @click="addChildNode">添加子节点</li>
        <li @click="addSameNode">添加同级节点</li>
        <li @click="removeNode">删除节点</li>
        <li @click="copyNode">复制节点</li>
        <li @click="pasteNode">粘贴节点</li>
      </ul>
    </div>
  </div>
</template>

<script setup>
import { TakeawayBox, SuitcaseLine, Suitcase } from '@element-plus/icons-vue'
import MindMap from 'simple-mind-map'
import MiniMap from 'simple-mind-map/src/plugins/MiniMap.js'
import Watermark from 'simple-mind-map/src/plugins/Watermark.js'
import KeyboardNavigation from 'simple-mind-map/src/plugins/KeyboardNavigation.js'
import ExportPDF from 'simple-mind-map/src/plugins/ExportPDF.js'
import ExportXMind from 'simple-mind-map/src/plugins/ExportXMind.js'
import Export from 'simple-mind-map/src/plugins/Export.js'
import Drag from 'simple-mind-map/src/plugins/Drag.js'
import Select from 'simple-mind-map/src/plugins/Select.js'
import RichText from 'simple-mind-map/src/plugins/RichText.js'
import AssociativeLine from 'simple-mind-map/src/plugins/AssociativeLine.js'
import TouchEvent from 'simple-mind-map/src/plugins/TouchEvent.js'
import NodeImgAdjust from 'simple-mind-map/src/plugins/NodeImgAdjust.js'
import SearchPlugin from 'simple-mind-map/src/plugins/Search.js'
import Painter from 'simple-mind-map/src/plugins/Painter.js'
import ScrollbarPlugin from 'simple-mind-map/src/plugins/Scrollbar.js'
import Formula from 'simple-mind-map/src/plugins/Formula.js'
import Cooperate from 'simple-mind-map/src/plugins/Cooperate.js'

// 注册插件
MindMap.usePlugin(MiniMap)
  .usePlugin(Watermark)
  .usePlugin(Drag)
  .usePlugin(KeyboardNavigation)
  .usePlugin(ExportPDF)
  .usePlugin(ExportXMind)
  .usePlugin(Export)
  .usePlugin(Select)
  .usePlugin(AssociativeLine)
  .usePlugin(NodeImgAdjust)
  .usePlugin(TouchEvent)
  .usePlugin(SearchPlugin)
  .usePlugin(Painter)
  .usePlugin(Formula)

import { TaskCentreApi } from '@/api/system/taskcentre'

const mindMapContainerRef = ref()
let mindMap = null;

const mindData = {
    "data": {
      "text": "Root Node",
    },
    "children": [
      {
        "data": {
          "text": "Child Node 1",
          "image": "",
          "imageTitle": "",
          "hyperlink": "",
          "note": ""
        },
        "children": []
      },
      {
        "data": {
          "text": "Child Node 2",
          "image": "",
          "imageTitle": "",
          "hyperlink": "",
          "note": ""
        },
        "children": []
      }
    ]
};

let data = ref([])
// 当前右键点击的类型
const type = ref('')
// 如果点击的节点,那么代表被点击的节点
const currentNode = shallowRef(null)
// 是否显示菜单
const showContextMenu = ref(false);
// 菜单显示的位置
const menuPosition = ref({ x: 0, y: 0 });
let selectedNode = null;

async function init() {
  let res = await TaskCentreApi.getTaskCentreTree();
  console.log(mindData);
  
  console.log(res);
  
  mindMap = new MindMap({
      el: mindMapContainerRef.value,
      data: res[0],
      editable: true, // 开启编辑模式
      mousewheelAction: 'move',// zoom(放大缩小)、move(上下移动)
      // 当mousewheelAction设为move时,可以通过该属性控制鼠标滚动一下视图移动的步长,单位px
      mousewheelMoveStep: 100,
      // 鼠标缩放是否以鼠标当前位置为中心点,否则以画布中心点
      mouseScaleCenterUseMousePosition: true,
      // 当mousewheelAction设为zoom时,或者按住Ctrl键时,默认向前滚动是缩小,向后滚动是放大,如果该属性设为true,那么会反过来
      mousewheelZoomActionReverse: true,
      // 禁止鼠标滚轮缩放,你仍旧可以使用api进行缩放
      disableMouseWheelZoom: false,
      layout: 'logicalStructure',
      // 连线的粗细
      lineWidth: 1,
      // 连线的颜色
      lineColor: '#549688',
      // 连线样式
      lineDasharray: 'none',
      // 连线风格,支持三种
      // 1.曲线(curve)。仅logicalStructure、mindMap、verticalTimeline三种结构支持。
      // 2.直线(straight)。
      // 3.直连(direct)。仅logicalStructure、mindMap、organizationStructure、verticalTimeline四种结构支持。
      lineStyle: 'curve', 
      // 曲线连接时,根节点和其他节点的连接线样式保持统一,默认根节点为 ( 型,其他节点为 { 型,设为true后,都为 { 型。仅logicalStructure、mindMap两种结构支持。
      rootLineKeepSameInCurve: true,
      // 直线连接(straight)时,连线的圆角大小,设置为0代表没有圆角,仅支持logicalStructure、mindMap、verticalTimeline三种结构
      lineRadius: 5,
      // 连线尾部是否显示标记,目前只支持箭头
      showLineMarker: false,
      // 概要连线的粗细
      generalizationLineWidth: 1,
  });
  
  // 节点右键事件
  mindMap.on('node_contextmenu', (e, node) => {
    if (e.which == 3) {
      menuPosition.value = { x: e.clientX +10, y: e.clientY+10 };
      showContextMenu.value = true;
      currentNode.value = node
    }
  })

  // 点击空白处
  mindMap.on('node_click', hide)
  mindMap.on('draw_click', hide)
  mindMap.on('expand_btn_click', hide)
  
}

// 隐藏右侧菜单
const hide = () => {
  menuPosition.value = { x: 0, y: 0 };
  showContextMenu.value = false;
  currentNode.value = null
}

// 添加节点
const addChildNode = () => {
  if (mindMap) {
    mindMap.execCommand('INSERT_CHILD_NODE')
  }
  showContextMenu.value = false; // 关闭菜单
};

// 添加同级节点
const addSameNode = () => {
  if (mindMap) {
    mindMap.execCommand('INSERT_NODE')
  }
  showContextMenu.value = false; // 关闭菜单
};
// 删除节点
const removeNode = () => {
  if (mindMap && currentNode.value) {
    mindMap.execCommand('REMOVE_NODE')
  }
  showContextMenu.value = false; // 关闭菜单
};

// 复制节点
const copyNode = () => {
  if (mindMap && currentNode.value) {
    mindMap.renderer.copy()
  }
  showContextMenu.value = false; // 关闭菜单
};

// 粘贴节点
const pasteNode = () => {
  if (mindMap && currentNode.value) {
    mindMap.renderer.paste()
  }
  showContextMenu.value = false; // 关闭菜单
};

// 导出为图片
const exportMindMap = () => {
  if (mindMap) {
    mindMap.export('png', true, '底格里斯任务中心图')
  }
};

const submitMindMap = () => {
  if (mindMap) {
    const data = mindMap.getData(true)
    console.log(data);
    
  }
};

const saveMindMap = () => {
  if (mindMap) {
    mindMap.export('xmind', true, '底格里斯任务中心图')
  }
};

onMounted( async () => {
  init()
})
</script>
<style lang="scss" scoped>
.mindMapContainer {
  margin: 0;
  padding: 0;
  width: 100%;
  height: calc(100vh - 190px);
}
.top-menu-fixed{
  position: fixed;
  top: 100px;
  left: 50%;
  width: 180px;
  z-index: 1000;
  display: flex;
  justify-content: space-around;
  background-color: #fff;
  padding: 10px 20px;
  border-radius: 6px;
  box-shadow: 0 2px 16px 0 rgba(0, 0, 0, .06);
  border: 1px solid rgba(0, 0, 0, .06);
  margin-right: 20px;
  .top-menu-item{
    width: 50px;
    text-align: center;
    border: 1px solid rgba(0, 0, 0, .06);
    cursor: pointer;
    padding: 3px 0px;
    border-radius: 5px;
    .top-menu-item--text{
      font-size: 14px;
    }
  }
}

.context-menu {
  position: fixed;
  background-color: white;
  border: 1px solid #ccc;
  box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
  z-index: 1000;
  padding: 10px;
  border-radius: 4px;
}

.context-menu ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

.context-menu li {
  padding: 8px 12px;
  cursor: pointer;
}

.context-menu li:hover {
  background-color: #f0f0f0;
}
</style>

总结

更多的功能实现可参考官方文档,文档很详细。该js库很灵活,可根据自己的需求去实现。有疑问的朋友也可以在评论区提问或交流。下一篇文章再见!!!

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

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

相关文章

I2C代码硬件实现

环境 芯片:STM32F103ZET6 库&#xff1a;来自HAL的STM32F1XX.H 原理图 有图可知SCL和SDA两条线接到了PB10和PB11 芯片的复用功能是I2C2 代码 Driver_I2C.h #include "Driver_I2C.h"void Driver_I2C_Init(void) {/* 1. 打开引脚和片上外设的时钟 I2C2 PB10 PB11 …

【提示学习论文】AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models&#xff08;2024CVPR&#xff09; 问题&#xff1a;在unseen class上&#xff0c;性能提升有限解决&#xff1a;在提示学习中引入对抗性标记嵌入adversarial token embedding&#xff0c; 将低层次视觉…

SOMEIP_ETS_060: SD_Discover_Port_and_IP

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;能够响应测试器发出的多播FindService消息&#xff0c;并返回一个单播OfferService消息&#xff0c;列出所有必要的IP地址和端口&#xff0c;以满足与DUT的所有可能通信需求。 描述 本测试用例旨在检查DUT是否能够…

清理linux的buff/cache缓存

通过free -m命令&#xff0c;查看内存占用率。 如果buff/cache 占用内存过高的话&#xff0c;执行以下命令 sync && echo 1 > /proc/sys/vm/drop_caches sync && echo 2 > /proc/sys/vm/drop_caches sync && echo 3 > /proc/sys/vm/drop_ca…

文字怎么生成二维码扫码展示?文本活码在线生成的3步操作技巧

现在很多人会将文本信息用生成二维码的方式来展现&#xff0c;通过二维码来分享内容能够有效的提升内容的传播效率&#xff0c;简化其他人获取信息的流程。只需要通过扫码就能在手机上预览内容&#xff0c;更加符合现在人们的生活习惯&#xff0c;而且这种方式可以降低制作者的…

bedtools安装与使用(v2.31.1)生物信息学工具29

01 背景 bedtools&#xff1a;一个用于基因组算术的强大工具集 总体而言&#xff0c;bedtools 工具集是一个多功能的工具包&#xff0c;可用于广泛的基因组分析任务。其中最广泛使用的工具能够进行基因组算术运算&#xff0c;即在基因组上执行集合论操作。例如&#xff0c;be…

前端实现投影坐标和地理坐标系(CGCS2000)转换

前言 地理坐标系和投影坐标系是地理信息系统&#xff08;GIS&#xff09;和制图学中用于描述地球表面位置的两种不同的参考系统。它们在使用方式和应用场景上有显著的区别。 1、什么是地理坐标系和投影坐标系&#xff1f; 1.1、地理坐标系 地理坐标系是基于地球的三维球面模…

虚拟机安装centos7-桥接模式

1、打开虚拟机&#xff0c;点击文件&#xff0c;选择新建虚拟机 2、选择典型&#xff0c;点击下一步 3、选择稍后安装操作系统&#xff0c;点击下一步 4、选择系统类型及版本&#xff0c;点击下一步&#xff0c;因centos7是Linux操作系统&#xff0c;且是64位的&#xff0c;所以…

隐藏的艺术:滥用 404 页面的新 Magecart 活动

介绍 一项新的、复杂的、隐蔽的 Magecart 网页窃取活动已针对 Magento 和 WooCommerce 网站展开。该活动的部分受害者与食品和零售行业的大型组织有关。 根据我们发现的证据,该活动已经持续了几周,在某些情况下甚至更长。该活动采用了一种我们以前从未遇到过的高级隐藏技术…

Linux 内核源码分析---组播/策略路由选择

在 Linux 实现中&#xff0c;组播路由选择不像单播路由选择那样可以由内核单独处理&#xff0c;组播守护程序种类繁多&#xff0c;如 mrouted 和 pimd&#xff0c;它们分别基于距离矢量组播路由选择协议&#xff08;Distance Vector Multicast Routing Protocol&#xff0c;DVM…

《在数字化时代筑牢软件服务的稳定性防线》

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

transform解题reserve

1.64位无壳&#xff0c;拖入ida检查。 选中函数按n键可以更改名称&#xff0c;便于分析和利用 。 重点&#xff1a; 2.分析加密过程&#xff0c;理解用于后续脚本编写。 str2以下表对应的元素作为索引遍历flag的每个元素赋值给str1数组&#xff0c;之后与新的str1每个元素异或…

数分基础(02)销售趋势分析

文章目录 销售趋势分析1. 数据集2. 销售趋势3. 步骤3.1 数据读取与预处理&#xff1a;3.2 计算按月、季度、年度的总销售额 4. 分析工具&#xff1a;Python 或 Excel5. Python5.1 Global_Superstore2.xlsx 文件位置5.2 读取数据集并检查其基本信息5.3 绘制趋势图来观察销售额的…

掌握C语言文件操作

1. 什么是文件 磁盘上的文件就是文件。 然而在程序设计中&#xff0c;我们所谈的文件有两种&#xff0c;一种是程序文件&#xff0c;另一种是数据文件&#xff08;从文件功能的角度来分类的&#xff09; 文件名 一个文件要有一个唯一的文件标识&#xff0c;以便用户识别和引用…

金蝶云星空开发简单账表《物料年采购入库报表》

文章目录 业务背景业务需求方案设计详细设计测试业务背景 系统现有功能不支持查询过去一年内所有物料的入库数,需要人工导出,然后再汇总。 业务需求 可以查询所有物料的入库数,多个物料,单个物料,多个组织,单个组织的入库数,以及支持查询入库数大于某个阈值。 方案设…

燃气灶行业分析、淘宝平台销售分析

内容&#xff1a;1.燃气灶&#xff08;不含集成灶&#xff09;整体行业分析 2.淘宝平台销量分析 3.针对性建议&#xff08;涉及商业信息就略&#xff09; 一、基本情况 &#xff08;一&#xff09;产品定义&#xff1a; 以液化石油气&#xff08;液态&#xff09;、人工煤…

DRF——router路由,parser解析器

文章目录 路由解析器1.JSONParser2.FormParser3.MultiPartParser4.FileUploadParser 路由 在之前进行drf开发时&#xff0c;对于路由我们一般进行两种配置&#xff1a; 视图继承APIView from django.urls import path from app01 import viewsurlpatterns [path(api/users/, …

趣味算法------尾部零的个数(C语言,python双重解法)

目录 题目描述&#xff1a; 解题思路&#xff1a; 具体代码&#xff1a; 注意&#xff1a; 题目描述&#xff1a; 给出数字 n(0<n<1000000)&#xff0c;计算出 n 阶乘尾部零的个数。 输入输出格式 输入格式 一个整数。 输出格式 一个整数。 输入输出样例 输入 11 输…

技术分享-商城篇-用户订单管理(十五)

前言 在前面的文章中&#xff0c;我们详细阐述了商品模块、购物模块、支付模块等B2B2C&#xff08;Business-to-Business-to-Consumer&#xff09;电商中核心基础模块&#xff0c;接下来我们来聊一下基础模块中最后一个环节订单模块&#xff0c;订单模块属于购物体系闭环内容&…

C语言典型例题50

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.2 使用do……while语句循环求1234……100&#xff1b; 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题4.2 使用do……while语句循环求1234……100&#xff1b;#incl…