AntV G6 组织图使用(后端渲染数据)

news2024/11/19 8:49:47

一、业务场景:
点击按钮,跳转页面并显示该数据的组织架构图(类似于粒子效果)

二、问题描述:
初始写死的数据能显示,但是从接口请求到的数据赋上值 渲染不了

三、具体实现步骤:
(1)下载

  npm install --save @antv/g6

(2)在需要使用的文件里面单独引入

  import G6 from '@antv/g6'

(3)所有逻辑处理写在初始化函数里面

 initComponent (arrList,edgesList) {
		// arrList是后台返回的数组数据,拿到后调用初始化函数把值传过来
		// edgesList 是用粒子连接 arrList数组里面数据的(以arrList数组里的第一项为中心)
        this.data = {
          nodes: arrList,
          edges:edgesList
        }
        /**
         * 遍历节点数据,给节点添加图片
         */
        for (let i = 0, len = this.data.nodes.length; i < len; i++) {
          // eslint-disable-next-line eqeqeq
          if (this.data.nodes[i].id !== 'node1') { // 'offlineAnomaly'
            this.data.nodes[i].img = '/labelshow.jpg'
          }
          // eslint-disable-next-line eqeqeq
          if (this.data.nodes[i].status == 1) { // 'onlineAuth'
            // this.data.nodes[i].img = 'https://yyb.gtimg.com/aiplat/page/product/visionimgidy/img/demo6-16a47e5d31.jpg?max_age=31536000'
          }
          // eslint-disable-next-line eqeqeq
          if (this.data.nodes[i].status == 2) { // 'onlineAuth'
            // this.data.nodes[i].img = 'https://img0.baidu.com/it/u=3927459320,2138990686&fm=26&fmt=auto'
          }
        }
        // todo 设置鼠标悬停显示详情操作
        const tooltip = new G6.Tooltip({
          offsetX: 70,
          offsetY: 20,
          getContent (e) {
            const outDiv = document.createElement('div')
            outDiv.style.width = '180px'
            // e.item._cfg.id== 'node1'?<li>人员ID: ${e.item.getModel().id}</li>: <li>标签ID: ${e.item.getModel().id}</li>
            if(e.item._cfg.id== 'node1'){
              outDiv.innerHTML = `
            <ul id="nodeDetails">
              <li>人员名称: ${e.item.getModel().label}</li>
<!--              <li>IP: ${e.item.getModel().ip}</li>-->
<!--               <li>人员ID: ${e.item.getModel().id}</li>-->
<!--              <li>status: ${e.item.getModel().status}</li>-->
            </ul>`
              return outDiv
            }else {
              outDiv.innerHTML = `
            <ul id="nodeDetails">
              <li>标签名称: ${e.item.getModel().label}</li>
               <li>标签ID: ${e.item.getModel().id}</li>
            </ul>`
              return outDiv
            }

          },
          itemTypes: ['node']
        })
        // todo 初始化画布宽高为div parentContent 的宽度和高度
        this.canvasWidth = this.$refs.parentContent.clientWidth
        this.canvasHeight = this.$refs.parentContent.clientHeight
        this.graph = new G6.Graph({
          container: 'container',
          width: this.canvasWidth,
          height: this.canvasHeight,
          linkCenter: true,
          plugins: [tooltip], // 配置 Tooltip 插件
          modes: {
            default: ['drag-canvas', 'zoom-canvas', 'drag-node', 'activate-relations'] // 允许拖拽画布、放缩画布、拖拽节点、设置高亮
          },
          layout: {
            type: 'force',
            preventOverlap: true, // 防止节点重叠
            // 防碰撞必须设置nodeSize或size,否则不生效,由于节点的size设置了40,虽然节点不碰撞了,但是节点之间的距离很近,label几乎都挤在一起,所以又重新设置了大一点的nodeSize,这样效果会好很多
            nodeSize: 120,
            linkDistance: 90 // 指定边距离为150
          },
          defaultNode: { // 节点样式修改
            type: 'image', // 设置节点为图片
            size: [40, 40], // 节点大小
            labelCfg: { // 修改节点label样式
              style: {
                fill: '#5B8FF9', // 字体颜色
                fontSize: 14 // 字体大小
              }
            }
          },
          defaultEdge: {
            style: {
              lineWidth: 2, // 线宽
              stroke: '#778899', // 线的颜色
              endArrow: { // 设置终点箭头
                path: G6.Arrow.vee(5, 20, 15), // 使用内置箭头路径函数,参数为箭头的 宽度、长度、偏移量(默认为 0,与 d 对应)
                d: 15
              }
            }
          }
          // 设置节点高亮样式
          // edgeStateStyles: {
          //   highlight: {
          //     stroke: '#32dadd'
          //   }
          // }
        })

        /**
         * 鼠标移出时,删除节点连线高亮
         * */
        // this.graph.on('node:mouseleave', this.clearAllStats)

        this.graph.on('node:click', (e) => {
          const nodeItem = e.item // 获取被点击的节点元素对象
          console.log(nodeItem)
          console.log('单击', nodeItem._cfg)
          // 如果点击的是人员就开始添加
          if(nodeItem._cfg.id== 'node1'){
            this.visible = true
          }
        if(nodeItem._cfg.id !== 'node1'){
          this.remove(nodeItem._cfg.id)
        }
        })
        // 接收数据并渲染
        this.graph.data(this.data)
        this.graph.render()
        
        const el = this.graph.findById(this.data.nodes[0]?.id)
        console.log('model', el)
         el._cfg.model.label = '张三'
        el._cfg.model.img = 'https://img2.baidu.com/it/u=617857580,3197175121&fm=253&fmt=auto&app=138&f=JPEG?w=260&h=260'
        this.graph.refreshItem(el)

        // 双击节点
        this.graph.on('node:dblclick', (e) => {
          // 先将所有当前是 click 状态的节点置为非 click 状态
          const clickNodes = this.graph.findAllByState('node', 'dblclick')
          clickNodes.forEach((cn) => {
            this.graph.setItemState(cn, 'dblclick', false)
          })
          const nodeItem = e.item // 获取被点击的节点元素对象
          console.log('双击', nodeItem._cfg)
          this.graph.setItemState(nodeItem, 'dblclick', true) // 设置当前节点的 click 状态为 true
        })
      },

