|
@@ -364,8 +364,8 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { ref, onMounted, onBeforeUnmount } from "vue";
|
|
|
|
|
-import { useRouter } from "vue-router";
|
|
|
|
|
|
|
+import { ref, onMounted, onBeforeUnmount, watch, nextTick } from "vue";
|
|
|
|
|
+import { useRouter, useRoute } from "vue-router";
|
|
|
import { searchVideoByTags, searchVideoByKeyword } from "@/services/api";
|
|
import { searchVideoByTags, searchVideoByKeyword } from "@/services/api";
|
|
|
import { videoMenus as fixedVideoMenus } from "@/data/videoMenus";
|
|
import { videoMenus as fixedVideoMenus } from "@/data/videoMenus";
|
|
|
import VideoProcessor from "@/components/VideoProcessor.vue";
|
|
import VideoProcessor from "@/components/VideoProcessor.vue";
|
|
@@ -374,10 +374,14 @@ import { VipLevel } from "@/types/vip";
|
|
|
|
|
|
|
|
// 路由
|
|
// 路由
|
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
|
|
+const route = useRoute();
|
|
|
|
|
|
|
|
// 用户状态
|
|
// 用户状态
|
|
|
const userStore = useUserStore();
|
|
const userStore = useUserStore();
|
|
|
|
|
|
|
|
|
|
+// 是否从视频播放页返回
|
|
|
|
|
+const isReturnFromVideo = ref(false);
|
|
|
|
|
+
|
|
|
// 生成MAC地址作为设备标识
|
|
// 生成MAC地址作为设备标识
|
|
|
const generateMacAddress = (): string => {
|
|
const generateMacAddress = (): string => {
|
|
|
const hex = "0123456789ABCDEF";
|
|
const hex = "0123456789ABCDEF";
|
|
@@ -569,6 +573,9 @@ const handleSearch = async (keyword: string, page = 1) => {
|
|
|
|
|
|
|
|
// 播放视频
|
|
// 播放视频
|
|
|
const playVideo = (video: any) => {
|
|
const playVideo = (video: any) => {
|
|
|
|
|
+ // 保存当前浏览状态,以便返回时恢复
|
|
|
|
|
+ saveCurrentState();
|
|
|
|
|
+
|
|
|
const vipLevel = userStore.getVipLevel();
|
|
const vipLevel = userStore.getVipLevel();
|
|
|
|
|
|
|
|
if (vipLevel === VipLevel.GUEST || vipLevel === VipLevel.FREE) {
|
|
if (vipLevel === VipLevel.GUEST || vipLevel === VipLevel.FREE) {
|
|
@@ -631,10 +638,83 @@ const loadVideosByTag = async (tagHash: string, page = 1) => {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+// 保存当前浏览状态
|
|
|
|
|
+const saveCurrentState = () => {
|
|
|
|
|
+ // 保存当前滚动位置
|
|
|
|
|
+ const scrollPosition = window.scrollY || document.documentElement.scrollTop;
|
|
|
|
|
+
|
|
|
|
|
+ console.log("保存主页状态,当前视频列表长度:", videoList.value.length);
|
|
|
|
|
+
|
|
|
|
|
+ userStore.saveHomePageState({
|
|
|
|
|
+ selectedMenu: selectedMenu.value,
|
|
|
|
|
+ currentPage: currentPage.value,
|
|
|
|
|
+ selectedSort: selectedSort.value,
|
|
|
|
|
+ scrollPosition: scrollPosition,
|
|
|
|
|
+ isSearchMode: isSearchMode.value,
|
|
|
|
|
+ currentSearchKeyword: currentSearchKeyword.value,
|
|
|
|
|
+ videoList: videoList.value,
|
|
|
|
|
+ totalPages: totalPages.value,
|
|
|
|
|
+ totalCount: totalCount.value,
|
|
|
|
|
+ });
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// 恢复保存的浏览状态
|
|
|
|
|
+const restoreSavedState = async () => {
|
|
|
|
|
+ const savedState = userStore.getHomePageState();
|
|
|
|
|
+ console.log("恢复主页状态:", savedState);
|
|
|
|
|
+
|
|
|
|
|
+ // 恢复状态
|
|
|
|
|
+ selectedMenu.value = savedState.selectedMenu;
|
|
|
|
|
+ selectedSort.value = savedState.selectedSort;
|
|
|
|
|
+ isSearchMode.value = savedState.isSearchMode;
|
|
|
|
|
+ currentSearchKeyword.value = savedState.currentSearchKeyword;
|
|
|
|
|
+ currentPage.value = savedState.currentPage;
|
|
|
|
|
+
|
|
|
|
|
+ // 直接使用已保存的视频列表数据,不重新调用API
|
|
|
|
|
+ if (savedState.videoList && savedState.videoList.length > 0) {
|
|
|
|
|
+ console.log("使用已保存的视频列表数据,不重新调用API");
|
|
|
|
|
+ videoList.value = savedState.videoList;
|
|
|
|
|
+ totalPages.value = savedState.totalPages || 0;
|
|
|
|
|
+ totalCount.value = savedState.totalCount || 0;
|
|
|
|
|
+
|
|
|
|
|
+ // 使用setTimeout确保DOM完全更新后再滚动
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ console.log("恢复滚动位置:", savedState.scrollPosition);
|
|
|
|
|
+ window.scrollTo({
|
|
|
|
|
+ top: savedState.scrollPosition,
|
|
|
|
|
+ behavior: "auto",
|
|
|
|
|
+ });
|
|
|
|
|
+ }, 100);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.log("没有保存的视频列表数据,需要重新加载");
|
|
|
|
|
+ // 加载视频数据
|
|
|
|
|
+ if (isSearchMode.value && currentSearchKeyword.value) {
|
|
|
|
|
+ await handleSearch(currentSearchKeyword.value, savedState.currentPage);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ await loadVideosByTag(selectedMenu.value, savedState.currentPage);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 使用setTimeout确保DOM完全更新后再滚动
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ console.log("恢复滚动位置:", savedState.scrollPosition);
|
|
|
|
|
+ window.scrollTo({
|
|
|
|
|
+ top: savedState.scrollPosition,
|
|
|
|
|
+ behavior: "auto",
|
|
|
|
|
+ });
|
|
|
|
|
+ }, 100);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
// 初始化视频菜单和加载默认视频
|
|
// 初始化视频菜单和加载默认视频
|
|
|
const initializeVideoMenus = async () => {
|
|
const initializeVideoMenus = async () => {
|
|
|
- // 默认不选择任何菜单,加载所有视频
|
|
|
|
|
- await loadVideosByTag("");
|
|
|
|
|
|
|
+ if (isReturnFromVideo.value) {
|
|
|
|
|
+ // 如果是从视频播放页返回,恢复之前的状态
|
|
|
|
|
+ await restoreSavedState();
|
|
|
|
|
+ isReturnFromVideo.value = false;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 默认不选择任何菜单,加载所有视频
|
|
|
|
|
+ await loadVideosByTag("");
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 监听Header搜索事件
|
|
// 监听Header搜索事件
|
|
@@ -643,7 +723,18 @@ const handleHeaderSearch = (event: CustomEvent) => {
|
|
|
handleSearch(keyword);
|
|
handleSearch(keyword);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+// 检查是否从视频播放页返回
|
|
|
|
|
+const checkReturnFromVideo = () => {
|
|
|
|
|
+ // 检查导航来源
|
|
|
|
|
+ if (route.meta.returnFromVideo) {
|
|
|
|
|
+ isReturnFromVideo.value = true;
|
|
|
|
|
+ // 重置路由元数据,避免重复触发
|
|
|
|
|
+ route.meta.returnFromVideo = false;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
|
|
+ checkReturnFromVideo();
|
|
|
initializeVideoMenus();
|
|
initializeVideoMenus();
|
|
|
// 监听Header搜索事件
|
|
// 监听Header搜索事件
|
|
|
window.addEventListener("header-search", handleHeaderSearch as EventListener);
|
|
window.addEventListener("header-search", handleHeaderSearch as EventListener);
|