最后修改

This commit is contained in:
qumeng039@126.com 2025-08-29 14:11:56 +08:00
parent 422e2878cc
commit 7b3d1b56e2
12 changed files with 151 additions and 102 deletions

BIN
dist.zip

Binary file not shown.

View File

@ -10,7 +10,7 @@
</template>
<script setup>
import { ref, watch, onUnmounted, nextTick, defineProps } from "vue"
import { ref, watch, onUnmounted, nextTick } from "vue"
import { useKeyNodeStore2 } from "@/store/keyNodeStore2"
import * as echarts from "echarts/core"
import { SVGRenderer } from "echarts/renderers"

View File

@ -52,7 +52,7 @@
</template>
<script setup>
import { ref, defineExpose, watch, computed, defineProps } from "vue"
import { ref, watch, computed } from "vue"
import { useKeyNodeStore2 } from "@/store/keyNodeStore2"
// stopAutomaticPlay
@ -127,7 +127,7 @@ const startAutomaticPlay = () => {
// activeTimePoint
updateActiveTimePointByPosition(newPosition)
}, 300)
}, 1000)
}
// activeTimePoint

View File

@ -50,7 +50,7 @@
</template>
<script setup>
import { ref, computed, watch, nextTick, defineEmits } from "vue"
import { ref, computed, watch, nextTick } from "vue"
import { useKeyNodeStore2 } from "@/store/keyNodeStore2"
const emit = defineEmits(["selectLeader"])

View File

@ -3,7 +3,7 @@
</template>
<script setup>
import { onMounted, onUnmounted, defineProps, watch, ref, defineEmits } from "vue"
import { onMounted, onUnmounted, watch, ref } from "vue"
import * as echarts from "echarts"
import bridgeData from "@/assets/json/bridge_neighbors_communities.json"
import bridgeNodeHoverBgImg from "@/assets/images/bridge_node_hoverbgimg.png"

View File

@ -118,7 +118,7 @@ const startAutomaticPlay = () => {
// activeTimePoint
updateActiveTimePointByPosition(newPosition)
}, 300)
}, 1000)
}
// activeTimePoint

View File

