模块四接口准备,小问题修复
This commit is contained in:
parent
de3a912705
commit
ebe1ce8536
|
|
@ -80,3 +80,26 @@ export function getGroupMemberEvolutionAnalysisChart() {
|
||||||
return http.get(`/groupEvolution/groupMember/rightChart`)
|
return http.get(`/groupEvolution/groupMember/rightChart`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 4.异常群体捕捉
|
||||||
|
// 4.1获取时间轴
|
||||||
|
export function getAbnormalGroupTimeLine() {
|
||||||
|
return http.get(`/groupEvolution/groupMember/timeline`)
|
||||||
|
}
|
||||||
|
// 4.2获取异常群体列表-z左上
|
||||||
|
export function getAbnormalGroupList(time) {
|
||||||
|
return http.get(`/groupEvolution/abnormalGroup/infoList?time=${time}`)
|
||||||
|
}
|
||||||
|
// 4.3全局异常互动时刻表-左下
|
||||||
|
export function getAbnormalGroupInteractionChart() {
|
||||||
|
return http.get(`/groupEvolution/abnormalGroup/chart`)
|
||||||
|
}
|
||||||
|
// 4.4异常行为分析
|
||||||
|
export function getAbnormalGroupBehaviorPosts(time) {
|
||||||
|
return http.get(`/groupEvolution/abnormalGroup/posts/date=${time}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4.5 异常互动行为内容详情
|
||||||
|
export function getAbnormalGroupBehaviorDetail(time) {
|
||||||
|
return http.get(`/groupEvolution/abnormalGroup/detail?time=${time}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,14 @@ import {
|
||||||
getGroupMemberChart,
|
getGroupMemberChart,
|
||||||
getGroupMemberEvolutionInfoByTime,
|
getGroupMemberEvolutionInfoByTime,
|
||||||
getGroupMemberEvolutionAnalysisChart,
|
getGroupMemberEvolutionAnalysisChart,
|
||||||
|
|
||||||
|
// 4.异常群体捕捉
|
||||||
|
getAbnormalGroupTimeLine,
|
||||||
|
getAbnormalGroupList,
|
||||||
|
getAbnormalGroupInteractionChart,
|
||||||
|
getAbnormalGroupBehaviorPosts,
|
||||||
|
getAbnormalGroupBehaviorDetail,
|
||||||
|
|
||||||
getRelationGraphByUtcTime
|
getRelationGraphByUtcTime
|
||||||
} from "@/service/api/groupEvolution"
|
} from "@/service/api/groupEvolution"
|
||||||
import { TansTimestamp, utcStringToHHMMSS, getMaxCeiled, parsePercentage } from "@/utils/transform"
|
import { TansTimestamp, utcStringToHHMMSS, getMaxCeiled, parsePercentage } from "@/utils/transform"
|
||||||
|
|
@ -299,7 +307,7 @@ export const useGroupStructureStore = defineStore("groupStructure", {
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
chartsData: {
|
chartsData: {
|
||||||
topSelfMedia: [
|
/* topSelfMedia: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
name: "内部密度指数演化",
|
name: "内部密度指数演化",
|
||||||
|
|
@ -394,7 +402,7 @@ export const useGroupStructureStore = defineStore("groupStructure", {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
] */
|
||||||
},
|
},
|
||||||
wordCloudData: [
|
wordCloudData: [
|
||||||
{
|
{
|
||||||
|
|
@ -1039,11 +1047,13 @@ export const useGroupMemberStore = defineStore("groupMember", {
|
||||||
]
|
]
|
||||||
}),
|
}),
|
||||||
actions: {
|
actions: {
|
||||||
|
// 获取时间轴
|
||||||
async initializeGroupMemberTimeLine() {
|
async initializeGroupMemberTimeLine() {
|
||||||
const res = await getGroupMemberTimeLine()
|
const res = await getGroupMemberTimeLine()
|
||||||
this.timeList = res.data
|
this.timeList = res.data
|
||||||
// console.log("测试获取timeList:",this.timeList);
|
// console.log("测试获取timeList:",this.timeList);
|
||||||
},
|
},
|
||||||
|
// 群体成员演化信息列表-左上
|
||||||
async initializeGroupList(time = "2024-06-19T07:57:46Z") {
|
async initializeGroupList(time = "2024-06-19T07:57:46Z") {
|
||||||
const res = await getGroupMemberInfoList(time)
|
const res = await getGroupMemberInfoList(time)
|
||||||
console.log("测试获取groupMemberInfoList:", res)
|
console.log("测试获取groupMemberInfoList:", res)
|
||||||
|
|
@ -1095,7 +1105,7 @@ export const useGroupMemberStore = defineStore("groupMember", {
|
||||||
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
|
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)},
|
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) => ({
|
seriesList: item.chart.seriesList.map((item) => ({
|
||||||
data: item.data,
|
data: item.data.map((item) => item.toFixed(2)),
|
||||||
name: item.name,
|
name: item.name,
|
||||||
themeColor: themeColors[item.name]
|
themeColor: themeColors[item.name]
|
||||||
}))
|
}))
|
||||||
|
|
@ -1109,7 +1119,7 @@ export const useGroupMemberStore = defineStore("groupMember", {
|
||||||
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
|
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)},
|
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) => ({
|
seriesList: item.chart.seriesList.map((item) => ({
|
||||||
data: item.data,
|
data: item.data.map((item) => item.toFixed(2)),
|
||||||
name: item.name,
|
name: item.name,
|
||||||
themeColor: themeColors[item.name]
|
themeColor: themeColors[item.name]
|
||||||
}))
|
}))
|
||||||
|
|
@ -1123,7 +1133,7 @@ export const useGroupMemberStore = defineStore("groupMember", {
|
||||||
xAxisData: item.chart.xaxisData.map((item) => utcStringToHHMMSS(item)),
|
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)},
|
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) => ({
|
seriesList: item.chart.seriesList.map((item) => ({
|
||||||
data: item.data,
|
data: item.data.map((item) => item.toFixed(2)),
|
||||||
name: item.name,
|
name: item.name,
|
||||||
themeColor: themeColors[item.name]
|
themeColor: themeColors[item.name]
|
||||||
}))
|
}))
|
||||||
|
|
@ -1176,6 +1186,8 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
graph: {},
|
||||||
|
timeList: [],
|
||||||
wordCloudData: [
|
wordCloudData: [
|
||||||
{
|
{
|
||||||
text: "局座",
|
text: "局座",
|
||||||
|
|
@ -1364,5 +1376,59 @@ export const useAnomalousGroup = defineStore("anomalousGroup", {
|
||||||
KS: 0.02
|
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 // 开启持久化
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle-container">
|
<div class="middle-container">
|
||||||
<div class="graph"></div>
|
<div class="graph">
|
||||||
|
<GroupGraph
|
||||||
|
:store="anomalousGroupStore"
|
||||||
|
@click:pointerDownAndSlide="handleChangeXAxis"
|
||||||
|
></GroupGraph>
|
||||||
|
</div>
|
||||||
<div class="postList">
|
<div class="postList">
|
||||||
<GroupPost :posts="anomalousGroupStore.posts" :isAbnormal="true" :moduleName="moduleName"></GroupPost>
|
<GroupPost :posts="anomalousGroupStore.posts" :isAbnormal="true" :moduleName="moduleName"></GroupPost>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -58,10 +63,11 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from "vue";
|
import { onMounted, ref } from "vue";
|
||||||
import userGroupTitle from "@/assets/images/abnormalGroup/abnormal-user-group-title.png"
|
import userGroupTitle from "@/assets/images/abnormalGroup/abnormal-user-group-title.png"
|
||||||
import userChartTitleImg from "@/assets/images/abnormalGroup/abnormal-group-hudo-time-chart.png"
|
import userChartTitleImg from "@/assets/images/abnormalGroup/abnormal-group-hudo-time-chart.png"
|
||||||
import { Icon } from "@iconify/vue";
|
import { Icon } from "@iconify/vue";
|
||||||
|
import GroupGraph from "../component/groupGraph.vue"
|
||||||
import WordsCloud from "../component/wordsCloud.vue"
|
import WordsCloud from "../component/wordsCloud.vue"
|
||||||
import GroupPanel from "./components/groupPanel.vue"
|
import GroupPanel from "./components/groupPanel.vue"
|
||||||
import GroupPost from "../component/groupPost.vue"
|
import GroupPost from "../component/groupPost.vue"
|
||||||
|
|
@ -72,6 +78,18 @@ import { useAnomalousGroup } from "@/store/groupEvolution/index";
|
||||||
const anomalousGroupStore = useAnomalousGroup();
|
const anomalousGroupStore = useAnomalousGroup();
|
||||||
const moduleName = "异常行为分析"
|
const moduleName = "异常行为分析"
|
||||||
|
|
||||||
|
|
||||||
|
const handleChangeXAxis = (utcTime) => {
|
||||||
|
|
||||||
|
console.log("点击时间轴:",utcTime)
|
||||||
|
// 根据时间轴变化更改群体结构信息列表
|
||||||
|
|
||||||
|
// 根据时间轴变化更改群体结构演化分析的群体演化信息-中下-随时间轴变化
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//控制弹窗
|
//控制弹窗
|
||||||
const postDialog = ref(false);
|
const postDialog = ref(false);
|
||||||
|
|
||||||
|
|
@ -82,6 +100,11 @@ const handleOpenPostDialog = (post) => {
|
||||||
postDialog.value = true;
|
postDialog.value = true;
|
||||||
currentPostPost.value = post;
|
currentPostPost.value = post;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await anomalousGroupStore.initializeAbnormalGroupTimeLine()
|
||||||
|
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,7 @@ const initChart = () => {
|
||||||
.join("")
|
.join("")
|
||||||
return `
|
return `
|
||||||
<div style="
|
<div style="
|
||||||
width:150px;
|
|
||||||
border-radius:6px;
|
border-radius:6px;
|
||||||
background:linear-gradient(304deg, rgba(28,103,175,0.3) -6.04%, rgba(2,95,137,0.3) 85.2%);
|
background:linear-gradient(304deg, rgba(28,103,175,0.3) -6.04%, rgba(2,95,137,0.3) 85.2%);
|
||||||
backdrop-filter:blur(4px);
|
backdrop-filter:blur(4px);
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,7 @@ onMounted(() => {
|
||||||
.tabs {
|
.tabs {
|
||||||
width: 97%;
|
width: 97%;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
|
padding: 0px 20px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
|
||||||
|
|
@ -81,17 +81,15 @@ const updateCharts = (groupList) => {
|
||||||
if (chartInstances.has(group.id)) {
|
if (chartInstances.has(group.id)) {
|
||||||
// 图表实例存在,只更新数据
|
// 图表实例存在,只更新数据
|
||||||
const myChart = chartInstances.get(group.id);
|
const myChart = chartInstances.get(group.id);
|
||||||
|
|
||||||
// 计算maxValue
|
// 计算maxValue
|
||||||
const firstElement = group.value[0];
|
const firstElement = group.value[0];
|
||||||
const allEqual = group.value.every(item => item === firstElement);
|
const allEqual = group.value.every(item => item === firstElement);
|
||||||
let maxValue = 0;
|
let maxValue = 0;
|
||||||
if(allEqual){
|
if(allEqual){
|
||||||
maxValue = Number(firstElement) + 40;
|
maxValue = parseFloat(firstElement) + 40;
|
||||||
}else{
|
}else{
|
||||||
maxValue = Math.ceil(Math.max(...group.value));
|
maxValue = Math.ceil(Math.max(...group.value.map(item => parseFloat(item))));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新图表选项
|
// 更新图表选项
|
||||||
myChart.setOption({
|
myChart.setOption({
|
||||||
radar: {
|
radar: {
|
||||||
|
|
@ -135,9 +133,9 @@ const updateCharts = (groupList) => {
|
||||||
const allEqual = group.value.every(item => item === firstElement);
|
const allEqual = group.value.every(item => item === firstElement);
|
||||||
let maxValue = 0;
|
let maxValue = 0;
|
||||||
if(allEqual){
|
if(allEqual){
|
||||||
maxValue = firstElement + 20;
|
maxValue = parseFloat(firstElement) + 20;
|
||||||
}else{
|
}else{
|
||||||
maxValue = Math.ceil(Math.max(...group.value));
|
maxValue = Math.ceil(Math.max(...group.value.map(item => parseFloat(item))));
|
||||||
}
|
}
|
||||||
|
|
||||||
const option = {
|
const option = {
|
||||||
|
|
@ -163,10 +161,10 @@ const updateCharts = (groupList) => {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
">
|
">
|
||||||
<div style="color:#fff;letter-spacing: 0.14px;">
|
<div style="color:#fff;letter-spacing: 0.14px;">
|
||||||
<div >成长:${params.data.value[0] - 20}</div>
|
<div >成长:${(parseFloat(params.data.value[0]) - 20).toFixed(2)}</div>
|
||||||
<div >收缩:${params.data.value[1] - 20}</div>
|
<div >收缩:${(parseFloat(params.data.value[1]) - 20).toFixed(2)}</div>
|
||||||
<div >合并:${params.data.value[2] - 20}</div>
|
<div >合并:${(parseFloat(params.data.value[2]) - 20).toFixed(2)}</div>
|
||||||
<div >分裂:${params.data.value[3] - 20}</div>
|
<div >分裂:${(parseFloat(params.data.value[3]) - 20).toFixed(2)}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { defineProps, onMounted, ref } from "vue";
|
import { defineProps, onMounted, ref, watch } from "vue";
|
||||||
import GroupChart from "../../component/groupChart.vue";
|
import GroupChart from "../../component/groupChart.vue";
|
||||||
const curSelectedTab = ref("头部自媒体");
|
const curSelectedTab = ref("头部自媒体");
|
||||||
const curSelectedTabData = ref(null);
|
const curSelectedTabData = ref(null);
|
||||||
|
|
@ -43,6 +43,27 @@ const props = defineProps({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 添加对chartsData的深度监听
|
||||||
|
watch(
|
||||||
|
() => props.chartsData,
|
||||||
|
(newVal) => {
|
||||||
|
// 当chartsData加载完成且不为空时,更新当前选中标签的数据
|
||||||
|
if (newVal && Object.keys(newVal).length > 0) {
|
||||||
|
const keyMapList = {
|
||||||
|
头部自媒体: "topSelfMedia",
|
||||||
|
官方媒体: "officalMedia",
|
||||||
|
普通自媒体: "ordinaryMedia"
|
||||||
|
};
|
||||||
|
const currentKey = keyMapList[curSelectedTab.value];
|
||||||
|
if (newVal[currentKey]) {
|
||||||
|
curSelectedTabData.value = newVal[currentKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ deep: true, immediate: true } // 深度监听并立即执行一次
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
const handleSwitch = (item) => {
|
const handleSwitch = (item) => {
|
||||||
curSelectedTab.value = item;
|
curSelectedTab.value = item;
|
||||||
const keyMapList = {
|
const keyMapList = {
|
||||||
|
|
@ -71,6 +92,7 @@ onMounted(() => {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
.tabs {
|
.tabs {
|
||||||
|
padding: 0px 20px;
|
||||||
width: 97%;
|
width: 97%;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user