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