(4)在任何地方要重新渲染的话,都需要调用初始化函数,两个值都必须传,必须确保是最新的

         this.initComponent(this.data.nodes,this.data.edges)

四、完整代码

<template>
  <!--设置parentContent的宽高为浏览器大小-->
  <div class="parentContent" ref="parentContent">
    <div id="container" ref="container"></div>

    <!--新增弹框-->
    <a-modal
      :title="labelTitle==0?'新增标签':'编辑标签'"
      :visible="visible"
      width="600px"
      @cancel="handleCancel"
    >
      <template slot="footer">
        <a-button @click="handleCancel">取消</a-button>
        <a-button type="primary" @click="handleOk">确定</a-button>
      </template>
      <a-form-model ref="ruleForm" :model="form" :rules="rules" :label-col="{ span: 6 }" :wrapper-col="{ span: 16 }">
        <a-form-model-item label="标签名称" prop="labelname">
          <a-input v-model="form.labelname" placeholder="请输入"/>
        </a-form-model-item>

        <a-form-model-item label="标签颜色" prop="color">
          <a-input placeholder="请选择" type="color" v-model="form.color"/>
        </a-form-model-item>

        <a-form-item label="标签图标" prop="tb">
          <a-input
            v-model="form.tb"
            ref="iconInput"
            @click="iconselect()"
            enterButton="选择图标"
            placeholder="选择图标"
          >
            <a-icon slot="prefix" :type="icon"/>
            <a-icon slot="suffix" type="close-circle" @click="emitEmpty"/>
          </a-input>
        </a-form-item>

        <a-form-model-item label="代码" prop="code" v-if="form.labelshape=='0'" v-hasPermi="['label:ifSystemLabel']">
          <a-input v-model="form.code" placeholder="请输入"/>
        </a-form-model-item>
      </a-form-model>
      <iconSelector-modal ref="modal" @ok="setIcon" :icon="icon"/>
    </a-modal>
  </div>
