123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- <!-- 使用 type="home" 属性设置首页,其他页面不需要设置,默认为page;推荐使用json5,更强大,且允许注释 -->
- <route lang="json5" type="home">
- {
- layout: 'tabbar',
- style: {
- navigationStyle: 'custom',
- navigationBarTitleText: '首页',
- },
- }
- </route>
- <script lang="ts" setup>
- import Card from '@/components/card.vue'
- import HotActivity from '@/components/hot-activity.vue'
- import MomentItem from '@/components/moment-item.vue'
- import useRequest from '../../hooks/useRequest'
- import Menus from './components/menus.vue'
- import { getCircles, getSetIndexConfigs, shareCircle } from '../../core/libs/requests'
- import { logo } from '../../core/libs/svgs'
- import PageHelper from '@/components/page-helper.vue'
- import { ComponentExposed } from 'vue-component-type-helpers'
- import { usePermissions } from '../../composables/permissions'
- import { storeToRefs } from 'pinia'
- import { messages } from '../../core/libs/messages'
- import { handleUpvoteClick } from '../../core/libs/actions'
- import { useUserStore } from '../../store'
- defineOptions({
- name: 'Home',
- })
- const instance = getCurrentInstance()
- const userStore = useUserStore()
- const { userInfo } = storeToRefs(userStore)
- const { isLogined, isDesigner } = usePermissions()
- const pageHelperRef = ref<ComponentExposed<typeof PageHelper>>()
- const { data: indexConfigsData, run: setIndexConfigsData } = useRequest(
- () => getSetIndexConfigs(),
- { initialData: { list: [] } },
- )
- const swiperData = ref<{ data: any; videoContext: UniNamespace.VideoContext; playing: boolean }[]>()
- const swiperCurrent = ref(0)
- onShow(async () => {
- pageHelperRef.value?.refresh()
- })
- onLoad(async () => {
- await setIndexConfigsData()
- swiperData.value = indexConfigsData.value.list.map((it) => ({
- data: it,
- videoContext: uni.createVideoContext(`video-${it.id}`, instance),
- playing: false,
- }))
- })
- const toAbout = () => {
- uni.navigateTo({ url: '/pages/home/about/index' })
- }
- const handleSwiperChange = ({ detail: { current } }) => {
- swiperCurrent.value = current
- }
- const handlePlay = () => {
- swiperData.value[swiperCurrent.value].videoContext.play()
- swiperData.value[swiperCurrent.value].playing = true
- }
- const handleLike = async (options) => {
- await handleUpvoteClick({
- ...options,
- userId: userInfo.value.userId,
- userName: userInfo.value.nickname,
- })
- pageHelperRef.value?.refresh()
- }
- onShareAppMessage(async ({ from, target }) => {
- const res: Page.CustomShareContent = {}
- if (from === 'button') {
- await shareCircle(target.id)
- res.path = `/pages/home/moment/index?id=${target.id}`
- res.imageUrl = target.dataset.options.bannerUrls[0]
- res.title = `${target.dataset.options.stylistName}: ${target.dataset.options.circleDesc}`
- }
- if (from === 'menu') {
- res.title = messages.home.shareTitle
- }
- return res
- })
- </script>
- <template>
- <view class="">
- <view class="bg-black w-full relative aspect-[1.26/1]">
- <swiper @change="handleSwiperChange">
- <template
- v-for="{
- data: { id, coverVideoImage, indexPromotionalVideoImage },
- playing,
- } of swiperData"
- :key="id"
- >
- <swiper-item>
- <div class="w-full h-full relative">
- <video
- class="w-full h-full"
- :id="`video-${id}`"
- :src="indexPromotionalVideoImage"
- ></video>
- <div v-if="!playing" class="absolute left-0 top-0 w-full h-full bg-black">
- <wd-img width="100%" height="100%" :src="coverVideoImage" />
- </div>
- <div
- v-if="!playing"
- class="w-[375px] h-[90px] bg-gradient-to-t from-black to-black/0 absolute left-0 bottom-0 w-full flex items-center"
- >
- <view class="mx-7">
- <wd-button
- plain
- custom-class="bg-transparent! border-white! text-white!"
- icon="play"
- @click="handlePlay"
- >
- 02:30
- </wd-button>
- </view>
- </div>
- </div>
- </swiper-item>
- </template>
- </swiper>
- </view>
- <view class="bg-[#f6f6f6] relative bottom-4 rounded-t-2xl py-1">
- <!-- <ScheduleCard custom-class="my-6 mx-3.5"></ScheduleCard> -->
- <menus></menus>
- <!-- <view class="my-6 mx-3.5">
- <HotActivity></HotActivity>
- </view> -->
- <view v-if="isDesigner" class="my-6 mx-3.5" @click="toAbout()">
- <Card>
- <div class="flex items-center gap-2">
- <wd-img width="28" height="28" :src="logo"></wd-img>
- <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-[10.18px]">
- 1分钟快速了解筑巢荟
- </div>
- <div class="flex-1"></div>
- <wd-icon name="help-circle" size="22px" custom-class="text-black/60"></wd-icon>
- </div>
- </Card>
- </view>
- <view class="mx-3.5 text-5 font-400">设计圈</view>
- <view class="mx-3.5">
- <PageHelper ref="pageHelperRef" :request="getCircles" :query="{}">
- <template #default="{ source }">
- <template v-for="it of source.list" :key="it.id">
- <view class="my-6">
- <MomentItem :options="it" @like="handleLike"></MomentItem>
- </view>
- </template>
- </template>
- </PageHelper>
- </view>
- </view>
- </view>
- </template>
- <style></style>
|