SocialNetworks_duan/src/views/LinkPrediction/socialGroups/index.vue
2025-08-01 14:26:12 +08:00

395 lines
12 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="layout-container">
<div class="top-container"></div>
<div class="content">
<div class="left-container">
<div class="userPanel">
<UserPanel
:title="userPanelTitleImg"
:panelHeight="760"
:userList="socialGroupsStore.userList"
@click:selectedGroup="handleSelectedUserGroup"
></UserPanel>
</div>
</div>
<div class="middle-container">
<div class="graph">
<Graph
:title="graphTitleImg"
@click:openUserInfoDialog="handleOpenUserInfoDialog"
></Graph>
</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>
<el-dialog v-if="false" 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">{{ 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>
<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">粉丝量:&nbsp;&nbsp;<p>{{ curSelectedUser.fans }}</p></div>
<div class="posts">发帖数:&nbsp;&nbsp;<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">
发帖总数:&nbsp;&nbsp;<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">
发帖频率:&nbsp;&nbsp;<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">
参与互动次数:&nbsp;&nbsp;<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">
参与互动频率:&nbsp;&nbsp;<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">
帖文被互动次数:&nbsp;&nbsp;<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">
最近活跃时间:&nbsp;&nbsp;<p>{{ curSelectedUser.recentActiveTime }}</p>
</div>
</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script setup>
import defaultAvatar from "@/assets/images/avatar/default.png";
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";
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";
import { getAvatarUrl } from "@/utils/transform"
const socialGroupsStore = useSocialGroupsStore();
//控制弹窗
const postDialog = ref(false);
// 控制个人信息弹窗
const userInfoDialog = ref(false);
const curSelectedUser = ref(null)
//当前选中的贴文数据
const currentPostPost = ref(null);
// 列表项的点击事件
const handleSelectedUserGroup = (group) => {
socialGroupsStore.curComponent = "detailkNode"
socialGroupsStore.clickEvent = "list"
console.log("点击列表group",group)
const groupIds = group.list.map((item)=>item.groupId)
socialGroupsStore.curRelationId = group.relationId //保存当前点击的relationid为了区分到底是从哪点进二级界面的
socialGroupsStore.initGraphCommunityDetailNode(groupIds, "2024-05-16 16:56:04", group.relationId)
socialGroupsStore.setTimeList(group.timeList)
socialGroupsStore.getSocialGroupPostListByRelationId(group.relationId)
};
const handleOpenUserInfoDialog = (params) => {
userInfoDialog.value = params.userInfoDialog
curSelectedUser.value = params.curSelectedUser
console.log("index.vue打印当前选中的用户",curSelectedUser.value)
}
onMounted(() => {
socialGroupsStore.initGroupList();
socialGroupsStore.initPostList("212431");
socialGroupsStore.initGraphCommunityNode();
socialGroupsStore.initGraphStatistics();
});
provide("communityNodeList", socialGroupsStore.communityNodeList);
provide("statisticsList", socialGroupsStore.statisticsList);
</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;
}
:deep(.custom-dialog) .userInfoTitle {
margin-top: -24px;
margin-left: -2px;
}
:deep(.custom-dialog) .dialog-content {
width: 100%;
padding: 25px 20px;
}
: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;
}
}
}
}
: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%;
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>