Skip to content

Commit 0f6cbff

Browse files
author
Taois
committed
feat:搜索恢复功能
1 parent 67ffb9f commit 0f6cbff

File tree

2 files changed

+83
-11
lines changed

2 files changed

+83
-11
lines changed

dashboard/src/components/Header.vue

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,32 @@ export default defineComponent({
139139
return route.name === 'SearchAggregation';
140140
});
141141
142-
// 检测是否有搜索结果(当在搜索页面且有搜索关键词时
142+
// 检测是否有搜索结果(当在搜索页面且有搜索关键词或保存的搜索状态时
143143
const hasSearchResults = computed(() => {
144-
return isSearchAggregationPage.value && route.query.keyword;
144+
// 依赖forceUpdate来触发重新计算
145+
forceUpdate.value;
146+
147+
if (!isSearchAggregationPage.value) {
148+
return false;
149+
}
150+
151+
// 检查URL参数
152+
if (route.query.keyword) {
153+
return true;
154+
}
155+
156+
// 检查是否有保存的搜索状态
157+
try {
158+
const savedState = localStorage.getItem('pageState_searchAggregation');
159+
if (savedState) {
160+
const state = JSON.parse(savedState);
161+
return state.hasSearched && state.searchKeyword;
162+
}
163+
} catch (error) {
164+
console.error('检查搜索状态失败:', error);
165+
}
166+
167+
return false;
145168
});
146169
147170
// 从localStorage获取聚搜功能状态
@@ -161,9 +184,14 @@ export default defineComponent({
161184
// 响应式的聚搜状态
162185
const searchAggregationEnabled = ref(getSearchAggregationStatus());
163186
187+
// 用于强制更新hasSearchResults计算属性的响应式变量
188+
const forceUpdate = ref(0);
189+
164190
// 监听localStorage变化
165191
const updateSearchAggregationStatus = () => {
166192
searchAggregationEnabled.value = getSearchAggregationStatus();
193+
// 强制更新hasSearchResults计算属性
194+
forceUpdate.value++;
167195
};
168196
169197
// 监听storage事件
@@ -275,6 +303,15 @@ export default defineComponent({
275303
closeSearchResults() {
276304
// 关闭搜索结果,回到搜索页面的初始状态
277305
this.searchValue = '';
306+
307+
// 清除保存的页面状态
308+
try {
309+
localStorage.removeItem('pageState_searchAggregation');
310+
console.log('🔄 [状态清理] 已清除聚合搜索页面保存的状态');
311+
} catch (error) {
312+
console.error('清除页面状态失败:', error);
313+
}
314+
278315
this.$router.push({ name: 'SearchAggregation' });
279316
},
280317
minimize() {

dashboard/src/views/SearchAggregation.vue

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,13 +1029,34 @@ export default defineComponent({
10291029
displayedCount: displayedCount.value,
10301030
scrollPosition: scrollPosition.value,
10311031
scrollAreaHeight: scrollAreaHeight.value,
1032-
loadingMore: loadingMore.value
1032+
loadingMore: loadingMore.value,
1033+
timestamp: Date.now() // 添加时间戳用于判断状态新鲜度
10331034
};
10341035
pageStateStore.savePageState('searchAggregation', state);
10351036
console.log('🔄 [状态保存] 保存聚合搜索页面状态:', state);
10361037
}
10371038
};
10381039
1040+
// 清除页面状态
1041+
const clearPageState = () => {
1042+
pageStateStore.clearPageState('searchAggregation');
1043+
console.log('🔄 [状态清理] 已清除聚合搜索页面状态');
1044+
1045+
// 重置所有状态到初始值
1046+
searchKeyword.value = '';
1047+
hasSearched.value = false;
1048+
searchResults.value = {};
1049+
loadingStates.value = {};
1050+
errorStates.value = {};
1051+
activeSource.value = '';
1052+
currentPages.value = {};
1053+
hasMorePages.value = {};
1054+
searchCompletedTimes.value = {};
1055+
displayedCount.value = pageSize.value;
1056+
scrollPosition.value = 0;
1057+
loadingMore.value = false;
1058+
};
1059+
10391060
const restorePageState = () => {
10401061
const savedState = pageStateStore.getPageState('searchAggregation');
10411062
if (savedState && !pageStateStore.isStateExpired('searchAggregation')) {
@@ -1097,23 +1118,36 @@ export default defineComponent({
10971118
const isReturnFromDetail = route.query._returnFromDetail === 'true';
10981119
console.log('🔄 [状态恢复] 是否从详情页返回:', isReturnFromDetail);
10991120
1121+
// 检查URL中是否有关键词参数
1122+
const urlKeyword = route.query.keyword;
1123+
11001124
// 尝试恢复页面状态
11011125
const restored = restorePageState();
11021126
if (restored) {
11031127
console.log('🔄 [状态恢复] 成功恢复聚合搜索页面状态');
11041128
1105-
// 如果是从详情页返回,优先使用恢复的状态,不执行新搜索
1129+
// 检查恢复的状态是否与URL参数匹配
1130+
const stateKeyword = searchKeyword.value;
1131+
11061132
if (isReturnFromDetail) {
1133+
// 如果是从详情页返回,优先使用恢复的状态,不执行新搜索
11071134
console.log('🔄 [状态恢复] 从详情页返回,使用恢复的状态,不执行新搜索');
1108-
} else if (route.query.keyword && route.query.keyword !== searchKeyword.value) {
1109-
// 如果不是从详情页返回,且URL中有不同的关键词,则执行新的搜索
1110-
console.log('🔄 [状态恢复] URL关键词与恢复状态不同,执行新搜索:', route.query.keyword);
1111-
performSearch(route.query.keyword);
1135+
} else if (urlKeyword && urlKeyword === stateKeyword) {
1136+
// URL关键词与恢复状态匹配,使用恢复的状态
1137+
console.log('🔄 [状态恢复] URL关键词与恢复状态匹配,使用恢复的状态');
1138+
} else if (urlKeyword && urlKeyword !== stateKeyword) {
1139+
// URL关键词与恢复状态不匹配,执行新搜索
1140+
console.log('🔄 [状态恢复] URL关键词与恢复状态不匹配,执行新搜索:', urlKeyword);
1141+
performSearch(urlKeyword);
1142+
} else if (!urlKeyword && stateKeyword) {
1143+
// URL中没有关键词但有恢复状态,说明用户可能点击了关闭按钮,清除状态
1144+
console.log('🔄 [状态恢复] URL中没有关键词但有恢复状态,清除状态回到初始页面');
1145+
clearPageState();
11121146
}
1113-
} else if (route.query.keyword) {
1147+
} else if (urlKeyword) {
11141148
// 如果没有恢复状态但URL中有关键词,则执行搜索
1115-
console.log('🔄 [状态恢复] 没有保存状态,根据URL关键词执行搜索:', route.query.keyword);
1116-
performSearch(route.query.keyword);
1149+
console.log('🔄 [状态恢复] 没有保存状态,根据URL关键词执行搜索:', urlKeyword);
1150+
performSearch(urlKeyword);
11171151
}
11181152
11191153
// 清理URL中的返回标识
@@ -1167,6 +1201,7 @@ export default defineComponent({
11671201
handleScroll,
11681202
handleActionClose,
11691203
randomizeHotSearchTags,
1204+
clearPageState,
11701205
// 最近搜索
11711206
recentSearches,
11721207
clearRecentSearches,

0 commit comments

Comments
 (0)