Merge branch 'main' of https://gitea-inner.fontree.cn/scout666/liveh5-nuxt into qb
This commit is contained in:
commit
569e805249
@ -39,9 +39,6 @@
|
||||
- 🔥 `<script setup>` 语法
|
||||
|
||||
- 🌍 [国际化支持](./i18n/locales)
|
||||
|
||||
- 🍍 [使用 Pinia 进行状态管理](https://github.com/vuejs/pinia),查看 [./app/composables/counter.ts](./app/composables/counter.ts)
|
||||
|
||||
- 📑 [布局系统](./app/layouts)
|
||||
|
||||
- 📥 API 自动导入 - 用于 Composition API 和自定义组合式函数
|
||||
@ -57,8 +54,6 @@
|
||||
- [i18n](https://github.com/nuxt-modules/i18n) - Nuxt 的国际化模块
|
||||
- [ColorMode](https://github.com/nuxt-modules/color-mode) - 支持自动检测的深色和浅色模式
|
||||
- [UnoCSS](https://github.com/unocss/unocss) - 即时按需原子化 CSS 引擎
|
||||
- [Pinia](https://github.com/vuejs/pinia) - 直观、类型安全、轻量且灵活的 Vue 状态管理
|
||||
- [Pinia Persistedstate](https://github.com/prazdevs/pinia-plugin-persistedstate) - 可配置的 Pinia 存储持久化和重新激活
|
||||
- [DevTools](https://github.com/nuxt/devtools) - 释放 Nuxt 开发者体验
|
||||
|
||||
## IDE
|
||||
|
@ -1,6 +1,4 @@
|
||||
<script setup>
|
||||
import useKeepalive from '~/composables/keepalive'
|
||||
import { appName, appDescription } from '~/constants'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import {message} from '@/components/x-message/useMessage.js'
|
||||
// message.success('success')
|
||||
@ -11,16 +9,11 @@ useHead({
|
||||
{ name: 'keywords', content: useI18n().t('appSetting.appKeyWords') },
|
||||
],
|
||||
})
|
||||
|
||||
const color = useColorMode()
|
||||
|
||||
const mode = computed(() => {
|
||||
return color.value
|
||||
})
|
||||
|
||||
const keepAliveRouteNames = computed(() => {
|
||||
return useKeepalive().routeCaches
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@ -28,7 +21,7 @@ const keepAliveRouteNames = computed(() => {
|
||||
<NuxtLoadingIndicator
|
||||
color="repeating-linear-gradient(to right,var(--c-primary) 0%,var(--c-primary-active) 100%)" />
|
||||
<NuxtLayout>
|
||||
<NuxtPage :keepalive="{ include: keepAliveRouteNames }" />
|
||||
<NuxtPage/>
|
||||
</NuxtLayout>
|
||||
</VanConfigProvider>
|
||||
</template>
|
||||
|
@ -18,7 +18,7 @@ initData()
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<van-tabbar v-if="show" v-model="active" route placeholder fixed>
|
||||
<van-tabbar v-model="active" route placeholder fixed>
|
||||
<van-tabbar-item replace to="/">
|
||||
<span>{{ $t('tabbar.home') }}</span>
|
||||
<template #icon>
|
||||
|
@ -1,10 +1,15 @@
|
||||
<script setup>
|
||||
import { useAppHeaderRouteNames as routeWhiteList } from '~/config'
|
||||
|
||||
import { useAppFooterRouteNames as routeWhiteList } from '~/config'
|
||||
import { homeStore } from "@/stores/home/index.js";
|
||||
const { fullLive } = homeStore()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
|
||||
function onBack() {
|
||||
if (fullLive.value){
|
||||
fullLive.value=false
|
||||
return
|
||||
}
|
||||
if (window.history.state.back)
|
||||
history.back()
|
||||
else
|
||||
@ -25,12 +30,13 @@ const subTitle = computed(() => {
|
||||
return route.meta.subTitle ? t(route.meta.subTitle) : ''
|
||||
})
|
||||
const showLeftArrow = computed(() => route.name && routeWhiteList.includes(route.name))
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<VanNavBar
|
||||
:title="title"
|
||||
:left-arrow="!showLeftArrow"
|
||||
:left-arrow="!showLeftArrow||fullLive"
|
||||
placeholder clickable fixed
|
||||
@click-left="onBack"
|
||||
>
|
||||
|
@ -3,8 +3,7 @@
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="w-full h-[188px] bg-[] bg-#606165">
|
||||
|
||||
<div class="w-full h-full bg-[] bg-#606165">
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -1,18 +0,0 @@
|
||||
import { defineStore } from 'pinia'
|
||||
|
||||
const useCounter = defineStore('counter', () => {
|
||||
const count = ref(0)
|
||||
|
||||
function increment() {
|
||||
count.value++
|
||||
}
|
||||
|
||||
return {
|
||||
count,
|
||||
increment,
|
||||
}
|
||||
}, {
|
||||
persist: true,
|
||||
})
|
||||
|
||||
export default useCounter
|
@ -1,24 +0,0 @@
|
||||
import type { RouteLocationNormalized, RouteRecordName } from 'vue-router'
|
||||
import { defineStore } from 'pinia'
|
||||
|
||||
const useKeepalive = defineStore('keepalive', () => {
|
||||
const routeCaches = ref<RouteRecordName[]>([])
|
||||
|
||||
const addRoute = (route: RouteLocationNormalized) => {
|
||||
if (!route.name)
|
||||
return
|
||||
|
||||
if (routeCaches.value.includes(route.name))
|
||||
return
|
||||
|
||||
if (route?.meta?.keepalive)
|
||||
routeCaches.value.push(route.name)
|
||||
}
|
||||
|
||||
return {
|
||||
routeCaches,
|
||||
addRoute,
|
||||
}
|
||||
})
|
||||
|
||||
export default useKeepalive
|
@ -1,13 +1,13 @@
|
||||
<template>
|
||||
<main class="flex flex-col min-h-svh">
|
||||
<AppHeader class="h-[var(--van-nav-bar-height)]" />
|
||||
|
||||
<div class="flex-1 flex flex-col">
|
||||
<slot />
|
||||
</div>
|
||||
|
||||
<AppFooter />
|
||||
<AppFooter v-if="!fullLive" />
|
||||
</main>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
<script setup >
|
||||
import { homeStore } from "@/stores/home/index.js";
|
||||
const { fullLive } = homeStore()
|
||||
</script>
|
@ -1,7 +0,0 @@
|
||||
import type { RouteLocationNormalized } from 'vue-router'
|
||||
import useKeepalive from '~/composables/keepalive'
|
||||
|
||||
export default defineNuxtRouteMiddleware((to: RouteLocationNormalized) => {
|
||||
if (to.meta && to.meta.keepalive)
|
||||
useKeepalive().addRoute(to)
|
||||
})
|
163
app/pages/LiveRoom/index.client.vue
Normal file
163
app/pages/LiveRoom/index.client.vue
Normal file
@ -0,0 +1,163 @@
|
||||
<script setup>
|
||||
import {ref, onMounted, onBeforeUnmount} from 'vue'
|
||||
import Aliplayer from 'aliyun-aliplayer'
|
||||
import 'aliyun-aliplayer/build/skins/default/aliplayer-min.css'
|
||||
import lock4 from '@/static/images/lock4@2x.png'
|
||||
import lockdfd from '@/static/images/lockdfd@2x.png'
|
||||
const player = ref(null)
|
||||
const quoteStatus = ref(false)
|
||||
const isPlayerReady = ref(false)
|
||||
const config = useRuntimeConfig()
|
||||
const props = defineProps({
|
||||
fullLive: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
})
|
||||
const playerConfig = {
|
||||
id: 'J_prismPlayer',
|
||||
source: 'artc://live-pull-sh-01.szjixun.cn/live/live?auth_key=1736748343-0-0-feef65166e5cc62957c35b6e3eec82a1',
|
||||
isLive: true,
|
||||
preload: true,
|
||||
autoplayPolicy: {fallbackToMute: true},
|
||||
controlBarVisibility: 'never',
|
||||
}
|
||||
const handlePlayerError = (error) => {
|
||||
console.error('播放器错误:', error)
|
||||
if (player.value) {
|
||||
player.value?.play()
|
||||
}
|
||||
}
|
||||
const initializePlayer = () => {
|
||||
try {
|
||||
if (player.value) {
|
||||
player.value?.dispose()
|
||||
}
|
||||
player.value = new Aliplayer(playerConfig, (playerInstance) => {
|
||||
isPlayerReady.value = true
|
||||
playerInstance?.play()
|
||||
})
|
||||
player.value?.on('error', handlePlayerError)
|
||||
player.value?.on('rtsTraceId', (event) => {
|
||||
})
|
||||
player.value?.on('rtsFallback', (event) => {
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('播放器初始化失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
const changeStatus = () => {
|
||||
quoteStatus.value = !quoteStatus.value
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
initializePlayer()
|
||||
})
|
||||
onBeforeUnmount(() => {
|
||||
if (player.value) {
|
||||
player.value?.dispose()
|
||||
player.value = null
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="relative h-full">
|
||||
<div id="J_prismPlayer" class="w-screen"
|
||||
:style="fullLive?'height: calc(100vh - var(--van-nav-bar-height))':'height:100%'"></div>
|
||||
<template v-if="fullLive">
|
||||
<div class="absolute bg-#fff w-60px top-196px right-0 z-999 rounded-l-4px">
|
||||
<div
|
||||
class="w-full h-60px text-#7D7D7F text-12px flex flex-col justify-center items-center border-b-1px border-b-#D3D3D3">
|
||||
<div>拍品</div>
|
||||
<div>(1/188)</div>
|
||||
</div>
|
||||
<div class="w-full h-60px flex flex-col items-center justify-center border-b-1px border-b-#D3D3D3"
|
||||
@click="changeStatus">
|
||||
<div class="mb-3px">
|
||||
<img :src="quoteStatus ? lockdfd : lock4"
|
||||
class="w-16px h-21px"
|
||||
alt="">
|
||||
</div>
|
||||
<div :class="quoteStatus ? 'text-#7D7D7F' : 'text-#2B53AC'"
|
||||
class="text-10px">
|
||||
{{ quoteStatus ? '关闭出价' : '开启出价' }}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="w-full h-60px text-#DD9C56 flex flex-col justify-center items-center ">
|
||||
<div class="text-10px ">RMB</div>
|
||||
<div class="text-12px">5,000</div>
|
||||
<div class="text-10px">去支付</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute top-505px left-1/2 transform -translate-x-1/2 flex flex-col items-center">
|
||||
<div class="text-16px text-#FFB25F font-600">
|
||||
当前价:RMB
|
||||
<van-rolling-text class="my-rolling-text" :start-num="0" :target-num="3000" direction="up"/>
|
||||
</div>
|
||||
<div class="text-16px text-#fff font-600">
|
||||
下口价:RMB
|
||||
<van-rolling-text class="my-rolling-text1" :start-num="0" :target-num="3500" direction="up"/>
|
||||
</div>
|
||||
<div
|
||||
:class="`w-344px h-[40px] ${quoteStatus ? 'bg-#FFB25F' : 'bg-#D6D6D8'} rounded-4px ${quoteStatus ? 'text-#fff' : 'text-#7D7D7F'} text-14px flex justify-center items-center mt-10px mb-10px`">
|
||||
{{ quoteStatus ? '确认出价 RMB 3,000' : '点击"开启出价",即刻参与竞拍 ' }}
|
||||
</div>
|
||||
<div class="w-344px h-86px bg-#fff rounded-4px text-14px text-#939393 pt-7px pb-7px flex flex-col justify-between">
|
||||
<div class="flex">
|
||||
<div class="flex-grow-1 text-center">领先</div>
|
||||
<div class="flex-grow-1 text-center">现场竞价</div>
|
||||
<div class="flex-grow-1 text-center">10:12:12</div>
|
||||
<div class="flex-grow-1 text-center">RMB5,500</div>
|
||||
<div class="flex-grow-1 text-center">我</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="flex-grow-1 text-center">领先</div>
|
||||
<div class="flex-grow-1 text-center">现场竞价</div>
|
||||
<div class="flex-grow-1 text-center">10:12:12</div>
|
||||
<div class="flex-grow-1 text-center">RMB5,500</div>
|
||||
<div class="flex-grow-1 text-center">我</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<div class="flex-grow-1 text-center">领先</div>
|
||||
<div class="flex-grow-1 text-center">现场竞价</div>
|
||||
<div class="flex-grow-1 text-center">10:12:12</div>
|
||||
<div class="flex-grow-1 text-center">RMB5,500</div>
|
||||
<div class="flex-grow-1 text-center">我</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.grid-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, 1fr);
|
||||
grid-template-rows: repeat(3, 1fr);
|
||||
}
|
||||
.grid-item {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.my-rolling-text {
|
||||
--van-rolling-text-item-width: 10px;
|
||||
--van-rolling-text-font-size: 16px;
|
||||
--van-rolling-text-color: #FFB25F;
|
||||
}
|
||||
|
||||
.my-rolling-text1 {
|
||||
--van-rolling-text-item-width: 10px;
|
||||
--van-rolling-text-font-size: 16px;
|
||||
--van-rolling-text-color: #FFF;
|
||||
}
|
||||
|
||||
:deep(.prism-license-watermark) {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
@ -1,30 +0,0 @@
|
||||
<template>
|
||||
<div class="relative">
|
||||
<video id="videoPlayer" controls autoplay>
|
||||
<source src="http://localhost:3213/video" type="video/mp4">
|
||||
</video>
|
||||
<div class="absolute bg-#fff w-60px top-196px right-0 z-999 rounded-l-4px">
|
||||
<div class="w-full h-60px text-#7D7D7F text-12px flex flex-col justify-center items-center border-b-1px border-b-#D3D3D3">
|
||||
<div>拍品</div>
|
||||
<div>(1/188)</div>
|
||||
</div>
|
||||
<div class="w-full h-60px flex flex-col items-center justify-center">
|
||||
<div class="mb-3px">
|
||||
<img src="@/static/images/lock4@2x.png" class="w-16px h-21px" alt="">
|
||||
</div>
|
||||
<div class="text-#2B53AC text-10px">开启出价</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
video {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
</style>
|
@ -1,35 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import useCounter from '~/composables/counter'
|
||||
|
||||
definePageMeta({
|
||||
title: '🍍 持久化 Pinia 状态',
|
||||
i18n: 'menu.persistPiniaState',
|
||||
})
|
||||
|
||||
const counter = useCounter()
|
||||
|
||||
function add() {
|
||||
counter.increment()
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-6xl color-pink font-semibold">
|
||||
Hello, Pinia!
|
||||
</h1>
|
||||
|
||||
<p class="mt-10 text-gray-700 dark:text-white">
|
||||
{{ $t('counter_page.label') }}
|
||||
</p>
|
||||
|
||||
<p class="mt-10">
|
||||
{{ $t('counter_page.label_num') }}:
|
||||
<strong class="text-green-500"> {{ counter.count }} </strong>
|
||||
</p>
|
||||
|
||||
<button class="mt-10 btn" @click="add">
|
||||
{{ $t('counter_page.btn_add') }}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
@ -1,12 +1,13 @@
|
||||
<script setup>
|
||||
import liveBroadcast from '@/components/liveBroadcast/index.vue'
|
||||
import {useRect} from '@vant/use';
|
||||
|
||||
import LiveRoom from '@/pages/LiveRoom/index.client.vue'
|
||||
import itemDetail from '@/components/itemDetail/index.vue'
|
||||
|
||||
import { homeStore } from "@/stores/home/index.js";
|
||||
const { fullLive } = homeStore()
|
||||
definePageMeta({
|
||||
layout: 'default',
|
||||
title: '主页',
|
||||
i18n: 'menu.home',
|
||||
})
|
||||
const liveRef = ref(null)
|
||||
@ -43,6 +44,16 @@ const list = ref([{
|
||||
title: '张天赐 | 日出而作,日落而息',
|
||||
startingPrice: 'RMB 1,000',
|
||||
transactionPrice: '',
|
||||
},{
|
||||
image: 'https://e-cdn.fontree.cn/fonchain-main/prod/file/default/setting/637d95b4-2ae9-4a74-bd60-a3a9d2ca2ca0.png',
|
||||
title: '张天赐 | 日出而作,日落而息',
|
||||
startingPrice: 'RMB 1,000',
|
||||
transactionPrice: 'RMB 10,000',
|
||||
},{
|
||||
image: 'https://e-cdn.fontree.cn/fonchain-main/prod/file/default/setting/637d95b4-2ae9-4a74-bd60-a3a9d2ca2ca0.png',
|
||||
title: '张天赐 | 日出而作,日落而息',
|
||||
startingPrice: 'RMB 1,000',
|
||||
transactionPrice: 'RMB 10,000',
|
||||
}])
|
||||
const page = ref(1)
|
||||
|
||||
@ -95,127 +106,164 @@ const openShow = () => {
|
||||
show.value = true
|
||||
})
|
||||
}
|
||||
|
||||
const changeLive=()=>{
|
||||
fullLive.value=true
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="bg-#fff flex-grow-1">
|
||||
<liveBroadcast ref="liveRef"/>
|
||||
<van-tabs sticky animated>
|
||||
<van-tab title="拍品列表">
|
||||
<div class="px-[16px] pt-[16px]">
|
||||
<van-pull-refresh>
|
||||
<van-list
|
||||
v-model:loading="loading"
|
||||
:finished="finished"
|
||||
finished-text="没有更多了"
|
||||
@load="loadData"
|
||||
>
|
||||
<div class="w-full flex gap-[16px]">
|
||||
<div class="flex flex-1 flex-col gap-[16px]">
|
||||
<div
|
||||
v-for="(item, index) in leftColumn"
|
||||
:key="index"
|
||||
class="w-full"
|
||||
@click="openShow"
|
||||
>
|
||||
<div class="relative w-full">
|
||||
<van-image
|
||||
:src="item.image"
|
||||
:style="{ aspectRatio: item.ratio }"
|
||||
fit="cover"
|
||||
class="w-full"
|
||||
/>
|
||||
<div
|
||||
class="absolute left-[8px] top-[8px] h-[17px] w-[45px] flex items-center justify-center bg-[#2b53ac] text-[12px] text-[#fff]">
|
||||
LOT{{ index * 2 + 1 }}
|
||||
<div class="flex-grow-1">
|
||||
<div
|
||||
@click="changeLive"
|
||||
:class="[
|
||||
'changeLive',
|
||||
fullLive ? 'expanded' : 'collapsed'
|
||||
]"
|
||||
>
|
||||
<client-only>
|
||||
<LiveRoom ref="liveRef" :fullLive="fullLive" />
|
||||
</client-only>
|
||||
</div>
|
||||
<transition name="fade">
|
||||
<div v-show="!fullLive" class="bg-#fff" >
|
||||
<van-tabs sticky animated>
|
||||
<van-tab title="拍品列表">
|
||||
<div class="px-[16px] pt-[16px]">
|
||||
<van-pull-refresh>
|
||||
<van-list
|
||||
v-model:loading="loading"
|
||||
:finished="finished"
|
||||
finished-text="没有更多了"
|
||||
@load="loadData"
|
||||
>
|
||||
<div class="w-full flex gap-[16px]">
|
||||
<div class="flex flex-1 flex-col gap-[16px]">
|
||||
<div
|
||||
v-for="(item, index) in leftColumn"
|
||||
:key="index"
|
||||
class="w-full"
|
||||
@click="openShow"
|
||||
>
|
||||
<div class="relative w-full">
|
||||
<van-image
|
||||
:src="item.image"
|
||||
:style="{ aspectRatio: item.ratio }"
|
||||
fit="cover"
|
||||
class="w-full"
|
||||
/>
|
||||
<div
|
||||
class="absolute left-[8px] top-[8px] h-[17px] w-[45px] flex items-center justify-center bg-[#2b53ac] text-[12px] text-[#fff]">
|
||||
LOT{{ index * 2 + 1 }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="pt-[8px]">
|
||||
<div class="text-[14px] text-[#000000] leading-[20px]">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
<div class="mt-[4px] text-[12px] text-[#575757]">
|
||||
起拍价:{{ item.startingPrice }}
|
||||
</div>
|
||||
<div
|
||||
v-if="item.transactionPrice"
|
||||
class="mt-[4px] text-[12px] text-[#b58047]"
|
||||
>
|
||||
成交价:{{ item.transactionPrice }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pt-[8px]">
|
||||
<div class="text-[14px] text-[#000000] leading-[20px]">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
<div class="flex flex-1 flex-col gap-[16px]">
|
||||
<div
|
||||
v-for="(item, index) in rightColumn"
|
||||
:key="index"
|
||||
class="w-full"
|
||||
@click="openShow"
|
||||
>
|
||||
<div class="relative w-full">
|
||||
<van-image
|
||||
:src="item.image"
|
||||
:style="{ aspectRatio: item.ratio }"
|
||||
fit="cover"
|
||||
class="w-full"
|
||||
/>
|
||||
<div
|
||||
class="absolute left-[8px] top-[8px] h-[17px] w-[45px] flex items-center justify-center bg-[#2b53ac] text-[12px] text-[#fff]">
|
||||
LOT{{ index * 2 + 2 }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-[4px] text-[12px] text-[#575757]">
|
||||
起拍价:{{ item.startingPrice }}
|
||||
</div>
|
||||
<div
|
||||
v-if="item.transactionPrice"
|
||||
class="mt-[4px] text-[12px] text-[#b58047]"
|
||||
>
|
||||
成交价:{{ item.transactionPrice }}
|
||||
<div class="pt-[8px]">
|
||||
<div class="text-[14px] text-[#000000] leading-[20px]">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
<div class="mt-[4px] text-[12px] text-[#575757]">
|
||||
起拍价:{{ item.startingPrice }}
|
||||
</div>
|
||||
<div
|
||||
v-if="item.transactionPrice"
|
||||
class="mt-[4px] text-[12px] text-[#b58047]"
|
||||
>
|
||||
成交价:{{ item.transactionPrice }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-1 flex-col gap-[16px]">
|
||||
<div
|
||||
v-for="(item, index) in rightColumn"
|
||||
:key="index"
|
||||
class="w-full"
|
||||
@click="openShow"
|
||||
>
|
||||
<div class="relative w-full">
|
||||
<van-image
|
||||
:src="item.image"
|
||||
:style="{ aspectRatio: item.ratio }"
|
||||
fit="cover"
|
||||
class="w-full"
|
||||
/>
|
||||
<div
|
||||
class="absolute left-[8px] top-[8px] h-[17px] w-[45px] flex items-center justify-center bg-[#2b53ac] text-[12px] text-[#fff]">
|
||||
LOT{{ index * 2 + 2 }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="pt-[8px]">
|
||||
<div class="text-[14px] text-[#000000] leading-[20px]">
|
||||
{{ item.title }}
|
||||
</div>
|
||||
<div class="mt-[4px] text-[12px] text-[#575757]">
|
||||
起拍价:{{ item.startingPrice }}
|
||||
</div>
|
||||
<div
|
||||
v-if="item.transactionPrice"
|
||||
class="mt-[4px] text-[12px] text-[#b58047]"
|
||||
>
|
||||
成交价:{{ item.transactionPrice }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</van-list>
|
||||
</van-pull-refresh>
|
||||
</div>
|
||||
</van-tab>
|
||||
<van-tab title="拍卖说明">
|
||||
<div class="px-16px pt-14px">
|
||||
<div class="text-#575757 text-14px">
|
||||
这里是后台富文本配置的说明,啊即可打开三等奖撒度老师的湿答答是快乐的阿四大皆空
|
||||
</van-list>
|
||||
</van-pull-refresh>
|
||||
</div>
|
||||
<div></div>
|
||||
</van-tab>
|
||||
<van-tab title="拍卖说明">
|
||||
<div class="px-16px pt-14px">
|
||||
<div class="text-#575757 text-14px">
|
||||
这里是后台富文本配置的说明,啊即可打开三等奖撒度老师的湿答答是快乐的阿四大皆空
|
||||
</div>
|
||||
<div></div>
|
||||
</div>
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
<van-back-top right="15vw" bottom="10vh"/>
|
||||
<van-action-sheet :round="false" v-model:show="show" title="拍品详情">
|
||||
<div class="content bg-[#F0F0F0]" :style="`height: calc(100vh - ${showHeight+85}px)`">
|
||||
<itemDetail></itemDetail>
|
||||
</div>
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
<van-back-top right="15vw" bottom="10vh"/>
|
||||
<van-action-sheet :round="false" v-model:show="show" title="拍品详情">
|
||||
<div class="content bg-[#F0F0F0]" :style="`height: calc(100vh - ${showHeight+85}px)`">
|
||||
<itemDetail></itemDetail>
|
||||
</div>
|
||||
</van-action-sheet>
|
||||
</van-action-sheet>
|
||||
</div>
|
||||
</transition>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
:root:root {
|
||||
--van-action-sheet-header-height: 39px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.van-swipe__indicator) {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
}
|
||||
|
||||
.fade-enter-active, .fade-leave-active {
|
||||
transition: opacity 1s;
|
||||
}
|
||||
.fade-enter, .fade-leave-to /* .fade-leave-active in <2.1.8 */ {
|
||||
opacity: 0;
|
||||
}
|
||||
:deep(.van-swipe__indicator:not(.van-swipe__indicator--active) ) {
|
||||
background: rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
.changeLive {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
transition: height 0.5s ease, transform 0.5s ease;
|
||||
}
|
||||
|
||||
.changeLive.collapsed {
|
||||
height: 188px;
|
||||
}
|
||||
|
||||
.changeLive.expanded {
|
||||
height: calc(100vh - var(--van-nav-bar-height));
|
||||
transform: translateY(0);
|
||||
}
|
||||
</style>
|
||||
|
@ -44,7 +44,7 @@ definePageMeta({
|
||||
<div class="flex flex-col justify-between">
|
||||
<div class="text-#000 text-16px ellipsis line-height-21px">张天赐 | 日出而作,日落而息撒打算撒打算撒打决赛多久啊是世奥兰…</div>
|
||||
<div class="text-#575757 text-14px line-height-none ">起拍价:RMB 1,000</div>
|
||||
<div class="text-#B58047 text-14px line-height-none">成交价:RMB 10,000</div>
|
||||
<div class="text-[#fdc181ff] line-height-none">成交价:RMB 10,000</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
BIN
app/static/images/lockdfd@2x.png
Normal file
BIN
app/static/images/lockdfd@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 995 B |
7
app/stores/home/index.js
Normal file
7
app/stores/home/index.js
Normal file
@ -0,0 +1,7 @@
|
||||
import { createGlobalState } from '@vueuse/core'
|
||||
export const homeStore = createGlobalState(() => {
|
||||
const fullLive=ref(false)
|
||||
return{
|
||||
fullLive
|
||||
}
|
||||
})
|
@ -12,7 +12,6 @@
|
||||
"404Demo": "🙅 Page 404 Demo",
|
||||
"unocssExample": "🎨 Unocss example",
|
||||
"keepAlive": "🧡 KeepAlive Demo",
|
||||
"persistPiniaState": "💾 Persist Pinia State",
|
||||
"fetch": "🏄 Network Request"
|
||||
},
|
||||
"tabbar": {
|
||||
|
@ -1,8 +1,6 @@
|
||||
import process from 'node:process'
|
||||
import { appDescription } from './app/constants/index'
|
||||
import preload from './app/utils/preload'
|
||||
import { currentLocales } from './i18n/i18n'
|
||||
|
||||
export default defineNuxtConfig({
|
||||
|
||||
hooks: {
|
||||
@ -23,8 +21,6 @@ export default defineNuxtConfig({
|
||||
'@unocss/nuxt',
|
||||
'@nuxtjs/color-mode',
|
||||
'@nuxtjs/i18n',
|
||||
'@pinia/nuxt',
|
||||
'pinia-plugin-persistedstate/nuxt',
|
||||
],
|
||||
runtimeConfig: {
|
||||
public: {
|
||||
@ -135,12 +131,6 @@ export default defineNuxtConfig({
|
||||
inlineStyles: false,
|
||||
},
|
||||
|
||||
eslint: {
|
||||
config: {
|
||||
standalone: false,
|
||||
},
|
||||
},
|
||||
|
||||
future: {
|
||||
compatibilityVersion: 4,
|
||||
},
|
||||
|
@ -5,7 +5,10 @@
|
||||
"packageManager": "pnpm@9.15.1",
|
||||
"scripts": {
|
||||
"build": "nuxt build",
|
||||
"dev": "nuxt dev",
|
||||
"dev": "nuxt dev --mode test",
|
||||
"dev:prod": "nuxt dev --mode prod",
|
||||
"build:test": "nuxt build --mode test",
|
||||
"build:prod": "nuxt build --mode prod",
|
||||
"generate": "nuxt generate",
|
||||
"preview": "nuxt preview",
|
||||
"postinstall": "nuxt prepare",
|
||||
@ -16,8 +19,8 @@
|
||||
"@nuxtjs/color-mode": "^3.5.2",
|
||||
"@nuxtjs/i18n": "^9.1.1",
|
||||
"@vueuse/core": "^12.4.0",
|
||||
"aliyun-aliplayer": "^2.28.5",
|
||||
"nuxt": "^3.15.0",
|
||||
"pinia-plugin-persistedstate": "^4.2.0",
|
||||
"pinyin": "4.0.0-alpha.2",
|
||||
"segmentit": "^2.0.3",
|
||||
"vue": "^3.5.13",
|
||||
@ -25,12 +28,10 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify-json/carbon": "^1.2.5",
|
||||
"@pinia/nuxt": "^0.9.0",
|
||||
"@unocss/nuxt": "0.65.2",
|
||||
"@unocss/preset-rem-to-px": "0.65.2",
|
||||
"@vant/nuxt": "^1.0.6",
|
||||
"bumpp": "^9.9.2",
|
||||
"pinia": "^2.3.0",
|
||||
"postcss-mobile-forever": "^4.3.1",
|
||||
"sass": "^1.83.1",
|
||||
"sass-loader": "^16.0.4",
|
||||
|
102
pnpm-lock.yaml
102
pnpm-lock.yaml
@ -20,12 +20,12 @@ importers:
|
||||
'@vueuse/core':
|
||||
specifier: ^12.4.0
|
||||
version: 12.4.0(typescript@5.7.2)
|
||||
aliyun-aliplayer:
|
||||
specifier: ^2.28.5
|
||||
version: 2.28.5
|
||||
nuxt:
|
||||
specifier: ^3.15.0
|
||||
version: 3.15.0(@parcel/watcher@2.5.0)(@types/node@22.10.2)(db0@0.2.1)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.29.1)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.2)(typescript@5.7.2)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(yaml@2.6.1)
|
||||
pinia-plugin-persistedstate:
|
||||
specifier: ^4.2.0
|
||||
version: 4.2.0(@pinia/nuxt@0.9.0(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)))(rollup@4.29.1))(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)))(rollup@4.29.1)
|
||||
pinyin:
|
||||
specifier: 4.0.0-alpha.2
|
||||
version: 4.0.0-alpha.2(segmentit@2.0.3)
|
||||
@ -42,9 +42,6 @@ importers:
|
||||
'@iconify-json/carbon':
|
||||
specifier: ^1.2.5
|
||||
version: 1.2.5
|
||||
'@pinia/nuxt':
|
||||
specifier: ^0.9.0
|
||||
version: 0.9.0(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)))(rollup@4.29.1)
|
||||
'@unocss/nuxt':
|
||||
specifier: 0.65.2
|
||||
version: 0.65.2(magicast@0.3.5)(postcss@8.4.49)(rollup@4.29.1)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.13(typescript@5.7.2))(webpack@5.97.1(esbuild@0.24.2))
|
||||
@ -57,9 +54,6 @@ importers:
|
||||
bumpp:
|
||||
specifier: ^9.9.2
|
||||
version: 9.9.2(magicast@0.3.5)
|
||||
pinia:
|
||||
specifier: ^2.3.0
|
||||
version: 2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))
|
||||
postcss-mobile-forever:
|
||||
specifier: ^4.3.1
|
||||
version: 4.3.1(postcss@8.4.49)
|
||||
@ -1026,11 +1020,6 @@ packages:
|
||||
resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
|
||||
'@pinia/nuxt@0.9.0':
|
||||
resolution: {integrity: sha512-2yeRo7LeyCF68AbNeL3xu2h6uw0617RkcsYxmA8DJM0R0PMdz5wQHnc44KeENQxR/Mrq8T910XVT6buosqsjBQ==}
|
||||
peerDependencies:
|
||||
pinia: ^2.3.0
|
||||
|
||||
'@pkgjs/parseargs@0.11.0':
|
||||
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
||||
engines: {node: '>=14'}
|
||||
@ -1609,6 +1598,9 @@ packages:
|
||||
ajv@8.17.1:
|
||||
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
|
||||
|
||||
aliyun-aliplayer@2.28.5:
|
||||
resolution: {integrity: sha512-UDy4Fj95fv/Syy0p8HRmYUGqadJHLuvucHEeJu6G71uHch87bllnaOI1r++ndfWu36oZph+dbArnP2eowR/Xsg==}
|
||||
|
||||
ansi-colors@4.1.3:
|
||||
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
|
||||
engines: {node: '>=6'}
|
||||
@ -1904,6 +1896,9 @@ packages:
|
||||
crossws@0.3.1:
|
||||
resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==}
|
||||
|
||||
crypto-js@4.2.0:
|
||||
resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
|
||||
|
||||
css-declaration-sorter@7.2.0:
|
||||
resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==}
|
||||
engines: {node: ^14 || ^16 || >=18}
|
||||
@ -1999,9 +1994,6 @@ packages:
|
||||
deep-is@0.1.4:
|
||||
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
|
||||
|
||||
deep-pick-omit@1.2.1:
|
||||
resolution: {integrity: sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==}
|
||||
|
||||
deepmerge@4.3.1:
|
||||
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@ -3104,26 +3096,6 @@ packages:
|
||||
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
pinia-plugin-persistedstate@4.2.0:
|
||||
resolution: {integrity: sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==}
|
||||
peerDependencies:
|
||||
'@pinia/nuxt': '>=0.9.0'
|
||||
pinia: '>=2.3.0'
|
||||
peerDependenciesMeta:
|
||||
'@pinia/nuxt':
|
||||
optional: true
|
||||
pinia:
|
||||
optional: true
|
||||
|
||||
pinia@2.3.0:
|
||||
resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==}
|
||||
peerDependencies:
|
||||
typescript: '>=4.4.4'
|
||||
vue: ^2.7.0 || ^3.5.11
|
||||
peerDependenciesMeta:
|
||||
typescript:
|
||||
optional: true
|
||||
|
||||
pinyin@4.0.0-alpha.2:
|
||||
resolution: {integrity: sha512-SED2wWr1X0QwH6rXIDgg20zS1mAk0AVMO8eM3KomUlOYzC8mNMWZnspZWhhI0M8MBIbF2xwa+5r30jTSjAqNsg==}
|
||||
engines: {install-node: ^18.0.0}
|
||||
@ -4074,17 +4046,6 @@ packages:
|
||||
vue-bundle-renderer@2.1.1:
|
||||
resolution: {integrity: sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==}
|
||||
|
||||
vue-demi@0.14.10:
|
||||
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
|
||||
engines: {node: '>=12'}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
'@vue/composition-api': ^1.0.0-rc.1
|
||||
vue: ^3.0.0-0 || ^2.6.0
|
||||
peerDependenciesMeta:
|
||||
'@vue/composition-api':
|
||||
optional: true
|
||||
|
||||
vue-devtools-stub@0.1.0:
|
||||
resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==}
|
||||
|
||||
@ -5210,15 +5171,6 @@ snapshots:
|
||||
'@parcel/watcher-win32-ia32': 2.5.0
|
||||
'@parcel/watcher-win32-x64': 2.5.0
|
||||
|
||||
'@pinia/nuxt@0.9.0(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)))(rollup@4.29.1)':
|
||||
dependencies:
|
||||
'@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.29.1)
|
||||
pinia: 2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))
|
||||
transitivePeerDependencies:
|
||||
- magicast
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
'@pkgjs/parseargs@0.11.0':
|
||||
optional: true
|
||||
|
||||
@ -5979,6 +5931,10 @@ snapshots:
|
||||
json-schema-traverse: 1.0.0
|
||||
require-from-string: 2.0.2
|
||||
|
||||
aliyun-aliplayer@2.28.5:
|
||||
dependencies:
|
||||
crypto-js: 4.2.0
|
||||
|
||||
ansi-colors@4.1.3: {}
|
||||
|
||||
ansi-escapes@4.3.2:
|
||||
@ -6289,6 +6245,8 @@ snapshots:
|
||||
dependencies:
|
||||
uncrypto: 0.1.3
|
||||
|
||||
crypto-js@4.2.0: {}
|
||||
|
||||
css-declaration-sorter@7.2.0(postcss@8.4.49):
|
||||
dependencies:
|
||||
postcss: 8.4.49
|
||||
@ -6384,8 +6342,6 @@ snapshots:
|
||||
|
||||
deep-is@0.1.4: {}
|
||||
|
||||
deep-pick-omit@1.2.1: {}
|
||||
|
||||
deepmerge@4.3.1: {}
|
||||
|
||||
default-browser-id@5.0.0: {}
|
||||
@ -7698,30 +7654,6 @@ snapshots:
|
||||
|
||||
picomatch@4.0.2: {}
|
||||
|
||||
pinia-plugin-persistedstate@4.2.0(@pinia/nuxt@0.9.0(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)))(rollup@4.29.1))(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)))(rollup@4.29.1):
|
||||
dependencies:
|
||||
'@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.29.1)
|
||||
deep-pick-omit: 1.2.1
|
||||
defu: 6.1.4
|
||||
destr: 2.0.3
|
||||
optionalDependencies:
|
||||
'@pinia/nuxt': 0.9.0(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)))(rollup@4.29.1)
|
||||
pinia: 2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))
|
||||
transitivePeerDependencies:
|
||||
- magicast
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)):
|
||||
dependencies:
|
||||
'@vue/devtools-api': 6.6.4
|
||||
vue: 3.5.13(typescript@5.7.2)
|
||||
vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2))
|
||||
optionalDependencies:
|
||||
typescript: 5.7.2
|
||||
transitivePeerDependencies:
|
||||
- '@vue/composition-api'
|
||||
|
||||
pinyin@4.0.0-alpha.2(segmentit@2.0.3):
|
||||
dependencies:
|
||||
commander: 1.1.1
|
||||
@ -8678,10 +8610,6 @@ snapshots:
|
||||
dependencies:
|
||||
ufo: 1.5.4
|
||||
|
||||
vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)):
|
||||
dependencies:
|
||||
vue: 3.5.13(typescript@5.7.2)
|
||||
|
||||
vue-devtools-stub@0.1.0: {}
|
||||
|
||||
vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.2)):
|
||||
|
Loading…
Reference in New Issue
Block a user