首页骨架 css样式
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
63
src/components/skeletonBox/skeletonBox.vue
Normal file
63
src/components/skeletonBox/skeletonBox.vue
Normal 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>
|
||||||
|
|
||||||
@@ -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')
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user