| | |
| | | </view> |
| | | |
| | | <view class="trip-card-swiper"> |
| | | <swiper :current="currentPage" @change="onSwiperChange" circular style="min-height: 1450rpx;"> |
| | | <swiper :current="currentPage" @change="onSwiperChange" circular style="min-height: 1850rpx;"> |
| | | <swiper-item v-for="(group, pageIndex) in pagedTripCards" :key="pageIndex"> |
| | | <TripCard v-for="(item, index) in group" :key="index" :tag="item.tag" :title="item.coverTitle" |
| | | :subtitle="item.coverAlt" :score="item.collectCount" :imageUrl="item.coverUrl" |
| | |
| | | </swiper> |
| | | </view> |
| | | |
| | | <SectionTitle title="全球影视地标" optitle="查看全部" goUrl="/pages/home/home-more" /> |
| | | <GlobalGeo /> |
| | | <!-- <SectionTitle title="全球影视地标" optitle="查看全部" goUrl="/pages/home/home-more" />--> |
| | | <!-- <GlobalGeo />--> |
| | | |
| | | <SectionTitle title="场景博物馆" optitle="查看全部" goUrl="/pages/home/home-more" /> |
| | | <SectionTitle title="场景博物馆" optitle="查看全部" goUrl="/sub-pages/hot-spot/index" /> |
| | | <SceneMuseumCard v-for="(item, index) in cardList" :key="index" :image="item.image" :title="item.title" |
| | | :subtitle="item.subtitle" :readTime="item.readTime" /> |
| | | |
| | | <SectionTitle title="光影社区" optitle="加入社区" goUrl="/pages/home/home-more" /> |
| | | <Community v-for="(item, index) in communitys" :key="index" :avatar="item.avatar" :nickname="item.nickname" |
| | | <SectionTitle title="光影天地" optitle="加入光影" goUrl="/sub-pages/community/index" /> |
| | | <Community v-for="(item, index) in communitys" :key="index" :detailUrl="`${detailUrl}?id=${item.id}`" :avatar="item.avatar" :nickname="item.nickname" |
| | | :time="formatRelativeTime(item.createTime)" :image="item.coverUrl" :content="item.coverAlt" |
| | | :likeCount="item.likeCount" :commentCount="item.commentCount" /> |
| | | <view class="more"> |
| | | <!-- <view v-if="loadingCommunity">加载中...</view> |
| | | <view v-if="noMoreCommunity">没有更多了</view> --> |
| | | <up-loadmore :status="communityStatus" /> |
| | | </view> |
| | | <up-loadmore :status="communityStatus" :line="true" /> |
| | | <view style="height: 300rpx;"></view> |
| | | </view> |
| | | |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import { ref, computed, onMounted } from 'vue' |
| | | import { onShow, onPullDownRefresh,onReachBottom } from '@dcloudio/uni-app' |
| | | import { onShow, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app' |
| | | |
| | | import HomeMain from './home-main.vue' |
| | | import TripCard from './trip-card.vue' |
| | |
| | | import Community from './community.vue' |
| | | import { SwiperChangeEvent } from '@dcloudio/uni-app' |
| | | import { useGlobal } from '@/composables/useGlobal' |
| | | import { number } from 'uview-plus/libs/function/test' |
| | | const { $http, $message, $store } = useGlobal() |
| | | import { FilmWorks } from '@/types/index' |
| | | import { formatRelativeTime } from '@/utils/time' |
| | |
| | | |
| | | |
| | | // 旅行卡片数据 |
| | | const detailUrl = '/api/filmworks/list' |
| | | const detailUrl = '/sub-pages/film-list/film-detail' |
| | | const tripCardList = ref<FilmWorks[]>([]) |
| | | |
| | | // 分页后的数组,每页3条 |
| | | const pagedTripCards = computed(() => { |
| | | const pages: FilmWorks[][] = [] |
| | | for (let i = 0; i < tripCardList.value.length; i += pageSize) { |
| | | pages.push(tripCardList.value.slice(i, i + pageSize)) |
| | | const list = tripCardList.value || [] // 安全兜底 |
| | | for (let i = 0; i < list.length; i += pageSize) { |
| | | pages.push(list.slice(i, i + pageSize)) |
| | | } |
| | | return pages |
| | | }) |
| | | |
| | | // 总页数 |
| | | const totalPages = computed(() => Math.ceil(tripCardList.value.length / pageSize)) |
| | | const totalPages = computed(() => { |
| | | const list = tripCardList.value || [] // 安全兜底 |
| | | return Math.ceil(list.length / pageSize) |
| | | }) |
| | | |
| | | // 场景博物馆卡片数据 |
| | | const cardList = ref([ |
| | | { |
| | | image: 'https://ai-public.mastergo.com/ai/img_res/6a226f9e9652c51cd535c3490535dfeb.jpg', |
| | | title: '《盗梦空间》巴黎咖啡馆', |
| | | subtitle: '拷素诺兰如何创造这个标志性场景', |
| | | readTime: '12分钟阅读', |
| | | }, |
| | | { |
| | | image: 'https://img.yzcdn.cn/vant/cat.jpeg', |
| | | title: '《星际穿越》玉米田', |
| | | subtitle: '诺兰如何还原地球末日场景', |
| | | readTime: '8分钟阅读', |
| | | }, |
| | | { |
| | | image: 'https://img.yzcdn.cn/vant/cat.jpeg', |
| | | title: '《星球大战》塔图因星球', |
| | | subtitle: '经典科幻电影中的沙漠设定', |
| | | readTime: '10分钟阅读', |
| | | }, |
| | | ]) |
| | | // 场景博物馆卡片数据 |
| | | const cardList = ref<Array<{ |
| | | image: string |
| | | title: string |
| | | subtitle: string |
| | | readTime: string |
| | | }>>([]) |
| | | |
| | | // 社区帖子数据 |
| | | // 数据 |
| | | const communitys = ref<FilmWorks[]>([]) |
| | | |
| | | |
| | |
| | | // 内容精选 |
| | | getContentSelected() |
| | | |
| | | // 光影社区 |
| | | // 光影 |
| | | getCommunitys() |
| | | |
| | | // 场景博物馆 |
| | | getSceneMuseumData() |
| | | }); |
| | | |
| | | |
| | |
| | | console.log('用户下拉刷新了') |
| | | // 内容精选 |
| | | getContentSelected() |
| | | // 光影社区 |
| | | communityPage.value=1 |
| | | // 光影 |
| | | communityPage.value = 1 |
| | | getCommunitys() |
| | | uni.stopPullDownRefresh() // 停止下拉刷新动画 |
| | | }) |
| | | |
| | | onReachBottom(()=>{ |
| | | onReachBottom(() => { |
| | | console.log('用户触底了') |
| | | getCommunitys() |
| | | }) |
| | | |
| | | const getContentSelected = async () => { |
| | | tripCardList.value = await getFilmWorks(FilmWorksCategory.CONTENT_SELECTED, 20,1); |
| | | tripCardList.value = await getFilmWorks(FilmWorksCategory.CONTENT_SELECTED, 20, 1); |
| | | } |
| | | |
| | | |
| | | const communityPage = ref(1) |
| | | const communitySize = 10 |
| | | const communityStatus = ref('loading') |
| | | |
| | | |
| | | const getCommunitys = async () => { |
| | | if (communityStatus.value==='nomore') return |
| | | if (communityStatus.value === 'nomore') return |
| | | |
| | | communityStatus.value = 'loading' |
| | | |
| | |
| | | communityStatus.value = 'noMore' |
| | | } |
| | | } |
| | | const getCommunitys_bak = async () => { |
| | | communitys.value = await getFilmWorks(FilmWorksCategory.COMMUNITY, 10,1); |
| | | |
| | | |
| | | // 获取场景博物馆数据 |
| | | const getSceneMuseumData = async () => { |
| | | try { |
| | | const { code, data } = await $http.request('get', '/api/filmLocation/getTop3') |
| | | if (code === 0 && data) { |
| | | cardList.value = data.map(item => ({ |
| | | image: item.locationUrl, |
| | | title: item.locationName, |
| | | subtitle: item.address, |
| | | readTime: `${item.locationWeight}热度` |
| | | })) |
| | | } |
| | | } catch (error) { |
| | | console.error('获取场景博物馆数据失败:', error) |
| | | $message.showToast('获取场景博物馆数据失败') |
| | | } |
| | | } |
| | | // 内容精选 |
| | | const getFilmWorks = async (type: String, pageSize: Number,currentPage: Number) => { |
| | | const getFilmWorks = async (type: String, pageSize: Number, currentPage: Number) => { |
| | | const { |
| | | code, data |
| | | } = await $http.request('get', '/api/filmWorks/list', { |
| | | params: { |
| | | classify: type, |
| | | size: pageSize, |
| | | status: 'published', |
| | | current: currentPage |
| | | } |
| | | }) |
| | |
| | | $message.showToast('系统异常,无法获取数据') |
| | | return null; |
| | | } |
| | | |
| | | } |
| | | |
| | | // 下一页 |