|
@@ -2,23 +2,63 @@
|
|
|
<script setup lang='ts'>
|
|
|
import { TreasureApi } from '@/api/api/treasure';
|
|
|
import { showToast } from 'vant';
|
|
|
+import SearchInput from '@/components/SearchInput/index.vue'
|
|
|
+
|
|
|
+export type DictType = {
|
|
|
+ createTime: string | null,
|
|
|
+ creatorId: number | null,
|
|
|
+ creatorName: string | null,
|
|
|
+ display: string | null,
|
|
|
+ id: number | null,
|
|
|
+ name: string | null,
|
|
|
+ parentId: number | null,
|
|
|
+ rtf: string | null,
|
|
|
+ sort: number | null,
|
|
|
+ type: string | null,
|
|
|
+ typeKey: string | null,
|
|
|
+ updateTime: string | null
|
|
|
+}
|
|
|
|
|
|
+export type TreasureType = {
|
|
|
+ age: string,
|
|
|
+ createTime: string,
|
|
|
+ creatorId: number,
|
|
|
+ creatorName: string,
|
|
|
+ description: string,
|
|
|
+ dirCode: string,
|
|
|
+ fileIds: string,
|
|
|
+ fileTypes: string,
|
|
|
+ id: 1,
|
|
|
+ name: string,
|
|
|
+ publishDate: string,
|
|
|
+ size: string,
|
|
|
+ texture: string,
|
|
|
+ thumb: string,
|
|
|
+ type: string,
|
|
|
+ updateTime: string
|
|
|
+}
|
|
|
|
|
|
-const searchValue = ref('')
|
|
|
-const router = useRouter()
|
|
|
-
|
|
|
-const data = ref([] as any)
|
|
|
|
|
|
+const searchParames = ref({
|
|
|
+ pageNum: 0,
|
|
|
+ pageSize: 0,
|
|
|
+ searchKey: '',
|
|
|
+ type: ''
|
|
|
+} as {
|
|
|
+ pageNum: number,
|
|
|
+ pageSize: number,
|
|
|
+ searchKey: string,
|
|
|
+ type: string | null
|
|
|
+})
|
|
|
|
|
|
-const activeIndex = ref(0)
|
|
|
+const router = useRouter()
|
|
|
|
|
|
-const onSearch = () => {
|
|
|
+const data = ref([] as TreasureType[])
|
|
|
|
|
|
-}
|
|
|
+const typeList = ref([] as DictType[])
|
|
|
|
|
|
-const onCancel = () => {
|
|
|
|
|
|
-}
|
|
|
+const activeIndex = ref(0)
|
|
|
|
|
|
const goDetai = (id: number) => {
|
|
|
router.push({ name: 'treasureDetail', params: { id } });
|
|
@@ -26,100 +66,52 @@ const goDetai = (id: number) => {
|
|
|
|
|
|
|
|
|
const getList = async () => {
|
|
|
- const res: any = await TreasureApi.getTreasureList()
|
|
|
+ searchParames.value.type = activeIndex.value == 0 ? '' : typeList.value[activeIndex.value].name
|
|
|
+ // 获取指定类型的列表
|
|
|
+ const res: any = await TreasureApi.getTreasureList(searchParames.value)
|
|
|
if (res.code == 0) {
|
|
|
- data.value = res.data
|
|
|
+ data.value = res.data.records
|
|
|
} else {
|
|
|
showToast('活动信息获取失败')
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
-onBeforeMount(() => {
|
|
|
- data.value = [
|
|
|
- {
|
|
|
- type: '全部',
|
|
|
- lists: [
|
|
|
- {
|
|
|
- id: 0,
|
|
|
- title: '《瓜洲马头新建石堤记》碑拓片',
|
|
|
- type: '全部',
|
|
|
- era: '朝代',
|
|
|
- character: '质地',
|
|
|
- info: '',
|
|
|
- size: '',
|
|
|
- themb: 'https://n.sinaimg.cn/sinakd20112/0/w2048h1152/20220428/03e8-399a8decd0e38baf901f375ef9a4c050.jpg',
|
|
|
- files: {
|
|
|
- images: [],
|
|
|
- moduleUrl: '',
|
|
|
- audio: '',
|
|
|
- // 可能是单个可能是多个
|
|
|
- videos: [],
|
|
|
- releaseTime: '2023-12-27'
|
|
|
- }
|
|
|
- }
|
|
|
- ]
|
|
|
- },
|
|
|
- {
|
|
|
- type: '类型1',
|
|
|
- lists: [
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- title: '《瓜洲马头新建石堤记》碑拓片',
|
|
|
- type: '全部',
|
|
|
- era: '朝代',
|
|
|
- character: '质地',
|
|
|
- info: '',
|
|
|
- size: '',
|
|
|
- themb: 'https://n.sinaimg.cn/sinakd20112/0/w2048h1152/20220428/03e8-399a8decd0e38baf901f375ef9a4c050.jpg',
|
|
|
- files: {
|
|
|
- images: [],
|
|
|
- moduleUrl: '',
|
|
|
- audio: '',
|
|
|
- // 可能是单个可能是多个
|
|
|
- videos: [],
|
|
|
- releaseTime: '2023-12-27'
|
|
|
- }
|
|
|
- }, {
|
|
|
- id: 1,
|
|
|
- title: '《瓜洲马头新建石堤记》碑拓片',
|
|
|
- type: '全部',
|
|
|
- era: '朝代',
|
|
|
- character: '质地',
|
|
|
- info: '',
|
|
|
- size: '',
|
|
|
- themb: 'https://n.sinaimg.cn/sinakd20112/0/w2048h1152/20220428/03e8-399a8decd0e38baf901f375ef9a4c050.jpg',
|
|
|
- files: {
|
|
|
- images: [],
|
|
|
- moduleUrl: '',
|
|
|
- audio: '',
|
|
|
- // 可能是单个可能是多个
|
|
|
- videos: [],
|
|
|
- releaseTime: '2023-12-27'
|
|
|
- }
|
|
|
- }
|
|
|
- ]
|
|
|
- },
|
|
|
- {
|
|
|
- type: '类型2',
|
|
|
- lists: [
|
|
|
-
|
|
|
- ]
|
|
|
- },
|
|
|
- {
|
|
|
- type: '类型3',
|
|
|
- lists: [
|
|
|
-
|
|
|
- ]
|
|
|
- },
|
|
|
- {
|
|
|
- type: '类型4',
|
|
|
- lists: [
|
|
|
-
|
|
|
- ]
|
|
|
- }
|
|
|
- ]
|
|
|
+const getTypeList = async () => {
|
|
|
+ // 获取珍藏类型
|
|
|
+ const resType: any = await TreasureApi.getTypeList()
|
|
|
+ if (resType.code == 0) {
|
|
|
+ typeList.value = resType.data
|
|
|
+ typeList.value.unshift({
|
|
|
+ createTime: null,
|
|
|
+ creatorId: null,
|
|
|
+ creatorName: '',
|
|
|
+ display: null,
|
|
|
+ id: null,
|
|
|
+ name: '全部',
|
|
|
+ parentId: null,
|
|
|
+ rtf: '',
|
|
|
+ sort: null,
|
|
|
+ type: '',
|
|
|
+ typeKey: '',
|
|
|
+ updateTime: null
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ showToast(resType.msg)
|
|
|
+ }
|
|
|
+
|
|
|
+ getList()
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const onSearch = (eventData: any) => {
|
|
|
+ searchParames.value.searchKey = eventData
|
|
|
+ getList()
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
+onBeforeMount(() => {
|
|
|
+ getTypeList()
|
|
|
})
|
|
|
|
|
|
|
|
@@ -129,22 +121,27 @@ onBeforeMount(() => {
|
|
|
|
|
|
<template>
|
|
|
<div class="treasure-box">
|
|
|
- <div class="search-box">
|
|
|
- <van-search v-model="searchValue" @search="onSearch" @cancel="onCancel" placeholder="请输入搜索关键词" />
|
|
|
- </div>
|
|
|
+ <SearchInput @onSearch="onSearch" />
|
|
|
<div class="content-box">
|
|
|
- <van-tabs v-model:active="activeIndex">
|
|
|
- <van-tab v-for="(item, index) in data" :key="index" :title="item.type">
|
|
|
+ <van-tabs v-model:active="activeIndex" color="#9D4F0B" background="#F7F3E8" title-active-color="#9D4F0B"
|
|
|
+ title-inactive-color="#88866F" @change="getList()">
|
|
|
+ <van-tab v-for="(item, index) in typeList" :key="index" :title="item.name">
|
|
|
<!-- <div>{{ activeIndex }}</div> -->
|
|
|
- <div class="tab-content" v-if="data[activeIndex].lists.length > 0">
|
|
|
- <div class="activity-card" v-for="(item, index) in data[activeIndex].lists" :key="index"
|
|
|
- @click="goDetai(item.id)">
|
|
|
- <img v-show="item.themb != ''" class="themb" :src="item.themb" alt="">
|
|
|
- <div class="detail">{{ item.era + '·' + item.character }}</div>
|
|
|
- <div class="title">{{ item.title }}</div>
|
|
|
+ <div class="tab-content" v-if="data.length > 0">
|
|
|
+ <div class="activity-card" v-for="(item, index) in data" :key="index" @click="goDetai(item.id)">
|
|
|
+ <img v-show="item.thumb != ''" class="thumb" :src="item.thumb" alt="">
|
|
|
+ <div class="title">{{ item.name }}</div>
|
|
|
+ <div class="detail">
|
|
|
+ <div style="margin-right: 30px;">朝代:{{ item.age }}</div>
|
|
|
+ <div>质地:{{ item.texture }}</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div v-else class="no-data">暂无内容</div>
|
|
|
+ <div v-else class="no-data">
|
|
|
+ <img src="@/assets/images/no-data.png" alt="">
|
|
|
+ <div class="tips">暂时没有数据 ,请试一下其他关键字</div>
|
|
|
+ </div>
|
|
|
</van-tab>
|
|
|
</van-tabs>
|
|
|
</div>
|
|
@@ -152,18 +149,27 @@ onBeforeMount(() => {
|
|
|
</template>
|
|
|
|
|
|
<style lang='less' scoped>
|
|
|
+.van-tabs__content {
|
|
|
+ background-color: #F7F3E8;
|
|
|
+}
|
|
|
+
|
|
|
.treasure-box {
|
|
|
width: 100%;
|
|
|
+ min-height: 100%;
|
|
|
+ background: #F7F3E8;
|
|
|
|
|
|
- .search-box {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
|
|
|
.content-box {
|
|
|
width: 100%;
|
|
|
padding: 0px 10px;
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
+ .van-tabs {
|
|
|
+ .van-tabs__nav {
|
|
|
+ background: #F7F3E8 !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
.tab-content {
|
|
|
width: 100%;
|
|
|
|
|
@@ -173,30 +179,51 @@ onBeforeMount(() => {
|
|
|
box-sizing: border-box;
|
|
|
margin-bottom: 20px;
|
|
|
|
|
|
+
|
|
|
img {
|
|
|
width: 100%;
|
|
|
+ border-radius: 10px;
|
|
|
}
|
|
|
|
|
|
.detail {
|
|
|
- font-size: 0.8em;
|
|
|
- color: gray;
|
|
|
+ font-size: 1em;
|
|
|
+ color: #9D4F0B;
|
|
|
margin-top: 10px;
|
|
|
+ font-family: 'SourceHanSansCN-Regular';
|
|
|
+ display: flex;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
.title {
|
|
|
- font-size: 1em;
|
|
|
+ font-size: 1.2em;
|
|
|
font-weight: bold;
|
|
|
margin-top: 5px;
|
|
|
+ color: #333333;
|
|
|
+ font-family: 'SourceHanSansCN-Medium';
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.no-data {
|
|
|
width: 100%;
|
|
|
- height: 80vh;
|
|
|
+ height: calc(100% -7vh);
|
|
|
display: flex;
|
|
|
+ flex-direction: column;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
+ margin-top: 10%;
|
|
|
+
|
|
|
+
|
|
|
+ img {
|
|
|
+ width: 40%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tips {
|
|
|
+ color: #88866F;
|
|
|
+ margin-top: 10px;
|
|
|
+ font-family: 'SourceHanSansCN-Regular';
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|