<template>
|
|
<view class="square-page">
|
|
<navbar title="广场"/>
|
|
|
|
|
|
<!-- 一级分类:关注/发现 -->
|
|
<view class="primary-tabs">
|
|
<view
|
|
class="primary-tab-item"
|
|
:class="{active: currentPrimaryTab === 0}"
|
|
@click="switchPrimaryTab(0)"
|
|
>
|
|
关注
|
|
</view>
|
|
<view
|
|
class="primary-tab-item"
|
|
:class="{active: currentPrimaryTab === 1}"
|
|
@click="switchPrimaryTab(1)"
|
|
>
|
|
发现
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 二级分类:城市列表 -->
|
|
<!-- <view class="secondary-tabs">
|
|
<scroll-view scroll-x="true" class="city-scroll">
|
|
<view class="city-tabs">
|
|
<view
|
|
class="city-tab-item"
|
|
:class="{active: currentCityIndex === -1}"
|
|
@click="switchCity(-1, null)"
|
|
>
|
|
全部
|
|
</view>
|
|
<view
|
|
v-for="(city, index) in cityList"
|
|
:key="city.id || index"
|
|
class="city-tab-item"
|
|
:class="{active: currentCityIndex === index}"
|
|
@click="switchCity(index, city)"
|
|
>
|
|
{{ city.name || city.cityName }}
|
|
</view>
|
|
</view>
|
|
</scroll-view>
|
|
</view> -->
|
|
|
|
<!-- 使用uv-tabs组件的城市分类 -->
|
|
<view class="city-tabs-container">
|
|
<uv-tabs
|
|
:list="cityTabsList"
|
|
:current="currentCityTabIndex"
|
|
:activeStyle="{color: '#5baaff', fontWeight: 600}"
|
|
lineColor="#5baaff"
|
|
lineHeight="6rpx"
|
|
lineWidth="40rpx"
|
|
keyName="name"
|
|
@click="onCityTabClick"
|
|
/>
|
|
</view>
|
|
|
|
<!-- 瀑布流列表 -->
|
|
<view class="content-container">
|
|
<waterfallContainer
|
|
:list="List"
|
|
@item-click="onItemClick"
|
|
@item-like="onItemLike"
|
|
/>
|
|
|
|
<!-- 加载更多提示 -->
|
|
<view v-if="loadmore && List.length > 0" class="load-more">
|
|
<uv-loading-icon size="28"></uv-loading-icon>
|
|
<text class="load-more-text">加载更多...</text>
|
|
</view>
|
|
|
|
<!-- 没有更多数据提示 -->
|
|
<view v-if="!loadmore && List.length > 0" class="no-more">
|
|
<text>— 没有更多了 —</text>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 空状态 -->
|
|
<view v-if="!loading && List.length === 0" class="empty-state">
|
|
<uv-empty
|
|
text="暂无动态"
|
|
textColor="#999"
|
|
icon="list"
|
|
iconColor="#ddd"
|
|
iconSize="120"
|
|
></uv-empty>
|
|
</view>
|
|
|
|
<!-- 加载状态 -->
|
|
<view v-if="loading && List.length === 0" class="loading-state">
|
|
<uv-loading-icon size="40"></uv-loading-icon>
|
|
<text class="loading-text">加载中...</text>
|
|
</view>
|
|
|
|
<tabber select="1" />
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import navbar from '@/components/base/navbar.vue'
|
|
import tabber from '@/components/base/tabbar.vue'
|
|
import waterfallContainer from '@/components/list/square/waterfallContainer.vue'
|
|
import mixinsList from '@/mixins/loadList.js'
|
|
import { mapState } from 'vuex'
|
|
|
|
export default {
|
|
mixins: [mixinsList],
|
|
components: {
|
|
navbar,
|
|
tabber,
|
|
waterfallContainer
|
|
},
|
|
data() {
|
|
return {
|
|
mixinsListApi: 'getPostPage', // 使用与首页相同的API
|
|
currentPrimaryTab: 1, // 默认显示发现
|
|
currentCityIndex: -1, // 默认全部城市
|
|
currentCity: null,
|
|
currentCityTabIndex: 0 // uv-tabs当前选中的城市索引
|
|
}
|
|
},
|
|
onLoad() {
|
|
// 获取城市列表
|
|
this.$store.commit('getCityList')
|
|
|
|
// 初始化查询参数
|
|
this.initQueryParams()
|
|
},
|
|
onShow() {
|
|
this.refreshList()
|
|
},
|
|
onPullDownRefresh() {
|
|
this.refreshList()
|
|
},
|
|
onReachBottom() {
|
|
this.loadMore()
|
|
},
|
|
computed: {
|
|
...mapState(['cityList']),
|
|
|
|
// 城市标签页列表(包含"全部"选项)
|
|
cityTabsList() {
|
|
const allTab = { id: null, name: '全部' }
|
|
const cityTabs = this.cityList.map(city => ({
|
|
id: city.id || city.cityId,
|
|
name: city.name || city.cityName || city.title
|
|
}))
|
|
return [allTab, ...cityTabs]
|
|
}
|
|
},
|
|
methods: {
|
|
// 初始化查询参数
|
|
initQueryParams() {
|
|
// 设置默认查询参数
|
|
this.queryParams = {
|
|
...this.queryParams,
|
|
type: this.currentPrimaryTab // 0: 关注, 1: 发现
|
|
}
|
|
|
|
// 如果有选择城市,添加城市参数
|
|
if (this.currentCity) {
|
|
this.queryParams.cityId = this.currentCity.id || this.currentCity.cityId
|
|
}
|
|
},
|
|
|
|
// 切换一级分类
|
|
switchPrimaryTab(index) {
|
|
if (this.currentPrimaryTab === index) return
|
|
|
|
this.currentPrimaryTab = index
|
|
this.queryParams.type = index
|
|
|
|
this.refreshList()
|
|
},
|
|
|
|
// 切换城市(已注释,改用uv-tabs的onCityTabClick方法)
|
|
// switchCity(index, city) {
|
|
// if (this.currentCityIndex === index) return
|
|
//
|
|
// this.currentCityIndex = index
|
|
// this.currentCity = city
|
|
//
|
|
// // 更新查询参数
|
|
// if (city) {
|
|
// this.queryParams.cityId = city.id || city.cityId
|
|
// } else {
|
|
// delete this.queryParams.cityId
|
|
// }
|
|
//
|
|
// this.refreshList()
|
|
// },
|
|
|
|
// 重写刷新方法
|
|
onRefresh() {
|
|
this.refreshList()
|
|
},
|
|
|
|
// 点击动态项
|
|
onItemClick(item) {
|
|
this.$utils.navigateTo('/pages_order/post/postDetail?id=' + item.id)
|
|
},
|
|
|
|
// 点赞动态
|
|
onItemLike(item) {
|
|
console.log('点赞动态:', item.id)
|
|
// 这里可以添加点赞API调用
|
|
},
|
|
|
|
// uv-tabs城市切换事件
|
|
onCityTabClick(item) {
|
|
this.currentCityTabIndex = item.index
|
|
|
|
// 如果是第一个(全部),清除城市筛选
|
|
if (item.index === 0) {
|
|
this.currentCity = null
|
|
this.currentCityIndex = -1
|
|
delete this.queryParams.cityId
|
|
} else {
|
|
// 获取对应的城市数据
|
|
const cityData = this.cityList[item.index - 1] // 减1是因为第一个是"全部"
|
|
this.currentCity = cityData
|
|
this.currentCityIndex = item.index - 1
|
|
this.queryParams.cityId = cityData.id || cityData.cityId
|
|
}
|
|
|
|
this.refreshList()
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.square-page {
|
|
background-color: #f5f5f5;
|
|
min-height: 100vh;
|
|
}
|
|
|
|
|
|
|
|
.primary-tabs {
|
|
background-color: #fff;
|
|
display: flex;
|
|
padding: 0 30rpx;
|
|
border-bottom: 1rpx solid #eee;
|
|
|
|
.primary-tab-item {
|
|
flex: 1;
|
|
text-align: center;
|
|
padding: 30rpx 0;
|
|
font-size: 32rpx;
|
|
color: #666;
|
|
position: relative;
|
|
|
|
&.active {
|
|
color: #5baaff;
|
|
font-weight: bold;
|
|
|
|
&::after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
width: 60rpx;
|
|
height: 6rpx;
|
|
background-color: #5baaff;
|
|
border-radius: 3rpx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 原有的二级分类样式(已注释)
|
|
// .secondary-tabs {
|
|
// background-color: #fff;
|
|
// border-bottom: 1rpx solid #eee;
|
|
//
|
|
// .city-scroll {
|
|
// padding: 20rpx 0;
|
|
//
|
|
// .city-tabs {
|
|
// display: flex;
|
|
// white-space: nowrap;
|
|
// padding: 0 30rpx;
|
|
//
|
|
// .city-tab-item {
|
|
// flex-shrink: 0;
|
|
// padding: 16rpx 32rpx;
|
|
// margin-right: 20rpx;
|
|
// background-color: #f8f9fa;
|
|
// border-radius: 30rpx;
|
|
// font-size: 28rpx;
|
|
// color: #666;
|
|
// border: 1rpx solid transparent;
|
|
//
|
|
// &.active {
|
|
// background-color: #5baaff;
|
|
// color: #fff;
|
|
// }
|
|
//
|
|
// &:last-child {
|
|
// margin-right: 30rpx;
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// uv-tabs城市分类容器
|
|
.city-tabs-container {
|
|
background-color: #fff;
|
|
border-bottom: 1rpx solid #eee;
|
|
padding: 0 20rpx;
|
|
}
|
|
|
|
.content-container {
|
|
padding: 0;
|
|
}
|
|
|
|
.empty-state {
|
|
padding: 100rpx 0;
|
|
text-align: center;
|
|
}
|
|
|
|
.loading-state {
|
|
padding: 100rpx 0;
|
|
text-align: center;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
|
|
.loading-text {
|
|
margin-top: 20rpx;
|
|
font-size: 28rpx;
|
|
color: #999;
|
|
}
|
|
}
|
|
|
|
.load-more {
|
|
padding: 30rpx 0;
|
|
text-align: center;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
|
|
.load-more-text {
|
|
margin-top: 15rpx;
|
|
font-size: 24rpx;
|
|
color: #999;
|
|
}
|
|
}
|
|
|
|
.no-more {
|
|
padding: 30rpx 0;
|
|
text-align: center;
|
|
|
|
text {
|
|
font-size: 24rpx;
|
|
color: #ccc;
|
|
}
|
|
}
|
|
|
|
// 原有的城市滚动条隐藏样式(已注释,uv-tabs自带滚动处理)
|
|
// /deep/ .city-scroll::-webkit-scrollbar {
|
|
// display: none;
|
|
// }
|
|
</style>
|