263 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="mt-[34px] w-[100%]">
 | |
|     <div class="flex items-center justify-between">
 | |
|       <KlTabBar v-model="query.type" :data="tabBar" :show-icon="true" />
 | |
|       <div class="flex gap-[15px]">
 | |
|         <span
 | |
|           v-for="(item, index) in projectTypeList"
 | |
|           :key="index"
 | |
|           :class="{ 'color-[#1A65FF!] border-b-[2px] border-b-solid border-b-[#1A65FF] rounded-[1px] pb-[3px]': query.projectTypeDay === item.id }"
 | |
|           class="cursor-pointer text-[14px] color-[#333333]"
 | |
|           @mouseenter="handleHover(item)"
 | |
|           @click="handleClickType(item)"
 | |
|         >
 | |
|           {{ item.name }}
 | |
|         </span>
 | |
|       </div>
 | |
|     </div>
 | |
|     <div class="content mt-[10px] flex">
 | |
|       <!-- <div class="sider">
 | |
|         <div class="box-border h-100% h-55px w-221px flex items-center rounded-lg bg-[#1A65FF] pl-24px text-white">
 | |
|           <img src="~/assets/images/1.png" alt="" srcset="" />
 | |
|           <span class="ml-12px text-16px">全部资源分类</span>
 | |
|         </div>
 | |
|         <div class="side-menu border border-[#EEEEEE] border-solid">
 | |
|           <div
 | |
|             v-for="(item, index) in projectTypeListChildren"
 | |
|             :key="index"
 | |
|             class="menu-item"
 | |
|             :class="{ active: query.projectType === item.id }"
 | |
|             @mouseenter="handleClick(item)"
 | |
|             @click="
 | |
|               handleClickType(
 | |
|                 projectTypeList?.find((c: any) => c.id === query.projectTypeDay),
 | |
|                 item
 | |
|               )
 | |
|             "
 | |
|           >
 | |
|             {{ item.name }}
 | |
|           </div>
 | |
|           <el-empty v-if="projectTypeList.length === 0" description="暂无数据"></el-empty>
 | |
|         </div>
 | |
|       </div> -->
 | |
|       <div class="box-border w-[100%]">
 | |
|         <div class="grid grid-cols-5 gap-[17px]">
 | |
|           <div
 | |
|             v-for="item in hotTopList"
 | |
|             :key="item.id"
 | |
|             class="cursor-pointer border border-[#EEEEEE] rounded-[1px] border-solid bg-[#FFFFFF]"
 | |
|             @click="handleCardClick(item)"
 | |
|           >
 | |
|             <div>
 | |
|               <div class="h-[212px] w-[100%]">
 | |
|                 <el-image :src="item.iconUrl" alt="" srcset="" fit="cover" class="block h-[100%] w-[100%]" />
 | |
|               </div>
 | |
|               <div class="ellipsis mx-[20px] my-[11px] text-[14px] color-[#333333] font-normal">{{ item.title }}</div>
 | |
|             </div>
 | |
|           </div>
 | |
|         </div>
 | |
|         <el-empty v-if="hotTopList?.length === 0" description="暂无数据"></el-empty>
 | |
|       </div>
 | |
|     </div>
 | |
|     <!-- <div class="morefont-400 text-16px text-[#1A65FF] text-right cursor-pointer"> 查看更多 >> </div> -->
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script lang="ts" setup>
 | |
|   import { reactive, ref, watch } from 'vue'
 | |
|   import KlTabBar from '~/components/kl-tab-bar/index.vue'
 | |
|   // import KlCardDetail from '~/components/kl-card-detail/index.vue'
 | |
|   import { hotTop, hotTag } from '~/api/home/index'
 | |
|   import type { ProjectDrawPageRespVO, ProjectDictNodeVO } from '~/api/home/type'
 | |
| 
 | |
|   /** tianjia key 接口刷新了 页面没变化 */
 | |