</template>
<script>
  import G6 from '@antv/g6'
  import { getLabelLists, delUserLabel, addLabels,addUserLabel, editLabels,showUserLabel } from '@/api/system/label'
  import IconSelectorModal from '@/views/system/modules/IconSelectorModal'
  export default {
    name: 'BqtuDiago',
    components: {
      IconSelectorModal
    },
   async mounted () {
      this.ryId = this.$route.query.ryId
      this.ryname = this.$route.query.name
      console.log(this.ryname)
     this.initSize()
     await this.getUserLabel()
    },
    watch:{
      'this.data.nodes'(val, oldVal) {
        console.log(val,oldVal)
        if(val) {
          const that = this
          val.forEach(function(value, index, array) {
            const el = that.graph.findById(value.id)
            console.log('model', el._cfg.model)
            console.log('value', value)
            el._cfg.model.id = value.id
            el._cfg.model.label = value.label
            el._cfg.model.ip= value.ip
            el._cfg.model.status= value.status
            if (value.status == 1) {
              el._cfg.model.img = '/labelshow.jpg'
            }
            if (value.status == 0) {
              el._cfg.model.img = '.....'
            }
            that.graph.refreshItem(el)
          })
        }
      }
    },
    data () {
      return {
        ryId:'',
        ryname:'',
        labelTitle: 0,
        icon: 'smile',
        visible: false,
        pagination: {
          current: 1,
          pageSize: 10,
          total: 0
        },
        form: {
          labelname: '',
          labeltype: '',
          labelshape: '',
          labelid: '',
          code: '',
          tb: '',
          color: ''
        },
        rules: {
          labelname: [
            { required: true, message: '请输入', trigger: 'blur' }
            // { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
          ],
          labelshape: [
            { required: true, message: '请选择', trigger: 'blur' }
            // { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
          ],
          labeltype: [
            { required: true, message: '请选择', trigger: 'blur' }
            // { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
          ],
          tb: [
            { required: true, message: '请选择', trigger: 'blur' }
            // { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
          ],
          code: [
            { required: true, message: '请输入', trigger: 'blur' }
            // { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
          ]

        },

        data: {
          nodes:[],
          edges:[],
        }, // 拓扑图数据
        graph: undefined, // new G6
        canvasWidth: 0, // 画布宽度
        canvasHeight: 0 // 画布高度
      }
    },
    methods: {

      getUserLabel() {
        console.log(this.ryId)
        showUserLabel({
          ryId: this.ryId,
          pageNum: this.pagination.current,
          pageSize: this.pagination.pageSize
        })
          .then(res => {
            console.log(res)
            const { data,code, msg } = res || {}
            this.data.nodes = data?.sysBqRequests
            console.log(this.data.nodes)

            this.data.nodes.forEach((item)=>{
              this.data.edges.push({
                source: 'node1',
                target: item.id
              })
            })
            console.log(this.data.edges)
            this.data.nodes.unshift({
                  id: 'node1',
                  label: '人员',
                  img:'/portrait.png',
                  status:'0'
            })
            console.log(this.data.nodes)
            this.initComponent(this.data.nodes,this.data.edges)
          }).catch((err) => {
          console.log(err)
        })
      },

// 删除
      remove(id) {
        // e.preventDefault();//阻止默认行为
        console.log(id)
        // this.selectedRowKeys.push(id)
        // console.log(this.selectedRowKeys)
        this.$confirm({
          content: '您确定要删除此标签吗?',
          okText: '确定',
          centered: true,//页面居中位置
          okType: 'danger',
          cancelText: '取消',
          onOk: () => {
            delUserLabel({
              bqId: id
            }).then(res => {
              console.log(res)
              let { msg } = res
              if (msg == 'success') {
                this.$message.success('操作成功')
                // 销毁画布在新增上去
                this.graph.destroy();
                this.getUserLabel()
                // 删除以后清空要删除的数组
                // this.selectedRowKeys = []
              } else {
                // this.$message.error(errorMessage)
              }
            }).catch(err => {
              console.log(err)
            })
          },
          onCancel: () => {
            console.log('Cancel')
          }
        })
      },
      iconselect() {
        this.$refs.modal.show()
      },
      setIcon(icon) {
        console.log(icon)
        this.icon = icon
        this.form.tb = icon
        // this.form.setFieldsValue({ icon: icon })
      },
      emitEmpty() {
        this.$refs.iconInput.focus()
        // this.form.setFieldsValue({ icon: '' })
        this.form.tb = ''
      },
      handleCancel() {
        if(this.labelTitle ==0){
          this.form = {}
        }
        this.visible = false
      },
      // 新增和编辑标签
      handleOk() {
        this.$refs.ruleForm.validate(valid => {
          if (valid) {
            if (this.labelTitle == 0) {
              console.log(this.ryId)
              addUserLabel({
                mc: this.form.labelname,
                // code:this.form.code,
                dm: this.form.code,
                // sfxt: this.form.labelshape,
                ys: this.form.color,
                lx: '1',
                ryId:this.ryId,
                tb: this.form.tb
              })
                .then(res => {
                  console.log(res)
                  let { msg } = res
                  if (msg == 'success') {
                    this.visible = false
                    this.$message.success('操作成功')
                    // 销毁画布在新增上去
                    this.graph.destroy();
                    this.getUserLabel()
                    // this.form = {}
                  } else {
                    this.$message.error(msg)
                  }
                }).catch((err) => {
                console.log(err)
              })
            } else {
              editLabels({
                mc: this.form.labelname,
                dm: this.form.code,
                ys: this.form.color,
                sfxt: this.form.labelshape,
                lx: this.form.labeltype,
                tb: this.form.tb,
                id: this.form.labelid
              })
                .then(res => {
                  console.log(res)
                  let { msg } = res
                  if (msg == 'success') {
                    this.visible = false
                    this.$message.success('操作成功')

                  }
                }).catch((err) => {
                console.log(err)
              })
            }
          }
        })
      },




      /**
       * 设置画布大小自适应
       */
      initSize () {
        const self = this // 因为箭头函数会改变this指向,指向windows。所以先把this保存
        setTimeout(() => {
          // todo 浏览器窗口发生变化时
          window.onresize = function () {
            // todo 获取div parentContent 的宽度和高度
            this.canvasWidth = self.$refs?.parentContent?.clientWidth
            this.canvasHeight = self.$refs?.parentContent?.clientHeight
            // todo 修改画布的大小
            self.graph.changeSize(this.canvasWidth, this.canvasHeight)
            // todo 将图移动到画布中心位置
            self.graph.fitCenter()
          }
        }, 20)
      },
      /**
       * 创建G6,并对G6的一些设置
       * */

      initComponent (arrList,edgesList) {
        console.log(arrList)
        this.data = {
          nodes: arrList,
          //   nodes:[
          //   {
          //     id: 'node1',
          //     label: '采集服务器',
          //     // ip: '192.168.1.1',
          //     // status: 0
          //     // 此处的key值一定不要出现type,如果出现type,图片修改无效
          //   },
          //   {
          //     id: 'node2',
          //     label: '标签1',
          //   },
          //   {
          //     id: 'node3',
          //     label: '标签2',
          //   },
          //   {
          //     id: 'node4',
          //     label: '标签3',
          //   },
          //   {
          //     id: 'node5',
          //     label: '标签4',
          //   },
          //   {
          //     id: 'node6',
          //     label: '标签5',
          //   },
          // ],
          edges:edgesList

            // edges[
            // {
            //   source: 'node1',
            //   target: '188'
            // },
            // {
            //   source: 'node1',
            //   target: '189'
            // },
            // {
            //   source: 'node1',
            //   target: '201'
            // },

          // ]
        }
        /**
         * 遍历节点数据,给节点添加图片
         */
        console.log(this.data.nodes)
        for (let i = 0, len = this.data.nodes.length; i < len; i++) {
          // eslint-disable-next-line eqeqeq
          if (this.data.nodes[i].id !== 'node1') { // 'offlineAnomaly'
            this.data.nodes[i].img = '/labelshow.jpg'
          }
          // eslint-disable-next-line eqeqeq
          if (this.data.nodes[i].status == 1) { // 'onlineAuth'
            // this.data.nodes[i].img = 'https://yyb.gtimg.com/aiplat/page/product/visionimgidy/img/demo6-16a47e5d31.jpg?max_age=31536000'
          }
          // eslint-disable-next-line eqeqeq
          if (this.data.nodes[i].status == 2) { // 'onlineAuth'
            // this.data.nodes[i].img = 'https://img0.baidu.com/it/u=3927459320,2138990686&fm=26&fmt=auto'
          }
        }
        // todo 设置鼠标悬停显示详情操作
        const tooltip = new G6.Tooltip({
          offsetX: 70,
          offsetY: 20,
          getContent (e) {
            const outDiv = document.createElement('div')
            outDiv.style.width = '180px'
            // e.item._cfg.id== 'node1'?<li>人员ID: ${e.item.getModel().id}</li>: <li>标签ID: ${e.item.getModel().id}</li>
            if(e.item._cfg.id== 'node1'){
              outDiv.innerHTML = `
            <ul id="nodeDetails">
              <li>人员名称: ${e.item.getModel().label}</li>
<!--              <li>IP: ${e.item.getModel().ip}</li>-->
<!--               <li>人员ID: ${e.item.getModel().id}</li>-->
<!--              <li>status: ${e.item.getModel().status}</li>-->
            </ul>`
              return outDiv
            }else {
              outDiv.innerHTML = `
            <ul id="nodeDetails">
              <li>标签名称: ${e.item.getModel().label}</li>
               <li>标签ID: ${e.item.getModel().id}</li>
            </ul>`
              return outDiv
            }

          },
          itemTypes: ['node']
        })
        // todo 初始化画布宽高为div parentContent 的宽度和高度
        this.canvasWidth = this.$refs.parentContent.clientWidth
        this.canvasHeight = this.$refs.parentContent.clientHeight
        this.graph = new G6.Graph({
          container: 'container',
          width: this.canvasWidth,
          height: this.canvasHeight,
          linkCenter: true,
          plugins: [tooltip], // 配置 Tooltip 插件
          modes: {
            default: ['drag-canvas', 'zoom-canvas', 'drag-node', 'activate-relations'] // 允许拖拽画布、放缩画布、拖拽节点、设置高亮
          },
          layout: {
            type: 'force',
            preventOverlap: true, // 防止节点重叠
            // 防碰撞必须设置nodeSize或size,否则不生效,由于节点的size设置了40,虽然节点不碰撞了,但是节点之间的距离很近,label几乎都挤在一起,所以又重新设置了大一点的nodeSize,这样效果会好很多
            nodeSize: 120,
            linkDistance: 90 // 指定边距离为150
          },
          defaultNode: { // 节点样式修改
            type: 'image', // 设置节点为图片
            size: [40, 40], // 节点大小
            labelCfg: { // 修改节点label样式
              style: {
                fill: '#5B8FF9', // 字体颜色
                fontSize: 14 // 字体大小
              }
            }
          },
          defaultEdge: {
            style: {
              lineWidth: 2, // 线宽
              stroke: '#778899', // 线的颜色
              endArrow: { // 设置终点箭头
                path: G6.Arrow.vee(5, 20, 15), // 使用内置箭头路径函数,参数为箭头的 宽度、长度、偏移量(默认为 0,与 d 对应)
                d: 15
              }
            }
          }
          // 设置节点高亮样式
          // edgeStateStyles: {
          //   highlight: {
          //     stroke: '#32dadd'
          //   }
          // }
        })
        /**
         * 鼠标移入时,设置节点连线高亮
         * */
        // const that = this // 改变this指向
        // this.graph.on('node:mouseenter', function (e) {
        //   let item = e.item
        //   that.graph.setAutoPaint(false)
        //   that.graph.getNodes().forEach(function (node) {
        //     that.graph.clearItemStates(node)
        //     that.graph.setItemState(node, 'dark', true)
        //   })
        //   that.graph.setItemState(item, 'dark', false)
        //   that.graph.setItemState(item, 'highlight', true)
        //   that.graph.getEdges().forEach(function (edge) {
        //     if (edge.getSource() === item) {
        //       that.graph.setItemState(edge.getTarget(), 'dark', false)
        //       that.graph.setItemState(edge.getTarget(), 'highlight', true)
        //       that.graph.setItemState(edge, 'highlight', true)
        //       edge.toFront()
        //     } else if (edge.getTarget() === item) {
        //       that.graph.setItemState(edge.getSource(), 'dark', false)
        //       that.graph.setItemState(edge.getSource(), 'highlight', true)
        //       that.graph.setItemState(edge, 'highlight', true)
        //       edge.toFront()
        //     } else {
        //       that.graph.setItemState(edge, 'highlight', false)
        //     }
        //   })
        //   that.graph.paint()
        //   that.graph.setAutoPaint(true)
        // })
        /**
         * 鼠标移出时,删除节点连线高亮
         * */
        // this.graph.on('node:mouseleave', this.clearAllStats)

        this.graph.on('node:click', (e) => {
          const nodeItem = e.item // 获取被点击的节点元素对象
          console.log(nodeItem)
          console.log('单击', nodeItem._cfg)
          // 如果点击的是人员就开始添加
          if(nodeItem._cfg.id== 'node1'){
            this.visible = true
          }
        if(nodeItem._cfg.id !== 'node1'){
          this.remove(nodeItem._cfg.id)
        }
        })

        // 接收数据并渲染
        this.graph.data(this.data)
        this.graph.render()



        console.log(this.data.nodes)
        console.log(this.data.nodes[0])
        const el = this.graph.findById(this.data.nodes[0]?.id)
        console.log('model', el)
        // // el._cfg.model.label = '张三'
        el._cfg.model.label = this.ryname
        // el._cfg.model.ip = '192.168.....'
        // el._cfg.model.status = 4
        el._cfg.model.img = '/portrait.png'
        // el._cfg.model.img = 'https://img2.baidu.com/it/u=617857580,3197175121&fm=253&fmt=auto&app=138&f=JPEG?w=260&h=260'
        this.graph.refreshItem(el)


        // 双击节点
        this.graph.on('node:dblclick', (e) => {
          // 先将所有当前是 click 状态的节点置为非 click 状态
          const clickNodes = this.graph.findAllByState('node', 'dblclick')
          clickNodes.forEach((cn) => {
            this.graph.setItemState(cn, 'dblclick', false)
          })
          const nodeItem = e.item // 获取被点击的节点元素对象
          console.log('双击', nodeItem._cfg)
          this.graph.setItemState(nodeItem, 'dblclick', true) // 设置当前节点的 click 状态为 true
        })
      },
      /**
       * 清除节点连线高亮状态
       */
      clearAllStats () {
        const that = this
        this.graph.setAutoPaint(false)
        this.graph.getNodes().forEach(function (node) {
          that.graph.clearItemStates(node)
        })
        this.graph.getEdges().forEach(function (edge) {
          that.graph.clearItemStates(edge)
        })
        this.graph.paint()
        this.graph.setAutoPaint(true)
      }
    }
  }
