- <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>
 
 
  |