|   definePageMeta({
 | |
|     key: 'PopularDrawings', // 页面的唯一标识,用于区分不同的页面
 | |
|   })
 | |
| 
 | |
|   /** 请求参数 */
 | |
|   const query = reactive({
 | |
|     type: 1,
 | |
|     projectType: '',
 | |
|     projectTypeDay: '', // 自定义的
 | |
|     isDomestic: 1,
 | |
|     limit: 6,
 | |
|   })
 | |
| 
 | |
|   const tabBar = ref([
 | |
|     {
 | |
|       label: '热门图纸',
 | |
|       value: 1,
 | |
|     },
 | |
|     {
 | |
|       label: '热门模型',
 | |
|       value: 3,
 | |
|     },
 | |
|     {
 | |
|       label: '热门文本',
 | |
|       value: 2,
 | |
|     },
 | |
|   ])
 | |
| 
 | |
|   // const hotTopListTitle = computed(() => {
 | |
|   //   if (projectTypeList.value.length > 0) {
 | |
|   //     const item = projectTypeList.value.find((item) => item.id === query.projectType)
 | |
|   //     return item?.name
 | |
|   //   }
 | |
|   //   return ''
 | |
|   // })
 | |
| 
 | |
|   /** 点击卡片 */
 | |
|   const handleCardClick = (item: ProjectDrawPageRespVO) => {
 | |
|     // 跳转到下载详情页 并且是单独开标签
 | |
|     navigateTo(`/down-drawe-detail/${item.id}`) // 修改为在新窗口打开
 | |
|   }
 | |
| 
 | |
