SocialNetworks_duan/src/views/LinkPrediction/charactersHiddenInteraction/index.vue
2025-08-01 15:43:24 +08:00

379 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

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"
:panel-height="760"
:userList="characterHiddenStore.userList"
@click:selectedGroup="handleSelectedUserGroup"
></UserPanel>
</div>
</div>
<div class="middle-container">
<div class="graph">
<Graph
:title="graphTitleImg"
:interactionStore="characterHiddenStore"
@click:openUserInfoDialog="handleOpenUserInfoDialog"
></Graph>
</div>
<div class="postList">
<PostList :posts="characterHiddenStore.posts"></PostList>
</div>
</div>
<div class="right-container">
<div class="anlysisPanel">
<AnlysisPanle
:anlysis-list="characterHiddenStore.anlysisList"
:title="analysisTitleImg"
></AnlysisPanle>
</div>
<div class="cloudWords">
<WordsCloud :wordsCloudList="characterHiddenStore.wordCloudData"></WordsCloud>
</div>
</div>
</div>
<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 { getAvatarUrl } from "@/utils/transform"
import { onMounted, provide, ref } from "vue"
import UserPanel from "../components/userPanel.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 { useCharacterHiddenStore } from "@/store/llinkPrediction/index"
import userPanelTitleImg from "@/assets/images/linkPrediction/title/user-title.png"
import graphTitleImg from "@/assets/images/linkPrediction/title/graph1-title.png"
import analysisTitleImg from "@/assets/images/linkPrediction/title/analysis-title.png"
const characterHiddenStore = useCharacterHiddenStore()
// 控制个人信息弹窗
const userInfoDialog = ref(false)
const curSelectedUser = ref(null)
const handleOpenUserInfoDialog = (params) => {
userInfoDialog.value = params.userInfoDialog
curSelectedUser.value = params.curSelectedUser
}
const handleSelectedUserGroup = (group) => {
characterHiddenStore.curComponent = "detailNode"
characterHiddenStore.timeList = group.timeList //保存从用户列表选择的用户组,为了显示这两个用户交互的时间切片
characterHiddenStore.curRelationId = group.relationId //保存当前点击的relationid为了区分到底是从哪点进二级界面的
characterHiddenStore.initCharacterSocialHiddenPostList(group.relationId)
characterHiddenStore.initGraphCommunityDetailNode(
group.list.map((item) => item.groupId),
"2024-05-16 16:56:04",
group.relationId
)
}
onMounted(() => {
characterHiddenStore.initGroupList()
characterHiddenStore.initCharacterSocialHiddenPostList("79") //初始贴文列表
characterHiddenStore.initGraphCommunityNode() //初始化社团节点
characterHiddenStore.initGraphStatistics() //初始化社团统计
})
provide("communityNodeList", characterHiddenStore.communityNodeList) // 提供数据
provide("statisticsList", characterHiddenStore.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>