</script>

<style>
  .parentContent {
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
  }
  #nodeDetails {
    list-style: none;
  }
  #nodeDetails>li {
    padding:5px 0;
    text-align: left;
  }
</style>

五、效果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

你已经成功了,撒花。
今天的分享到此结束,欢迎小伙伴们一起交流

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

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

相关文章

python GUI And Tkinter 01

目录 一、基础介绍 二、创建窗口 1、创建完窗口后还需要知道窗口的相关属性 2、widget相关控件 3、原本tkinter有的Widget。 4、widget的共同属性 1. Configuration 2. Event Processing 3. Event callbacks 4. Alarm handlersafter(time,callback)&#xff1a;间隔指定时间后调…

Python logging 库的『完整教程』

前言 本文的标题是『完整』。所谓『完整』&#xff0c;大意是想表达&#xff1a;提炼出一组最小的经验组合&#xff0c;并且能够快速应用于工程中&#xff0c;能 work&#xff0c;甚至能完美地 work。这篇文章就是想要做到『如何能完美地work』。 初衷 最原始的初衷就是&…

nmap 扫描数据分析

本案22端口为开放端口&#xff0c;110为未开放端口 Wireshark上使用下面的表达式 ip.addr192.168.104.127 and ip.addr192.168.104.61 and tcp.port22 ip.addr192.168.104.127 and ip.addr192.168.104.61 and tcp.port110 命令一、 nmap -sS SYN-->SYN ACK-->RST …

