diff --git a/src/service/api/linkPrediction.js b/src/service/api/linkPrediction.js index d950d77..03fda15 100644 --- a/src/service/api/linkPrediction.js +++ b/src/service/api/linkPrediction.js @@ -68,11 +68,22 @@ export function getSocialCommunityList() { return http.get(`/linkPrediction/triangle/community`) } -// 社交紧密团体中社团内的 - +// 社交紧密团体中社团内的社团内部节点 从用户组中点击,只显示这两个用户的关系 +export function getSocialCommunityDetailFromUserGroup( + relationId, + time = "2024-05-16 16:56:04" +) { + return http.get(`/linkPrediction/user_detail?relationId=${relationId}&time=${time}`) +} // 社交紧密团体的社团内部节点 -export function getSocialCommunityDetailNodes(ids, time = "2024-05-16 16:56:04") { - return http.get(`/linkPrediction/triangle/community_detail?groupIds=${ids}&dateTime=${time}`) +export function getSocialCommunityDetailNodes(ids, relationId, time = "2024-05-16 16:56:04") { + if (relationId != -1) { + return http.get( + `/linkPrediction/triangle/community_detail?groupIds=${ids}&dateTime=${time}&relationId=${relationId}` + ) + } else { + return http.get(`/linkPrediction/triangle/community_detail?groupIds=${ids}&dateTime=${time}`) + } } //人物社交隐关系预测用户组列表 diff --git a/src/store/llinkPrediction/index.js b/src/store/llinkPrediction/index.js index a567cc5..66dd2de 100644 --- a/src/store/llinkPrediction/index.js +++ b/src/store/llinkPrediction/index.js @@ -217,9 +217,13 @@ export const useSocialGroupsStore = defineStore("socialGroups", { curComponent: "CommunityNode", curSelecedGroupIds: [], communityDetailNodeList: [], + // 社交紧密团体的所有用户 + communityAllNodeList: [], timeList: [], // 当前需要高亮的用户id curHighlightUserIdList: [], + // 当前的relationId + curRelationId: "", // 记录点击边的时序列表 clickEdgeTimeList: [], // 记录是从边点的还是列表项中的点击 @@ -449,16 +453,29 @@ export const useSocialGroupsStore = defineStore("socialGroups", { })) }, // 传递社交团体的数组,获取其详情 - async initGraphCommunityDetailNode(ids, time = "2024-05-16 16:56:04") { + async initGraphCommunityDetailNode(ids, time = "2024-05-16 16:56:04", relationId = -1) { this.curSelecedGroupIds = ids - const res = await getSocialCommunityDetailNodes(ids, time) + const res = await getSocialCommunityDetailNodes(ids, relationId, time) if (res.code != 200) return console.log("index.js:",res.data) + const customStatisticsObj = Object.assign({}, res.data.communityStatistics) + //计算两个用户是否同属与同一个社团 + if ( + customStatisticsObj.groupCount == null && + customStatisticsObj.hiddenInteractionCount == null + ) { + customStatisticsObj.hiddenInteractionCount = 1 + customStatisticsObj.groupCount = ids[0] === ids[1] ? 1 : 3 + } + this.statisticsDetailList = this.statisticsDetailList.map((item) => ({ ...item, - count: res.data.communityStatistics[item.key] + count: customStatisticsObj[item.key] })) + // 设置社交紧密团体的所有用户id + this.communityAllNodeList = res.data.userList this.communityDetailNodeList = res.data.userRelation + this.curHighlightUserIdList = res.data.predictNodes }, // 修改timeList @@ -467,10 +484,10 @@ export const useSocialGroupsStore = defineStore("socialGroups", { }, // 点击边,先获取需要的timeList async getClickEdgeTimeList(ids, time = "2024-05-16 16:56:04") { - const res = await getSocialCommunityDetailNodes(ids, time) + const relationId = -1 + const res = await getSocialCommunityDetailNodes(ids, relationId, time) if (res.code != 200) return console.log("3.获取边中的timelist并设置成它") - this.curHighlightUserIdList = res.data.predictNodes this.setTimeList(res.data.timeList) } }, diff --git a/src/views/LinkPrediction/socialGroups/components/detailNode.vue b/src/views/LinkPrediction/socialGroups/components/detailNode.vue index c84a1f9..46720b2 100644 --- a/src/views/LinkPrediction/socialGroups/components/detailNode.vue +++ b/src/views/LinkPrediction/socialGroups/components/detailNode.vue @@ -176,7 +176,11 @@ const handlePointerDown = (e) => { // 点击后输出当前时间 const currentTimes = TansTimestamp(currentTime.value, "YYYY-MM-DD HH:mm:ss") - socialGroupsStore.initGraphCommunityDetailNode(socialGroupsStore.curSelecedGroupIds, currentTimes) + if(socialGroupsStore.curRelationId === "") { + socialGroupsStore.initGraphCommunityDetailNode(socialGroupsStore.curSelecedGroupIds, currentTimes) + } else { + socialGroupsStore.initGraphCommunityDetailNode(socialGroupsStore.curSelecedGroupIds, currentTimes, socialGroupsStore.curRelationId) + } } // 时间点指针按下事件 @@ -201,7 +205,11 @@ const handlePointPointerDown = (e) => { isDragging.value = false // 拖动结束时输出当前时间 const currentTimes = TansTimestamp(currentTime.value, "YYYY-MM-DD HH:mm:ss") - socialGroupsStore.initGraphCommunityDetailNode(socialGroupsStore.curSelecedGroupIds, currentTimes) + if(socialGroupsStore.curRelationId === "") { + socialGroupsStore.initGraphCommunityDetailNode(socialGroupsStore.curSelecedGroupIds, currentTimes) + } else { + socialGroupsStore.initGraphCommunityDetailNode(socialGroupsStore.curSelecedGroupIds, currentTimes, socialGroupsStore.curRelationId) + } document.removeEventListener("pointermove", handlePointerMove) document.removeEventListener("pointerup", handlePointerUp) @@ -239,28 +247,21 @@ const initChart = async () => { else if (interactionTime > 30) return 10 else return 1 } - // 添加边唯一标识集合,用于检测重复边 - const edgeSet = new Set() if (!Object.keys(socialGroupsStore.communityDetailNodeList).length) return - Object.entries(socialGroupsStore.communityDetailNodeList).forEach(([parentId, children]) => { + // 先获取到所有节点 + socialGroupsStore.communityAllNodeList.forEach((item) => { nodes.push({ - id: `parent_${parentId}`, - name: parentId + id: item.userId, + name: item.userName, + symbolSize: 40, + postNum: item.postNum, + fancy: item.fans }) + }) + Object.entries(socialGroupsStore.communityDetailNodeList).forEach(([parentId, children]) => { children.forEach((child) => { - if (!nodes.some((n) => n.id === child.id)) { - nodes.push(child) - } - // 生成标准化边标识(排序后拼接,确保1-2和2-1视为同一条边) - const source = `parent_${parentId}` - const target = child.id - const edgeKey = [source, target].sort().join('-') - if(!edgeSet.has(edgeKey)){ - edgeSet.add(edgeKey) - - } links.push({ - source: `parent_${parentId}`, + source: parentId, target: child.id, edge: child.isHidden ? 1 : 0, interactionTimes: child.interactionTime, @@ -270,6 +271,8 @@ const initChart = async () => { type: child.isHidden ? "dashed" : "solid" // 无互动=实线,有互动=虚线 } }) + + }) }) @@ -402,7 +405,8 @@ const initChart = async () => { flex-direction: column; ">