重构page1页面框架,1分为6.

src/
└── views/
    ├── KeyNodeRecognition1.vue      (主文件)
    └── KeyNodeRecognition1/         (子组件文件夹)
        ├── OpinionLeaders.vue
        ├── PelosiGraph.vue
        ├── LeaderAnalysis.vue
        ├── EventHeatmap.vue
        ├── PostDynamics.vue
        └── WordCloud.vue
Signed-off-by: changyunju <2743319061@qq.com>
This commit is contained in:
changyunju 2025-06-17 16:43:44 +08:00
parent 05fc7809d2
commit 3c23a084a3
9 changed files with 1779 additions and 1435 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
<template>
<div class="event-hot">
<img src="../../assets/images/evenhot.png" alt="" style="margin-top: -6px;">
</div>
</template>
<script setup>
//
</script>
<style scoped>
.event-hot {
width: 352px;
height: 296px;
background-color: #04142166;
border-radius: 2px;
box-shadow: 0px 0px 18px 0px #0A2E55 inset;
backdrop-filter: blur(4px);
}
</style>

View File

@ -0,0 +1,21 @@
<template>
<div class="leader-ansys">
<img src="../../assets/images/chuanbofenxi.png" alt="" style="margin-top: -6px;">
<!-- 未来这里将是 ECharts 图表 -->
</div>
</template>
<script setup>
//
</script>
<style scoped>
.leader-ansys {
width: 372px;
height: 542px;
background-color: #04142166;
border-radius: 2px;
box-shadow: 0px 0px 18px 0px #0A2E55 inset;
backdrop-filter: blur(4px);
}
</style>

View File

