| 
									
										
										
										
											2025-07-25 09:07:39 +08:00
										 |  |  |  | <template> | 
					
						
							|  |  |  |  |   <view class="region-container"> | 
					
						
							|  |  |  |  |     <!-- 收益区域列表 --> | 
					
						
							|  |  |  |  |     <view class="region-list"> | 
					
						
							|  |  |  |  |       <!-- 省级区域 --> | 
					
						
							|  |  |  |  |       <view v-if="shouldShowProvince" class="region-item"> | 
					
						
							|  |  |  |  |         <view class="region-card"> | 
					
						
							|  |  |  |  |           <view class="region-header"> | 
					
						
							|  |  |  |  |             <text class="region-level">省级区域</text> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							|  |  |  |  |           <view v-if="selectedData.provinceData" class="region-content"> | 
					
						
							|  |  |  |  |             <text class="region-name">{{ | 
					
						
							|  |  |  |  |               selectedData.provinceData.provinceName | 
					
						
							|  |  |  |  |             }}</text> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							| 
									
										
										
										
											2025-08-01 10:47:25 +08:00
										 |  |  |  |           <view v-if="unSelected.includes('province')" class="region-action"> | 
					
						
							| 
									
										
										
										
											2025-07-25 09:07:39 +08:00
										 |  |  |  |             <button class="select-btn" @click="selectProvinceRegion"> | 
					
						
							|  |  |  |  |               选择省级收益区域 | 
					
						
							|  |  |  |  |             </button> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							|  |  |  |  |         </view> | 
					
						
							|  |  |  |  |       </view> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       <!-- 市级区域 --> | 
					
						
							|  |  |  |  |       <view v-if="shouldShowCity" class="region-item"> | 
					
						
							|  |  |  |  |         <view class="region-card"> | 
					
						
							|  |  |  |  |           <view class="region-header"> | 
					
						
							|  |  |  |  |             <text class="region-level">市级区域</text> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							|  |  |  |  |           <view v-if="selectedData.cityData" class="region-content"> | 
					
						
							|  |  |  |  |             <text class="region-name">{{ | 
					
						
							|  |  |  |  |               selectedData.cityData.provinceName | 
					
						
							|  |  |  |  |             }}</text> | 
					
						
							|  |  |  |  |             <text class="region-separator">·</text> | 
					
						
							|  |  |  |  |             <text class="region-name">{{ | 
					
						
							|  |  |  |  |               selectedData.cityData.cityName | 
					
						
							|  |  |  |  |             }}</text> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							| 
									
										
										
										
											2025-08-01 10:47:25 +08:00
										 |  |  |  |           <view v-if="unSelected.includes('city')" class="region-action"> | 
					
						
							| 
									
										
										
										
											2025-07-25 09:07:39 +08:00
										 |  |  |  |             <button class="select-btn" @click="selectCityRegion"> | 
					
						
							|  |  |  |  |               选择市级收益区域 | 
					
						
							|  |  |  |  |             </button> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							|  |  |  |  |         </view> | 
					
						
							|  |  |  |  |       </view> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       <!-- 区县级区域 --> | 
					
						
							|  |  |  |  |       <view v-if="shouldShowCounty" class="region-item"> | 
					
						
							|  |  |  |  |         <view class="region-card"> | 
					
						
							|  |  |  |  |           <view class="region-header"> | 
					
						
							|  |  |  |  |             <text class="region-level">区县级区域</text> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							|  |  |  |  |           <view v-if="selectedData.countyData" class="region-content"> | 
					
						
							|  |  |  |  |             <text class="region-name">{{ | 
					
						
							|  |  |  |  |               selectedData.countyData.provinceName | 
					
						
							|  |  |  |  |             }}</text> | 
					
						
							|  |  |  |  |             <text class="region-separator">·</text> | 
					
						
							|  |  |  |  |             <text class="region-name">{{ | 
					
						
							|  |  |  |  |               selectedData.countyData.cityName | 
					
						
							|  |  |  |  |             }}</text> | 
					
						
							|  |  |  |  |             <text class="region-separator">·</text> | 
					
						
							|  |  |  |  |             <text class="region-name">{{ | 
					
						
							|  |  |  |  |               selectedData.countyData.countyName | 
					
						
							|  |  |  |  |             }}</text> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							| 
									
										
										
										
											2025-08-01 10:47:25 +08:00
										 |  |  |  |           <view v-if="unSelected.includes('county')" class="region-action"> | 
					
						
							| 
									
										
										
										
											2025-07-25 09:07:39 +08:00
										 |  |  |  |             <button class="select-btn" @click="selectCountyRegion"> | 
					
						
							|  |  |  |  |               选择区县收益区域 | 
					
						
							|  |  |  |  |             </button> | 
					
						
							|  |  |  |  |           </view> | 
					
						
							|  |  |  |  |         </view> | 
					
						
							|  |  |  |  |       </view> | 
					
						
							|  |  |  |  |     </view> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     <!-- 空状态 --> | 
					
						
							|  |  |  |  |     <view | 
					
						
							|  |  |  |  |       v-if="!shouldShowProvince && !shouldShowCity && !shouldShowCounty" | 
					
						
							|  |  |  |  |       class="empty-state" | 
					
						
							|  |  |  |  |     > | 
					
						
							|  |  |  |  |       <text class="empty-text">暂无收益区域数据</text> | 
					
						
							|  |  |  |  |     </view> | 
					
						
							|  |  |  |  |     <RegionSelect | 
					
						
							|  |  |  |  |       @success="successHandle" | 
					
						
							|  |  |  |  |       :autoTrigger="false" | 
					
						
							|  |  |  |  |       ref="regionSelect" | 
					
						
							| 
									
										
										
										
											2025-07-28 17:50:58 +08:00
										 |  |  |  |       showCancelButton | 
					
						
							| 
									
										
										
										
											2025-07-25 09:07:39 +08:00
										 |  |  |  |     /> | 
					
						
							|  |  |  |  |   </view> | 
					
						
							|  |  |  |  | </template> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <script> | 
					
						
							|  |  |  |  | import { getRegionSelect } from '@/config/mine.js' | 
					
						
							|  |  |  |  | import RegionSelect from '@/components/region-select/index.vue' | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | export default { | 
					
						
							|  |  |  |  |   name: 'RegionPage', | 
					
						
							|  |  |  |  |   components: { | 
					
						
							|  |  |  |  |     RegionSelect, | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   data() { | 
					
						
							|  |  |  |  |     return { | 
					
						
							|  |  |  |  |       unSelected: [], | 
					
						
							|  |  |  |  |       selectedData: {}, | 
					
						
							|  |  |  |  |       rawData: {}, // 保存原始接口数据
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   computed: { | 
					
						
							|  |  |  |  |     // 是否显示省级区域:有数据或者需要选择
 | 
					
						
							|  |  |  |  |     shouldShowProvince() { | 
					
						
							|  |  |  |  |       return ( | 
					
						
							|  |  |  |  |         this.selectedData.provinceData || this.unSelected.includes('province') | 
					
						
							|  |  |  |  |       ) | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     // 是否显示市级区域:有数据或者需要选择
 | 
					
						
							|  |  |  |  |     shouldShowCity() { | 
					
						
							|  |  |  |  |       return this.selectedData.cityData || this.unSelected.includes('city') | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     // 是否显示区县级区域:有数据或者需要选择
 | 
					
						
							|  |  |  |  |     shouldShowCounty() { | 
					
						
							|  |  |  |  |       return this.selectedData.countyData || this.unSelected.includes('county') | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   onShow() { | 
					
						
							|  |  |  |  |     this.getRegionSelect() | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   methods: { | 
					
						
							|  |  |  |  |     async getRegionSelect() { | 
					
						
							|  |  |  |  |       uni.showLoading({ | 
					
						
							|  |  |  |  |         title: '加载中...', | 
					
						
							|  |  |  |  |       }) | 
					
						
							|  |  |  |  |       return new Promise(async (resolve, reject) => { | 
					
						
							|  |  |  |  |         try { | 
					
						
							|  |  |  |  |           const res = await getRegionSelect() | 
					
						
							|  |  |  |  |           if (res?.code === 200) { | 
					
						
							|  |  |  |  |             this.rawData = res.data || {} | 
					
						
							|  |  |  |  |             // 需要选择的区域(字段为true的)
 | 
					
						
							|  |  |  |  |             const unSelected = Object.keys(res?.data || {}) | 
					
						
							|  |  |  |  |               .filter(key => key !== 'data') | 
					
						
							|  |  |  |  |               .filter(key => res.data[key] === true) | 
					
						
							|  |  |  |  |             this.unSelected = unSelected | 
					
						
							|  |  |  |  |             this.selectedData = res.data?.data || {} | 
					
						
							|  |  |  |  |             resolve() | 
					
						
							|  |  |  |  |           } | 
					
						
							|  |  |  |  |         } catch (error) { | 
					
						
							|  |  |  |  |           reject(false) | 
					
						
							|  |  |  |  |         } finally { | 
					
						
							|  |  |  |  |           uni.hideLoading() | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |       }) | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     // 选择省级收益区域
 | 
					
						
							|  |  |  |  |     selectProvinceRegion() { | 
					
						
							|  |  |  |  |       this.$refs.regionSelect.open('province') | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     // 选择市级收益区域
 | 
					
						
							|  |  |  |  |     selectCityRegion() { | 
					
						
							|  |  |  |  |       this.$refs.regionSelect.open('city') | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     // 选择区县收益区域
 | 
					
						
							|  |  |  |  |     selectCountyRegion() { | 
					
						
							|  |  |  |  |       this.$refs.regionSelect.open('county') | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |     successHandle(data) { | 
					
						
							|  |  |  |  |       this.getRegionSelect() | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | </script> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <style lang="scss" scoped> | 
					
						
							|  |  |  |  | .region-container { | 
					
						
							|  |  |  |  |   min-height: 100vh; | 
					
						
							|  |  |  |  |   background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); | 
					
						
							|  |  |  |  |   padding: 15rpx; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .region-list { | 
					
						
							|  |  |  |  |   padding: 0 15rpx; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .region-item { | 
					
						
							|  |  |  |  |   margin-bottom: 15rpx; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   .region-card { | 
					
						
							|  |  |  |  |     background: #ffffff; | 
					
						
							|  |  |  |  |     border-radius: 20rpx; | 
					
						
							|  |  |  |  |     padding: 20rpx; | 
					
						
							|  |  |  |  |     box-shadow: 0 8rpx 30rpx rgba(0, 91, 172, 0.1); | 
					
						
							|  |  |  |  |     border: 2rpx solid rgba(0, 91, 172, 0.1); | 
					
						
							|  |  |  |  |     transition: all 0.3s ease; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     &:hover { | 
					
						
							|  |  |  |  |       box-shadow: 0 12rpx 40rpx rgba(0, 91, 172, 0.15); | 
					
						
							|  |  |  |  |       transform: translateY(-4rpx); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   .region-header { | 
					
						
							|  |  |  |  |     text-align: center; | 
					
						
							|  |  |  |  |     padding: 15rpx 0 20rpx 0; | 
					
						
							|  |  |  |  |     position: relative; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     &::after { | 
					
						
							|  |  |  |  |       content: ''; | 
					
						
							|  |  |  |  |       position: absolute; | 
					
						
							|  |  |  |  |       bottom: 0; | 
					
						
							|  |  |  |  |       left: 50%; | 
					
						
							|  |  |  |  |       transform: translateX(-50%); | 
					
						
							|  |  |  |  |       width: 100rpx; | 
					
						
							|  |  |  |  |       height: 4rpx; | 
					
						
							|  |  |  |  |       background: linear-gradient(135deg, #005bac 0%, #0071d9 100%); | 
					
						
							|  |  |  |  |       border-radius: 2rpx; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .region-level { | 
					
						
							|  |  |  |  |       font-size: 32rpx; | 
					
						
							|  |  |  |  |       color: #005bac; | 
					
						
							|  |  |  |  |       font-weight: bold; | 
					
						
							|  |  |  |  |       letter-spacing: 1rpx; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   .region-content { | 
					
						
							|  |  |  |  |     display: flex; | 
					
						
							|  |  |  |  |     align-items: center; | 
					
						
							|  |  |  |  |     justify-content: center; | 
					
						
							|  |  |  |  |     flex-wrap: wrap; | 
					
						
							|  |  |  |  |     margin-bottom: 15rpx; | 
					
						
							| 
									
										
										
										
											2025-07-25 09:42:30 +08:00
										 |  |  |  |     // margin-top: 10rpx;
 | 
					
						
							| 
									
										
										
										
											2025-07-25 09:07:39 +08:00
										 |  |  |  |     padding: 10rpx 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .region-name { | 
					
						
							|  |  |  |  |       font-size: 28rpx; | 
					
						
							|  |  |  |  |       color: #333333; | 
					
						
							|  |  |  |  |       font-weight: 500; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .region-separator { | 
					
						
							|  |  |  |  |       margin: 0 10rpx; | 
					
						
							|  |  |  |  |       font-size: 24rpx; | 
					
						
							|  |  |  |  |       color: #999999; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   .region-action { | 
					
						
							| 
									
										
										
										
											2025-07-25 09:42:30 +08:00
										 |  |  |  |     margin-top: 16rpx; | 
					
						
							| 
									
										
										
										
											2025-07-25 09:07:39 +08:00
										 |  |  |  |     .select-btn { | 
					
						
							|  |  |  |  |       width: 100%; | 
					
						
							|  |  |  |  |       height: 70rpx; | 
					
						
							|  |  |  |  |       background: linear-gradient(135deg, #005bac 0%, #0071d9 100%); | 
					
						
							|  |  |  |  |       color: #ffffff; | 
					
						
							|  |  |  |  |       border: none; | 
					
						
							|  |  |  |  |       border-radius: 35rpx; | 
					
						
							|  |  |  |  |       font-size: 26rpx; | 
					
						
							|  |  |  |  |       font-weight: 500; | 
					
						
							|  |  |  |  |       display: flex; | 
					
						
							|  |  |  |  |       align-items: center; | 
					
						
							|  |  |  |  |       justify-content: center; | 
					
						
							|  |  |  |  |       box-shadow: 0 6rpx 20rpx rgba(0, 91, 172, 0.3); | 
					
						
							|  |  |  |  |       transition: all 0.3s ease; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       &:active { | 
					
						
							|  |  |  |  |         transform: scale(0.98); | 
					
						
							|  |  |  |  |         box-shadow: 0 4rpx 15rpx rgba(0, 91, 172, 0.4); | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       &::after { | 
					
						
							|  |  |  |  |         border: none; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .empty-state { | 
					
						
							|  |  |  |  |   display: flex; | 
					
						
							|  |  |  |  |   flex-direction: column; | 
					
						
							|  |  |  |  |   align-items: center; | 
					
						
							|  |  |  |  |   justify-content: center; | 
					
						
							|  |  |  |  |   padding: 60rpx 40rpx; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   .empty-text { | 
					
						
							|  |  |  |  |     font-size: 26rpx; | 
					
						
							|  |  |  |  |     color: #999999; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /* 响应式设计 */ | 
					
						
							|  |  |  |  | @media screen and (max-width: 750rpx) { | 
					
						
							|  |  |  |  |   .region-container { | 
					
						
							|  |  |  |  |     padding: 10rpx; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   .region-list { | 
					
						
							|  |  |  |  |     padding: 0 10rpx; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   .region-item { | 
					
						
							|  |  |  |  |     margin-bottom: 12rpx; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .region-card { | 
					
						
							|  |  |  |  |       padding: 18rpx; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .region-header { | 
					
						
							|  |  |  |  |       padding: 12rpx 0 15rpx 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       .region-level { | 
					
						
							|  |  |  |  |         font-size: 30rpx; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .region-content { | 
					
						
							|  |  |  |  |       padding: 8rpx 0; | 
					
						
							|  |  |  |  |       margin-bottom: 12rpx; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       .region-name { | 
					
						
							|  |  |  |  |         font-size: 26rpx; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       .region-separator { | 
					
						
							|  |  |  |  |         font-size: 22rpx; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     .region-action .select-btn { | 
					
						
							|  |  |  |  |       height: 65rpx; | 
					
						
							|  |  |  |  |       font-size: 24rpx; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | </style> |