|   const handleClickType = (primary?: ProjectDictNodeVO, secondary?: ProjectDictNodeVO) => {
 | |
|     if (primary?.name !== '全部分类') return
 | |
|     const normal = { id: '0', name: query.type === 1 ? '图纸库' : query.type === 2 ? '文本库' : '模型库', isChildren: false }
 | |
|     const level = [primary, secondary].filter((item) => item).map((item) => ({ id: item?.id, name: item?.name, isChildren: item?.children ? false : true }))
 | |
|     if (primary?.id === '0') {
 | |
|       level[0].name = '图纸库'
 | |
|     } else {
 | |
|       level.unshift(normal)
 | |
|     }
 | |
|     if (query.type === 1) {
 | |
|       navigateTo(`/drawe?level=${JSON.stringify(level)}`)
 | |
|     } else if (query.type === 2) {
 | |
|       navigateTo(`/text?level=${JSON.stringify(level)}`)
 | |
|     } else if (query.type === 3) {
 | |
|       navigateTo(`/model?level=${JSON.stringify(level)}`)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /** 热门数据 */
 | |
|   // const hotTopList = ref<ProjectDrawPageRespVO[]>([])
 | |
|   // const getHotTop = () => {
 | |
|   //   hotTop({
 | |
|   //     type: query.type,
 | |
|   //     projectType: query.projectTypeDay,
 | |
|   //     isDomestic: query.isDomestic,
 | |
|   //     projectTypeTop: query.projectTypeDay,
 | |
|   //   }).then((res) => {
 | |
|   //     if (res.code === 0) {
 | |
|   //       hotTopList.value = res.data || []
 | |
|   //     }
 | |
|   //   })
 | |
|   // }
 | |
| 
 | |
|   const { data: projectTypeList, refresh: getParent } = await useAsyncData('projectTypeListChildren-PopularDrawings-popularDrawings', async () => {
 | |
|     const res = await hotTag({
 | |
|       type: query.type,
 | |
|       limit: 6,
 | |
|       size: 1000,
 | |
|     })
 | |
|     const all = [{ id: '0', name: '全部分类', children: [] }]
 | |
|     if (Array.isArray(res.data) && res.data?.length > 0) {
 | |
|       const total = [...res.data, ...all]
 | |
|       query.projectTypeDay = total[0]?.id || ''
 | |
|       // query.projectType = total[0]!.children?.[0]?.id || ''
 | |
|       return total
 | |
|     }
 | |
|     return []
 | |
|   })
 | |
| 
 | |
|   // if (!projectTypeList.value?.length) {
 | |
|   //   throw createError({
 | |
|   //     statusCode: 404,
 | |
|   //     statusMessage: 'Page Not Found',
 | |
|   //     fatal: true,
 | |
|   //   })
 | |
|   // }
 | |
| 
 | |
|   const { data: hotTopList, refresh: getHotTop } = useAsyncData('hotTop-PopularDrawings-popularDrawings', async () => {
 | |
|     const res = await hotTop({
 | |
|       type: query.type,
 | |
|       // @ts-ignore
 | |
|       projectType: query.projectTypeDay || projectTypeList.value[0].id,
 | |
|       isDomestic: query.isDomestic || 1,
 | |
|       projectTypeTop: query.projectTypeDay || projectTypeList.value?.[0].id,
 | |
|     })
 | |
|     return res.data || []
 | |
|   })
 | |
| 
 | |
|   /** 获取分类下拉框 */
 | |
|   // const projectTypeList = ref<ProjectDictNodeVO[]>([])
 | |
|   // // const projectTypeListChildren = ref<ProjectDictNodeVO[]>([])
 | |
|   // const getParent = () => {
 | |
|   //   hotTag({
 | |
|   //     type: query.type,
 | |
|   //     limit: 6,
 | |
|   //     size: 1000,
 | |
|   //   }).then((res) => {
 | |
|   //     if (res.code === 0) {
 | |
|   //       if (Array.isArray(res.data) && res.data.length > 0) {
 | |
|   //         projectTypeList.value = [...res.data, { id: '0', name: '全部分类', children: [] }]
 | |
|   //         projectTypeListChildren.value = res.data[0].children || []
 | |
|   //         query.projectTypeDay = res.data[0].id || ''
 | |
|   //         query.projectType = res.data[0]!.children?.[0]!.id || ''
 | |
|   //         // 热门数据
 | |
|   //         getHotTop()
 | |
|   //       } else {
 | |
|   //         hotTopList.value = []
 | |
|   //       }
 | |
|   //     }
 | |
|   //   })
 | |
|   // }
 | |
| 
 | |
|   const handleHover = (item: ProjectDictNodeVO) => {
 | |
|     if (item.name === '全部分类') return
 | |
|     query.projectTypeDay = item.id || ''
 | |
|     // projectTypeListChildren.value = item.children || []
 | |
|     // query.projectType = item.id || ''
 | |
|     // 热门数据
 | |
|     getHotTop()
 | |
|   }
 | |
| 
 | |
|   /** 点击分类 */
 | |
|   // const handleClick = (item: ProjectDictNodeVO) => {
 | |
|   //   query.projectType = item.id || ''
 | |
|   //   getHotTop()
 | |
|   // }
 | |
| 
 | |
|   watch(
 | |
|     () => query.type,
 | |
|     async () => {
 | |
|       await getParent()
 | |
|       await getHotTop()
 | |
|     },
 | |
|     {
 | |
|       // immediate: true,
 | |
|     }
 | |
|   )
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
|   .side-menu {
 | |
|     width: 221px;
 | |
|     height: 470px;
 | |
|     background-color: #fff;
 | |
|     // padding: 10px 0;
 | |
|     /* box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); */
 | |
|     overflow-y: auto;
 | |
|     box-sizing: border-box;
 | |
|   }
 | |
| 
 | |
|   .menu-item {
 | |
|     padding: 10px 24px;
 | |
|     cursor: pointer;
 | |
|     transition: all 0.3s ease;
 | |
|     color: #333;
 | |
|     font-size: 14px;
 | |
|     &.active {
 | |
|       background-color: #f0f7ff;
 | |
|       color: #1a65ff !important;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .menu-item:hover {
 | |
|     background-color: #f0f7ff;
 | |
|     color: #1a65ff;
 | |
|   }
 | |
| </style>
 | 