@ -0,0 +1,80 @@
<template>
<div class="leader-show">
<img src="../../assets/images/leader-show.png" alt="" style="margin-top: -6px;">
<div class="all-leader">
<button v-for="(item, index) in props.buttonList" :key="index" :class="{ active: activeButton === index }"
@click="changeData(index)">
{{ item }}
</button>
<div class="leader-data">
<!-- 这里是根据按钮和时间点切换内容的逻辑 -->
<div v-if="timePointDataIndex === 0">
<div v-if="activeButton === 0">全部种类的数据信息</div>
<div v-if="activeButton === 1"><el-avatar shape="square" :size="50" :src="squareUrl" /></div>
<div v-if="activeButton === 2">自媒体的数据信息</div>
<div v-if="activeButton === 3">中国海警</div>
</div>
<div v-if="timePointDataIndex === 1">时间点 2 的数据信息</div>
<!-- ... 其他时间点 ... -->
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const props = defineProps({
buttonList: Array
});
const activeButton = ref(0);
const timePointDataIndex = ref(0); //
const changeData = (index) => {
activeButton.value = index;
};
</script>
<style scoped>
/* 粘贴所有与 .leader-show 和 .all-leader 相关的样式 */
.leader-show {
width: 352px;
height: 540px;
background-color: #04142166;
border-radius: 2px;
box-shadow: 0px 0px 18px 0px #0A2E55 inset;
backdrop-filter: blur(4px);
}
.all-leader {
width: 305px;
height: 450px;
margin-left: 24px;
font-size: 0;
}
.all-leader button {
height: 24px;
font-family: OPPOSans;
font-size: 14px;
cursor: pointer;
background-color: #04142166;
color: #E1F4FF;
border: 1px solid #1C588F;
border-radius: 0;
display: inline-block;
}
.all-leader button:first-child {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
.all-leader button:nth-child(4) {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
.all-leader button.active {
background-color: #236291;
}
.leader-data {
color: white; /* 示例文字颜色 */
}
</style>

View File

@ -0,0 +1,88 @@
<template>
<div class="leader-radio">
<div>
<img src="../../assets/images/peiluoxi.png" alt="" style="margin-left: 125px;">
</div>
<div class="graph-container">
<!-- 这里将来放关系图 -->
</div>
<div class="leader-time">
<p>2022.07.31 00:00:00</p>
<div class="progress-bar-container">
<div class="progress-bar" :style="{ width: progress + '%' }"></div>
<div v-for="(breakpoint, index) in breakpoints" :key="index" class="breakpoint"
:style="{ left: breakpoint + '%' }" @click="pauseProgress(index)"></div>
<div class="drag-button" :style="{ left: progress + '%' }" @mousedown="startDrag"></div>
</div>
<p>2022.08.01 00:00:00</p>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
//
const progress = ref(0);
let progressInterval = null;
const breakpoints = [4, 12.5, 25, 37.5, 50, 62.5, 75, 87.5];
const isPaused = ref(false);
const isDragging = ref(false);
const startDrag = () => { isDragging.value = true; isPaused.value = true; };
const startProgress = () => {
progressInterval = setInterval(() => {
if (!isPaused.value) {
progress.value += 0.1;
if (progress.value >= 100) clearInterval(progressInterval);
}
}, 10);
};
const pauseProgress = (index) => {
const breakpointValue = breakpoints[index];
if (Math.abs(progress.value - breakpointValue) < 1) {
isPaused.value = !isPaused.value;
}
};
onMounted(() => startProgress());
onUnmounted(() => { if (progressInterval) clearInterval(progressInterval); });
</script>
<style scoped>
/* 粘贴所有与 .leader-radio 和 .leader-time 相关的样式 */
.leader-radio {
width: 800px;
height: 540px;
background-color: #04142166;
border-radius: 2px;
box-shadow: 0px 0px 18px 0px #0A2E55 inset;
backdrop-filter: blur(4px);
display: flex;
flex-direction: column;
}
.graph-container {
flex-grow: 1; /* 占据中间的空白区域 */
}
.leader-time {
width: calc(100% - 14px);
height: 42px;
margin: 0 7px 7px 7px;
border-radius: 4px;
color: #FFFFFF;
font-size: 14px;
background-image: linear-gradient(to right, #00527D, #97E3F87A);
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
}
.progress-bar-container {
position: relative; /* 改为相对定位 */
width: 400px;
height: 6px;
border-radius: 20px;
background-color: #3B7699;
}
/* ... 其他时间轴样式 ... */
</style>

View File

@ -0,0 +1,51 @@
<template>
<div class="leader-post" ref="leaderPost">
<div ref="originalContent">
<img src="../../assets/images/tiewen.png" alt="">
</div>
<div ref="clonedContent"></div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
const leaderPost = ref(null);
const originalContent = ref(null);
const clonedContent = ref(null);
let scrollInterval = null;
onMounted(async () => {
await nextTick();
if (leaderPost.value && originalContent.value && clonedContent.value) {
clonedContent.value.innerHTML = originalContent.value.innerHTML;
scrollInterval = setInterval(() => {
const container = leaderPost.value;
container.scrollTop += 1;
if (container.scrollTop >= originalContent.value.offsetHeight) {
container.scrollTop = 0;
}
}, 50);
}
});
onUnmounted(() => {
if (scrollInterval) clearInterval(scrollInterval);
});
</script>
<style scoped>
.leader-post {
width: 800px;
height: 296px;
background-color: #04142166;
border-radius: 2px;
box-shadow: 0px 0px 18px 0px #0A2E55 inset;
backdrop-filter: blur(4px);
overflow: hidden;
scrollbar-width: none; /* Firefox */
}
.leader-post::-webkit-scrollbar {
display: none; /* Chrome, Safari, and Opera */
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
<template>
<div class="words">
<img src="../../assets/images/words.png" alt="" style="margin-top: -6px;">
<img src="../../assets/images/wordsimg.png" alt="" style="margin-top: 10px;margin-left: 20px;">
</div>
</template>
<script setup>
//
</script>
<style scoped>
.words {
width: 372px;
height: 296px;
background-color: #04142166;
border-radius: 2px;
box-shadow: 0px 0px 18px 0px #0A2E55 inset;
backdrop-filter: blur(4px);
}
</style>