| | |
| | | <view class="header"> |
| | | <up-icon name="list" size="40rpx" color="#333333" @click="onSettingClick" /> |
| | | <view> |
| | | <up-tabs :list="list1"> |
| | | <!-- <up-tabs :list="list1"> --> |
| | | <up-tabs v-model:current="parentTabIndex" :list="userTabList" @click="onChangeTab"> |
| | | <!-- <template #left> |
| | | <up-icon name="list" size="40rpx" color="#333333" /> |
| | | </template> --> |
| | |
| | | </up-tabs> |
| | | </view> |
| | | <view class="content-area"> |
| | | <up-waterfall v-model="flowList"> |
| | | <up-waterfall v-model="films"> |
| | | <template #left="{ leftList }"> |
| | | <FlowCard v-for="(item, index) in leftList" :key="index" :item="item" @click="handleDetailClick" /> |
| | | </template> |
| | |
| | | <FlowCard v-for="(item, index) in rightList" :key="index" :item="item" @click="handleDetailClick" /> |
| | | </template> |
| | | </up-waterfall> |
| | | <up-loadmore :status="filmStatus" :line="true" /> |
| | | </view> |
| | | <!-- <view v-for="(item, index) in 100">safsafda</view> --> |
| | | <view style="height: 50px; width: 100%;"></view> |
| | | <common-footer flg="0"></common-footer> |
| | | <setting-popup v-model="settingShow" /> |
| | | </view> |
| | |
| | | <script setup lang="ts"> |
| | | import SettingPopup from '@/components/setting/setting-popup.vue'; |
| | | import { reactive, ref, onMounted } from 'vue'; |
| | | import { onLoad } from '@dcloudio/uni-app' |
| | | import { FilmCategoryTree, FilmWorks } from '@/types/index' |
| | | import { onLoad, onShow, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app' |
| | | import { FilmTabCategory, FilmWorksCategory } from '@/enums/dict' |
| | | import { useGlobal } from '@/composables/useGlobal' |
| | | const { $http, $message, $store } = useGlobal() |
| | | import { getParentTabList, getTabList, getFilmWorksBase } from '@/sub-pages/utils/api' |
| | | import { FilmWorksQueryDTO } from '@/types/index' |
| | | |
| | | import { useNavigator } from '@/composables/useNavigator' |
| | | const { navigateTo } = useNavigator() |
| | | |
| | | // 控制设置弹窗显示 |
| | | const settingShow = ref(false); |
| | |
| | | } |
| | | |
| | | // 创建响应式数据 |
| | | const list1 = reactive([ |
| | | { name: '关注' }, |
| | | { name: '发现' }, |
| | | { name: '苏州' }, |
| | | ]); |
| | | // const list1 = reactive([ |
| | | // { name: '关注' }, |
| | | // { name: '发现' }, |
| | | // { name: '苏州' }, |
| | | // ]); |
| | | const parentTabIndex = ref<number>(0) |
| | | const userTabList = ref<FilmCategoryTree[]>([]) |
| | | const tabList = ref<FilmCategoryTree[]>([]) |
| | | |
| | | const tabList = ref([ |
| | | { id: 'recommend', name: '推荐' }, |
| | | { id: 'straight', name: '直播' }, |
| | | { id: 'short', name: '短剧' }, |
| | | { id: 'food', name: '美食' }, |
| | | { id: 'travel', name: '穿搭' }, |
| | | { id: 'beauty', name: '美甲' }, |
| | | { id: 'more', name: '更多' }, |
| | | ]) |
| | | |
| | | const flowList = ref([ |
| | | { |
| | | id: 1, |
| | | title: 'iPhone 高清全屏壁纸,划走就后悔', |
| | | imgurl: 'https://ai-public.mastergo.com/ai/img_res/6a226f9e9652c51cd535c3490535dfeb.jpg', |
| | | username: '草莓喵喵', |
| | | avatar: '/static/avatar1.jpg', |
| | | likes: 1397 |
| | | }, |
| | | { |
| | | id: 2, |
| | | title: '高清 4K 全屏手机壁纸 #高质量壁纸', |
| | | imgurl: 'https://img.yzcdn.cn/vant/cat.jpeg', |
| | | username: '4K wallpaper', |
| | | avatar: '/static/avatar2.jpg', |
| | | likes: 167 |
| | | }, |
| | | { |
| | | id: 3, |
| | | title: 'iPhone 实况动态壁纸 #动态壁纸', |
| | | imgurl: 'https://img.yzcdn.cn/vant/cat.jpeg', |
| | | username: '图墙精选', |
| | | avatar: '/static/avatar3.jpg', |
| | | likes: 980 |
| | | }, |
| | | { |
| | | id: 4, |
| | | title: '高清小清新壁纸 浪漫的人都有自己的海', |
| | | imgurl: 'https://ai-public.mastergo.com/ai/img_res/6a226f9e9652c51cd535c3490535dfeb.jpg', |
| | | username: 'wallpaper', |
| | | avatar: '/static/avatar4.jpg', |
| | | likes: 456 |
| | | } |
| | | ]) |
| | | |
| | | const handleDetailClick = (item: Item) => { |
| | | const url = |
| | | item.id === 1 |
| | | ? `/sub-pages/film-list/film-official-detail?id=${item.id}` |
| | | : `/sub-pages/film-list/film-detail?id=${item.id}` |
| | | uni.navigateTo({ url }) |
| | | const handleDetailClick = (item: FilmCategoryTree) => { |
| | | const urlOfficicl = `/sub-pages/film-list/film-official-detail?id=${item.id}`; |
| | | const url = `/sub-pages/film-list/film-detail?id=${item.id}` |
| | | navigateTo(url) |
| | | } |
| | | |
| | | const toSearchPage = () => { |
| | | uni.navigateTo({ |
| | | url: '/sub-pages/community/search-page' |
| | | }) |
| | | const url = `/sub-pages/community/search-page` |
| | | navigateTo(url) |
| | | } |
| | | |
| | | const onChangeTab = (item: FilmCategoryTree) => { |
| | | getTabList(item.id, tabList) |
| | | } |
| | | |
| | | const theme = ref('light') |
| | |
| | | const storedTheme = uni.getStorageSync('theme') || 'light' |
| | | theme.value = storedTheme |
| | | }) |
| | | |
| | | |
| | | onShow(() => { |
| | | getDefaultTabList() |
| | | // 获取电影 |
| | | getfilms() |
| | | }); |
| | | |
| | | onPullDownRefresh(async () => { |
| | | console.log('用户下拉刷新了') |
| | | filmPage.value = 1 |
| | | getfilms() |
| | | uni.stopPullDownRefresh() // 停止下拉刷新动画 |
| | | }) |
| | | |
| | | onReachBottom(() => { |
| | | console.log('用户触底了') |
| | | getfilms() |
| | | }) |
| | | |
| | | const getDefaultTabList = async () => { |
| | | await getParentTabList(userTabList, false) |
| | | const curItem = userTabList.value[parentTabIndex.value] |
| | | getTabList(curItem.id, tabList) |
| | | } |
| | | |
| | | const films = ref<FilmWorks[]>([]) |
| | | const filmPage = ref(1) |
| | | const filmSize = 10 |
| | | const filmStatus = ref('loading') |
| | | |
| | | const getfilms = async () => { |
| | | if (filmStatus.value === 'nomore') return |
| | | |
| | | filmStatus.value = 'loading' |
| | | |
| | | // TODO 暂时使用光影社区的类别 |
| | | const query: FilmWorksQueryDTO = { |
| | | classify: '', |
| | | type: '', |
| | | current: filmPage.value, |
| | | size: filmSize, |
| | | }; |
| | | const records = await getFilmWorksBase(query) |
| | | |
| | | if (records && records.length > 0) { |
| | | // 使用 Set 进行去重 |
| | | const existingIds = new Set(films.value.map(item => item.id)) |
| | | const uniqueRecords = records.filter(item => !existingIds.has(item.id)) |
| | | |
| | | films.value = [...films.value, ...uniqueRecords] |
| | | |
| | | // 如果返回的记录数少于请求的 size,说明没有更多数据 |
| | | if (records.length < filmSize) { |
| | | filmStatus.value = 'noMore' |
| | | } |
| | | |
| | | filmPage.value++ |
| | | } else { |
| | | filmStatus.value = 'noMore' |
| | | } |
| | | } |
| | | |
| | | </script> |
| | | <style lang="scss" scoped> |
| | |
| | | |
| | | .content-area { |
| | | // padding: 20rpx; |
| | | margin-bottom: 100px; |
| | | } |
| | | </style> |