重构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:
parent
05fc7809d2
commit
3c23a084a3
BIN
src/assets/images/chuanbofenxititle.png
Normal file
BIN
src/assets/images/chuanbofenxititle.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
File diff suppressed because it is too large
Load Diff
20
src/views/KeyNodeRecognition1/EventHeatmap.vue
Normal file
20
src/views/KeyNodeRecognition1/EventHeatmap.vue
Normal 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>
|
||||||
21
src/views/KeyNodeRecognition1/LeaderAnalysis.vue
Normal file
21
src/views/KeyNodeRecognition1/LeaderAnalysis.vue
Normal 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>
|
||||||
80
src/views/KeyNodeRecognition1/OpinionLeaders.vue
Normal file
80
src/views/KeyNodeRecognition1/OpinionLeaders.vue
Normal 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>
|
||||||
88
src/views/KeyNodeRecognition1/PelosiGraph.vue
Normal file
88
src/views/KeyNodeRecognition1/PelosiGraph.vue
Normal 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>
|
||||||
51
src/views/KeyNodeRecognition1/PostDynamics.vue
Normal file
51
src/views/KeyNodeRecognition1/PostDynamics.vue
Normal 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>
|
||||||
1463
src/views/KeyNodeRecognition1/Untitled-1.md
Normal file
1463
src/views/KeyNodeRecognition1/Untitled-1.md
Normal file
File diff suppressed because it is too large
Load Diff
21
src/views/KeyNodeRecognition1/WordCloud.vue
Normal file
21
src/views/KeyNodeRecognition1/WordCloud.vue
Normal 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>
|
||||||
Loading…
Reference in New Issue
Block a user