@ -8,8 +8,6 @@ import * as echarts from "echarts"
import { nextTick, onMounted, ref, onUnmounted, watch } from "vue"
import { cropToCircleAsync } from "@/utils/transform"
import normalNodeIcon from "@/assets/images/icon/opinion-leader-normal-node.png"
import leaderNodeIcon from "@/assets/images/icon/bridge_node_legend.png"
import bridgeNodeHoverBgImg from "@/assets/images/bridge_node_hoverbgimg.png"
const emit = defineEmits(["handle:openDialog"])
@ -26,16 +24,6 @@ const props = defineProps({
// node1Hu Xijin
const node1Followers = [
// { name: "Laura Loomer", avatar: node1_1 },
// { name: "🇺🇸 Mike Davis 🇺🇸", avatar: node1_2 },
// { name: "Rep. Carlos A. Gimenez", avatar: node1_3 },
// { name: "Israel War Room", avatar: node1_4 },
// { name: "Meme Knight 🇺🇸", avatar: node1_5 },
// { name: "AIPAC 🇺🇸🇮🇱🎗", avatar: node1_6 },
// { name: "Sarah Larchmont", avatar: node1_7 },
// { name: "Faraz Pervaiz", avatar: node1_8 },
// { name: "Jamie Bryson", avatar: node1_9 },
// { name: "_daqiao", avatar: node1_10 }
{ name: "Mohamed Rashid Osman", avatar: normalNodeIcon },
{ name: "🎗🇯🇵🇺🇸🇹🇼🇺🇦", avatar: normalNodeIcon },
{ name: "Alex kennedy", avatar: normalNodeIcon },
@ -60,16 +48,6 @@ const node1Followers = [
// node2: Levi Godman
const node2Followers = [
// { name: "Andy Ngo", avatar: node2_1 },
// { name: "Andy Ngo", avatar: node2_2 }, // -> Andy Ngo ()
// { name: "Ian Miles Cheong", avatar: node2_3 },
// { name: "_jianai", avatar: node2_4 },
// { name: "_weiyoujiduzhengjiu", avatar: node2_5 },
// { name: "wethenorth - 1984", avatar: node2_6 },
// { name: "Lomt Lea🅰", avatar: node2_7 },
// { name: "Chad Felix Greene 🇮🇱", avatar: node2_8 },
// { name: "AlinaSalazarGongora", avatar: node2_9 },
// { name: "Gary Du", avatar: node2_10 }
{ name: "Iván J RS ⚜️", avatar: normalNodeIcon },
{ name: "Анка-пулемётчица", avatar: normalNodeIcon },
{ name: "Patrick Maina45", avatar: normalNodeIcon },
@ -97,15 +75,6 @@ const node2Followers = [
// node3:bidishalolo
const node3Followers = [
// { name: "OSINTdefender", avatar: node3_1 },
// { name: "Eylon Levy", avatar: node3_2 },
// { name: "Israel War Room", avatar: node3_3 },
// { name: "Adam Kinzinger (Slava Ukraini) 🇺🇸🇺🇦", avatar: node3_4 },
// { name: "AIPAC 🇺🇸🇮🇱🎗", avatar: node3_5 },
// { name: "Sarah Larchmont", avatar: node3_6 },
// { name: "Israel Nitzan🇮🇱🎗", avatar: node3_7 },
// { name: "Jamie Bryson", avatar: node3_8 },
// { name: "xiaohuaSong", avatar: node3_9 }
{ name: "Ron Gilbert", avatar: normalNodeIcon },
{ name: "Lord Jesus Christ/ Prophet / Michael David Boyles", avatar: normalNodeIcon },
{ name: "Giovana Du 🇵🇪🇨🇭❤️", avatar: normalNodeIcon },
@ -130,16 +99,6 @@ const node3Followers = [
// node4:Indo-Pacific News
const node4Followers = [
// { name: "President Biden Archived", avatar: node4_1 },
// { name: "Department of State", avatar: node4_2 },
// { name: "👨🍳_pingfandechuzi👨🍳", avatar: node4_3 },
// { name: "Jared Moskowitz", avatar: node4_4 },
// { name: "Fred Guttenberg", avatar: node4_5 },
// { name: "S.E. Cupp", avatar: node4_6 },
// { name: "Ford News", avatar: node4_7 },
// { name: "J Street", avatar: node4_8 },
// { name: "Faraz Pervaiz", avatar: node4_9 },
// { name: "💙💛_liusichang💙💛", avatar: node4_10 }
{ name: "KoiN", avatar: normalNodeIcon },
{ name: "Vinod Kumar", avatar: normalNodeIcon },
{ name: "SKELETON", avatar: normalNodeIcon },
@ -164,16 +123,6 @@ const node4Followers = [
// node5: The Spectator Index
const node5Followers = [
// { name: "Secretary Antony Blinken", avatar: node5_1 },
// { name: "AIPAC 🇺🇸🇮🇱🎗", avatar: node5_2 },
// { name: "使 U.S. Mission to China", avatar: node5_3 },
// { name: "FJ", avatar: node5_4 },
// { name: "Tammy Bruce", avatar: node5_5 },
// { name: "Israel Nitzan🇮🇱🎗", avatar: node5_6 },
// { name: "ChrisT", avatar: node5_7 },
// { name: "THEE((L'EtatC'estMoi))🎗", avatar: node5_8 },
// { name: "kum ", avatar: node5_9 },
// { name: "Laura Rozen", avatar: node5_10 }
{ name: "Un Corsaithe Jèrriais 🌸🇯🇪", avatar: normalNodeIcon },
{ name: "KokoCat", avatar: normalNodeIcon },
{ name: "penny collenette", avatar: normalNodeIcon },
@ -198,16 +147,6 @@ const node5Followers = [
// node6: Reuters
const node6Followers = [
// { name: "Secretary Antony Blinken", avatar: node6_1 },
// { name: "AIPAC 🇺🇸🇮🇱🎗", avatar: node6_2 },
// { name: "使 U.S. Mission to China", avatar: node6_3 },
// { name: "FJ", avatar: node6_4 },
// { name: "Tammy Bruce", avatar: node6_5 },
// { name: "Israel Nitzan🇮🇱🎗", avatar: node6_6 },
// { name: "ChrisT", avatar: node6_7 },
// { name: "THEE((L'EtatC'estMoi))🎗", avatar: node6_8 },
// { name: "kum ", avatar: node6_9 },
// { name: "Laura Rozen", avatar: node6_10 }
{ name: "Bartlomiej Baudler", avatar: normalNodeIcon },
{ name: "ぼくはこへいた", avatar: normalNodeIcon },
{ name: "hyphee3030", avatar: normalNodeIcon },
@ -232,11 +171,6 @@ const node6Followers = [
// node7: Mick Wallace
const node7Followers = [
// { name: "Jackson Hinkle 🇺🇸", avatar: node7_1 },
// { name: "nk", avatar: node7_2 },
// { name: "Jenni", avatar: node7_3 },
// { name: "Phoenix", avatar: node7_4 },
// { name: "Moiz bhutt", avatar: node7_5 }
{ name: "季艾欧", avatar: normalNodeIcon },
{ name: "宁爸", avatar: normalNodeIcon },
{ name: "Khizar Riaz Tanoli", avatar: normalNodeIcon },
@ -261,15 +195,6 @@ const node7Followers = [
// node8:Jiushiniya
const node8Followers = [
// { name: "Rep. Matt Gaetz", avatar: node8_1 },
// { name: "sevennine_Bella789", avatar: node8_2 },
// { name: "btsjs", avatar: node8_3 },
// { name: "_xingzhe", avatar: node8_4 },
// { name: "annie", avatar: node8_5 },
// { name: "_zhinadana", avatar: node8_6 },
// { name: "_aiziyou(hongye)", avatar: node8_7 },
// { name: "loresang1996", avatar: node8_8 },
// { name: "Silbernagel Simos", avatar: node8_9 }
{ name: "Hello", avatar: normalNodeIcon },
{ name: "水明🇺🇸", avatar: normalNodeIcon },
{ name: "雪线飞音符", avatar: normalNodeIcon },
@ -294,15 +219,6 @@ const node8Followers = [
// node9:
const node9Followers = [
// { name: "OSINTdefender", avatar: node9_1 },
// { name: "Emmanuel Macron", avatar: node9_2 },
// { name: "RoINTEL", avatar: node9_3 },
// { name: "U.S. Central Command", avatar: node9_4 },
// { name: "Eylon Levy", avatar: node9_5 },
// { name: "david", avatar: node9_6 },
// { name: "Change Zhang🇨🇦", avatar: node9_7 },
// { name: "Andy C", avatar: node9_8 },
// { name: "_congtouzailai", avatar: node9_9 }
{ name: "Emmy🌸互fo🌸", avatar: normalNodeIcon },
{ name: "深红爱国同盟🇨🇳", avatar: normalNodeIcon },
{ name: "Putin Huylo 🇺🇸🇺🇦", avatar: normalNodeIcon },
@ -449,7 +365,6 @@ const initAllGraphData = async () => {
target: userId
})
} catch (error) {
console.error(`Failed to process follower avatar for ${followerName}:`, error)
// 使使
const followerNode = {
id: userId,
@ -483,6 +398,79 @@ const initAllGraphData = async () => {
}
}
//
// 1.
const leaderNodes = nodes.filter(node => node.category === 0);
const totalLeaders = leaderNodes.length;
const leaderEdgesToAdd = Math.max(10, Math.floor(totalLeaders * 0.2 * totalLeaders));
//
const existingEdgeMap = new Set();
edges.forEach(edge => {
existingEdgeMap.add(`${edge.source}_${edge.target}`);
existingEdgeMap.add(`${edge.target}_${edge.source}`);
});
//
for (let i = 0; i < leaderEdgesToAdd; i++) {
const randomLeader1 = leaderNodes[Math.floor(Math.random() * totalLeaders)];
let randomLeader2 = leaderNodes[Math.floor(Math.random() * totalLeaders)];
//
while (randomLeader1.id === randomLeader2.id || existingEdgeMap.has(`${randomLeader1.id}_${randomLeader2.id}`)) {
randomLeader2 = leaderNodes[Math.floor(Math.random() * totalLeaders)];
}
edges.push({
source: randomLeader1.id,
target: randomLeader2.id
});
existingEdgeMap.add(`${randomLeader1.id}_${randomLeader2.id}`);
existingEdgeMap.add(`${randomLeader2.id}_${randomLeader1.id}`);
}
// 2.
const allUsers = nodes.filter(node => node.category === 1);
const totalUsers = allUsers.length;
const userLeaderEdgesToAdd = Math.max(50, Math.floor(totalUsers * 0.15));
for (let i = 0; i < userLeaderEdgesToAdd; i++) {
const randomUser = allUsers[Math.floor(Math.random() * totalUsers)];
const randomLeader = leaderNodes[Math.floor(Math.random() * totalLeaders)];
//
if (!randomUser.id.includes(randomLeader.id) && !existingEdgeMap.has(`${randomUser.id}_${randomLeader.id}`)) {
edges.push({
source: randomLeader.id,
target: randomUser.id
});
existingEdgeMap.add(`${randomUser.id}_${randomLeader.id}`);
existingEdgeMap.add(`${randomLeader.id}_${randomUser.id}`);
}
}
// 3.
const userUserEdgesToAdd = Math.max(100, Math.floor(totalUsers * 0.2));
for (let i = 0; i < userUserEdgesToAdd; i++) {
const randomUser1 = allUsers[Math.floor(Math.random() * totalUsers)];
let randomUser2 = allUsers[Math.floor(Math.random() * totalUsers)];
//
while (randomUser1.id === randomUser2.id ||
randomUser1.id.split('_')[1] === randomUser2.id.split('_')[1] ||
existingEdgeMap.has(`${randomUser1.id}_${randomUser2.id}`)) {
randomUser2 = allUsers[Math.floor(Math.random() * totalUsers)];
}
edges.push({
source: randomUser1.id,
target: randomUser2.id
});
existingEdgeMap.add(`${randomUser1.id}_${randomUser2.id}`);
existingEdgeMap.add(`${randomUser2.id}_${randomUser1.id}`);
}
allGraphData.value = { nodes, edges }
}
@ -723,8 +711,16 @@ const renderChart = () => {
links: edges,
categories: [{ name: "意见领袖" }, { name: "普通用户" }],
force: {
repulsion: 100,
edgeLength: 80
// 使
repulsion: 300,
// 使
edgeLength: 120,
// 使
gravity: 0.1,
// 使
layoutAnimation: true,
//
friction: 0.6
},
label: {
position: "center"

View File

@ -109,7 +109,7 @@
<el-dialog v-model="postDialog" :width="640" align-center class="custom-dialog">
<img src="@/assets/images/head/post-dialog-title.png" alt="" class="postTitleImage" />
<div class="dialog-content">
<div class="post-content">{{ currentPostContent }}</div>
<div class="post-content" v-text="currentPostContent"></div>
</div>
</el-dialog>
</div>
@ -181,7 +181,7 @@ provide("statisticsList", interactionStore.statisticsList)
<style scoped lang="scss">
:deep(.custom-dialog) {
width: vw(640);
width: vw(740);
border-width: 0, 0, 0, 0;
border-style: solid;
border-image-source: linear-gradient(180deg, #3aa1f8 0%, rgba(58, 161, 248, 0.2) 100%);
@ -270,9 +270,28 @@ provide("statisticsList", interactionStore.statisticsList)
}
}
.post-content {
max-height: vh(200);
color: #fff;
font-size: vw(16);
opacity: 0.7;
overflow-y: auto;
white-space: pre-wrap;
/* 滚动条整体样式 - WebKit浏览器 */
&::-webkit-scrollbar {
width: 3px; /* 垂直滚动条宽度 - 保持px单位 */
height: 5px; /* 水平滚动条高度 - 保持px单位 */
}
/* 滚动条滑块 */
&::-webkit-scrollbar-thumb {
background: rgba(147, 210, 255, 0.3); /* 蓝色半透明滑块 */
border-radius: vw(4);
}
/* 鼠标悬停在滑块上的效果 */
&::-webkit-scrollbar-thumb:hover {
background: rgba(147, 210, 255, 0.5); /* 更明显的蓝色 */
}
}
.heat {
display: flex;

View File

@ -184,7 +184,7 @@ provide("statisticsList", characterHiddenStore.statisticsList)
<style scoped lang="scss">
:deep(.custom-dialog) {
width: vw(640);
width: vw(740);
border-width: 0, 0, 0, 0;
border-style: solid;
border-image-source: linear-gradient(180deg, #3aa1f8 0%, rgba(58, 161, 248, 0.2) 100%);
@ -274,9 +274,28 @@ provide("statisticsList", characterHiddenStore.statisticsList)
opacity: 0.7;
}
.post-content {
max-height: vh(200);
color: #fff;
font-size: vw(16);
opacity: 0.7;
overflow-y: auto;
white-space: pre-wrap;
/* 滚动条整体样式 - WebKit浏览器 */
&::-webkit-scrollbar {
width: 3px; /* 垂直滚动条宽度 - 保持px单位 */
height: 5px; /* 水平滚动条高度 - 保持px单位 */
}
/* 滚动条滑块 */
&::-webkit-scrollbar-thumb {
background: rgba(147, 210, 255, 0.3); /* 蓝色半透明滑块 */
border-radius: vw(4);
}
/* 鼠标悬停在滑块上的效果 */
&::-webkit-scrollbar-thumb:hover {
background: rgba(147, 210, 255, 0.5); /* 更明显的蓝色 */
}
}
.heat {
display: flex;

View File

@ -197,10 +197,6 @@ const timePointsWithPositions = computed(() => {
})
})
watch(timeList, (newList) => {
console.log("🔥 timeList 被更新了:", newList)
})
// watchtimeList
watch(
timePointsWithPositions,

View File

@ -212,7 +212,7 @@ provide("statisticsList", socialGroupsStore.statisticsList)
<style scoped lang="scss">
:deep(.custom-dialog) {
width: vw(640);
width: vw(740);
border-width: 0, 0, 0, 0;
border-style: solid;
border-image-source: linear-gradient(180deg, #3aa1f8 0%, rgba(58, 161, 248, 0.2) 100%);
@ -302,9 +302,28 @@ provide("statisticsList", socialGroupsStore.statisticsList)
opacity: 0.7;
}
.post-content {
max-height: vh(200);
color: #fff;
font-size: vw(16);
opacity: 0.7;
overflow-y: auto;
white-space: pre-wrap;
/* 滚动条整体样式 - WebKit浏览器 */
&::-webkit-scrollbar {
width: 3px; /* 垂直滚动条宽度 - 保持px单位 */
height: 5px; /* 水平滚动条高度 - 保持px单位 */
}
/* 滚动条滑块 */
&::-webkit-scrollbar-thumb {
background: rgba(147, 210, 255, 0.3); /* 蓝色半透明滑块 */
border-radius: vw(4);
}
/* 鼠标悬停在滑块上的效果 */
&::-webkit-scrollbar-thumb:hover {
background: rgba(147, 210, 255, 0.5); /* 更明显的蓝色 */
}
}
.heat {
display: flex;

View File

@ -123,7 +123,7 @@ const submitForm = (formEl) => {
/* 修改 el-input 样式 */
:deep(.el-input__wrapper) {
background: rgba(0, 166, 255, 0.1) !important; /* 背景颜色 */
border: 1px solid rgba(0, 166, 255, 0.1); /* 必须要有边框,否则看不到渐变 */
border: vw(1) solid rgba(0, 166, 255, 0.1); /* 必须要有边框,否则看不到渐变 */
background-clip: padding-box, border-box;
background-origin: border-box;
box-shadow: inset 0 0 0 vw(1) #1a9adb;