当前位置: 首页 > wzjs >正文

做建材的网站好名字南京疫情最新情况

做建材的网站好名字,南京疫情最新情况,b2c模式类型有哪些,设计工作室名片先上图片&#xff01; 为了记录下&#xff0c;智能电表&#xff0c;以及智能设备的监测。 正常数据应该从后端来&#xff0c;我为了本地展示&#xff0c;把数据搬前端来&#xff0c;后端代码就不传了。 上代码&#xff1a; TreeCanvas.vue <template><div class&q…

先上图片!

为了记录下,智能电表,以及智能设备的监测。

正常数据应该从后端来,我为了本地展示,把数据搬前端来,后端代码就不传了。

上代码:

TreeCanvas.vue

<template><div class="tree-container" ref="container" @wheel.prevent="handleWheel"><canvas ref="canvas" @mousedown="startDragging" @mousemove="onMouseMove" @mouseup="stopDragging"@mouseleave="stopDragging"></canvas></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'const canvas = ref(null)
const ctx = ref(null)
const container = ref(null)// 树形数据结构
const treeData = {id: 1,name: '别墅总电表',type: 1,children: [{id: 2,name: 'F-1健身房',type: 2,error: 0,children: [{id: 4,name: '电表-器械区',type: 1,children: [{id: 8,name: '跑步机',type: 2,error: 0,}, {id: 9,name: '划船机',type: 2,error: 1,},{id: 100,name: '动感单车',type: 2,error: 0,},]},{id: 7,name: '电表-娱乐圈',type: 1,children: [{id: 10,name: '豪华影音室',type: 2,error: 0,children: [{id: 11,name: '电表03',type: 1,error: 0,children: [{id: 12,name: 'ktv运行设备',type: 2,error: 0,},{id: 13,name: '电竞房运行设备',type: 2,error: 0,}]}]},]}]},{id: 3,name: 'F-2',type: 2,error: 0,},{id: 5,name: 'F- -1宝马充电桩',type: 2,error: 1,}]
}let scale = 1
let offsetX = 0
let offsetY = 0
let isDragging = false
let lastX = 0
let lastY = 0
let deviceImg = null
let deviceImgd2 = null
let deviceImgd3 = nullasync function loadDeviceImage() {//加载3种图片// 1 创建 Image 对象const image = new Image()// 2 引入图片image.src = require('@/assets/d.png')deviceImg = image// 1 创建 Image 对象const imaged2 = new Image()// 2 引入图片imaged2.src = require('@/assets/d2.png')deviceImgd2 = imaged2// 1 创建 Image 对象const imaged3 = new Image()// 2 引入图片imaged3.src = require('@/assets/d3.png')deviceImgd3 = imaged3console.log(deviceImgd2, deviceImgd3)
}function drawTree(node, x, y, level) {const imgWidth = 25const imgHeight = 25const hGap = 200// const vGap = 200console.log('drawTree方法')console.log(node)// Draw current nodeif (deviceImg) {if (node.type == 1) {ctx.value.drawImage(deviceImgd3, x - imgWidth / 2, y - imgHeight / 2, imgWidth, imgHeight)} else if (node.type == 2) {if (node.error == 1) {ctx.value.drawImage(deviceImg, x - imgWidth / 2, y - imgHeight / 2, imgWidth, imgHeight)} else if (node.error == 0) {ctx.value.drawImage(deviceImgd2, x - imgWidth / 2, y - imgHeight / 2, imgWidth, imgHeight)}}}ctx.value.fillStyle = '#000'ctx.value.font = '12px sans-serif'ctx.value.textAlign = 'center'//  node.id;var text = ""if (node.error == 1) {text = node.name + "异常"} else {text = node.name}ctx.value.fillText(text, x, y + imgHeight / 2 + 15)// if (node.children && node.children.length > 0) {//     let totalHeight = (node.children.length - 1) * vGap//     let startY = y - totalHeight / 2//     node.children.forEach((child, i) => {//         const childX = x + hGap//         const childY = startY + i * vGap//         // Draw line to child//         ctx.value.beginPath()//         ctx.value.moveTo(x, y)//         ctx.value.lineTo(childX, childY)//         ctx.value.stroke()//         drawTree(child, childX, childY, level + 1)//     })// }if (node.children && node.children.length > 0) {let angleStep = Math.PI / (node.children.length + 1) // 角度步长for (let i = 0; i < node.children.length; i++) {let angle = -(Math.PI / 2) + (i + 1) * angleStep // 计算角度let childX = x + hGap * Math.cos(angle) // 根据角度计算新位置let childY = y + hGap * Math.sin(angle)// Draw line to childctx.value.beginPath()ctx.value.moveTo(x, y)ctx.value.lineTo(childX, childY)ctx.value.stroke()drawTree(node.children[i], childX, childY, level + 1)}}
}function draw() {const canvasEl = canvas.valueconst containerEl = container.valueconst devicePixelRatio = window.devicePixelRatio || 1const rect = containerEl.getBoundingClientRect()canvasEl.width = rect.width * devicePixelRatiocanvasEl.height = rect.height * devicePixelRatiocanvasEl.style.width = `${rect.width}px`canvasEl.style.height = `${rect.height}px`ctx.value = canvasEl.getContext('2d')ctx.value.setTransform(scale * devicePixelRatio, 0, 0, scale * devicePixelRatio, offsetX * devicePixelRatio, offsetY * devicePixelRatio)// ctx.value.clearRect(0, 0, canvasEl.width, canvasEl.height)ctx.value.clearRect(0, 0, canvasEl.width, canvasEl.height)console.log('draw方法')if (deviceImg) {drawTree(treeData, 100, rect.height / 2, 0)}
}function handleWheel(e) {const zoomFactor = 1.1if (e.deltaY < 0) {scale *= zoomFactor} else {scale /= zoomFactor}draw()
}function startDragging(e) {isDragging = truelastX = e.clientXlastY = e.clientY
}function stopDragging() {isDragging = false
}function onMouseMove(e) {if (!isDragging) returnconst dx = e.clientX - lastXconst dy = e.clientY - lastYoffsetX += dxoffsetY += dylastX = e.clientXlastY = e.clientYdraw()
}function resizeHandler() {draw()
}onMounted(async () => {await loadDeviceImage()draw()window.addEventListener('resize', resizeHandler)
})onBeforeUnmount(() => {window.removeEventListener('resize', resizeHandler)
})
</script><style scoped>
.tree-container {width: 100%;height: 600px;overflow: hidden;border: 1px solid #ccc;background-color: #f9f9f9;
}canvas {display: block;cursor: grab;
}
</style>