电脑技巧:Windows这些自带应用尽量不要删,否则影响系统运行

目录 第一种&#xff1a;带有“microsoft”字样的软件尽量不卸载。 第二种&#xff1a;带有“Intel”或者“英特尔”的程序名称不要卸载。 第三种&#xff1a;windows驱动程序包尽量不要卸载 第四种&#xff1a;Adobe flash player不建议卸载 当电脑太卡&#xff0c;运行变…

C/C++ - 从代码到可执行程序的过程

&#xff08;1&#xff09;预编译 主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下&#xff1a; 删除所有的#define&#xff0c;展开所有的宏定义。处理所有的条件预编译指令&#xff0c;如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。处理“#inc…

简单工厂模式

简单工厂模式所谓组件&#xff1a;从设计上讲&#xff0c;组件就是能完成一定功能的封装体。小到一个类&#xff0c;大到一个系统&#xff0c;都可以称为组件&#xff0c;因为一个小系统放到更大的系统里面去&#xff0c;也就当个组件而已。模式定义&#xff1a;提供一个创建对…

servlet运用自定义分发优化servlet泛滥

servlet优化 Web 层的 Servlet 个数太多了&#xff0c;不利于管理和编写 我们发现每一个功能都需要定义一个 servlet&#xff0c;一个模块需要实现增删改查功能&#xff0c;就需要4个 servlet&#xff0c;模块一多就会造成servlet 泛滥。此时我们就想 servlet 能不能像 servi…

