瑶都万能墙
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

205 lines
4.1 KiB

<template>
<view class="page">
<navbar title="同城群"/>
<!-- 顶部操作栏 -->
<view class="top-actions">
<view class="search-container">
<uv-search
v-model="searchKeyword"
placeholder="搜索群组名称"
@search="onSearch"
@clear="onClear"
bgColor="#f5f5f5"
:showAction="false"
></uv-search>
</view>
<view class="create-btn" @click="createGroup">
<uv-icon name="plus" size="30rpx" color="#fff"></uv-icon>
<text>创建群组</text>
</view>
</view>
<!-- 城市分类标签 -->
<view class="city-tabs-container">
<uv-tabs
:list="categoryList"
:current="currentCityTabIndex"
:activeStyle="{color: '#5baaff', fontWeight: 600}"
lineColor="#5baaff"
lineHeight="6rpx"
lineWidth="40rpx"
keyName="name"
@click="onCategoryClick"
/>
</view>
<!-- 群组列表 -->
<view class="group-list">
<groupItem
:key="index"
v-for="(item, index) in List"
:item="item"
@click="onGroupClick(item)"
/>
</view>
<!-- 空状态 -->
<view v-if="List.length === 0 && !loading" class="empty-state">
<uv-empty
mode="list"
text="暂无群组"
iconSize="120"
></uv-empty>
</view>
<!-- 加载状态 -->
<view v-if="loading" class="loading-state">
<uv-loading-icon size="40"></uv-loading-icon>
<text>加载中...</text>
</view>
<tabber select="2" />
</view>
</template>
<script>
import tabber from '@/components/base/tabbar.vue'
import groupItem from '@/components/list/group/groupItem.vue'
import loadList from '@/mixins/loadList.js'
import { mapState } from 'vuex'
export default {
components : {
tabber,
groupItem,
},
mixins: [loadList],
data() {
return {
searchKeyword: '',
currentCityTabIndex: 0, // uv-tabs当前选中的城市索引
mixinsListApi: 'groupList', // 使用group.js中的groupList接口
}
},
computed: {
...mapState(['cityList']),
// 城市分类列表(包含"全部"选项)
categoryList() {
const allTab = { name: '全部', value: null }
const cityTabs = this.cityList.map(city => ({
name: city.name || city.cityName || city.title,
value: city.id || city.cityId
}))
return [allTab, ...cityTabs]
}
},
onLoad() {
// 获取城市列表
this.$store.commit('getCityList')
},
methods: {
// 搜索群组
onSearch(keyword) {
this.searchKeyword = keyword
this.queryParams.title = keyword // 使用后端字段名
this.refreshList()
},
// 清除搜索
onClear() {
this.searchKeyword = ''
delete this.queryParams.title
this.refreshList()
},
// 分类点击
onCategoryClick(item) {
this.currentCityTabIndex = item.index
if (item.value) {
// 使用城市ID作为筛选条件
this.queryParams.classId = item.value // 使用后端字段名
} else {
// 选择"全部"时清除城市筛选
delete this.queryParams.classId
}
this.refreshList()
},
// 群组点击
onGroupClick(item) {
// 跳转到群组详情页
this.$utils.navigateTo('/pages_order/group/groupDetail?id=' + item.id)
},
// 创建群组
createGroup() {
this.$utils.navigateTo('/pages_order/group/createGroup')
}
}
}
</script>
<style scoped lang="scss">
.page{
background-color: #f5f5f5;
min-height: 100vh;
.top-actions {
background-color: #fff;
padding: 20rpx;
display: flex;
align-items: center;
gap: 20rpx;
.search-container {
flex: 1;
}
.create-btn {
display: flex;
align-items: center;
background-color: #5baaff;
color: #fff;
padding: 15rpx 20rpx;
border-radius: 30rpx;
font-size: 26rpx;
text {
margin-left: 8rpx;
}
}
}
.category-tabs {
background-color: #fff;
margin-bottom: 20rpx;
}
.group-list {
padding-bottom: 120rpx;
}
.empty-state {
padding: 100rpx 0;
text-align: center;
}
.loading-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 100rpx 0;
text {
margin-top: 20rpx;
color: #999;
font-size: 28rpx;
}
}
}
</style>