diff --git a/src/api/search.js b/src/api/search.js index 7fa5928..6ea2ee9 100644 --- a/src/api/search.js +++ b/src/api/search.js @@ -5,6 +5,16 @@ export const ServeSeachQueryAll = (data = {}) => { return post('/api/v1/elasticsearch/query-all', data) } +// ES搜索用户数据 +export const ServeQueryUser = (data) => { + return post('/api/v1/elasticsearch/query-user', data) +} + +// ES搜索群组数据 +export const ServeQueryGroup = (data) => { + return post('/api/v1/elasticsearch/query-group', data) +} + //ES搜索聊天记录-主页搜索什么都有、聊天记录 export const ServeQueryTalkRecord = (data = {}) => { return post('/api/v1/elasticsearch/query-talk-record', data) diff --git a/src/components/search/searchList.vue b/src/components/search/searchList.vue index 539e26a..17490d1 100644 --- a/src/components/search/searchList.vue +++ b/src/components/search/searchList.vue @@ -41,7 +41,13 @@ >
{{ getHasMoreResult(searchResultKey) }} @@ -147,6 +159,7 @@ import { NInfiniteScroll } from 'naive-ui' import searchItem from './searchItem.vue' import { ref, reactive, defineEmits, defineProps, onMounted, watch } from 'vue' +import { ServeQueryUser, ServeQueryGroup } from '@/api/search' const emits = defineEmits([ 'toMoreResultPage', @@ -164,7 +177,16 @@ const state = reactive({ uid: 12303, //当前用户id clickStayItem: '', //点击停留的item hasMore: true, //是否还有更多数据 - loading: false //加载锁 + loading: false, //加载锁 + userInfosExpand: false, // 控制通讯录全部加载完 + userInfosLoading: false, // 控制通讯录加载更多状态 + userInfosLastId: undefined, // 记录通讯录分页的 last_id + userInfosShowAll: false, // 只要点过"更多通讯录"就为 true + groupInfosExpand: false, // 控制群聊全部加载完 + groupInfosLoading: false, // 控制群聊加载更多状态 + groupInfosLastGroupId: 0, // 记录群聊分页的 last_group_id + groupInfosLastMemberId: 0, // 记录群聊分页的 last_member_id + groupInfosShowAll: false // 只要点过"更多群聊"就为 true }) const props = defineProps({ @@ -214,7 +236,11 @@ const props = defineProps({ useCustomTitle: { type: Boolean, default: false - } //是否使用自定义标题 + }, //是否使用自定义标题 + selectItemInList: { + type: String, + default: '' + } //在列表选中的聊天记录搜索项 }) onMounted(() => { @@ -247,6 +273,13 @@ watch( emits('clickStayItemChange', state.clickStayItem) //重置搜索条件 emits('lastIdChange', 0, 0, 0, '', '') + state.userInfosExpand = false + state.userInfosShowAll = false + state.userInfosLastId = undefined + state.groupInfosExpand = false + state.groupInfosShowAll = false + state.groupInfosLastGroupId = 0 + state.groupInfosLastMemberId = 0 queryAllSearch() } ) @@ -384,6 +417,12 @@ const queryAllSearch = (doClearSearchResult) => { } } state.pageNum = state.pageNum + 1 + // 同步 userInfosLastId + if (typeof data.last_id !== 'undefined') { + state.userInfosLastId = data.last_id + } else { + state.userInfosLastId = undefined + } } else { if (state.pageNum === 1) { // 第一页请求失败,清空结果 @@ -538,6 +577,13 @@ const clickSearchItem = (searchResultKey, searchItem) => { //加载更多数据 const doLoadMore = (doClearSearchResult) => { + if ( + state.userInfosLoading || + state.userInfosShowAll || + state.groupInfosShowAll // 新增判断,群聊展开后不再触发 queryAllSearch + ) { + return + } if (!state.hasMore || state.loading) { return } @@ -546,6 +592,134 @@ const doLoadMore = (doClearSearchResult) => { state.loading = false }) } + +watch( + () => props.selectItemInList, + (newVal, oldVal) => { + if (newVal) { + const selectedItem = JSON.parse(decodeURIComponent(newVal)) + clickSearchItem('general_infos', selectedItem) + } + }, + { + deep: true, + immediate: true + } +) + +// 单独维护通讯录加载更多逻辑,基于 last_id 分页 +async function loadMoreUserInfos() { + if (state.userInfosLoading) return + state.userInfosLoading = true + try { + let params = { + key: state.searchText, + last_id: state.userInfosLastId, + size: 10 + } + const resp = await ServeQueryUser(params) + if (resp.code === 200 && Array.isArray(resp.data.user_infos)) { + if (!state.userInfosLastId) { + // 第一次加载,直接替换 + state.searchResult = { + ...state.searchResult, + user_infos: resp.data.user_infos + } + } else { + // 后续加载,追加 + state.searchResult = { + ...state.searchResult, + user_infos: (state.searchResult.user_infos || []).concat(resp.data.user_infos) + } + } + state.userInfosLastId = resp.data.last_id + // 判断是否全部加载完 + if ( + !resp.data.last_id || + (Array.isArray(resp.data.user_infos) && resp.data.user_infos.length < 10) + ) { + state.userInfosExpand = true + } + } + } finally { + state.userInfosLoading = false + } +} + +// 处理"更多通讯录"、 "更多群聊"点击,调用新方法 +function onMoreResultClick(searchResultKey) { + if (searchResultKey === 'user_infos') { + state.userInfosShowAll = true + loadMoreUserInfos() + } else if (searchResultKey === 'combinedGroup') { + state.groupInfosShowAll = true + loadMoreGroupInfos() + } else { + emits('toMoreResultPage', searchResultKey, state.searchText) + } +} + +// 单独维护群聊加载更多逻辑,基于 last_id 分页 +async function loadMoreGroupInfos() { + if (state.groupInfosLoading) return + state.groupInfosLoading = true + try { + let params = { + key: state.searchText, + last_group_id: state.groupInfosLastGroupId, + last_member_id: state.groupInfosLastMemberId, + size: 10 + } + const resp = await ServeQueryGroup(params) + if (resp.code === 200) { + const groupInfos = Array.isArray(resp.data.group_infos) ? resp.data.group_infos : [] + const groupMemberInfos = Array.isArray(resp.data.group_member_infos) ? resp.data.group_member_infos : [] + + // 给新数据加上 groupTempType + groupInfos.forEach(item => { + item.groupTempType = 'group_infos' + item.group_type = item.type // 保持一致性 + }) + groupMemberInfos.forEach(item => { + item.groupTempType = 'group_member_infos' + }) + + const isFirstLoad = (!state.groupInfosLastGroupId && !state.groupInfosLastMemberId) || + (state.groupInfosLastGroupId === 0 && state.groupInfosLastMemberId === 0) + if (isFirstLoad) { + // 第一次加载,直接替换 + state.searchResult = { + ...state.searchResult, + group_infos: groupInfos, + group_member_infos: groupMemberInfos, + combinedGroup: groupInfos.concat(groupMemberInfos) + } + } else { + // 后续加载,追加 + const allGroupInfos = (state.searchResult.group_infos || []).concat(groupInfos) + const allGroupMemberInfos = (state.searchResult.group_member_infos || []).concat(groupMemberInfos) + state.searchResult = { + ...state.searchResult, + group_infos: allGroupInfos, + group_member_infos: allGroupMemberInfos, + combinedGroup: allGroupInfos.concat(allGroupMemberInfos) + } + } + state.groupInfosLastGroupId = resp.data.last_group_id + state.groupInfosLastMemberId = resp.data.last_member_id + // 判断是否全部加载完 + const noMoreData = ( + (!groupInfos.length && !groupMemberInfos.length) || + (resp.data.last_group_id === 0 && resp.data.last_member_id === 0) + ) + if (noMoreData) { + state.groupInfosExpand = true + } + } + } finally { + state.groupInfosLoading = false + } +}