YOLOv6 训练自己的数据集

项目地址&#xff1a;https://github.com/meituan/YOLOv6 论文地址&#xff1a;https://arxiv.org/abs/2209.02976 论文解析&#xff1a;http://t.csdn.cn/0ZQbV YOLOv6 是一种专为工业应用设计的单级对象检测框架&#xff0c;具有硬件友好的高效设计和高性能。YOLOv6-N 在 NVI…

【windows】docker与docker-compose部署spring boot项目

看完不会用&#xff0c;我倒立**&#xff0c;保姆级教学 docker部署项目 采用Dockerfile部署 docker-compose部署项目 docker-compose部署&#xff0c;实际上是对容器的编排&#xff0c;以及容器间的一些依赖 比如一个springboot项目&#xff0c;需要使用redis&#xff0c;…

深入 Redis sds

文末有视频讲解 在上一个模块中&#xff0c;我和小伙伴们一起学习了 Redis 最核心的命令&#xff0c;主要涉及 String、List、Hash、Set、Sorted Set 五种数据结构的命令&#xff0c;同时&#xff0c;我们还介绍了每种数据结构的实战场景&#xff0c;并带领小伙伴们使用 Java 语…

11、ThingsBoard-租户配置

1、概述 租户配置(tenant profile)如其名是租户相关的配置,通俗一点就是给你这个租户的功能增加一些限制,如果你加钱,我就给你把限制设置高一点,thingsboard官方那个收费的版本不就是这样的吗?租户配置在系统层,系统管理员可以创建租户配置,然后使用租户配置为多个租…

