2025-07-18 10:46:45 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="layout-container">
|
|
|
|
|
|
<div class="top-container"></div>
|
|
|
|
|
|
<div class="content">
|
|
|
|
|
|
<div class="left-container">
|
|
|
|
|
|
<div class="userPanel">
|
|
|
|
|
|
<UserPanel
|
|
|
|
|
|
:title="userPanelTitleImg"
|
2025-07-25 15:07:08 +08:00
|
|
|
|
:panelHeight="760"
|
2025-07-18 10:46:45 +08:00
|
|
|
|
:userList="socialGroupsStore.userList"
|
|
|
|
|
|
@click:selectedGroup="handleSelectedUserGroup"
|
|
|
|
|
|
></UserPanel>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="middle-container">
|
|
|
|
|
|
<div class="graph">
|
2025-08-01 14:26:12 +08:00
|
|
|
|
<Graph
|
|
|
|
|
|
:title="graphTitleImg"
|
|
|
|
|
|
@click:openUserInfoDialog="handleOpenUserInfoDialog"
|
|
|
|
|
|
></Graph>
|
2025-07-18 10:46:45 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
<div class="postList">
|
|
|
|
|
|
<PostList
|
|
|
|
|
|
:posts="socialGroupsStore.posts"
|
|
|
|
|
|
></PostList>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="right-container">
|
|
|
|
|
|
<div class="anlysisPanel">
|
|
|
|
|
|
<AnlysisPanle
|
|
|
|
|
|
:anlysis-list="socialGroupsStore.anlysisList"
|
|
|
|
|
|
:title="analysisTitleImg"
|
|
|
|
|
|
></AnlysisPanle>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="cloudWords">
|
|
|
|
|
|
<WordsCloud :wordsCloudList="socialGroupsStore.wordCloudData"></WordsCloud>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2025-07-29 20:08:42 +08:00
|
|
|
|
<el-dialog v-if="false" v-model="postDialog" width="640" align-center class="custom-dialog">
|
2025-07-18 10:46:45 +08:00
|
|
|
|
<img src="@/assets/images/head/post-dialog-title.png" alt="" class="postTitleImage" />
|
|
|
|
|
|
<div class="dialog-content">
|
|
|
|
|
|
<div class="post-content">{{ currentPostPost.content }}</div>
|
|
|
|
|
|
<div class="heat">
|
|
|
|
|
|
<div class="item-heat-detail">
|
|
|
|
|
|
<div class="item-heat-like">
|
|
|
|
|
|
<Icon icon="ei:like" width="25" height="25" /> {{ currentPostPost.like }}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="item-heat-comment">
|
|
|
|
|
|
<Icon icon="la:comment-dots" width="25" height="25" /> {{ currentPostPost.comment }}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="item-heat-transmit">
|
|
|
|
|
|
<Icon icon="mdi:share-outline" width="25" height="25" /> {{
|
|
|
|
|
|
currentPostPost.transmit
|
|
|
|
|
|
}}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</el-dialog>
|
2025-08-01 14:26:12 +08:00
|
|
|
|
|
|
|
|
|
|
<el-dialog v-model="userInfoDialog" width="640" align-center class="custom-dialog">
|
|
|
|
|
|
<img src="@/assets/images/linkPrediction/title/user-info-title.png" alt="" class="userInfoTitle" />
|
|
|
|
|
|
<div class="user-dialog-content">
|
|
|
|
|
|
<div class="user-basic-info">
|
|
|
|
|
|
<img :src="curSelectedUser.avatarData ? getAvatarUrl(curSelectedUser.avatarData) : defaultAvatar" alt="" class="avatar">
|
|
|
|
|
|
<div class="info-detail">
|
|
|
|
|
|
<div class="username">
|
|
|
|
|
|
{{ curSelectedUser.name }}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="info-fans-posts">
|
|
|
|
|
|
<div class="fans">粉丝量: <p>{{ curSelectedUser.fans }}</p></div>
|
|
|
|
|
|
<div class="posts">发帖数: <p>{{ curSelectedUser.postNum }}</p></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="info-group">
|
|
|
|
|
|
<div class="info-item">
|
|
|
|
|
|
<img src="@/assets/images/linkPrediction/icon/user-info-group-icon.png" alt="">
|
|
|
|
|
|
<div class="info-item-content">
|
|
|
|
|
|
发帖总数: <p>{{ curSelectedUser.postNum }}</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="info-item">
|
|
|
|
|
|
<img src="@/assets/images/linkPrediction/icon/user-info-group-icon.png" alt="">
|
|
|
|
|
|
<div class="info-item-content">
|
|
|
|
|
|
发帖频率: <p>{{ curSelectedUser.postFreqPerDay }}</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="info-item">
|
|
|
|
|
|
<img src="@/assets/images/linkPrediction/icon/user-info-group-icon.png" alt="">
|
|
|
|
|
|
<div class="info-item-content">
|
|
|
|
|
|
参与互动次数: <p>{{ curSelectedUser.interactionNum }}</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="info-item">
|
|
|
|
|
|
<img src="@/assets/images/linkPrediction/icon/user-info-group-icon.png" alt="">
|
|
|
|
|
|
<div class="info-item-content">
|
|
|
|
|
|
参与互动频率: <p>{{ curSelectedUser.interactionFreqPerDay }}</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="info-item">
|
|
|
|
|
|
<img src="@/assets/images/linkPrediction/icon/user-info-group-icon.png" alt="">
|
|
|
|
|
|
<div class="info-item-content">
|
|
|
|
|
|
帖文被互动次数: <p>{{ curSelectedUser.interactedNum }}</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="info-item">
|
|
|
|
|
|
<img src="@/assets/images/linkPrediction/icon/user-info-group-icon.png" alt="">
|
|
|
|
|
|
<div class="info-item-content">
|
|
|
|
|
|
最近活跃时间: <p>{{ curSelectedUser.recentActiveTime }}</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</el-dialog>
|
2025-07-18 10:46:45 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script setup>
|
2025-08-01 14:26:12 +08:00
|
|
|
|
import defaultAvatar from "@/assets/images/avatar/default.png";
|
2025-07-29 12:13:55 +08:00
|
|
|
|
import { onMounted, provide, ref } from "vue";
|
|
|
|
|
|
import UserPanel from "./components/userPanel.vue";
|
|
|
|
|
|
import UserChart from "./components/userChart.vue";
|
|
|
|
|
|
import PostList from "./components/postList.vue";
|
|
|
|
|
|
import AnlysisPanle from "./components/anlysisPanle.vue";
|
|
|
|
|
|
import Graph from "./components/graph.vue";
|
|
|
|
|
|
import WordsCloud from "./components/cloudWords.vue";
|
2025-07-18 10:46:45 +08:00
|
|
|
|
import { Icon } from "@iconify/vue";
|
|
|
|
|
|
import { useSocialGroupsStore } from "@/store/llinkPrediction/index";
|
|
|
|
|
|
import userPanelTitleImg from "@/assets/images/linkPrediction/title/user-title.png";
|
|
|
|
|
|
import userChartTitleImg from "@/assets/images/linkPrediction/title/interaction-strenth-title.png";
|
|
|
|
|
|
import graphTitleImg from "@/assets/images/linkPrediction/title/graph1-title.png";
|
|
|
|
|
|
import analysisTitleImg from "@/assets/images/linkPrediction/title/analysis-title.png";
|
2025-08-01 14:26:12 +08:00
|
|
|
|
import { getAvatarUrl } from "@/utils/transform"
|
2025-07-18 10:46:45 +08:00
|
|
|
|
const socialGroupsStore = useSocialGroupsStore();
|
|
|
|
|
|
|
|
|
|
|
|
//控制弹窗
|
|
|
|
|
|
const postDialog = ref(false);
|
|
|
|
|
|
|
2025-08-01 14:26:12 +08:00
|
|
|
|
// 控制个人信息弹窗
|
|
|
|
|
|
const userInfoDialog = ref(false);
|
|
|
|
|
|
const curSelectedUser = ref(null)
|
|
|
|
|
|
|
2025-07-18 10:46:45 +08:00
|
|
|
|
//当前选中的贴文数据
|
|
|
|
|
|
const currentPostPost = ref(null);
|
|
|
|
|
|
|
2025-07-31 10:10:03 +08:00
|
|
|
|
// 列表项的点击事件
|
2025-07-18 10:46:45 +08:00
|
|
|
|
const handleSelectedUserGroup = (group) => {
|
2025-07-29 16:25:28 +08:00
|
|
|
|
socialGroupsStore.curComponent = "detailkNode"
|
2025-07-31 10:10:03 +08:00
|
|
|
|
socialGroupsStore.clickEvent = "list"
|
|
|
|
|
|
console.log("点击列表group:",group)
|
2025-07-30 11:28:22 +08:00
|
|
|
|
const groupIds = group.list.map((item)=>item.groupId)
|
2025-07-31 13:42:51 +08:00
|
|
|
|
socialGroupsStore.curRelationId = group.relationId //保存当前点击的relationid,为了区分到底是从哪点进二级界面的
|
2025-07-31 17:06:11 +08:00
|
|
|
|
socialGroupsStore.initGraphCommunityDetailNode(groupIds, "2024-05-16 16:56:04", group.relationId)
|
2025-07-30 11:28:22 +08:00
|
|
|
|
socialGroupsStore.setTimeList(group.timeList)
|
|
|
|
|
|
socialGroupsStore.getSocialGroupPostListByRelationId(group.relationId)
|
2025-07-18 10:46:45 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-08-01 14:26:12 +08:00
|
|
|
|
const handleOpenUserInfoDialog = (params) => {
|
|
|
|
|
|
userInfoDialog.value = params.userInfoDialog
|
|
|
|
|
|
curSelectedUser.value = params.curSelectedUser
|
|
|
|
|
|
console.log("index.vue打印当前选中的用户:",curSelectedUser.value)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-23 15:02:10 +08:00
|
|
|
|
onMounted(() => {
|
|
|
|
|
|
socialGroupsStore.initGroupList();
|
2025-07-29 20:08:42 +08:00
|
|
|
|
socialGroupsStore.initPostList("212431");
|
2025-07-29 12:13:55 +08:00
|
|
|
|
socialGroupsStore.initGraphCommunityNode();
|
2025-07-29 16:25:28 +08:00
|
|
|
|
socialGroupsStore.initGraphStatistics();
|
2025-07-23 15:02:10 +08:00
|
|
|
|
});
|
2025-07-29 12:13:55 +08:00
|
|
|
|
|
|
|
|
|
|
provide("communityNodeList", socialGroupsStore.communityNodeList);
|
|
|
|
|
|
provide("statisticsList", socialGroupsStore.statisticsList);
|
2025-07-18 10:46:45 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped lang="less">
|
|
|
|
|
|
:deep(.custom-dialog) {
|
|
|
|
|
|
width: 640px;
|
|
|
|
|
|
border-width: 0px, 0px, 0px, 0px;
|
|
|
|
|
|
border-style: solid;
|
|
|
|
|
|
border-image-source: linear-gradient(180deg, #3aa1f8 0%, rgba(58, 161, 248, 0.2) 100%);
|
|
|
|
|
|
background-color: rgba(6, 45, 90, 1);
|
|
|
|
|
|
border: 1px solid #1a8bff;
|
|
|
|
|
|
border-radius: 2px;
|
|
|
|
|
|
padding: 0 0;
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
:deep(.post-dialog) {
|
|
|
|
|
|
height: 300px;
|
|
|
|
|
|
}
|
|
|
|
|
|
:deep(.custom-dialog) .postTitleImage {
|
|
|
|
|
|
margin-top: -24px;
|
|
|
|
|
|
margin-left: -2px;
|
|
|
|
|
|
}
|
2025-08-01 14:26:12 +08:00
|
|
|
|
:deep(.custom-dialog) .userInfoTitle {
|
|
|
|
|
|
margin-top: -24px;
|
|
|
|
|
|
margin-left: -2px;
|
|
|
|
|
|
}
|
2025-07-18 10:46:45 +08:00
|
|
|
|
:deep(.custom-dialog) .dialog-content {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
padding: 25px 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-01 14:26:12 +08:00
|
|
|
|
:deep(.custom-dialog) .user-dialog-content {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
padding: 30px;
|
|
|
|
|
|
.user-basic-info {
|
|
|
|
|
|
width: 428px;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: start;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
.avatar {
|
|
|
|
|
|
width: 70px;
|
|
|
|
|
|
height: 70px;
|
|
|
|
|
|
border-radius: 5px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.info-detail {
|
|
|
|
|
|
height: 70px;
|
|
|
|
|
|
padding: 0 24px;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
justify-content: space-around;
|
|
|
|
|
|
.info-fans-posts {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: start;
|
|
|
|
|
|
.fans {
|
|
|
|
|
|
margin-right: 63px;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: start;
|
|
|
|
|
|
}
|
|
|
|
|
|
.posts {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: start;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.info-group {
|
|
|
|
|
|
margin-top: 32px;
|
|
|
|
|
|
margin-left: -10px;
|
|
|
|
|
|
display: grid;
|
|
|
|
|
|
grid-template-columns: 1fr 1fr;
|
|
|
|
|
|
row-gap: 15px;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
.info-item {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: start;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
.info-item-content {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: start;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-18 10:46:45 +08:00
|
|
|
|
:deep(.custom-dialog) .dialog-content .content {
|
|
|
|
|
|
color: rgba(255, 255, 255, 0.8);
|
|
|
|
|
|
font-family: "PingFang SC";
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
font-style: normal;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
opacity: 0.7;
|
|
|
|
|
|
}
|
|
|
|
|
|
.post-content {
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
opacity: 0.7;
|
|
|
|
|
|
}
|
|
|
|
|
|
.heat {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: flex-end;
|
|
|
|
|
|
margin-top: 20px;
|
|
|
|
|
|
.item-heat-detail {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
div {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
width: 70px;
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
opacity: 0.7;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.layout-container {
|
|
|
|
|
|
width: 1544px;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
gap: 20px;
|
|
|
|
|
|
.top-container {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 88px;
|
|
|
|
|
|
background-image: url(@/assets/images/linkPrediction/title/page-title.png);
|
|
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
|
|
background-size: cover;
|
|
|
|
|
|
fill: linear-gradient(270deg, rgba(6, 61, 113, 0.1) 0%, rgba(8, 30, 56, 0.38) 100%);
|
|
|
|
|
|
stroke-width: 1px;
|
|
|
|
|
|
stroke: #3aa1f8;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.content {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 805px;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
gap: 15px;
|
|
|
|
|
|
.left-container {
|
|
|
|
|
|
width: 352px;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
gap: 15px;
|
|
|
|
|
|
.userPanel {
|
|
|
|
|
|
width: 100%;
|
2025-07-25 15:07:08 +08:00
|
|
|
|
|
2025-07-18 10:46:45 +08:00
|
|
|
|
border-radius: 2px;
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
background-color: rgba(6, 45, 90, 0.3);
|
|
|
|
|
|
border: 1px solid rgba(0, 113, 188, 0.705);
|
|
|
|
|
|
}
|
|
|
|
|
|
.userChart {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
border-radius: 2px;
|
|
|
|
|
|
background-color: rgba(6, 45, 90, 0.3);
|
|
|
|
|
|
border: 1px solid rgba(0, 113, 188, 0.705);
|
|
|
|
|
|
overflow: auto;
|
|
|
|
|
|
-ms-overflow-style: none; /* IE 和 Edge */
|
|
|
|
|
|
scrollbar-width: none; /* Firefox */
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.middle-container {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
gap: 15px;
|
|
|
|
|
|
.search {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 60px;
|
|
|
|
|
|
}
|
|
|
|
|
|
.graph {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 541px;
|
|
|
|
|
|
background-color: #070a22;
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
background-color: rgba(6, 45, 90, 0.3);
|
|
|
|
|
|
border: 1px solid rgba(0, 113, 188, 0.705);
|
|
|
|
|
|
}
|
|
|
|
|
|
.postList {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
background-color: rgba(6, 45, 90, 0.3);
|
|
|
|
|
|
border: 1px solid rgba(0, 113, 188, 0.705);
|
|
|
|
|
|
fill: linear-gradient(270deg, rgba(6, 61, 113, 0.1) 0%, rgba(8, 30, 56, 0.38) 100%);
|
|
|
|
|
|
stroke-width: 1px;
|
|
|
|
|
|
stroke: #3aa1f8;
|
|
|
|
|
|
overflow: auto;
|
|
|
|
|
|
padding: 10px 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.right-container {
|
|
|
|
|
|
width: 352px;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
gap: 15px;
|
|
|
|
|
|
.anlysisPanel {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 540px;
|
|
|
|
|
|
border-radius: 2px;
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
background-color: rgba(6, 45, 90, 0.3);
|
|
|
|
|
|
border: 1px solid rgba(0, 113, 188, 0.705);
|
|
|
|
|
|
}
|
|
|
|
|
|
.cloudWords {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
border-radius: 2px;
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
background-color: rgba(6, 45, 90, 0.3);
|
|
|
|
|
|
border: 1px solid rgba(0, 113, 188, 0.705);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|