Compare commits
	
		
			2 Commits
		
	
	
		
			3317123181
			...
			fcc2926209
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| fcc2926209 | |||
| bad2583779 | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/tanchuang.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/assets/images/tanchuang.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 49 KiB  | 
| 
						 | 
				
			
			@ -26,7 +26,7 @@ let myChart = null;
 | 
			
		|||
 | 
			
		||||
const option = {
 | 
			
		||||
  title: {
 | 
			
		||||
    text: '中国海警首次登检菲律宾运补船只 (Y轴镜像)',
 | 
			
		||||
    text: '事件热度预测',
 | 
			
		||||
    left: 'center'
 | 
			
		||||
  },
 | 
			
		||||
  tooltip: { trigger: 'axis' },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ let myChart = null;
 | 
			
		|||
 | 
			
		||||
const option = {
 | 
			
		||||
  title: {
 | 
			
		||||
    text: '中方回应菲称我海警挥舞刀具 (Y轴镜像)',
 | 
			
		||||
    text: '事件热度预测',
 | 
			
		||||
    left: 'center'
 | 
			
		||||
  },
 | 
			
		||||
  tooltip: { trigger: 'axis' },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ let myChart = null;
 | 
			
		|||
 | 
			
		||||
const option = {
 | 
			
		||||
  title: {
 | 
			
		||||
    text: '中国海警夺回菲方盗窃赃物 (Y轴镜像)',
 | 
			
		||||
    text: '事件热度预测',
 | 
			
		||||
    left: 'center'
 | 
			
		||||
  },
 | 
			
		||||
  tooltip: { trigger: 'axis' },
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ const option = {
 | 
			
		|||
  series: [{
 | 
			
		||||
    name: '热度',
 | 
			
		||||
    data: yAxisMirroredData,
 | 
			
		||||
    type: 'bar', // 使用柱状图
 | 
			
		||||
    type: 'line', 
 | 
			
		||||
    itemStyle: { color: '#91cc75' }
 | 
			
		||||
  }]
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ let myChart = null;
 | 
			
		|||
 | 
			
		||||
const option = {
 | 
			
		||||
  title: {
 | 
			
		||||
    text: '菲自曝被缴枪的是顶级特种部队 (Y轴镜像)',
 | 
			
		||||
    text: '时间热度预测',
 | 
			
		||||
    left: 'center'
 | 
			
		||||
  },
 | 
			
		||||
  tooltip: { trigger: 'axis' },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ let myChart = null;
 | 
			
		|||
 | 
			
		||||
const option = {
 | 
			
		||||
  title: {
 | 
			
		||||
    text: '菲希望与中国就南海问题对话 (Y轴镜像)',
 | 
			
		||||
    text: '事件热度预测',
 | 
			
		||||
    left: 'center'
 | 
			
		||||
  },
 | 
			
		||||
  tooltip: { trigger: 'axis' },
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,6 @@ const option = {
 | 
			
		|||
    name: '热度',
 | 
			
		||||
    data: yAxisMirroredData,
 | 
			
		||||
    type: 'line',
 | 
			
		||||
    step: 'start', // 使用阶梯线图
 | 
			
		||||
    itemStyle: { color: '#ee6666' }
 | 
			
		||||
  }]
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,18 +2,32 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <div style="width: 100%; height: 100%;">
 | 
			
		||||
    <div class="graph-box" id="graph-container"></div>
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <div class="slider-box">
 | 
			
		||||
      <el-slider v-model="state.sliderValue" @input="sliderChange" :marks="state.marks" />
 | 
			
		||||
 <div class="slider-container">
 | 
			
		||||
  <div class="play-controls">
 | 
			
		||||
    <button @click="togglePlay" class="play-button">
 | 
			
		||||
      {{ isPlaying ? '暂停' : '播放' }}
 | 
			
		||||
    </button>
 | 
			
		||||
  </div>
 | 
			
		||||
      <el-slider style="" v-model="state.sliderValue" @input="sliderChange" :marks="state.marks" />
 | 
			
		||||
     </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup>
 | 
			
		||||
import axios from "axios";
 | 
			
		||||
import { onMounted, reactive } from "vue";
 | 
			
		||||
import { onMounted,onUnmounted, reactive,ref } from "vue";
 | 
			
		||||
import { Graph } from "@antv/g6";
 | 
			
		||||
import { ElLoading } from 'element-plus';
 | 
			
		||||
 | 
			
		||||
const isPlaying = ref(false);
 | 
			
		||||
const playTimer = ref(null);
 | 
			
		||||
 | 
			
		||||
const state = reactive({
 | 
			
		||||
  graph: null,
 | 
			
		||||
  marks: {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,8 +36,8 @@ const state = reactive({
 | 
			
		|||
    '20': "2024-01-05",
 | 
			
		||||
    '30': "2024-03-14",
 | 
			
		||||
    '40': "2024-03-16",
 | 
			
		||||
    '60': "2024-05-26",
 | 
			
		||||
    '70': "2024-06-21",
 | 
			
		||||
    '60': "2024-05-18",
 | 
			
		||||
    '80': "2024-05-23",
 | 
			
		||||
    '100': "2024-06-28"
 | 
			
		||||
  },
 | 
			
		||||
  sliderValue: 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -46,12 +60,58 @@ const hideLoading = () => {
 | 
			
		|||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const setStateSliderValue = (value) => {
 | 
			
		||||
  state.sliderValue = value;
 | 
			
		||||
  sliderChange(value);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 自动播放相关方法
 | 
			
		||||
const togglePlay = () => {
 | 
			
		||||
  if (isPlaying.value) {
 | 
			
		||||
    stopAutoPlay();
 | 
			
		||||
  } else {
 | 
			
		||||
    startAutoPlay();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const startAutoPlay = () => {
 | 
			
		||||
  isPlaying.value = true;
 | 
			
		||||
  // 获取排序后的mark键
 | 
			
		||||
  const markKeys = Object.keys(state.marks).map(Number).sort((a, b) => a - b);
 | 
			
		||||
  let currentIndex = markKeys.indexOf(state.sliderValue);
 | 
			
		||||
 | 
			
		||||
  playTimer.value = setInterval(() => {
 | 
			
		||||
    if (currentIndex < markKeys.length - 1) {
 | 
			
		||||
        currentIndex++;
 | 
			
		||||
      } else {
 | 
			
		||||
        stopAutoPlay();
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
    const nextValue = markKeys[currentIndex];
 | 
			
		||||
    state.sliderValue = nextValue;
 | 
			
		||||
    sliderChange(nextValue);
 | 
			
		||||
  }, 3000); // 3秒切换一次
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const stopAutoPlay = () => {
 | 
			
		||||
  isPlaying.value = false;
 | 
			
		||||
  if (playTimer.value) {
 | 
			
		||||
    clearInterval(playTimer.value);
 | 
			
		||||
    playTimer.value = null;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const sliderChange = (val) => {
 | 
			
		||||
  // 拖动时暂停自动播放
 | 
			
		||||
  if (isPlaying.value) {
 | 
			
		||||
    stopAutoPlay();
 | 
			
		||||
  }
 | 
			
		||||
  if (state.marks[val]) {
 | 
			
		||||
  if (state.marks[val]) {
 | 
			
		||||
    getData(state.marks[val]);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * 根据日期获取图谱数据
 | 
			
		||||
 * @param dataTime 日期
 | 
			
		||||
| 
						 | 
				
			
			@ -152,6 +212,15 @@ const highlightNode = (id) => {
 | 
			
		|||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
defineExpose({
 | 
			
		||||
  highlightNode,
 | 
			
		||||
  setStateSliderValue
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
onUnmounted(() => {
 | 
			
		||||
  stopAutoPlay();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  getData('2024-01-03')
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -163,7 +232,37 @@ onMounted(() => {
 | 
			
		|||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.slider-box {
 | 
			
		||||
.slider-container {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  gap: 10px;
 | 
			
		||||
  margin-top: -230px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.play-controls {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.play-button {
 | 
			
		||||
  width: 60px;
 | 
			
		||||
  padding: 6px 12px;
 | 
			
		||||
  background-color: #409EFF;
 | 
			
		||||
  color: white;
 | 
			
		||||
  border: none;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  margin-right: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.play-button:hover {
 | 
			
		||||
  background-color: #337ecc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.slider-box {
 | 
			
		||||
  flex: 1;
 | 
			
		||||
  margin-top: 0;
 | 
			
		||||
  width: 90%;
 | 
			
		||||
  margin-top: -230px;
 | 
			
		||||
  margin-left: 10px;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,16 @@
 | 
			
		|||
        <div class="tooltip-containner-data">
 | 
			
		||||
          <li><img :src="currentItem.img" alt="" style=""></li>
 | 
			
		||||
          <li v-if="currentItem.title.includes('中国海警首次登检菲律宾运补船只')"><chart32_-inspection /></li>
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
          <li v-else-if="currentItem.title.includes('中方回应菲称我海警挥舞刀具')"> <Chart33_WavingBlades /></li>
 | 
			
		||||
          <li v-else-if="currentItem.title.includes('中国海警夺回菲方盗窃赃物')"><Chart34_RecoveredGoods /></li>
 | 
			
		||||
          <li v-else-if="currentItem.title.includes('菲自曝被中国海警缴枪的是顶级特种部队')"><Chart35_SpecialForces /></li>
 | 
			
		||||
          <li v-else-if="currentItem.title.includes('菲律宾希望与中国就南海问题进行对话')"><Chart36_Dialogue /></li>
 | 
			
		||||
 | 
			
		||||
          <li style="margin-left: 10px; margin-top:20px;"><img src="../assets/images/logo/point.png"
 | 
			
		||||
              alt="" style="margin-bottom: -7px;">最初首发者:   {{ currentItem.earler }} </li>
 | 
			
		||||
          <li style="margin-left: 10px;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">积极评论者:{{ currentItem.comenter
 | 
			
		||||
=======
 | 
			
		||||
          <li v-else-if="currentItem.title.includes('中方回应菲称我海警挥舞刀具')">
 | 
			
		||||
            <Chart33_WavingBlades />
 | 
			
		||||
          </li>
 | 
			
		||||
| 
						 | 
				
			
			@ -16,10 +26,11 @@
 | 
			
		|||
          <li style="margin-left: 10px; margin-top:   20px;"><img src="../assets/images/logo/point.png"
 | 
			
		||||
              alt="">最初首发者:   {{ currentItem.earler }} </li>
 | 
			
		||||
          <li style="margin-left: 10px;"><img src="../assets/images/logo/point.png" alt="">积极评论者:{{ currentItem.comenter
 | 
			
		||||
>>>>>>> 33171231818e20d0f810df4ae56f3620727af4df
 | 
			
		||||
          }}</li>
 | 
			
		||||
          <li style="margin-left: 200px;margin-top: -57px;"><img src="../assets/images/logo/point.png" alt="">锚点用户{{
 | 
			
		||||
          <li style="margin-left: 200px;margin-top: -45px;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">锚点用户{{
 | 
			
		||||
            currentItem.keyuser }}</li>
 | 
			
		||||
          <li style="margin-left: 200px;;"><img src="../assets/images/logo/point.png" alt="">积极转发者:   {{
 | 
			
		||||
          <li style="margin-left: 200px;;"><img src="../assets/images/logo/point.png" alt="" style="margin-bottom: -7px;">积极转发者:   {{
 | 
			
		||||
            currentItem.switcher }}</li>
 | 
			
		||||
        </div>
 | 
			
		||||
        <img src="../assets/images/logo/cancel.png" alt=""
 | 
			
		||||
| 
						 | 
				
			
			@ -50,19 +61,20 @@
 | 
			
		|||
        <div class="info-coment">精选贴文:
 | 
			
		||||
          <!-- 新增贴文列表容器 -->
 | 
			
		||||
          <div class="post-list-container">
 | 
			
		||||
            <div class="post-item" v-for="(post, index) in visibleData" :key="index">
 | 
			
		||||
              <p class="post-content">{{ post.commenter }}</p>
 | 
			
		||||
            <div class="post-item" v-for="(post, index) in filteredComments" :key="index">
 | 
			
		||||
              <p class="post-content">{{ post.comment }}</p>
 | 
			
		||||
              <p class="post-time">{{ post.time }}</p>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div v-if="filteredComments.length === 0" class="no-posts">
 | 
			
		||||
              暂无该用户的贴文数据
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <header class="header">
 | 
			
		||||
      <button class="back-home-btn" @click="goToHome">返回主页面</button>
 | 
			
		||||
      <div class="timer">
 | 
			
		||||
 | 
			
		||||
        <button class="reload-button" @click="handleReload" :disabled="isReloading" style="margin-top: -10px;">
 | 
			
		||||
          <img src="../assets/images/logo/reload.png">
 | 
			
		||||
          {{ buttonText }}
 | 
			
		||||
| 
						 | 
				
			
			@ -110,10 +122,9 @@
 | 
			
		|||
            </div>
 | 
			
		||||
            <div class="suggestion-containner">
 | 
			
		||||
              <ul>
 | 
			
		||||
                <button
 | 
			
		||||
                  style="background-image: url('src/assets/images/logo/定位.png'); background-size: cover; background-repeat: no-repeat; background-position: center;width: 20px;height: 20px;margin-left: 370px;margin-bottom: -60px;border-radius: 0px;border: 0;cursor: pointer;"
 | 
			
		||||
                  @click.stop="handleCombineAction"></button>
 | 
			
		||||
                <li v-for="item in filteredData" :key="item.id" @click="openDetailModal(item)"
 | 
			
		||||
                <!-- 只显示第一个按钮 -->
 | 
			
		||||
               
 | 
			
		||||
                <li v-for="(item, index) in filteredData" :key="item.id" @click="openDetailModal(item)"
 | 
			
		||||
                  @mouseenter="handleMouseEnter(item.id)" @mouseleave="handleMouseLeave()"
 | 
			
		||||
                  :class="{ 'hover-item': hoverItemId === item.id }">
 | 
			
		||||
                  <img :src="item.avatar">
 | 
			
		||||
| 
						 | 
				
			
			@ -123,6 +134,9 @@
 | 
			
		|||
                    <span class="span-2">粉丝数: {{ item.number }}</span>
 | 
			
		||||
                    <span class="span-3">推荐监控频率{{ item.transmit }}</span>
 | 
			
		||||
                  </div>
 | 
			
		||||
                   <button v-if="index === 0"
 | 
			
		||||
                  style="background-image: url('src/assets/images/logo/定位.png'); background-size: cover; background-repeat: no-repeat; background-position: center;margin-left: 340px;margin-top: -100px;width: 20px;height: 20px;border-radius: 0px;border: 0;cursor: pointer;"
 | 
			
		||||
                  @click.stop="handleLocateMark"></button>
 | 
			
		||||
                </li>
 | 
			
		||||
              </ul>
 | 
			
		||||
            </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -145,10 +159,15 @@
 | 
			
		|||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="intime">
 | 
			
		||||
            <img src="../assets/images/percent/intime.png" alt="" style="margin-left:30px;margin-top: 30px;">
 | 
			
		||||
            <img src="../assets/images/percent/intime-data.png " style="margin-left:30px;margin-bottom: 10px;">
 | 
			
		||||
            <img src="../assets/images/logo/xingwei.png" alt="" style="margin-left:30px;margin-top: 30px;">
 | 
			
		||||
            <img src="../assets/images/logo/xingwei-data.png" style="margin-left:30px;margin-bottom: 30px;">
 | 
			
		||||
            <!-- 添加图表切换按钮 -->
 | 
			
		||||
            <div class="chart-tabs">
 | 
			
		||||
              <button @click="switchChartType('registration')"
 | 
			
		||||
                :class="{ 'active-tab': currentChartType === 'registration' }">注册时间</button>
 | 
			
		||||
              <button @click="switchChartType('behavior')"
 | 
			
		||||
                :class="{ 'active-tab': currentChartType === 'behavior' }">行为模式</button>
 | 
			
		||||
            </div>
 | 
			
		||||
            <!-- ECharts图表容器 -->
 | 
			
		||||
            <div id="categoryChart" style="width: 400px;height: 200px;margin-top: 30px;"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -184,17 +203,17 @@
 | 
			
		|||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="containner5" style="width: 850px; height: 850px">
 | 
			
		||||
      <IndexView />
 | 
			
		||||
      <IndexView ref="appRef" />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="containner6">
 | 
			
		||||
      <div class="containner6-data">
 | 
			
		||||
        <img src="../assets/images/main-6/mao.png" alt="" style="margin-top: 20px; margin-left: 100px;">
 | 
			
		||||
        <p class="containner6-font1">500</p>
 | 
			
		||||
        <p class="containner6-font1">20</p>
 | 
			
		||||
        <p class="containner6-font2">锚点数量</p>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="containner6-data" style="margin-top: -180px;margin-left: 200px;">
 | 
			
		||||
        <img src="../assets/images/main-6/jiankong.png" alt="" style="margin-top: 10px; margin-left: 100px;">
 | 
			
		||||
        <p class="containner6-font1">36</p>
 | 
			
		||||
        <p class="containner6-font1">15</p>
 | 
			
		||||
        <p class="containner6-font2">已监控锚点</p>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="containner6-data" style="margin-top: -210px;margin-left: 400px;">
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +230,7 @@
 | 
			
		|||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup>
 | 
			
		||||
import { ref, computed, reactive, onMounted, onUnmounted, nextTick } from 'vue';
 | 
			
		||||
import { ref, computed, reactive, onMounted, onUnmounted, nextTick,watch } from 'vue';
 | 
			
		||||
import { useRouter } from 'vue-router';
 | 
			
		||||
import IndexView from './App.vue';
 | 
			
		||||
import ScrollContainer from '@/components/ScrollContainer.vue';
 | 
			
		||||
| 
						 | 
				
			
			@ -220,6 +239,11 @@ import { useActionStore } from '@/store';
 | 
			
		|||
import Chart32_Inspection from '@/components/Chart32_Inspection(1).vue';
 | 
			
		||||
import Chart33_WavingBlades from '@/components/Chart33_WavingBlades(1).vue';
 | 
			
		||||
import Chart34_RecoveredGoods from '@/components/Chart34_RecoveredGoods(1).vue';
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
import Chart35_SpecialForces from '@/components/Chart35_SpecialForces(1).vue';
 | 
			
		||||
import Chart36_Dialogue from '@/components/Chart36_Dialogue(1).vue';
 | 
			
		||||
=======
 | 
			
		||||
>>>>>>> 33171231818e20d0f810df4ae56f3620727af4df
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
let myChart = null;
 | 
			
		||||
| 
						 | 
				
			
			@ -244,6 +268,20 @@ const goToHome = () => {
 | 
			
		|||
  router.push('/'); // 假设主页面路由为根路径
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const appRef = ref(null);
 | 
			
		||||
 | 
			
		||||
const handleLocateMark = () => {
 | 
			
		||||
  if (appRef.value) {
 | 
			
		||||
    // 设置marks=2024-3-14对应的sliderValue
 | 
			
		||||
    appRef.value.setStateSliderValue(30);
 | 
			
		||||
    // 设置延迟,等待数据加载完成后高亮节点
 | 
			
		||||
    setTimeout(() => {
 | 
			
		||||
      // 请将'实际节点ID'替换为需要高亮的节点ID
 | 
			
		||||
      appRef.value.highlightNode('840983');
 | 
			
		||||
    }, 1500); // 1.5秒延迟,可根据实际情况调整
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const handleCombineAction = () => {
 | 
			
		||||
  actionStore.triggerCombine();
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -354,33 +392,33 @@ const handleInput = () => {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
const mediaData = [
 | 
			
		||||
  { id: 1, type: '新闻媒体', name: '新浪军事', avatar: 'src/views/user/xinlang.png', number: '5005.8w', transmit: '425', time: '2024.1.5', posts: '2.1w', atten: '98', interaction: '16.1w' },
 | 
			
		||||
  { id: 2, type: '新闻媒体', name: '环球时报', avatar: 'src/views/user/huanqiu.png', number: '3126.1w', transmit: '557', time: '2024.3.12', posts: '1.8w', atten: '76', interaction: '9.3w' },
 | 
			
		||||
  { id: 3, type: '自媒体', name: '大侠啊啊啊啊', avatar: 'src/views/user/daxia.png', number: '288', transmit: '55', time: '2024.2.20', posts: '896', atten: '12', interaction: '3.2w' },
 | 
			
		||||
  { id: 4, type: '自媒体', name: '外贸发布BBS', avatar: 'src/views/user/bbs.png', number: '1.3w', transmit: '68', time: '2024.4.5', posts: '562', atten: '8', interaction: '1.5w' },
 | 
			
		||||
  { id: 5, type: '自媒体', name: '空天砺剑', avatar: 'src/views/user/kongtian.png', number: '516.5w', transmit: '55', time: '2024.1.28', posts: '3.2w', atten: '156', interaction: '22.7w' },
 | 
			
		||||
  { id: 6, type: '自媒体', name: '爱锤盾海桃-霆恩启副', avatar: 'src/views/user/ai.png', number: '223', transmit: '76', time: '2024.3.18', posts: '432', atten: '5', interaction: '896' },
 | 
			
		||||
  { id: 7, type: '自媒体', name: '苍龙飞天79', avatar: 'src/views/user/79.png', number: '516.6w', transmit: '76', time: '2024.2.10', posts: '2.9w', atten: '142', interaction: '19.5w' },
 | 
			
		||||
  { id: 8, type: '自媒体', name: '盖世英雄玉椒龙', avatar: 'src/views/user/gaishi.png', number: '42w', transmit: '53', time: '2024.4.1', posts: '1.2w', atten: '67', interaction: '8.3w' },
 | 
			
		||||
  { id: 9, type: '自媒体', name: '十八子91221', avatar: 'src/views/user/91221.png', number: '1947', transmit: '56', time: '2024.1.15', posts: '654', atten: '9', interaction: '2.1w' },
 | 
			
		||||
  { id: 10, type: '自媒体', name: '江夏云飞', avatar: 'src/views/user/jiang.png', number: '1629', transmit: '33', time: '2024.3.25', posts: '321', atten: '4', interaction: '987' },
 | 
			
		||||
  { id: 11, type: '自媒体', name: '唐宁20150903', avatar: 'src/views/user/tang.png', number: '25', transmit: '43', time: '2024.2.5', posts: '128', atten: '2', interaction: '456' },
 | 
			
		||||
  { id: 12, type: '自媒体', name: '钻石狗Boss', avatar: 'src/views/user/bbs.png', number: '1184', transmit: '76', time: '2024.4.12', posts: '512', atten: '7', interaction: '1.8w' },
 | 
			
		||||
  { id: 13, type: '自媒体', name: '乐之567', avatar: 'src/views/user/567.png', number: '266', transmit: '24', time: '2024.1.30', posts: '209', atten: '3', interaction: '654' },
 | 
			
		||||
  { id: 14, type: '自媒体', name: '地瓜熊老六', avatar: 'src/views/user/lao.png', number: '667.5w', transmit: '33', time: '2024.3.8', posts: '4.7w', atten: '210', interaction: '33.2w' },
 | 
			
		||||
  { id: 15, type: '自媒体', name: 'CGTN记者团', avatar: 'src/views/user/cgtn.png', number: '322.1w', transmit: '43', time: '2024.2.18', posts: '2.5w', atten: '105', interaction: '17.8w' },
 | 
			
		||||
  { id: 16, type: '自媒体', name: '钱局长本人', avatar: 'src/views/user/qian.png', number: '40万', transmit: '56', time: '2024.4.20', posts: '1.3w', atten: '58', interaction: '9.4w' },
 | 
			
		||||
  { id: 17, type: '自媒体', name: '肥_谍_gg', avatar: 'src/views/user/gg.png', number: '245', transmit: '56', time: '2024.1.22', posts: '317', atten: '6', interaction: '1.2w' },
 | 
			
		||||
  { id: 18, type: '自媒体', name: '深海一万米', avatar: 'src/views/user/shenhai.png', number: '126w', transmit: '44', time: '2024.3.5', posts: '8906', atten: '42', interaction: '6.7w' },
 | 
			
		||||
  { id: 19, type: '政府官号', name: '中国海警', avatar: 'src/views/user/haijing.png', number: '80.9w', transmit: '45', time: '2024.2.8', posts: '1.1w', atten: '35', interaction: '5.2w' },
 | 
			
		||||
  { id: 20, type: '政府官号', name: '平安泸县', avatar: 'src/views/user/luxian.png', number: '3.9w', transmit: '45', time: '2024.4.15', posts: '4321', atten: '18', interaction: '2.9w' },
 | 
			
		||||
  { id: 1, type: '新闻媒体', name: '新浪军事', avatar: 'src/views/user/xinlang.png', number: '5005.8w', transmit: '10h/1次', time: '2024.1.5', posts: '2.1w', atten: '98', interaction: '16.1w' },
 | 
			
		||||
  { id: 2, type: '新闻媒体', name: '环球时报', avatar: 'src/views/user/huanqiu.png', number: '3126.1w', transmit: '8h/1次', time: '2024.3.12', posts: '1.8w', atten: '76', interaction: '9.3w' },
 | 
			
		||||
  { id: 3, type: '自媒体', name: '大侠啊啊啊啊', avatar: 'src/views/user/daxia.png', number: '288', transmit: '20h/1次', time: '2024.2.20', posts: '896', atten: '12', interaction: '3.2w' },
 | 
			
		||||
  { id: 4, type: '自媒体', name: '外贸发布BBS', avatar: 'src/views/user/bbs.png', number: '1.3w', transmit: '21h/1次', time: '2024.4.5', posts: '562', atten: '8', interaction: '1.5w' },
 | 
			
		||||
  { id: 5, type: '自媒体', name: '空天砺剑', avatar: 'src/views/user/kongtian.png', number: '516.5w', transmit: '18h/1次', time: '2024.1.28', posts: '3.2w', atten: '156', interaction: '22.7w' },
 | 
			
		||||
  { id: 6, type: '自媒体', name: '爱锤盾海桃-霆恩启副', avatar: 'src/views/user/ai.png', number: '223', transmit: '25h/1次', time: '2024.3.18', posts: '432', atten: '5', interaction: '896' },
 | 
			
		||||
  { id: 7, type: '自媒体', name: '苍龙飞天79', avatar: 'src/views/user/79.png', number: '516.6w', transmit: '24h/1次', time: '2024.2.10', posts: '2.9w', atten: '142', interaction: '19.5w' },
 | 
			
		||||
  { id: 8, type: '自媒体', name: '盖世英雄玉椒龙', avatar: 'src/views/user/gaishi.png', number: '42w', transmit: '26h/1次', time: '2024.4.1', posts: '1.2w', atten: '67', interaction: '8.3w' },
 | 
			
		||||
  { id: 9, type: '自媒体', name: '十八子91221', avatar: 'src/views/user/91221.png', number: '1947', transmit: '30h/1次', time: '2024.1.15', posts: '654', atten: '9', interaction: '2.1w' },
 | 
			
		||||
  { id: 10, type: '自媒体', name: '江夏云飞', avatar: 'src/views/user/jiang.png', number: '1629', transmit: '23h/1次', time: '2024.3.25', posts: '321', atten: '4', interaction: '987' },
 | 
			
		||||
  { id: 11, type: '自媒体', name: '唐宁20150903', avatar: 'src/views/user/tang.png', number: '25', transmit: '22h/1次', time: '2024.2.5', posts: '128', atten: '2', interaction: '456' },
 | 
			
		||||
  { id: 12, type: '自媒体', name: '钻石狗Boss', avatar: 'src/views/user/bbs.png', number: '1184', transmit: '22h/1次', time: '2024.4.12', posts: '512', atten: '7', interaction: '1.8w' },
 | 
			
		||||
  { id: 13, type: '自媒体', name: '乐之567', avatar: 'src/views/user/567.png', number: '266', transmit: '18h/1次', time: '2024.1.30', posts: '209', atten: '3', interaction: '654' },
 | 
			
		||||
  { id: 14, type: '自媒体', name: '地瓜熊老六', avatar: 'src/views/user/lao.png', number: '667.5w', transmit: '10h/1次', time: '2024.3.8', posts: '4.7w', atten: '210', interaction: '33.2w' },
 | 
			
		||||
  { id: 15, type: '自媒体', name: 'CGTN记者团', avatar: 'src/views/user/cgtn.png', number: '322.1w', transmit: '15h/1次', time: '2024.2.18', posts: '2.5w', atten: '105', interaction: '17.8w' },
 | 
			
		||||
  { id: 16, type: '自媒体', name: '钱局长本人', avatar: 'src/views/user/qian.png', number: '40万', transmit: '24h/1次', time: '2024.4.20', posts: '1.3w', atten: '58', interaction: '9.4w' },
 | 
			
		||||
  { id: 17, type: '自媒体', name: '肥_谍_gg', avatar: 'src/views/user/gg.png', number: '245', transmit: '19h/1次', time: '2024.1.22', posts: '317', atten: '6', interaction: '1.2w' },
 | 
			
		||||
  { id: 18, type: '自媒体', name: '深海一万米', avatar: 'src/views/user/shenhai.png', number: '126w', transmit: '21h/1次', time: '2024.3.5', posts: '8906', atten: '42', interaction: '6.7w' },
 | 
			
		||||
  { id: 19, type: '政府官号', name: '中国海警', avatar: 'src/views/user/haijing.png', number: '80.9w', transmit: '26h/1次', time: '2024.2.8', posts: '1.1w', atten: '35', interaction: '5.2w' },
 | 
			
		||||
  { id: 20, type: '政府官号', name: '平安泸县', avatar: 'src/views/user/luxian.png', number: '3.9w', transmit: '18h/1次', time: '2024.4.15', posts: '4321', atten: '18', interaction: '2.9w' },
 | 
			
		||||
];
 | 
			
		||||
const categoryData = {
 | 
			
		||||
  '全部': {
 | 
			
		||||
    anchorCount: 36,
 | 
			
		||||
    anchorCount: 20,
 | 
			
		||||
    postFrequency: '5.1天/次',
 | 
			
		||||
    fansCount: '1.7w',
 | 
			
		||||
    interactionCount: 0
 | 
			
		||||
    interactionCount: 6
 | 
			
		||||
  },
 | 
			
		||||
  '自媒体': {
 | 
			
		||||
    anchorCount: 16,
 | 
			
		||||
| 
						 | 
				
			
			@ -398,7 +436,7 @@ const categoryData = {
 | 
			
		|||
    anchorCount: 2,
 | 
			
		||||
    postFrequency: '14.8天/次',
 | 
			
		||||
    fansCount: '4065.5w',
 | 
			
		||||
    interactionCount: 0
 | 
			
		||||
    interactionCount: 4
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
// 当前显示的分类
 | 
			
		||||
| 
						 | 
				
			
			@ -421,7 +459,6 @@ const showTooltip = ref(false);
 | 
			
		|||
 | 
			
		||||
const allData = Array.from({ length: 5 }, (_, index) => ({ id: index, showTemporaryStyle: false }));
 | 
			
		||||
const currentIndex = ref(0);
 | 
			
		||||
 | 
			
		||||
const visibleData = ref([
 | 
			
		||||
  {
 | 
			
		||||
    avatar: './src/views/user/boss.png',
 | 
			
		||||
| 
						 | 
				
			
			@ -611,6 +648,37 @@ const visibleData = ref([
 | 
			
		|||
  },
 | 
			
		||||
 | 
			
		||||
]);
 | 
			
		||||
// 按commenter分类visibleData
 | 
			
		||||
const groupedByCommenter = visibleData.value.reduce((groups, item) => {
 | 
			
		||||
  const commenter = item.commenter.trim();
 | 
			
		||||
  if (!groups[commenter]) {
 | 
			
		||||
    groups[commenter] = [];
 | 
			
		||||
  }
 | 
			
		||||
  groups[commenter].push(item);
 | 
			
		||||
  return groups;
 | 
			
		||||
}, {});
 | 
			
		||||
 | 
			
		||||
const commenterGroups = Object.entries(groupedByCommenter).map(([commenter, comments]) => ({
 | 
			
		||||
  commenter,
 | 
			
		||||
  comments
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
// 根据当前详情用户筛选评论
 | 
			
		||||
const filteredComments = computed(() => {
 | 
			
		||||
  if (!currentDetailItem.value) return [];
 | 
			
		||||
  // 去除两端空格并统一转为小写进行匹配,避免空格和大小写问题
 | 
			
		||||
  const targetName = currentDetailItem.value.name?.trim().toLowerCase();
 | 
			
		||||
  if (!targetName) return [];
 | 
			
		||||
 | 
			
		||||
  // 查找匹配的评论组
 | 
			
		||||
  const matchedGroup = commenterGroups.find(group =>
 | 
			
		||||
    group.commenter.trim().toLowerCase() === targetName
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return matchedGroup ? matchedGroup.comments : [];
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// 时间切换
 | 
			
		||||
const tooltipDdata1 = [
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -784,7 +852,7 @@ const tooltipDdata5 = [
 | 
			
		|||
    switcher: '杨毅妻儿',
 | 
			
		||||
    earler: '白俄罗斯大宽',
 | 
			
		||||
    keyuser: '盖世英雄玉椒龙, 肥_谍_gg, 钻石狗Boss, 外贸发布BBS, 新浪军事, 钱局长本人, 地瓜熊老六,唐宁20150903,空天砺剑',
 | 
			
		||||
    img: 'src/assets/images/mess/main4.png',
 | 
			
		||||
    img: 'src/assets/images/mess/main5.png',
 | 
			
		||||
    imgdata: 'src/assets/images/mess/4top.png',
 | 
			
		||||
    beforeimg: 'src/assets/images/logo/ruank4.png',
 | 
			
		||||
    backimg: 'src/assets/images/logo/high3.png'
 | 
			
		||||
| 
						 | 
				
			
			@ -796,7 +864,7 @@ const tooltipDdata5 = [
 | 
			
		|||
    switcher: '彼岸星光德尔塔',
 | 
			
		||||
    earler: '今日俄罗斯RT',
 | 
			
		||||
    keyuser: '新浪军事',
 | 
			
		||||
    img: 'src/assets/images/mess/main5.png',
 | 
			
		||||
    img: 'src/assets/images/mess/main4.png',
 | 
			
		||||
    imgdata: 'src/assets/images/mess/5top.png',
 | 
			
		||||
    beforeimg: 'src/assets/images/logo/ruank5.png',
 | 
			
		||||
    backimg: 'src/assets/images/logo/high3.png'
 | 
			
		||||
| 
						 | 
				
			
			@ -880,8 +948,6 @@ const startDataSwitchTimer = () => {
 | 
			
		|||
  timers.push(interval, timeout);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 添加组件引用
 | 
			
		||||
const appRef = ref(null);
 | 
			
		||||
 | 
			
		||||
// 修改定位按钮点击事件
 | 
			
		||||
const handleLocationClick = (itemId) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -895,8 +961,188 @@ const handleLocationClick = (itemId) => {
 | 
			
		|||
  }, 500);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 图表相关状态
 | 
			
		||||
const currentChartType = ref('registration'); // 'registration' 或 'behavior'
 | 
			
		||||
let categoryChart = null;
 | 
			
		||||
 | 
			
		||||
// 图表数据
 | 
			
		||||
const chartData = {
 | 
			
		||||
  '全部': {
 | 
			
		||||
    registration: [
 | 
			
		||||
      { name: '小于6个月', value: 0, itemStyle: { color: '#3398DB' } },
 | 
			
		||||
      { name: '6-12个月', value: 5, itemStyle: { color: '#13C2C2' } },
 | 
			
		||||
      { name: '1-3年', value: 15, itemStyle: { color: '#00B42A' } },
 | 
			
		||||
      { name: '大于三年', value: 80, itemStyle: { color: '#F53F3F' } }
 | 
			
		||||
    ],
 | 
			
		||||
    behavior: [
 | 
			
		||||
      { name: '转发行为', value: 43.12, itemStyle: { color: '#722ED1' } },
 | 
			
		||||
      { name: '评论行为', value: 22.06, itemStyle: { color: '#EB0AA4' } },
 | 
			
		||||
      { name: '原发行为', value: 34.82, itemStyle: { color: '#FF7D00' } }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  '自媒体': {
 | 
			
		||||
    registration: [
 | 
			
		||||
      { name: '小于6个月', value: 0, itemStyle: { color: '#3398DB' } },
 | 
			
		||||
      { name: '6-12个月', value: 10, itemStyle: { color: '#13C2C2' } },
 | 
			
		||||
      { name: '1-3年', value: 20, itemStyle: { color: '#00B42A' } },
 | 
			
		||||
      { name: '大于三年', value: 70, itemStyle: { color: '#F53F3F' } }
 | 
			
		||||
    ],
 | 
			
		||||
    behavior: [
 | 
			
		||||
      { name: '转发行为', value: 49.19, itemStyle: { color: '#722ED1' } },
 | 
			
		||||
      { name: '评论行为', value: 24.48, itemStyle: { color: '#EB0AA4' } },
 | 
			
		||||
      { name: '原发行为', value: 26.33, itemStyle: { color: '#FF7D00' } }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  '政府官号': {
 | 
			
		||||
    registration: [
 | 
			
		||||
      { name: '小于6个月', value: 0, itemStyle: { color: '#3398DB' } },
 | 
			
		||||
      { name: '6-12个月', value: 0, itemStyle: { color: '#13C2C2' } },
 | 
			
		||||
      { name: '大于1年', value: 0, itemStyle: { color: '#00B42A' } },
 | 
			
		||||
      { name: '大于三年', value: 100, itemStyle: { color: '#F53F3F' } }
 | 
			
		||||
    ],
 | 
			
		||||
    behavior: [
 | 
			
		||||
      { name: '转发行为', value: 0, itemStyle: { color: '#722ED1' } },
 | 
			
		||||
      { name: '评论行为', value: 15, itemStyle: { color: '#EB0AA4' } },
 | 
			
		||||
      { name: '原发行为', value: 85, itemStyle: { color: '#FF7D00' } }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  '新闻媒体': {
 | 
			
		||||
    registration: [
 | 
			
		||||
      { name: '小于6个月', value: 0, itemStyle: { color: '#3398DB' } },
 | 
			
		||||
      { name: '6-12个月', value: 50, itemStyle: { color: '#13C2C2' } },
 | 
			
		||||
      { name: '大于1年', value: 0, itemStyle: { color: '#00B42A' } },
 | 
			
		||||
      { name: '大于三年', value: 50, itemStyle: { color: '#F53F3F' } }
 | 
			
		||||
    ],
 | 
			
		||||
    behavior: [
 | 
			
		||||
      { name: '转发行为', value: 0, itemStyle: { color: '#722ED1' } },
 | 
			
		||||
      { name: '评论行为', value: 0, itemStyle: { color: '#EB0AA4' } },
 | 
			
		||||
      { name: '原发行为', value: 100, itemStyle: { color: '#FF7D00' } }
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 切换图表类型(注册时间/行为模式)
 | 
			
		||||
const switchChartType = (type) => {
 | 
			
		||||
  currentChartType.value = type;
 | 
			
		||||
  updateChart();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 更新图表数据
 | 
			
		||||
const updateChart = () => {
 | 
			
		||||
  if (!categoryChart) return;
 | 
			
		||||
  
 | 
			
		||||
  // 根据当前选中的分类和图表类型获取数据
 | 
			
		||||
  const category = currentCategory.value === '全部' ? '全部' : currentCategory.value;
 | 
			
		||||
  const data = chartData[category][currentChartType.value];
 | 
			
		||||
  
 | 
			
		||||
  // 设置图表数据
 | 
			
		||||
  categoryChart.setOption({
 | 
			
		||||
    tooltip: {
 | 
			
		||||
      trigger: 'item',
 | 
			
		||||
      formatter: '{a} <br/>{b}: {c}% ({d}%)'
 | 
			
		||||
    },
 | 
			
		||||
    legend: {
 | 
			
		||||
      orient: 'vertical', // 垂直排列
 | 
			
		||||
      top: 'center', // 垂直居中
 | 
			
		||||
      left: 'right', // 定位到左侧
 | 
			
		||||
      right: 100, // 向右移动留出详细信息空间
 | 
			
		||||
      itemGap: 20,
 | 
			
		||||
      textStyle: { color: '#fff', width: 120 }, // 固定文本宽度
 | 
			
		||||
      formatter: function(name) {
 | 
			
		||||
        // 查找当前项数据
 | 
			
		||||
        const item = data.find(item => item.name === name);
 | 
			
		||||
        if (!item) return name;
 | 
			
		||||
        // 计算百分比
 | 
			
		||||
        const total = data.reduce((sum, item) => sum + item.value, 0);
 | 
			
		||||
        const percentage = total > 0 ? ((item.value / total) * 100).toFixed(1) + '%' : '0%';
 | 
			
		||||
        // 使用富文本实现名称左对齐、百分比右对齐
 | 
			
		||||
        return `{name|${name}}{percent|${percentage}}`;
 | 
			
		||||
      },
 | 
			
		||||
      textStyle: {
 | 
			
		||||
        rich: {
 | 
			
		||||
          name: { width: 100, color: '#fff' },
 | 
			
		||||
          percent: { align: 'right', color: '#ffcc00', fontWeight: 'bold', }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    series: [
 | 
			
		||||
      {
 | 
			
		||||
        name: currentChartType.value === 'registration' ? '注册时间分布' : '行为模式分布',
 | 
			
		||||
        type: 'pie',
 | 
			
		||||
        radius: ['40%', '70%'],
 | 
			
		||||
        center: ['40%', '50%'],
 | 
			
		||||
        avoidLabelOverlap: false,
 | 
			
		||||
        itemStyle: {
 | 
			
		||||
          borderRadius: 10,
 | 
			
		||||
          borderColor: '#fff',
 | 
			
		||||
          borderWidth: 2
 | 
			
		||||
        },
 | 
			
		||||
        label: {
 | 
			
		||||
          show: false,
 | 
			
		||||
          position: 'outside'
 | 
			
		||||
        },
 | 
			
		||||
        emphasis: {
 | 
			
		||||
          label: {
 | 
			
		||||
            show: true,
 | 
			
		||||
            fontSize: 16,
 | 
			
		||||
            fontWeight: 'bold',
 | 
			
		||||
            color: '#fff'
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        labelLine: {
 | 
			
		||||
          show: false
 | 
			
		||||
        },
 | 
			
		||||
        data: data
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 初始化图表
 | 
			
		||||
const initChart = () => {
 | 
			
		||||
  // 确保DOM元素存在
 | 
			
		||||
  const chartDom = document.getElementById('categoryChart');
 | 
			
		||||
  if (!chartDom) return;
 | 
			
		||||
  
 | 
			
		||||
  // 初始化ECharts实例
 | 
			
		||||
  categoryChart = echarts.init(chartDom);
 | 
			
		||||
  
 | 
			
		||||
  // 设置初始图表选项
 | 
			
		||||
  const option = {
 | 
			
		||||
    backgroundColor: 'transparent',
 | 
			
		||||
    tooltip: {
 | 
			
		||||
      trigger: 'item'
 | 
			
		||||
    },
 | 
			
		||||
    series: [
 | 
			
		||||
      {
 | 
			
		||||
        type: 'pie',
 | 
			
		||||
        radius: ['40%', '70%'],
 | 
			
		||||
        data: []
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
  option && categoryChart.setOption(option);
 | 
			
		||||
  
 | 
			
		||||
  // 初始更新图表数据
 | 
			
		||||
  updateChart();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 监听分类变化,更新图表
 | 
			
		||||
watch(currentCategory, () => {
 | 
			
		||||
  updateChart();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  // ... 现有代码 ...
 | 
			
		||||
  // ... 现有代码 ...、
 | 
			
		||||
  initChart();
 | 
			
		||||
   // 窗口大小变化时重绘图表
 | 
			
		||||
   window.addEventListener('resize', () => {
 | 
			
		||||
    if (categoryChart) {
 | 
			
		||||
      categoryChart.resize();
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  startActiveWarningTimer();
 | 
			
		||||
  startHighRiskTimer();
 | 
			
		||||
  startDataSwitchTimer();
 | 
			
		||||
| 
						 | 
				
			
			@ -915,6 +1161,8 @@ onMounted(() => {
 | 
			
		|||
    myChart = echarts.init(chartDom);
 | 
			
		||||
    // Set option here
 | 
			
		||||
    const option = {
 | 
			
		||||
      animationDuration: 60000, // 动画持续时间,单位ms
 | 
			
		||||
      animationEasing: 'cubicInOut',
 | 
			
		||||
      title: {
 | 
			
		||||
      },
 | 
			
		||||
      tooltip: {
 | 
			
		||||
| 
						 | 
				
			
			@ -924,8 +1172,7 @@ onMounted(() => {
 | 
			
		|||
        data: ['活跃预警事件', '高风险事件']
 | 
			
		||||
      },
 | 
			
		||||
      grid: {
 | 
			
		||||
        left: '3%',
 | 
			
		||||
        right: '4%',
 | 
			
		||||
        left: '5%',
 | 
			
		||||
        containLabel: true
 | 
			
		||||
      },
 | 
			
		||||
      toolbox: {
 | 
			
		||||
| 
						 | 
				
			
			@ -938,7 +1185,6 @@ onMounted(() => {
 | 
			
		|||
        boundaryGap: true,//坐标轴两边留白
 | 
			
		||||
        data: ['6.29', '6.30', '7-1', '7-2', '7-3', '7-4', '7-5'],
 | 
			
		||||
        name: '日期',
 | 
			
		||||
        nameLocation: 'middle',
 | 
			
		||||
        nameGap: 20,
 | 
			
		||||
        nameTextStyle: {
 | 
			
		||||
          color: '#606266',
 | 
			
		||||
| 
						 | 
				
			
			@ -1077,10 +1323,6 @@ onMounted(() => {
 | 
			
		|||
    myChart.setOption(option);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// 定位事件(阻止冒泡)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
onUnmounted(() => {
 | 
			
		||||
  document.removeEventListener('click', handleClickOutside);
 | 
			
		||||
  // 统一清理所有定时器
 | 
			
		||||
| 
						 | 
				
			
			@ -1096,6 +1338,10 @@ onUnmounted(() => {
 | 
			
		|||
      myChart.dispose();
 | 
			
		||||
      myChart = null;
 | 
			
		||||
    }
 | 
			
		||||
    if (categoryChart) {
 | 
			
		||||
    categoryChart.dispose();
 | 
			
		||||
    categoryChart = null;
 | 
			
		||||
  }
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -1126,9 +1372,6 @@ onUnmounted(() => {
 | 
			
		|||
  position: relative;
 | 
			
		||||
  z-index: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.time span {
 | 
			
		||||
  font-family: LCD2;
 | 
			
		||||
  font-weight: 400;
 | 
			
		||||
| 
						 | 
				
			
			@ -1140,7 +1383,6 @@ onUnmounted(() => {
 | 
			
		|||
  margin-right: 80px;
 | 
			
		||||
  margin-top: -148px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.search {
 | 
			
		||||
  width: 530px;
 | 
			
		||||
  height: 48px;
 | 
			
		||||
| 
						 | 
				
			
			@ -1432,7 +1674,7 @@ onUnmounted(() => {
 | 
			
		|||
.suggestion-containner {
 | 
			
		||||
  margin-left: 10px;
 | 
			
		||||
  margin-top: 15px;
 | 
			
		||||
  width: 400px;
 | 
			
		||||
  width: 420px;
 | 
			
		||||
  height: 480px;
 | 
			
		||||
  max-height: 380px;
 | 
			
		||||
  /* 可根据需要调整最大高度 */
 | 
			
		||||
| 
						 | 
				
			
			@ -1471,6 +1713,7 @@ onUnmounted(() => {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
.span-3 {
 | 
			
		||||
  width: 200px;
 | 
			
		||||
  font-family: PingFang SC;
 | 
			
		||||
  font-weight: 200;
 | 
			
		||||
  font-size: 14px;
 | 
			
		||||
| 
						 | 
				
			
			@ -1526,7 +1769,7 @@ onUnmounted(() => {
 | 
			
		|||
 | 
			
		||||
.containner2-alldata {
 | 
			
		||||
  margin-left: 25px;
 | 
			
		||||
  width: 420px;
 | 
			
		||||
  width: 450px;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  flex-wrap: nowrap;
 | 
			
		||||
| 
						 | 
				
			
			@ -1551,7 +1794,7 @@ onUnmounted(() => {
 | 
			
		|||
  justify-content: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  color: #C6E3F5;
 | 
			
		||||
  width: 200px;
 | 
			
		||||
  width: 400px;
 | 
			
		||||
  list-style-type: none;
 | 
			
		||||
  flex: 1;
 | 
			
		||||
  min-width: 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1562,15 +1805,6 @@ onUnmounted(() => {
 | 
			
		|||
  width: 420px;
 | 
			
		||||
  height: 200px;
 | 
			
		||||
  max-height: 200px;
 | 
			
		||||
  /* 可根据需要调整最大高度 */
 | 
			
		||||
  overflow-y: auto;
 | 
			
		||||
  /* 当内容超出最大高度时显示垂直滚动条 */
 | 
			
		||||
  overflow-x: hidden;
 | 
			
		||||
  /* 隐藏水平滚动条 */
 | 
			
		||||
  scrollbar-width: none;
 | 
			
		||||
  /* Firefox */
 | 
			
		||||
  ;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.color-block1 {
 | 
			
		||||
| 
						 | 
				
			
			@ -2094,4 +2328,47 @@ onUnmounted(() => {
 | 
			
		|||
.back-home-btn:active {
 | 
			
		||||
  background-color: #0a1949;
 | 
			
		||||
}
 | 
			
		||||
.chart-tabs {
 | 
			
		||||
  margin-top: -80px;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
 | 
			
		||||
  gap: 0px;
 | 
			
		||||
  margin-left: 180px;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.chart-tabs button {
 | 
			
		||||
  width: 100px;
 | 
			
		||||
  height: 30px;
 | 
			
		||||
  margin-top: 60px;
 | 
			
		||||
  margin-left: 10px;
 | 
			
		||||
  border: none;
 | 
			
		||||
  border-radius: 15px;
 | 
			
		||||
  background-color: #333;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  transition: all 0.3s ease;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.chart-tabs button.active-tab {
 | 
			
		||||
  margin-top: 60px;
 | 
			
		||||
  background-color: #1890ff;
 | 
			
		||||
  box-shadow: 0 0 10px rgba(24, 144, 255, 0.5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 图表容器样式 */
 | 
			
		||||
#categoryChart {
 | 
			
		||||
  width: 80%;
 | 
			
		||||
  height: 400px;
 | 
			
		||||
margin-left: -40px;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 响应式调整 */
 | 
			
		||||
@media (max-width: 900px) {
 | 
			
		||||
  #categoryChart {
 | 
			
		||||
    height: 200px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,13 @@
 | 
			
		|||
            style=" width: 180px;margin-top: 30px;margin-right: 50px;float: right;">
 | 
			
		||||
          <img src="../assets/images/percent/1-2.png" alt=""
 | 
			
		||||
            style=" width: 180px;margin-top: -70px;margin-right: 50px;float: right;">
 | 
			
		||||
          <img src="../assets/images/percent/1-1-1.png" alt="" style="margin-left: 45px;">
 | 
			
		||||
          <!-- 【修改点】点击时调用不带参数的 openModal -->
 | 
			
		||||
          <img 
 | 
			
		||||
            :src="image111" 
 | 
			
		||||
            alt="可点击图片" 
 | 
			
		||||
            style="margin-left: 45px; cursor: pointer;"
 | 
			
		||||
            @click="openModal()"
 | 
			
		||||
          >
 | 
			
		||||
          <button 
 | 
			
		||||
            class="mao-button"
 | 
			
		||||
            :class="{ active: route.path === '/Main' }"
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +84,13 @@
 | 
			
		|||
            style=" width: 180px;margin-top: 30px;margin-right: 50px;float: right;">
 | 
			
		||||
          <img src="../assets/images/percent/2-2.png" alt=""
 | 
			
		||||
            style=" width: 180px;margin-top: -70px;margin-right: 50px;float: right;">
 | 
			
		||||
            <img src="../assets/images/percent/2-1-1.png" alt="" style="margin-left: 45px;">
 | 
			
		||||
            <!-- 【修改点】点击时调用不带参数的 openModal -->
 | 
			
		||||
            <img 
 | 
			
		||||
              :src="image211" 
 | 
			
		||||
              alt="可点击图片" 
 | 
			
		||||
              style="margin-left: 45px; cursor: pointer;"
 | 
			
		||||
              @click="openModal()"
 | 
			
		||||
            >
 | 
			
		||||
            <img src="../assets/images/percent/2-1-2.png" alt="" style="margin-top: 25px;margin-left: 45px;">
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="main3">
 | 
			
		||||
| 
						 | 
				
			
			@ -88,13 +100,24 @@
 | 
			
		|||
            style=" width: 180px;margin-top: 30px;margin-right: 50px;float: right;">
 | 
			
		||||
          <img src="../assets/images/percent/3-2.png" alt=""
 | 
			
		||||
            style=" width: 180px;margin-top: -70px;margin-right: 50px;float: right;">
 | 
			
		||||
            <img src="../assets/images/percent/3-1-1.png" alt="" style="margin-left: 45px;">
 | 
			
		||||
            <!-- 【修改点】点击时调用不带参数的 openModal -->
 | 
			
		||||
            <img 
 | 
			
		||||
              :src="image311" 
 | 
			
		||||
              alt="可点击图片" 
 | 
			
		||||
              style="margin-left: 45px; cursor: pointer;"
 | 
			
		||||
              @click="openModal()"
 | 
			
		||||
            >
 | 
			
		||||
            <img src="../assets/images/percent/3-1-2.png" alt="" style="margin-top: 25px;margin-left: 45px;">
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </body>
 | 
			
		||||
    <div>
 | 
			
		||||
 | 
			
		||||
    <!-- 图片弹窗/模态框 -->
 | 
			
		||||
    <div v-if="isModalVisible" class="modal-overlay" @click="closeModal">
 | 
			
		||||
      <div class="modal-content" @click.stop>
 | 
			
		||||
        <span class="modal-close-button" @click="closeModal">×</span>
 | 
			
		||||
        <img :src="modalImageSrc" alt="Modal Image" class="modal-image">
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -104,8 +127,34 @@
 | 
			
		|||
import { useRouter } from 'vue-router';
 | 
			
		||||
import { ref, onMounted,onUnmounted } from 'vue';
 | 
			
		||||
import { useRoute } from 'vue-router';
 | 
			
		||||
const route = useRoute();
 | 
			
		||||
import { ElLoading } from 'element-plus';
 | 
			
		||||
 | 
			
		||||
// 【新增点】导入统一的弹窗图片
 | 
			
		||||
import tanchuangImage from '../assets/images/tanchuang.png'; 
 | 
			
		||||
 | 
			
		||||
// 导入页面上显示的图片
 | 
			
		||||
import image111 from '../assets/images/percent/1-1-1.png';
 | 
			
		||||
import image211 from '../assets/images/percent/2-1-1.png';
 | 
			
		||||
import image311 from '../assets/images/percent/3-1-1.png';
 | 
			
		||||
 | 
			
		||||
const route = useRoute();
 | 
			
		||||
 | 
			
		||||
// 弹窗相关状态
 | 
			
		||||
const isModalVisible = ref(false);
 | 
			
		||||
const modalImageSrc = ref('');
 | 
			
		||||
 | 
			
		||||
// 【修改点】打开弹窗的函数,固定显示 tanchuang.png
 | 
			
		||||
const openModal = () => {
 | 
			
		||||
  modalImageSrc.value = tanchuangImage; // 总是使用 tanchuang.png
 | 
			
		||||
  isModalVisible.value = true;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 关闭弹窗的函数
 | 
			
		||||
const closeModal = () => {
 | 
			
		||||
  isModalVisible.value = false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// 实时时钟实现
 | 
			
		||||
const currentTime = ref('');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -224,6 +273,55 @@ onUnmounted(() => {
 | 
			
		|||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
/* 弹窗样式 */
 | 
			
		||||
.modal-overlay {
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  width: 100vw;
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  background-color: rgba(0, 0, 0, 0.8);
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  z-index: 9999;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.modal-content {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  /* 【修改点】移除了白色背景和内边距,让弹窗图片本身作为背景 */
 | 
			
		||||
  background-color: transparent; 
 | 
			
		||||
  border-radius: 5px;
 | 
			
		||||
  cursor: default;
 | 
			
		||||
  box-shadow: 0 4px 15px rgba(0,0,0,0.2);
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
.modal-image {
 | 
			
		||||
  max-width: 80vw;
 | 
			
		||||
  max-height: 80vh;
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 关闭按钮样式 */
 | 
			
		||||
.modal-close-button {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 10px; /* 根据tanchuang.png的设计调整位置 */
 | 
			
		||||
  right: 15px; /* 根据tanchuang.png的设计调整位置 */
 | 
			
		||||
  font-size: 2.5rem;
 | 
			
		||||
  color: #ccc; /* 调整颜色使其在弹窗图片上更清晰 */
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  line-height: 1;
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
  transition: color 0.2s;
 | 
			
		||||
  text-shadow: 0 0 5px black; /* 添加文字阴影使其更突出 */
 | 
			
		||||
}
 | 
			
		||||
.modal-close-button:hover {
 | 
			
		||||
  color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 原有样式 */
 | 
			
		||||
.mao-button {
 | 
			
		||||
  /* 保留原有样式 */
 | 
			
		||||
  transition: all 0.3s ease;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user