centos7安装kubeadm

centos7安装kubeadm 一、基础设置 1、设置主机名 hostnamectl set-hostname master hostnamectl set-hostname node01vim /etc/hosts 192.168.198.169 master 192.168.198.170 note01hostnamectl hostnamectl 是在 centos7 中新增加的命令&#xff0c;它是是用来管理给定主机…

2023年我花费数小时整理的Java常用类进阶学习文档,你学会了吗?

文章目录1. 基本类型的包装类1.1 概念1.2 常用的属性1.3 常用的方法1.4 自动装箱和自动拆箱2. 字符串类2.1 String 类2.2 StringBuilder类2.3 StringBuffer类2.4 StringBuilder 的扩容机制3. 数字常用类3.1 Math 类3.2 Radom 类4. 枚举类5. 日期类5.1 Date 类5.2 DateFormat 类…

基于微信小程序的小区租拼车管理信息系统小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

学习理解10G Ethernet Subsystem之IEEE1588

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 学习理解10G Ethernet Subsystem之IEEE1588前言原理简介one step/two step1PPSIP 设置前言 1588大多是走在报文中&#xff0c;主要通过一些报文交互来完成同步过程&#xff…

在Docker中安装Gitea

目录在Docker中安装Gitea1、拉取最新Gitea官方镜像2、实例化一个Gitea容器3、Gitea需要数据源&#xff0c;因此使用mysql作为后端数据库4、在mysql中创建一个新数据库&#xff0c;起名gitea5、访问Gitea主页http://host:3000&#xff0c;进入初始配置页在Docker中安装Gitea 1、…

