政务云大屏修改
This commit is contained in:
		
							parent
							
								
									1af489ab4b
								
							
						
					
					
						commit
						9e0ccac1e5
					
				| @ -9,16 +9,13 @@ import { useEcharts } from '@/hooks/useEcharts'; | |||||||
| 
 | 
 | ||||||
| defineOptions({ name: 'NewHyalineCake' }); | defineOptions({ name: 'NewHyalineCake' }); | ||||||
| 
 | 
 | ||||||
| // 记录当前选中和高亮的系列索引 |  | ||||||
| let selectedIndex = null; | let selectedIndex = null; | ||||||
| let hoveredIndex = null; | let hoveredIndex = null; | ||||||
| 
 | 
 | ||||||
| // 定义组件 props |  | ||||||
| const props = defineProps({ | const props = defineProps({ | ||||||
|   chartData: { |   chartData: { | ||||||
|     type: Array, |     type: Array, | ||||||
|     default: () => [ |     default: () => [ | ||||||
|       // 默认示例数据 |  | ||||||
|       { name: '项目一', value: 60 }, |       { name: '项目一', value: 60 }, | ||||||
|       { name: '项目二', value: 44 }, |       { name: '项目二', value: 44 }, | ||||||
|       { name: '项目三', value: 32 }, |       { name: '项目三', value: 32 }, | ||||||
| @ -27,8 +24,8 @@ const props = defineProps({ | |||||||
|   option: { |   option: { | ||||||
|     type: Object, |     type: Object, | ||||||
|     default: () => ({ |     default: () => ({ | ||||||
|       k: 1, // 控制内外径关系的系数,1 表示无内径(实心饼),值越小内径越大 |       k: 1, // 控制内外径关系的系数,1 表示无内径,值越小内径越大 | ||||||
|       itemGap: 0.1, // 扇形边缘向外偏移距离比例(用于选中效果),扇形的间距,单位视图坐标,可调 |       itemGap: 0.1, // 扇形的间距 | ||||||
|       itemHeight: 120, // 扇形高度(影响z轴拉伸程度) |       itemHeight: 120, // 扇形高度(影响z轴拉伸程度) | ||||||
|       autoItemHeight: 0, // 自动计算扇形高度时使用的系数(>0时 itemHeight 失效,使用 autoItemHeight * value ) |       autoItemHeight: 0, // 自动计算扇形高度时使用的系数(>0时 itemHeight 失效,使用 autoItemHeight * value ) | ||||||
|       opacity: 0.6, // 透明度设置 |       opacity: 0.6, // 透明度设置 | ||||||
| @ -46,15 +43,11 @@ const props = defineProps({ | |||||||
|   }, |   }, | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // 声明组件触发的事件 |  | ||||||
| const emit = defineEmits(['click']); | const emit = defineEmits(['click']); | ||||||
| 
 | 
 | ||||||
| // 绑定到DOM的容器引用 |  | ||||||
| const chartRef = ref(null); | const chartRef = ref(null); | ||||||
| // 使用 useEcharts 钩子初始化 ECharts 实例,并获取控制方法 |  | ||||||
| const { setOptions, getInstance } = useEcharts(chartRef); | const { setOptions, getInstance } = useEcharts(chartRef); | ||||||
| 
 | 
 | ||||||
| // 存储当前的 ECharts 配置项 |  | ||||||
| const chartOption = ref({}); | const chartOption = ref({}); | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -69,8 +62,7 @@ const chartOption = ref({}); | |||||||
|  * @return {Object} parametric 曲面方程 |  * @return {Object} parametric 曲面方程 | ||||||
|  */ |  */ | ||||||
| function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h, offsetZ = 0) { | function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h, offsetZ = 0) { | ||||||
|   console.log('getParametricEquation params :>> ', startRatio, endRatio, isSelected, isHovered, k, h, offsetZ); |   // console.log('getParametricEquation params :>> ', startRatio, endRatio, isSelected, isHovered, k, h, offsetZ); | ||||||
|   // 中心弧度用于计算偏移方向 |  | ||||||
|   const midRatio = (startRatio + endRatio) / 2; |   const midRatio = (startRatio + endRatio) / 2; | ||||||
|   const startRadian = startRatio * Math.PI * 2; |   const startRadian = startRatio * Math.PI * 2; | ||||||
|   const endRadian = endRatio * Math.PI * 2; |   const endRadian = endRatio * Math.PI * 2; | ||||||
| @ -89,7 +81,6 @@ function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h | |||||||
|   // 计算高亮时的放大比例(未高亮时为1) |   // 计算高亮时的放大比例(未高亮时为1) | ||||||
|   const hoverRate = isHovered ? 1.05 : 1; |   const hoverRate = isHovered ? 1.05 : 1; | ||||||
| 
 | 
 | ||||||
|   // 返回 parametric 曲面方程 |  | ||||||
|   return { |   return { | ||||||
|     u: { |     u: { | ||||||
|       // u 参数控制饼的周向角度:从 -π 到 3π,可以完整绘制一圈 |       // u 参数控制饼的周向角度:从 -π 到 3π,可以完整绘制一圈 | ||||||
| @ -155,10 +146,6 @@ function getPie3D(pieData, internalDiameterRatio) { | |||||||
| 
 | 
 | ||||||
|   const k = typeof internalDiameterRatio !== 'undefined' ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio) : 1 / 3; |   const k = typeof internalDiameterRatio !== 'undefined' ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio) : 1 / 3; | ||||||
| 
 | 
 | ||||||
|   // 计算总值 |  | ||||||
|   // pieData.forEach((item) => { |  | ||||||
|   //   sumValue += item.value; |  | ||||||
|   // }); |  | ||||||
|   // 构建每个扇形的 series 数据 |   // 构建每个扇形的 series 数据 | ||||||
|   for (let i = 0; i < pieData.length; i += 1) { |   for (let i = 0; i < pieData.length; i += 1) { | ||||||
|     sumValue += pieData[i].value; |     sumValue += pieData[i].value; | ||||||
| @ -169,16 +156,19 @@ function getPie3D(pieData, internalDiameterRatio) { | |||||||
|       parametric: true, |       parametric: true, | ||||||
|       wireframe: { show: false }, |       wireframe: { show: false }, | ||||||
|       pieData: pieData[i], |       pieData: pieData[i], | ||||||
|       // itemStyle: { |  | ||||||
|       //   opacity: props.option.opacity, |  | ||||||
|       //   borderRadius: 300, |  | ||||||
|       //   borderColor: '#fff', |  | ||||||
|       // } |  | ||||||
|       pieStatus: { |       pieStatus: { | ||||||
|         selected: true, |         selected: true, | ||||||
|         hovered: false, |         hovered: false, | ||||||
|         k, |         k, | ||||||
|       }, |       }, | ||||||
|  |       label: { | ||||||
|  |         show: true, | ||||||
|  |         formatter: () => `${pieData[i].value}`, // 直接显示 value | ||||||
|  |         position: 'outside', // 标签位置 | ||||||
|  |         distance: 10, // 距扇形边缘的距离 | ||||||
|  |         color: '#fff', // 根据背景色调整 | ||||||
|  |         fontSize: 14, | ||||||
|  |       }, | ||||||
|     }; |     }; | ||||||
|     if (typeof pieData[i].itemStyle !== 'undefined') { |     if (typeof pieData[i].itemStyle !== 'undefined') { | ||||||
|       const { itemStyle } = pieData[i]; |       const { itemStyle } = pieData[i]; | ||||||
| @ -191,7 +181,7 @@ function getPie3D(pieData, internalDiameterRatio) { | |||||||
|   } |   } | ||||||
|   // 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数, |   // 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数, | ||||||
|   // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。 |   // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。 | ||||||
|   console.log(series); |   // console.log(series); | ||||||
|   for (let i = 0; i < series.length; i += 1) { |   for (let i = 0; i < series.length; i += 1) { | ||||||
|     endValue = startValue + series[i].pieData.value; |     endValue = startValue + series[i].pieData.value; | ||||||
| 
 | 
 | ||||||
| @ -301,7 +291,7 @@ function getPie3D(pieData, internalDiameterRatio) { | |||||||
| 
 | 
 | ||||||
| // 监听 mouseover,近似实现高亮(放大)效果 | // 监听 mouseover,近似实现高亮(放大)效果 | ||||||
| function handleMouseover(params) { | function handleMouseover(params) { | ||||||
|   console.log('mouseover'); |   // console.log('mouseover'); | ||||||
|   const idx = params.seriesIndex; |   const idx = params.seriesIndex; | ||||||
|   const series = chartOption.value.series; |   const series = chartOption.value.series; | ||||||
| 
 | 
 | ||||||
| @ -418,19 +408,10 @@ function handleClick(params) { | |||||||
|   series[idx].parametricEquation = getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h); |   series[idx].parametricEquation = getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h); | ||||||
|   series[idx].pieStatus.selected = isSelected; |   series[idx].pieStatus.selected = isSelected; | ||||||
| 
 | 
 | ||||||
|   // 更新记录选中的系列索引 |  | ||||||
|   selectedIndex = isSelected ? idx : null; |   selectedIndex = isSelected ? idx : null; | ||||||
| 
 |  | ||||||
|   // 更新图表配置 |  | ||||||
|   setOptions(optionVal); |   setOptions(optionVal); | ||||||
|   // 触发组件 click 事件供父组件使用 |  | ||||||
|   emit('click', params); |   emit('click', params); | ||||||
| } | } | ||||||
| // 在函数顶部声明(确保作用域覆盖所有需要的地方) |  | ||||||
| window.debugZValues = { |  | ||||||
|   current: null, |  | ||||||
|   history: [], |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| // 组件挂载后绑定事件 | // 组件挂载后绑定事件 | ||||||
| onMounted(() => { | onMounted(() => { | ||||||
|  | |||||||
| @ -42,16 +42,46 @@ const state = reactive({ | |||||||
|       icon: 'rect', |       icon: 'rect', | ||||||
|       left: 'center', |       left: 'center', | ||||||
|       textStyle: { |       textStyle: { | ||||||
|         color: '#fff', // 根据你的主题调整颜色 |         color: '#fff', | ||||||
|         fontSize: 14, |         fontSize: 16, | ||||||
|       }, |  | ||||||
|       itemStyle: { |  | ||||||
|         display: 'float', |  | ||||||
|         top: '120px', |  | ||||||
|         backgroundColor: 'rgba(255, 255, 255, 0.2)', |  | ||||||
|       }, |       }, | ||||||
|       formatter: (name) => name, |       formatter: (name) => name, | ||||||
|     }, |     }, | ||||||
|  |     // series: [ | ||||||
|  |     //   { | ||||||
|  |     //     type: 'pie3D', | ||||||
|  |     //     center: ['50%', '50%'], | ||||||
|  |     //     radius: ['40%', '60%'], | ||||||
|  |     //     avoidLabelOverlap: false, | ||||||
|  |     //     label: { | ||||||
|  |     //       normal: { | ||||||
|  |     //         formatter: (params) => { | ||||||
|  |     //           return params.value + '%'; | ||||||
|  |     //         }, | ||||||
|  |     //         padding: [0, -100, 25, -100], | ||||||
|  |     //         rich: { | ||||||
|  |     //           icon: { | ||||||
|  |     //             fontSize: 16, | ||||||
|  |     //           }, | ||||||
|  |     //           name: { | ||||||
|  |     //             fontSize: 14, | ||||||
|  |     //             padding: [0, 10, 0, 4], | ||||||
|  |     //             color: '#666666', | ||||||
|  |     //           }, | ||||||
|  |     //           value: { | ||||||
|  |     //             fontSize: 18, | ||||||
|  |     //             fontWeight: 'bold', | ||||||
|  |     //             color: '#333333', | ||||||
|  |     //           }, | ||||||
|  |     //         }, | ||||||
|  |     //       }, | ||||||
|  |     //     }, | ||||||
|  |     //     labelLine: { | ||||||
|  |     //       show: false, | ||||||
|  |     //     }, | ||||||
|  |     //     data: [], | ||||||
|  |     //   }, | ||||||
|  |     // ], | ||||||
|   }, |   }, | ||||||
|   data: [ |   data: [ | ||||||
|     { value: 76, name: '产业运营平台' }, |     { value: 76, name: '产业运营平台' }, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user