引用的话,就在想用的地方,直接引组件用。

http://www.dtcms.com/wzjs/301402.html

相关文章:

  • 什么网站做代练比价靠谱品牌营销策划方案怎么做才好
  • 网站建设通查询网络营销考试题目及答案2022
  • 自己创建平台要多少钱seo指的是什么
  • es网站开发网站注册时间查询
  • 电子商务网站开发形式seo优化搜索结果
  • 在哪个网站可以搜索做凉菜视频seo建站教程
  • 怎样装修公司网站淘宝推广
  • 邯郸有做网站的吗上海谷歌seo公司
  • 商务网站建设内容免费网站建设seo
  • 企业如何做网站网络推广的具体方式
  • 张家港高端网站制作百度灰色词优化排名
  • 为什么网站显示乱码代运营公司怎么找客户
  • 做网站用买服务器码起飞页自助建站平台
  • 网站目标定位概念手机网络优化
  • 网站域名如何续费郑州网站推广优化公司
  • 如何在网站上做404页面广告网站建设网站排名优化
  • b2b网站制作平台nba今日最新消息
  • 普陀网站建设推广手机搭建网站
  • 建材团购网站建设方案网络热词缩写
  • 需要大量做网站做推广的行业百度网盘官网网页版
  • seo自学网app河南网站seo
  • 目前网站建设主流技术架构免费的html网站
  • 化妆品网站建设的维护网站提交收录
  • 怎样用自己的电脑,做网站建站的公司
  • java做的网站怎么调试企业网站推广方案设计毕业设计
  • 南京企业网站做优化百度人工客服电话
  • 关于做我女朋友的网站南京seo网络推广
  • 微信网站建设费用seo优化的主要任务
  • 苏州网站设计师招聘信息西安百度爱采购推广
  • 自己怎么做网页链接aso优化榜单