|
@@ -1,5 +1,5 @@
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
-import { ref } from 'vue';
|
|
|
|
|
|
+import { ref, watch } from 'vue';
|
|
import { useRoute } from 'vue-router';
|
|
import { useRoute } from 'vue-router';
|
|
import { useSimpleDataLoader } from '@/composeable/SimpleDataLoader';
|
|
import { useSimpleDataLoader } from '@/composeable/SimpleDataLoader';
|
|
import { Vue3Marquee } from 'vue3-marquee';
|
|
import { Vue3Marquee } from 'vue3-marquee';
|
|
@@ -10,36 +10,44 @@ import Header from '@/components/parts/Header.vue';
|
|
import ImageLine from '@/components/small/ImageLine.vue';
|
|
import ImageLine from '@/components/small/ImageLine.vue';
|
|
import ImagePreview from '@/components/small/ImagePreview.vue';
|
|
import ImagePreview from '@/components/small/ImagePreview.vue';
|
|
|
|
|
|
|
|
+const emit = defineEmits(['contentLoaded']);
|
|
|
|
+
|
|
const route = useRoute();
|
|
const route = useRoute();
|
|
const loader = useSimpleDataLoader(async () => {
|
|
const loader = useSimpleDataLoader(async () => {
|
|
- return (await CommonContent.getContentDetail(Number(route.query.id)));
|
|
|
|
|
|
+ const content = (await CommonContent.getContentDetail(Number(route.query.id)));
|
|
|
|
+ emit('contentLoaded', content);
|
|
|
|
+ return content;
|
|
});
|
|
});
|
|
|
|
|
|
const showPreview = ref(false);
|
|
const showPreview = ref(false);
|
|
const activeItem = ref(0);
|
|
const activeItem = ref(0);
|
|
|
|
|
|
|
|
+watch(route, () => loader.loadData(undefined, true));
|
|
|
|
+
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<template>
|
|
<template>
|
|
<main class="main-content main-bg main-bg1">
|
|
<main class="main-content main-bg main-bg1">
|
|
<Header show-back absolute />
|
|
<Header show-back absolute />
|
|
<SimplePageContentLoader :loader="loader">
|
|
<SimplePageContentLoader :loader="loader">
|
|
- <div class="content absolute">
|
|
|
|
|
|
+ <div v-if="loader.content.value" class="content absolute">
|
|
<div class="left" :style="{ backgroundImage: `url(${loader.content.value?.image})` }" />
|
|
<div class="left" :style="{ backgroundImage: `url(${loader.content.value?.image})` }" />
|
|
<div class="right">
|
|
<div class="right">
|
|
<h1>{{ loader.content.value?.title }}</h1>
|
|
<h1>{{ loader.content.value?.title }}</h1>
|
|
<slot name="afterTitle" :content="loader.content.value" />
|
|
<slot name="afterTitle" :content="loader.content.value" />
|
|
- <Vue3Marquee style="width:100%;" :duration="70" vertical>
|
|
|
|
- <div class="d-flex flex-col">
|
|
|
|
- <slot name="beforeContent" :content="loader.content.value" />
|
|
|
|
- <SimpleRichHtml :contents="[ loader.content.value?.content as string || '暂无' ]" noScroll />
|
|
|
|
- <slot name="afterContent" :content="loader.content.value" />
|
|
|
|
- </div>
|
|
|
|
- </Vue3Marquee>
|
|
|
|
|
|
+ <slot name="content" :content="loader.content.value">
|
|
|
|
+ <Vue3Marquee style="width:100%;" :duration="70" :delay="10" vertical>
|
|
|
|
+ <div class="d-flex flex-col">
|
|
|
|
+ <slot name="beforeContent" :content="loader.content.value" />
|
|
|
|
+ <SimpleRichHtml :contents="[ loader.content.value?.content as string || '暂无' ]" noScroll />
|
|
|
|
+ <slot name="afterContent" :content="loader.content.value" />
|
|
|
|
+ </div>
|
|
|
|
+ </Vue3Marquee>
|
|
|
|
+ </slot>
|
|
<ImageLine
|
|
<ImageLine
|
|
:data="loader.content.value?.images"
|
|
:data="loader.content.value?.images"
|
|
:max-count="5"
|
|
:max-count="5"
|
|
- image-height="20vh"
|
|
|
|
|
|
+ image-height="10vh"
|
|
@itemClick="(v, i) => { showPreview = true; activeItem = i }"
|
|
@itemClick="(v, i) => { showPreview = true; activeItem = i }"
|
|
@moreClick="showPreview = true; activeItem=5"
|
|
@moreClick="showPreview = true; activeItem=5"
|
|
/>
|
|
/>
|
|
@@ -75,7 +83,7 @@ const activeItem = ref(0);
|
|
background: linear-gradient(90deg, rgba(240, 235, 222, 0.1) 0%, #f0ebde 15%, #f0ebde 100%);
|
|
background: linear-gradient(90deg, rgba(240, 235, 222, 0.1) 0%, #f0ebde 15%, #f0ebde 100%);
|
|
font-size: 0.8rem;
|
|
font-size: 0.8rem;
|
|
color: var(--color-text);
|
|
color: var(--color-text);
|
|
- padding: 8%;
|
|
|
|
|
|
+ padding: 6% 8%;
|
|
padding-left: 20%;
|
|
padding-left: 20%;
|
|
display: flex;
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
@@ -88,9 +96,34 @@ const activeItem = ref(0);
|
|
:deep(.image-line) {
|
|
:deep(.image-line) {
|
|
margin-top: 4%;
|
|
margin-top: 4%;
|
|
}
|
|
}
|
|
|
|
+ :deep(.tab-container) {
|
|
|
|
+ margin-top: 2%;
|
|
|
|
+ }
|
|
|
|
+ :deep(.vue-scroll-rect) {
|
|
|
|
+ flex: 1 1 0%;
|
|
|
|
+ min-height: 0;
|
|
|
|
+ }
|
|
|
|
+ :deep(.common-list) {
|
|
|
|
+ flex: 1 1 0%;
|
|
|
|
+ min-height: 0;
|
|
|
|
+ }
|
|
|
|
+ :deep(video) {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 50%;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-@media (max-height: 600px) {
|
|
|
|
|
|
+@media (max-height: 800px) {
|
|
|
|
+ .right {
|
|
|
|
+ padding-top: 4%;
|
|
|
|
+ padding-bottom: 4%;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+@media (max-height: 400px) {
|
|
|
|
+ .right {
|
|
|
|
+ padding-top: 2%;
|
|
|
|
+ padding-bottom: 2%;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
</style>
|
|
</style>
|