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