SocialNetworks_duan/src/store/groupEvolution/index.js
2025-08-08 10:17:22 +08:00

1135 lines
31 KiB
JavaScript

import { defineStore } from "pinia"
import nodePrefix from "@/assets/images/groupEvolution/node-prefix.png"
import edgePrefix from "@/assets/images/groupEvolution/edge-prefix.png"
import splitImg from "@/assets/images/groupMember/splitImg.png"
import mergeImg from "@/assets/images/groupMember/mergeImg.png"
import shrinkImg from "@/assets/images/groupMember/shrinkImg.png"
import expamdImg from "@/assets/images/groupMember/expamdImg.png"
import defaultAvatar from "@/assets/images/avatar/default.png"
import {
getGroupEvolutionGroupList,
getGroupEvolutionGroupScaleChart,
getGroupEvolutionTimeLine,
getPostByUtcTime,
getStructuralEvolutionChart,
getStructuralEvolutionAnalysisChart,
getStructuralEvolutionAnalysisTimeLine,
getStructuralEvolutionAnalysisInfoList,
getStructuralEvolutionAnalysisPost,
getGroupMemberInfoList,
getGroupMemberTimeLine,
getGroupMemberChart,
getGroupMemberEvolutionInfoByTime,
getGroupMemberEvolutionAnalysisChart,
// 4.异常群体捕捉
getAbnormalGroupTimeLine,
getAbnormalGroupList,
getAbnormalGroupInteractionChart,
getAbnormalGroupBehaviorPosts,
getAbnormalGroupBehaviorDetail,
getRelationGraphByUtcTime
} from "@/service/api/groupEvolution"
import { TansTimestamp, utcStringToHHMMSS, getMaxCeiled, parsePercentage } from "@/utils/transform"
export const useGroupDiscoveryStore = defineStore("groupDiscovery", {
state: () => ({
groupList: [],
chartData: {},
timeList: [],
graph: {},
chartsData: {
topSelfMedia: {
xAxis: [
"15:57:46",
"16:57:55",
"17:57:32",
"18:58:03",
"19:58:03",
"20:58:04",
"21:57:47",
"22:58:12"
],
yAxis: [0.5, 1.0, 1.5, 2.0, 2.5],
data: [1.0, 0.99, 1.0, 1.0, 1.01, 2.03, 1.2, 0.99]
},
officialMedia: {
xAxis: [
"15:57:46",
"16:57:55",
"17:57:32",
"18:58:03",
"19:58:03",
"20:58:04",
"21:57:47",
"22:58:12"
],
yAxis: [0.8, 1.0, 1.2],
data: [1.0, 0.99, 1.0, 1.0, 1.01, 1.01, 1.2, 0.99]
},
ordinaryMedia: {
xAxis: [
"15:57:46",
"16:57:55",
"17:57:32",
"18:58:03",
"19:58:03",
"20:58:04",
"21:57:47",
"22:58:12"
],
yAxis: [0, 1.0, 2.0, 3.0],
data: [1.08, 2.54, 1.47, 1.03, 0.98, 0.99, 1.0, 1.12]
}
},
wordCloudData: [
{
text: "主权权益",
top: 115.5,
left: 215.5,
width: 80,
height: 22,
fontSize: 13,
opacity: 1
},
{
text: "局座预言",
top: 80,
left: 69.5,
width: 73,
height: 22,
fontSize: 12,
opacity: 0.7
},
{
text: "吃瓜",
top: 72.5,
left: 132.5,
width: 50,
height: 22,
fontSize: 12,
opacity: 1
},
{
text: "中国海警",
top: 140,
left: 212.5,
width: 130,
height: 40,
fontSize: 22,
opacity: 0.8
},
{
text: "菲律宾",
top: 150,
left: 50,
width: 81,
height: 22,
fontSize: 14,
opacity: 0.8
},
{
text: "手指",
top: 200.5,
left: 38.5,
width: 73,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "装甲船",
top: 50,
left: 160.5,
width: 73,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "登检",
top: 211.5,
left: 143.5,
width: 50,
height: 19,
fontSize: 12,
opacity: 1
},
{ text: "执法", top: 176.5, left: 15.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "现场画面", top: 110, left: 26, width: 90, height: 22, fontSize: 14, opacity: 1 },
{ text: "渔民", top: 103.5, left: 95.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "包夹", top: 57.5, left: 72.5, width: 49, height: 19, fontSize: 12, opacity: 0.6 },
{ text: "枪支", top: 77.5, left: 264.5, width: 49, height: 19, fontSize: 12, opacity: 0.7 },
{ text: "解决", top: 195.5, left: 287.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{
text: "大刀长矛",
top: 186,
left: 200.5,
width: 70,
height: 19,
fontSize: 12,
opacity: 0.8
}
],
posts: []
}),
actions: {
//获取群体列表数据
async initializeGroupList(time = "") {
const res = await getGroupEvolutionGroupList(time)
if (res.code != 200) return
const iconMap = {
节点数: nodePrefix,
连边数: edgePrefix
}
this.groupList = res.data
this.groupList.forEach((item) => {
item.list = item.list.map((statistic) => ({
...statistic,
iconImg: iconMap[statistic.name]
}))
})
},
//获取群体规模演化图数据
async initializeGroupScaleChart() {
const res = await getGroupEvolutionGroupScaleChart()
if (res.code != 200) return
let resultObj = {}
const themeMap = {
群体一: "#32b6fb",
群体二: "#00d6da",
群体三: "#fddc33"
}
resultObj["xAxisData"] = res.data.timeList.map((item) => TansTimestamp(item, "HH:mm:ss"))
resultObj["yAxisRange"] = res.data.scale
resultObj["seriesList"] = []
Object.entries(res.data.data).forEach(([key, list]) => {
resultObj["seriesList"].push({ name: key, themeColor: themeMap[key], data: list })
})
this.chartData = resultObj
},
//获取时间轴参数
async initialGraphTimestamp() {
const res = await getGroupEvolutionTimeLine()
if (res.code != 200) return
this.timeList = res.data
},
async initialGraphByUtcTime(utcTime = "") {
const setColor = (groupId) => {
const colorMap = {
0: "50,141,120",
1: "133,129,48",
6: "12,112,144"
}
return colorMap[parseInt(groupId)]
}
const res = await getRelationGraphByUtcTime(utcTime)
if (res.code != 200) return
const newSet = new Set()
this.graph["links"] = res.data.links.map((link) => ({
source: link.source,
target: link.target,
color: setColor(link.type)
}))
this.graph["nodes"] = res.data.nodes
.filter((node) => {
if (!newSet.has(node.name)) {
newSet.add(node.name)
return true
}
return false
})
.map((node) => {
return {
id: node.name,
label: node.name,
type: node.groupId
}
})
},
// 通过时间来获取帖文列表
//根据时间参数获取贴文数据
async initialPostByUtcTime(utcTime) {
const res = await getPostByUtcTime(utcTime)
if (res.code != 200) return
this.posts = res.data
}
},
persist: true // 开启持久化
})
export const useGroupStructureStore = defineStore("groupStructure", {
state: () => ({
groupList: [],
graph: {},
timeList: [],
chartData: {},
chartsData: {},
wordCloudData: [
{
text: "佩洛西",
top: 115.5,
left: 215.5,
width: 109,
height: 40,
fontSize: 28,
opacity: 1
},
{ text: "中国", top: 183.5, left: 69.5, width: 73, height: 35, fontSize: 22, opacity: 1 },
{
text: "中国人民解放军",
top: 72.5,
left: 132.5,
width: 123,
height: 22,
fontSize: 12,
opacity: 1
},
{
text: "中美关系",
top: 171.5,
left: 212.5,
width: 81,
height: 22,
fontSize: 14,
opacity: 0.8
},
{ text: "台独", top: 135.5, left: 42.5, width: 57, height: 24, fontSize: 16, opacity: 1 },
{
text: "台海和平",
top: 228.5,
left: 230.5,
width: 81,
height: 22,
fontSize: 14,
opacity: 0.8
},
{
text: "坚决反对",
top: 200.5,
left: 38.5,
width: 73,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "联合公报",
top: 241.5,
left: 130.5,
width: 73,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "有力反制",
top: 211.5,
left: 143.5,
width: 73,
height: 19,
fontSize: 12,
opacity: 1
},
{ text: "白宫", top: 176.5, left: 15.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "内政", top: 87.5, left: 36.5, width: 53, height: 22, fontSize: 14, opacity: 1 },
{ text: "访台", top: 103.5, left: 95.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "领土", top: 57.5, left: 72.5, width: 49, height: 19, fontSize: 12, opacity: 0.6 },
{ text: "原则", top: 77.5, left: 264.5, width: 49, height: 19, fontSize: 12, opacity: 0.7 },
{ text: "台湾", top: 195.5, left: 287.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 }
],
posts: [
{
id: 1,
time: "2024-01-04 0:03:16",
groupCategory: "群体一",
innerEdgeAddCount: 8,
outerEdgeAddCount: 2
},
{
id: 2,
time: "2024-02-03 12:58:53",
groupCategory: "群体一",
innerEdgeAddCount: 8,
outerEdgeAddCount: 2
},
{
id: 3,
time: "2024-02-22 17:13:44",
groupCategory: "群体二",
innerEdgeAddCount: 13,
outerEdgeAddCount: 3
},
{
id: 4,
time: "2024-02-23 17:54:46",
groupCategory: "群体三",
innerEdgeAddCount: 1,
outerEdgeAddCount: 2
},
{
id: 5,
time: "2024-03-14 09:58:12",
groupCategory: "群体三",
innerEdgeAddCount: 1,
outerEdgeAddCount: 2
},
{
id: 6,
time: "2024-03-23 21:20:40",
groupCategory: "群体三",
innerEdgeAddCount: 1,
outerEdgeAddCount: 2
},
{
id: 7,
time: "2024-03-23 21:42:36",
groupCategory: "群体三",
innerEdgeAddCount: 1,
outerEdgeAddCount: 2
},
{
id: 8,
time: "2024-04-06 18:17:30",
groupCategory: "群体三",
innerEdgeAddCount: 1,
outerEdgeAddCount: 2
},
{
id: 9,
time: "2024-04-06 19:19:50",
groupCategory: "群体三",
innerEdgeAddCount: 1,
outerEdgeAddCount: 2
},
{
id: 10,
time: "2024-05-16 00:22:18",
groupCategory: "群体三",
innerEdgeAddCount: 1,
outerEdgeAddCount: 2
}
]
}),
actions: {
// 初始化timeList
async initializeStructuralEvolutionAnalysisTimeLine() {
const res = await getStructuralEvolutionAnalysisTimeLine()
this.timeList = res.data
},
// 初始化群体结构演化分析信息列表
async initializeStructuralEvolutionAnalysisInfoList(time = "2024-06-19T07:57:46Z") {
const res = await getStructuralEvolutionAnalysisInfoList(time)
this.groupList = res.data.map((item) => ({
id: item.id,
type: item.type,
name: item.name,
focusedTopic: item.focusedTopic,
innerNum: parsePercentage(item.innerNum),
outerNum: parsePercentage(item.outerNum)
}))
},
// 初始化全局连通性演化图--左下方
async initializeStructuralEvolutionChart() {
const res = await getStructuralEvolutionChart()
this.chartData = {
xAxisData: res.data.xaxisData.map((item) => utcStringToHHMMSS(item)),
seriesList: [
{
name: "",
data: res.data.seriesList[0].data,
themeColor: "#2AB8FD"
}
],
yAxisRange: { min: 0, max: 1, interval: 0.2 }
}
},
// 初始化群体结构演化分析图表--右上方
async initializeStructuralEvolutionAnalysisChart() {
const res = await getStructuralEvolutionAnalysisChart()
const topSelfMedia = res.data.topSelfMedia.map((item) => ({
id: item.id,
name: item.name,
chart: {
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
yAxisRange: {
min: 0,
max: Math.ceil(item.chart.yaxisRange.max / 5) * 5,
interval: Math.ceil(item.chart.yaxisRange.max / 5)
},
seriesList: item.chart.seriesList.map((item) => ({
data: item.data,
name: item.name,
themeColor: "#2AB8FD"
}))
}
}))
const officalMedia = res.data.officalMedia.map((item) => ({
id: item.id,
name: item.name,
chart: {
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
yAxisRange: {
min: 0,
max: Math.ceil(item.chart.yaxisRange.max / 5) * 5,
interval: Math.ceil(item.chart.yaxisRange.max / 5)
},
seriesList: item.chart.seriesList.map((item) => ({
data: item.data,
name: item.name,
themeColor: "#2AB8FD"
}))
}
}))
const ordinaryMedia = res.data.ordinaryMedia.map((item) => ({
id: item.id,
name: item.name,
chart: {
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
yAxisRange: {
min: 0,
max: Math.ceil(item.chart.yaxisRange.max / 5) * 5,
interval: Math.ceil(item.chart.yaxisRange.max / 5)
},
seriesList: item.chart.seriesList.map((item) => ({
data: item.data,
name: item.name,
themeColor: "#2AB8FD"
}))
}
}))
this.chartsData = {
topSelfMedia,
officalMedia,
ordinaryMedia
}
},
async initialGraphByUtcTime(utcTime = "") {
const setColor = (groupId) => {
const colorMap = {
0: "50,141,120",
1: "133,129,48",
6: "12,112,144"
}
return colorMap[parseInt(groupId)]
}
const res = await getRelationGraphByUtcTime(utcTime)
if (res.code != 200) return
const newSet = new Set()
this.graph["links"] = res.data.links.map((link) => ({
source: link.source,
target: link.target,
color: setColor(link.type)
}))
this.graph["nodes"] = res.data.nodes
.filter((node) => {
if (!newSet.has(node.name)) {
newSet.add(node.name)
return true
}
return false
})
.map((node) => {
return {
id: node.name,
label: node.name,
type: node.groupId
}
})
},
// 初始化群体结构演化分析的群体演化信息-中下-随时间轴变化
async initializeStructuralPost(time = "2024-06-19T07:57:46Z") {
const res = await getStructuralEvolutionAnalysisPost(time)
this.posts = res.data.map((item) => ({
id: item.id,
time: TansTimestamp(item.time, "YYYY.MM.DD HH:mm:ss"),
groupCategory: item.groupCategory,
innerEdgeAddCount: item.innerEdgeAddCount,
outerEdgeAddCount: item.outerEdgeAddCount
}))
}
},
persist: true // 开启持久化
})
export const useGroupMemberStore = defineStore("groupMember", {
state: () => ({
groupList: [],
timeList: [],
graph: {},
chartData: {},
chartsData: {},
posts: [
{
id: 1,
time: "2024-01-04 0:03:16",
type: "群体一",
memberAddCount: 1
},
{
id: 2,
time: "2024-02-03 12:58:53",
type: "群体二",
memberAddCount: 2
},
{
id: 3,
time: "2024-02-22 17:13:44",
type: "群体三",
memberAddCount: 4
},
{
id: 4,
time: "2024-02-23 17:54:46",
type: "群体一",
memberAddCount: 4
},
{
id: 5,
time: "2024-03-14 09:58:12",
type: "群体三",
memberAddCount: 4
},
{
id: 6,
time: "2024-03-23 21:20:40",
type: "群体二",
memberAddCount: 4
},
{
id: 7,
time: "2024-03-23 21:42:36",
type: "群体一",
memberAddCount: 2
},
{
id: 8,
time: "2024-04-06 18:17:30",
type: "群体二",
memberAddCount: 4
},
{
id: 9,
time: "2024-04-06 19:19:50",
type: "群体一",
memberAddCount: 4
},
{
id: 10,
time: "2024-05-16 00:22:18",
type: "群体二",
memberAddCount: 5
}
],
wordCloudData: [
{
text: "中国海警",
top: 115.5,
left: 200.5,
width: 150,
height: 40,
fontSize: 28,
opacity: 1
},
{ text: "渔民", top: 160.5, left: 69.5, width: 70, height: 35, fontSize: 20, opacity: 1 },
{
text: "缴获",
top: 72.5,
left: 132.5,
width: 60,
height: 22,
fontSize: 12,
opacity: 1
},
{
text: "菲律宾",
top: 171.5,
left: 200.5,
width: 81,
height: 22,
fontSize: 14,
opacity: 0.8
},
{ text: "枪支", top: 135.5, left: 42.5, width: 57, height: 24, fontSize: 16, opacity: 1 },
{
text: "装甲船",
top: 223.5,
left: 230.5,
width: 81,
height: 22,
fontSize: 14,
opacity: 0.8
},
{
text: "渔民吃瓜",
top: 200.5,
left: 38.5,
width: 73,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "执法",
top: 223.5,
left: 130.5,
width: 60,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "登检",
top: 200.5,
left: 143.5,
width: 60,
height: 19,
fontSize: 12,
opacity: 1
},
{ text: "蹲下", top: 176.5, left: 15.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "解决", top: 87.5, left: 36.5, width: 53, height: 22, fontSize: 14, opacity: 1 },
{ text: "抱头", top: 103.5, left: 95.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "包夹", top: 57.5, left: 72.5, width: 49, height: 19, fontSize: 12, opacity: 0.6 },
{ text: "吃瓜", top: 77.5, left: 264.5, width: 49, height: 19, fontSize: 12, opacity: 0.7 },
{ text: "手指", top: 195.5, left: 287.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 }
]
}),
actions: {
// 获取时间轴
async initializeGroupMemberTimeLine() {
const res = await getGroupMemberTimeLine()
this.timeList = res.data
},
// 群体成员演化信息列表-左上
async initializeGroupList(time = "2024-06-19T07:57:46Z") {
const res = await getGroupMemberInfoList(time)
const groupList = res.data.map((item) => ({
id: item.id,
type: item.type,
focusedTopic: item.focusedTopic,
value: item.value.map((item) => item.toFixed(2))
// value: item.value.map(item => (item * 100 + 20).toFixed(2))
}))
this.groupList = groupList
},
async initializeGroupMemberChart() {
const res = await getGroupMemberChart()
// console.log("测试获取groupMemberChart:",res);
const xAxisData = res.data.xaxisData.map((item) => utcStringToHHMMSS(item))
const yAxisRange = res.data.yaxisRange
const themeColors = ["#2AB8FD", "#02D7DA", "#FFDA09", "#EB57B0"]
const seriesList = res.data.seriesList.map((item) => ({
data: item.data.map((item) => item.toFixed(2)),
name: item.name,
themeColor: themeColors[item.id - 1]
}))
this.chartData = {
xAxisData,
yAxisRange,
seriesList
}
},
async initialPostByUtcTime(utcTime) {
const res = await getGroupMemberEvolutionInfoByTime(utcTime)
this.posts = res.data
},
async initializeGroupMemberEvolutionAnalysisChart() {
const res = await getGroupMemberEvolutionAnalysisChart()
const themeColors = {
分裂演化: "#2AB8FD",
合并演化: "#02D7DA",
收缩演化: "#FFDA09",
扩展演化: "#EB57B0"
}
const topSelfMedia = res.data.topSelfMedia.map((item) => ({
id: item.id,
name: item.name,
chart: {
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
yAxisRange: {
min: 0,
max: Math.ceil(item.chart.yaxisRange.max / 5) * 5,
interval: Math.ceil(item.chart.yaxisRange.max / 5)
},
seriesList: item.chart.seriesList.map((item) => ({
data: item.data.map((item) => item.toFixed(2)),
name: item.name,
themeColor: themeColors[item.name]
}))
}
}))
const officalMedia = res.data.officalMedia.map((item) => ({
id: item.id,
name: item.name,
chart: {
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
yAxisRange: {
min: 0,
max: Math.ceil(item.chart.yaxisRange.max / 5) * 5,
interval: Math.ceil(item.chart.yaxisRange.max / 5)
},
seriesList: item.chart.seriesList.map((item) => ({
data: item.data.map((item) => item.toFixed(2)),
name: item.name,
themeColor: themeColors[item.name]
}))
}
}))
const ordinaryMedia = res.data.ordinaryMedia.map((item) => ({
id: item.id,
name: item.name,
chart: {
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
yAxisRange: {
min: 0,
max: Math.ceil(item.chart.yaxisRange.max / 5) * 5,
interval: Math.ceil(item.chart.yaxisRange.max / 5)
},
seriesList: item.chart.seriesList.map((item) => ({
data: item.data.map((item) => item.toFixed(2)),
name: item.name,
themeColor: themeColors[item.name]
}))
}
}))
this.chartsData = {
topSelfMedia: topSelfMedia,
officalMedia: officalMedia,
ordinaryMedia: ordinaryMedia
}
},
async initialGraphByUtcTime(utcTime = "") {
const setColor = (groupId) => {
const colorMap = {
0: "50,141,120",
1: "133,129,48",
6: "12,112,144"
}
return colorMap[parseInt(groupId)]
}
const res = await getRelationGraphByUtcTime(utcTime)
if (res.code != 200) return
const newSet = new Set()
this.graph["links"] = res.data.links.map((link) => ({
source: link.source,
target: link.target,
color: setColor(link.type)
}))
this.graph["nodes"] = res.data.nodes
.filter((node) => {
if (!newSet.has(node.name)) {
newSet.add(node.name)
return true
}
return false
})
.map((node) => {
return {
id: node.name,
label: node.name,
type: node.groupId
}
})
}
},
persist: true // 开启持久化
})
export const useAnomalousGroup = defineStore("anomalousGroup", {
state: () => ({
groupList: [
{
id: 1,
type: "异常社团组一",
abnormalGroup: [
{
groupId: "G02",
nodeCount: 112,
postNum: 21
},
{
groupId: "G07",
nodeCount: 183,
postNum: 13
}
]
},
{
id: 2,
type: "异常社团组二",
abnormalGroup: [
{
groupId: "G04",
nodeCount: 86,
postNum: 12
},
{
groupId: "G08",
nodeCount: 143,
postNum: 7
}
]
}
],
graph: {},
timeList: [],
wordCloudData: [
{
text: "局座",
top: 115.5,
left: 220.5,
width: 80,
height: 40,
fontSize: 28,
opacity: 1
},
{ text: "折叠屏", top: 160.5, left: 69.5, width: 105, height: 35, fontSize: 20, opacity: 1 },
{
text: "蹬鼻子上脸",
top: 50.5,
left: 132.5,
width: 90,
height: 22,
fontSize: 12,
opacity: 1
},
{
text: "菲律宾",
top: 171.5,
left: 200.5,
width: 81,
height: 22,
fontSize: 14,
opacity: 0.8
},
{
text: "中国海警",
top: 120.5,
left: 30.5,
width: 100,
height: 24,
fontSize: 16,
opacity: 1
},
{
text: "船",
top: 223.5,
left: 230.5,
width: 50,
height: 22,
fontSize: 14,
opacity: 0.8
},
{
text: "斧头",
top: 200.5,
left: 38.5,
width: 40,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "执法",
top: 223.5,
left: 130.5,
width: 60,
height: 19,
fontSize: 12,
opacity: 0.7
},
{
text: "登检",
top: 200.5,
left: 143.5,
width: 60,
height: 19,
fontSize: 12,
opacity: 1
},
{ text: "蹲下", top: 176.5, left: 15.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "邦邦邦邦", top: 87.5, left: 20.5, width: 106, height: 22, fontSize: 14, opacity: 1 }
/* { text: "抱头", top: 103.5, left: 95.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 },
{ text: "包夹", top: 57.5, left: 72.5, width: 49, height: 19, fontSize: 12, opacity: 0.6 },
{ text: "吃瓜", top: 77.5, left: 264.5, width: 49, height: 19, fontSize: 12, opacity: 0.7 },
{ text: "手指", top: 195.5, left: 287.5, width: 49, height: 19, fontSize: 12, opacity: 0.8 } */
],
abnormalContentList: [
{
id: 1,
// 评论人
commenter: {
userId: "1",
userName: "Trump-Good",
userAvatar: defaultAvatar
},
// 评论接收人
commentRecipient: {
userId: "2",
userName: "疾风中青劲草",
userAvatar: defaultAvatar
},
//
mutualCommentCount: 3,
// 评论内容
content:
"在我国海域偷运軍械彈藥是應該依法拘捕送交法院睿理判刑,而且在中国的裹服刑的!难道外国人特权?更何况是這千点小国!#中国海警首次登检菲律宾运补船只# #外交部回应中国海警缴获菲士兵枪支#",
// 点赞数
likeCount: "4.8w",
// 评论数
commentCount: 100,
// 转发数
shareCount: 6890
},
{
id: 2,
// 评论人
commenter: {
userId: "1",
userName: "Trump-Good",
userAvatar: defaultAvatar
},
// 评论接收人
commentRecipient: {
userId: "2",
userName: "疾风中青劲草",
userAvatar: defaultAvatar
},
//
mutualCommentCount: 3,
// 评论内容
content:
"在我国海域偷运軍械彈藥是應該依法拘捕送交法院睿理判刑,而且在中国的裹服刑的!难道外国人特权?更何况是這千点小国!#中国海警首次登检菲律宾运补船只# #外交部回应中国海警缴获菲士兵枪支#",
// 点赞数
likeCount: "4.8w",
// 评论数
commentCount: 100,
// 转发数
shareCount: 6890
}
],
chartData: {
xAxisData: ["t0", "t1", "t2", "t3", "t4", "t5", "t6"],
yAxisRange: { min: 0, max: 5, interval: 1 },
seriesList: [
{
name: "社团组一",
themeColor: "#2AB8FD",
data: [0, 5, 4, 3, 0, 5, 0]
},
{
name: "社团组二",
themeColor: "#02D7DA",
data: [3, 0, 1, 0, 3, 5, 0]
},
{
name: "社团组三",
themeColor: "#FFDA09",
data: [5, 0, 4, 0, 3, 0, 0]
}
]
},
posts: [
{
id: 1,
abnormalGroup: "G02与G07互动方式出现显著异常",
explanation: "持续异常行为已累积显著,疑似某组织突然发动“”信息攻击“或”舆论战“",
firstDiscoverTime: "2024.06.20",
duration: 6,
JS: 0.3,
CUSUM: 6.21,
KS: 0.02
},
{
id: 2,
abnormalGroup: "GO4与G08互动方式出现显著异常",
firstDiscoverTime: "2024.06.23",
duration: 4,
explanation: "疑似“统一指令”或“操控集群”在某时段被同时激活",
JS: 0.41,
CUSUM: 5.0,
KS: 0.05
},
{
id: 3,
abnormalGroup: "G02与G07互动方式出现显著异常",
firstDiscoverTime: "2024.07.25",
duration: 6,
explanation: "疑似群体间短时高强度联动",
JS: 0.41,
CUSUM: 5.0,
KS: 0.02
}
]
}),
actions: {
// 获取时间轴数据-中间时间轴
async initializeAbnormalGroupTimeLine() {
const res = await getAbnormalGroupTimeLine()
if (res.code === 200) {
this.timeList = res.data
}
},
// 异常用户组展示-左上
async initializeAbnormalGroupList(time = "2024-06-19T07:57:46Z") {
const res = await getAbnormalGroupList(time)
if (res.code === 200) {
this.abnormalGroupList = res.data
}
},
// 全局异常互动时刻表-左下
async initializeAbnormalGroupInteractionChart() {
const res = await getAbnormalGroupInteractionChart()
const xAxisData = res.data.xaxisData.map((item) => utcStringToHHMMSS(item))
const yAxisRange = res.data.yaxisRange
const themeColors = {
社团组一: "#2AB8FD",
社团组二: "#02D7DA",
社团组三: "#FFDA09"
}
const seriesList = res.data.seriesList.map((item) => ({
data: item.data.map((item) => item.toFixed(2)),
name: item.name,
themeColor: themeColors[item.name]
}))
this.chartData = {
xAxisData,
yAxisRange,
seriesList
}
},
// 异常行为分析-中下
async initializeAbnormalGroupPosts(time = "2024-06-19T07:57:46Z") {
const res = await getAbnormalGroupBehaviorPosts(time)
if (res.code === 200) {
this.posts = res.data
}
},
// 异常互动详情-右上
async initializeAbnormalGroupInteractionDetail(time = "2024-06-19T07:57:46Z") {
const res = await getAbnormalGroupBehaviorDetail(time)
if (res.code === 200) {
this.interactionDetail = res.data
}
}
},
persist: true // 开启持久化
})