【自学Python】Python位运算符

Python位运算符 Python位运算符教程 在 Python 中&#xff0c;位运算符主要是用于 数值类型 的二进制的运算。 Python位运算符语法 位运算符说 明案例备注&按位与a & b返回 a 和 b 相与的结果|按位或a | b返回 a 和 b 相或的结果^按位异或a ^ b返回 a 和 b 相异或的…

FFMpeg 实现视频编码、解码

FFMpeg 作为音视频领域的开源工具&#xff0c;它几乎可以实现所有针对音视频的处理&#xff0c;本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例&#xff1a;编码、解码、封装、解封装、转码、缩放以及添加水印。 接下来会由发现问题&#xff0d;&#xff1e;…

Java中的equals()方法和hashCode的关系

文章目录1.Java中equals()方法比较的是什么&#xff1f;2.equals方法和hashcode的关系3.什么是hashCode3.1 hashcode有什么作用呢&#xff1f;4.关于重写equals()方法的两条规范5.代码实例1.Java中equals()方法比较的是什么&#xff1f; 最直接的回答就是看调用equals()方法的…

联合评测 DapuStor Roealsen5 NVMe SSD在GreatSQL数据据库中的应用探索

1、合作背景 万里开源软件有限公司 ​ 北京万里开源软件有限公司&#xff0c;是专注于国产自主可控数据库产品研发超 20年的国家高新技术企业&#xff0c;参与多个国家级的数据库行业标准制定工作。本次用于测试的 GreatSQL 开源数据库是适用于金融级应用的国内自主 MySQL 版…