362 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			362 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <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>
 | ||
|           <view
 | ||
|             v-if="unSelected.includes('province') || selectedData.provinceData"
 | ||
|             class="region-action"
 | ||
|           >
 | ||
|             <button class="select-btn" @click="selectProvinceRegion">
 | ||
|               {{ selectedData.provinceData ? '修改' : '选择' }}省级收益区域
 | ||
|             </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>
 | ||
|           <view
 | ||
|             v-if="unSelected.includes('city') || selectedData.cityData"
 | ||
|             class="region-action"
 | ||
|           >
 | ||
|             <button class="select-btn" @click="selectCityRegion">
 | ||
|               {{ selectedData.cityData ? '修改' : '选择' }}市级收益区域
 | ||
|             </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>
 | ||
|           <view
 | ||
|             v-if="unSelected.includes('county') || selectedData.countyData"
 | ||
|             class="region-action"
 | ||
|           >
 | ||
|             <button class="select-btn" @click="selectCountyRegion">
 | ||
|               {{ selectedData.countyData ? '修改' : '选择' }}区县收益区域
 | ||
|             </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"
 | ||
|       :reselected="reselected"
 | ||
|       ref="regionSelect"
 | ||
|       showCancelButton
 | ||
|     />
 | ||
|   </view>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| import { getRegionSelect, getSelectedRegion } from '@/config/mine.js'
 | ||
| import RegionSelect from '@/components/region-select/index.vue'
 | ||
| 
 | ||
| export default {
 | ||
|   name: 'RegionPage',
 | ||
|   components: {
 | ||
|     RegionSelect,
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|       unSelected: [],
 | ||
|       selectedData: {},
 | ||
|       reselected: true,
 | ||
|       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()
 | ||
|     this.getSelectedRegion()
 | ||
|   },
 | ||
|   methods: {
 | ||
|     getSelectedRegion() {
 | ||
|       return new Promise((resolve, reject) => {
 | ||
|         getSelectedRegion().then(res => {
 | ||
|           this.selectedData = res.data?.data || {}
 | ||
|           resolve()
 | ||
|         })
 | ||
|       })
 | ||
|     },
 | ||
|     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()
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     updateReSelected(data) {
 | ||
|       if (data) {
 | ||
|         this.reselected = true
 | ||
|       } else {
 | ||
|         this.reselected = false
 | ||
|       }
 | ||
|     },
 | ||
|     // 选择省级收益区域
 | ||
|     selectProvinceRegion() {
 | ||
|       this.updateReSelected(this.selectedData?.provinceData)
 | ||
|       this.$refs.regionSelect.open('province')
 | ||
|     },
 | ||
|     // 选择市级收益区域
 | ||
|     selectCityRegion() {
 | ||
|       this.updateReSelected(this.selectedData?.cityData)
 | ||
|       this.$refs.regionSelect.open('city')
 | ||
|     },
 | ||
|     // 选择区县收益区域
 | ||
|     selectCountyRegion() {
 | ||
|       this.updateReSelected(this.selectedData?.countyData)
 | ||
|       this.$refs.regionSelect.open('county')
 | ||
|     },
 | ||
|     successHandle(data) {
 | ||
|       this.getSelectedRegion()
 | ||
|     },
 | ||
|   },
 | ||
| }
 | ||
| </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;
 | ||
|     // margin-top: 10rpx;
 | ||
|     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 {
 | ||
|     margin-top: 16rpx;
 | ||
|     .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>
 |