SocialNetworks_duan/src/views/GroupEvolution/groupMember/index.vue
2025-08-08 10:17:22 +08:00

278 lines
7.8 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.

<template>
<div class="layout-container">
<!-- 头部 -->
<div class="top-container"></div>
<div class="content">
<div class="left-container">
<!-- 群体成员演化信息列表 -->
<div class="userPanel">
<GroupPanel
:groupList="groupMemberStore.groupList"
:title="userPanelTitleImg"
></GroupPanel>
</div>
<!-- 全局群体成员演化图 -->
<div class="userChart">
<GroupChart
:title="userChartTitleImg"
:moduleName="moduleName"
:chartData="groupMemberStore.chartData"
></GroupChart>
</div>
</div>
<!-- 中间大矩形 2 -->
<div class="middle-container">
<div class="graph">
<GroupGraph
:store="groupMemberStore"
@click:pointerDownAndSlide="handleChangeXAxis"
></GroupGraph>
</div>
<div class="postList">
<GroupPost
:posts="groupMemberStore.posts"
@click:open-dialog="handleOpenPostDialog"
:moduleName="moduleName"
></GroupPost>
</div>
</div>
<!-- 右侧矩形 2 -->
<div class="right-container">
<div class="anlysisPanel">
<GroupAnalysis
:title="groupAnalsisTitleImg"
:chartsData="groupMemberStore.chartsData"
></GroupAnalysis>
</div>
<div class="cloudWords">
<WordsCloud :wordsCloudList="groupMemberStore.wordCloudData"></WordsCloud>
</div>
</div>
</div>
<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">{{ 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>
</div>
</template>
<script setup>
import { onMounted, ref } from "vue"
import GroupGraph from "../component/groupGraph.vue"
import GroupPanel from "./components/groupPanel.vue"
import GroupPost from "../component/groupPost.vue"
import GroupAnalysis from "./components/groupAnalysis.vue"
import GroupChart from "../component/groupChart.vue"
import userChartTitleImg from "@/assets/images/groupMember/group-member-evolution-chart-title.png"
// src\views\GroupEvolution\component\wordsCloud.vue
import WordsCloud from "../component/wordsCloud.vue"
import userPanelTitleImg from "@/assets/images/groupMember/evolutionAnalysisListTitle.png"
import groupAnalsisTitleImg from "@/assets/images/groupMember/groupEvolutionAnalsisTitleImg.png"
import { Icon } from "@iconify/vue"
import { useGroupMemberStore } from "@/store/groupEvolution/index.js"
const groupMemberStore = useGroupMemberStore()
const moduleName = "群体成员演化分析"
//控制弹窗
const postDialog = ref(false)
//当前选中的贴文数据
const currentPostPost = ref(null)
const handleChangeXAxis = (utcTime) => {
groupMemberStore.initializeGroupList(utcTime) //随着时间轴变动,更新群体成员信息列表
groupMemberStore.initialPostByUtcTime(utcTime) //随着时间轴变动,更新贴文列表
groupMemberStore.initialGraphByUtcTime(utcTime) //随着时间轴变动,更新关系图
}
const handleOpenPostDialog = (post) => {
postDialog.value = true
currentPostPost.value = post
}
onMounted(async () => {
await groupMemberStore.initializeGroupMemberTimeLine()
await groupMemberStore.initializeGroupList()
await groupMemberStore.initializeGroupMemberChart()
await groupMemberStore.initializeGroupMemberEvolutionAnalysisChart()
await groupMemberStore.initialGraphByUtcTime() //随着时间轴变动,更新关系图
})
</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) .dialog-content {
width: 100%;
padding: 25px 20px;
}
: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%;
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);
}
.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>