首页骨架 css样式

This commit is contained in:
2023-07-14 17:53:58 +08:00
parent bfac0867b5
commit 0819f9812f
7 changed files with 173 additions and 21 deletions

View File

@@ -69,8 +69,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="corner-box" v-if="itemData.type === 'housing'"> <div class="corner-box">
<img src="../../assets/homeImage/corner.svg" class="corner-img" alt=""> <img src="../../assets/homeImage/corner.svg" v-if="itemData.type === 'housing'&&itemData.intermediary!==1" class="corner-img" alt="">
<img src="../../assets/homeImage/intermediaryCorner.svg" v-if="itemData.type === 'housing'&&itemData.intermediary===1" style="transform: rotate(90deg);" class="tab-img" alt="">
</div> </div>
<!-- <div class="apartment-price-more flexcenter">更多</div> --> <!-- <div class="apartment-price-more flexcenter">更多</div> -->
@@ -213,7 +214,7 @@ let itemData = props.data
font-weight: 400; font-weight: 400;
font-style: normal; font-style: normal;
font-size: 14px; font-size: 14px;
color: #7F7F7F; color: #AAAAAA;
margin-top: 15px; margin-top: 15px;
padding: 0 10px; padding: 0 10px;
} }

View File

@@ -10,11 +10,13 @@
{{ {{
item.name }}</div> item.name }}</div>
<div class="user-box"> <div class="user-box">
<img src="" class="user-img" alt=""> <img :src="user.data.avatar" class="user-img" alt="">
<div class="user-out-box"> <div class="user-out-box">
<div class="box-bg dis-f jus-x"> <div class="box-bg dis-f jus-x">
<div class="top-box"></div> <div class="top-box"></div>
退出 <a :href="quitUrl" style="color: #fff;">
退出
</a>
</div> </div>
</div> </div>
</div> </div>
@@ -29,9 +31,9 @@
<div class="dis-f jus-x al-item" style="margin-top:20px;" v-if="routePath === '/'"> <div class="dis-f jus-x al-item" style="margin-top:20px;" v-if="routePath === '/'">
<div class="body-maxWidth"> <div class="body-maxWidth">
<el-carousel :interval="5000" arrow="always" height="330" style="height:330px;"> <el-carousel :interval="5000" arrow="always" height="330" style="height:330px;">
<el-carousel-item v-for="item in 4" :key="item"> <el-carousel-item v-for="item in bannerLists.data" :key="item.feedId">
<div style="width:100%;height:100%;" class="dis-f jus-x al-item"> <div style="width:100%;height:100%;" class="dis-f jus-x al-item">
<img class="carousel-img" src="../../assets/homeImage/carousel.svg" alt=""> <img class="carousel-img" :src="item.imageurl" alt="">
</div> </div>
</el-carousel-item> </el-carousel-item>
</el-carousel> </el-carousel>
@@ -56,12 +58,31 @@
<script setup> <script setup>
import store from '../../store/index'; import store from '../../store/index';
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { reactive, watchEffect, ref } from "vue"; import { reactive, watchEffect, ref,defineProps } from "vue";
const props=defineProps({
bannerList:{
type:Array,
default:function (){
return []
}
}
})
//退出登录
let url = location.href
let quitUrl = ref(`https://passport.gter.net/login/quit?referer=${url}`)
//个人信息
let user = reactive({data:{}})
//组件数据 //组件数据
let topTab = reactive({ data: [] }) let topTab = reactive({ data: [] })
let seachTab = reactive({ data: [] }) let seachTab = reactive({ data: [] })
let bannerLists = reactive({data:[]})
watchEffect(() => { watchEffect(() => {
console.log(store.state.indexData.menu) user.data=store.state.user
bannerLists.data=props.bannerList
console.log(bannerLists.data)
if (!store.state.indexData.menu) return if (!store.state.indexData.menu) return
store.state.indexData.menu.map(res => { store.state.indexData.menu.map(res => {
if (res.name === '首页') { if (res.name === '首页') {
@@ -192,7 +213,7 @@ tabBtnType.value = route.path
.top-bg-img-box .user-img { .top-bg-img-box .user-img {
width: 32px; width: 32px;
height: 32px; height: 32px;
border-radius: 16rpx; border-radius: 50%;
} }
.top-bg-img-box .info-box .logo-box { .top-bg-img-box .info-box .logo-box {

View File

@@ -73,7 +73,8 @@
v-if="allHireType.data.length"></seachInfo> v-if="allHireType.data.length"></seachInfo>
</div> </div>
<!-- --> <!-- -->
<div v-if="routePath === '/personHousing' || routePath === '/intermediaryHousing'||routePath === '/needHousing'"> <div
v-if="routePath === '/personHousing' || routePath === '/intermediaryHousing' || routePath === '/needHousing'">
<selectTabBox></selectTabBox> <selectTabBox></selectTabBox>
</div> </div>
</div> </div>
@@ -83,11 +84,12 @@
</template> </template>
<script setup> <script setup>
import { ref, watchEffect, reactive, watch } from 'vue'; import { ref, watchEffect, reactive, beforeMount } from 'vue';
import seachInfo from '../indexSeachInfo/indexSeachInfo.vue'; import seachInfo from '../indexSeachInfo/indexSeachInfo.vue';
import selectTabBox from "../selectTabBox/selectTabBox.vue"; import selectTabBox from "../selectTabBox/selectTabBox.vue";
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import store from '../../store/index'; import store from '../../store/index';
import api from "../../utils/api";
//搜索框 //搜索框
@@ -103,6 +105,25 @@ let seachArea = {};//区域找房
let historyArr = reactive({ data: [] })//历史查找记录 let historyArr = reactive({ data: [] })//历史查找记录
let hotArr = reactive({ data: [] }) let hotArr = reactive({ data: [] })
//获取区域下列数据
let getLocationData = () => {
console.log(seachArea.data)
api.getLocationData().then(res => {
console.log(res)
if (res.code === 200) {
for (let item in res.data) {
if (!seachArea.data[item.substring(0, 1) - 1].data) seachArea.data[item.substring(0, 1) - 1].data = []
if (item.length > 1) {
seachArea.data[item.substring(0, 1) - 1].data.push({
title: res.data[item],
id: item
})
}
}
}
})
}
//监听路由 //监听路由
const route = useRoute() const route = useRoute()
let routePath = ref('') let routePath = ref('')
@@ -113,6 +134,7 @@ watchEffect(() => {
hireType.data = store.state.seachTypeData[2] ? store.state.seachTypeData[2].where[0].data : [] hireType.data = store.state.seachTypeData[2] ? store.state.seachTypeData[2].where[0].data : []
allHireType.data = store.state.seachTypeData[2] ? store.state.seachTypeData[2].where[1].data : [] allHireType.data = store.state.seachTypeData[2] ? store.state.seachTypeData[2].where[1].data : []
seachArea.data = store.state.seachTypeData[1] ? store.state.seachTypeData[1].where : [] seachArea.data = store.state.seachTypeData[1] ? store.state.seachTypeData[1].where : []
if (seachArea.data.length > 0&&!seachArea.data[0].data) getLocationData()
hotArr.data = store.state.indexData.hotSearcheWords hotArr.data = store.state.indexData.hotSearcheWords
}) })
@@ -125,6 +147,7 @@ let seachList = () => {
localStorage.setItem('historyArr', JSON.stringify(historyArr.data)); localStorage.setItem('historyArr', JSON.stringify(historyArr.data));
} }
defineExpose({ defineExpose({
historyShow, historyShow,
seachValue seachValue

View File

@@ -0,0 +1,63 @@
<template>
<div>
<el-skeleton style="width: 240px" animated="true">
<template #template>
<el-skeleton-item variant="image" style="width: 240px; height: 240px" />
<div style="padding: 14px">
<el-skeleton-item variant="p" style="width: 50%" />
<div style="
display: flex;
align-items: center;
justify-items: space-between;
">
<el-skeleton-item variant="text" style="margin-right: 16px" />
<el-skeleton-item variant="text" style="width: 30%" />
</div>
</div>
</template>
</el-skeleton>
</div>
</template>
<script setup>
</script>
<style scoped>
img {
object-fit: contain;
}
.dis-f {
display: flex;
}
.jus-x {
justify-content: center;
}
.al-item {
align-items: center;
}
.pos-r {
position: relative;
}
.body-maxWidth {
width: 1200px;
min-width: 1200px;
}
.s-w-100 {
width: 100%;
}
.jus-bet {
justify-content: space-between;
}
.mg-t-35 {
margin-top: 35px;
}
</style>

View File

@@ -20,6 +20,9 @@ import {
ElPopover, ElPopover,
ElDatePicker, ElDatePicker,
ElMessage, ElMessage,
ElSpace,
ElSkeleton,
ElSkeletonItem,
// 其他需要的组件 // 其他需要的组件
} from 'element-plus' } from 'element-plus'
@@ -43,7 +46,6 @@ api.index().then(res => {
store.state.user = res.data.user store.state.user = res.data.user
store.state.nav = res.data.nav store.state.nav = res.data.nav
store.state.wechat = res.data.wechat store.state.wechat = res.data.wechat
console.log(123,res.data.recommendedTab)
} }
}) })
@@ -64,6 +66,8 @@ app.use(ElDropdown)
app.use(ElPopover) app.use(ElPopover)
app.use(ElDatePicker) app.use(ElDatePicker)
app.use(ElMessage) app.use(ElMessage)
app.use(ElSkeleton)
app.use(ElSkeletonItem)
app.use(store).use(router).use(Axios).mount('#app') app.use(store).use(router).use(Axios).mount('#app')

View File

@@ -9,5 +9,11 @@ export default{
}, },
recommendList:(params={})=>{//首页瀑布流 recommendList:(params={})=>{//首页瀑布流
return axios.get('/tenement/pc/api/home/recommendList',params) return axios.get('/tenement/pc/api/home/recommendList',params)
},
banner:(params={})=>{//轮播
return axios.get('/tenement/pc/api/banner',params)
},
getLocationData:(params={})=>{//地区选择数据
return axios.get('/tenement/pc/api/home/getLocationData',params)
} }
} }

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="home"> <div class="home">
<pageTopBar></pageTopBar> <pageTopBar :bannerList="bannerList.data"></pageTopBar>
<!-- <headerNavigation></headerNavigation> --> <!-- <headerNavigation></headerNavigation> -->
<!-- 搜索模块 --> <!-- 搜索模块 -->
<seachModule></seachModule> <seachModule></seachModule>
@@ -107,7 +107,10 @@
<div class="body-maxWidth dis-f al-item"> <div class="body-maxWidth dis-f al-item">
<div class="waterfall-box s-w-100"> <div class="waterfall-box s-w-100">
<div> <div>
<div ref="waterfall1"> <div v-show="waterfallList['1'].length===0">
<skeletonBox v-show="waterfallList['1'].length===0" v-for="item in noWaterfallList['1']" :key="item"></skeletonBox>
</div>
<div ref="waterfall1" v-show="waterfallList['1'].length>0">
<div class="waterfall-first-box dis-f"> <div class="waterfall-first-box dis-f">
<div class="info-box dis-f jus-x al-item first" @click="indexWaterfallBoxCheck(indexData.data.tabs[0])"> <div class="info-box dis-f jus-x al-item first" @click="indexWaterfallBoxCheck(indexData.data.tabs[0])">
<div> <div>
@@ -142,22 +145,32 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 骨架屏 -->
<indexWaterfallBox v-for="(item, i) in waterfallList['1']" :data="item" :key="i"></indexWaterfallBox> <indexWaterfallBox v-for="(item, i) in waterfallList['1']" :data="item" :key="i"></indexWaterfallBox>
</div> </div>
</div> </div>
<div> <div>
<div ref="waterfall2"> <div v-show="waterfallList['2'].length===0">
<skeletonBox v-show="waterfallList['2'].length===0" v-for="item in noWaterfallList['2']" :key="item"></skeletonBox>
</div>
<div ref="waterfall2" v-show="waterfallList['2'].length>0">
<indexWaterfallBox v-for="(item, i) in waterfallList['2']" :data="item" :key="i"></indexWaterfallBox> <indexWaterfallBox v-for="(item, i) in waterfallList['2']" :data="item" :key="i"></indexWaterfallBox>
</div> </div>
<!-- <img src="../assets/homeImage/liveImg.svg" class="live-img" alt=""> --> <!-- <img src="../assets/homeImage/liveImg.svg" class="live-img" alt=""> -->
</div> </div>
<div> <div>
<div ref="waterfall3"> <div v-show="waterfallList['3'].length===0">
<skeletonBox v-show="waterfallList['3'].length===0" v-for="item in noWaterfallList['3']" :key="item"></skeletonBox>
</div>
<div ref="waterfall3" v-show="waterfallList['3'].length>0">
<indexWaterfallBox v-for="(item, i) in waterfallList['3']" :data="item" :key="i"></indexWaterfallBox> <indexWaterfallBox v-for="(item, i) in waterfallList['3']" :data="item" :key="i"></indexWaterfallBox>
</div> </div>
</div> </div>
<div> <div>
<div ref="waterfall4"> <div v-show="waterfallList['4'].length===0">
<skeletonBox v-show="waterfallList['4'].length===0" v-for="item in noWaterfallList['4']" :key="item"></skeletonBox>
</div>
<div ref="waterfall4" v-show="waterfallList['4'].length>0">
<indexWaterfallBox v-for="(item, i) in waterfallList['4']" :data="item" :key="i"></indexWaterfallBox> <indexWaterfallBox v-for="(item, i) in waterfallList['4']" :data="item" :key="i"></indexWaterfallBox>
</div> </div>
</div> </div>
@@ -178,6 +191,7 @@ import pageTopBar from '../components/pageTopBar/pageTopBar.vue';
import indexWaterfallBox from "../components/indexWaterfallBox/indexWaterfallBox.vue"; import indexWaterfallBox from "../components/indexWaterfallBox/indexWaterfallBox.vue";
import seachModule from "../components/seachModule/seachModule.vue"; import seachModule from "../components/seachModule/seachModule.vue";
import indexRegularBox from '../components/indexRegularBox/indexRegularBox.vue'; import indexRegularBox from '../components/indexRegularBox/indexRegularBox.vue';
import skeletonBox from '../components/skeletonBox/skeletonBox.vue'
import headerNavigation from '../components/public/head.vue'; import headerNavigation from '../components/public/head.vue';
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import store from '../store/index'; import store from '../store/index';
@@ -230,9 +244,12 @@ api.getApartment().then(res => {
//获取实例 //获取实例
let currentInstance = null let currentInstance = null
let pagevalue = ref(0)
//瀑布流数据 //瀑布流数据
let pages = ref(1) let pages = ref(1)
let waterfallList = reactive({ 1: [], 2: [], 3: [], 4: [] }) let waterfallList = reactive({ 1: [], 2: [], 3: [], 4: [] })
let noWaterfallList=reactive({1:3,2:3,3:3,4:3})
//判断最小值 //判断最小值
let getMinHeight = (data) => { let getMinHeight = (data) => {
@@ -249,6 +266,16 @@ let getMinHeight = (data) => {
// console.log(index,waterfallAll) // console.log(index,waterfallAll)
} }
//轮播
let bannerList = reactive({ data: [] })
let banner = () => {
api.banner({ type: 'home' }).then(res => {
if (res.code === 200) {
bannerList.data = res.data
}
})
}
//瀑布流添加 //瀑布流添加
let addListData = (data) => { let addListData = (data) => {
data.map((res) => { data.map((res) => {
@@ -264,11 +291,15 @@ let getRecommendList = () => {
api.recommendList({ api.recommendList({
page: pages.value, page: pages.value,
limit: 30, limit: 30,
type: ListSelectBtn.selectType type: ListSelectBtn.selectType,
pagevalue: pagevalue.value
}).then(res => { }).then(res => {
console.log(res) console.log(res)
if (res.code === 200) { if (res.code === 200) {
if (res.data.pagevalue) addListData(res.data.data) if (res.data.pagevalue) {
addListData(res.data.data)
pagevalue.value = res.data.pagevalue
}
if (res.data.data.length >= 30) { if (res.data.data.length >= 30) {
loadMore.value = true loadMore.value = true
} else { } else {
@@ -287,6 +318,7 @@ let listDataTypeChange = (item) => {
waterfallList[3] = [] waterfallList[3] = []
waterfallList[4] = [] waterfallList[4] = []
pages.value = 1 pages.value = 1
pagevalue.value = 0
getRecommendList() getRecommendList()
} }
@@ -322,12 +354,14 @@ onMounted(() => {
currentInstance = getCurrentInstance() currentInstance = getCurrentInstance()
setTimeout(() => { setTimeout(() => {
getRecommendList() getRecommendList()
banner()
window.addEventListener('scroll', onPageSrcoll, true); window.addEventListener('scroll', onPageSrcoll, true);
}, 1000) }, 1000)
}) })
onBeforeUnmount(() => { onBeforeUnmount(() => {
window.removeEventListener('scroll', onPageSrcoll); window.removeEventListener('scroll', onPageSrcoll, true);
console.log('卸载', window.scroll)
}) })