hookehuyr

feat(EditFamily): 添加区域战队选择功能并替换家庭规模选择

将家庭规模选择替换为区域战队选择功能,添加区域选择器和相关逻辑
1 <!-- 1 <!--
2 * @Date: 2025-08-27 17:44:53 2 * @Date: 2025-08-27 17:44:53
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-08-28 21:18:07 4 + * @LastEditTime: 2025-08-29 14:18:23
5 * @FilePath: /lls_program/src/pages/EditFamily/index.vue 5 * @FilePath: /lls_program/src/pages/EditFamily/index.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
8 <template> 8 <template>
9 - <view class="min-h-screen flex flex-col bg-white"> 9 + <view class="min-h-screen flex flex-col bg-[#F9FAFB]">
10 <!-- <AppHeader title="编辑家庭" /> --> 10 <!-- <AppHeader title="编辑家庭" /> -->
11 <view class="flex-1 px-4 py-6 overflow-auto"> 11 <view class="flex-1 px-4 py-6 overflow-auto">
12 <view class="mb-6"> 12 <view class="mb-6">
...@@ -37,23 +37,16 @@ ...@@ -37,23 +37,16 @@
37 /> 37 />
38 </view> 38 </view>
39 </view> 39 </view>
40 - <!-- Family Size --> 40 + <!-- District Selection -->
41 <view class="mb-6"> 41 <view class="mb-6">
42 <view class="bg-white rounded-lg border border-gray-200 p-4"> 42 <view class="bg-white rounded-lg border border-gray-200 p-4">
43 - <view class="block text-lg font-medium mb-4">家庭规模</view> 43 + <view class="block text-lg font-medium mb-4">快来挑选加入哪个区域战队</view>
44 - <view class="flex gap-2"> 44 + <view class="bg-white rounded-xl p-4 border border-gray-200" @click="showDistrictPicker = true">
45 - <view 45 + <view class="flex justify-between items-center">
46 - v-for="size in familySizes" 46 + <text :class="{'text-gray-400': !selectedDistrictText, 'text-gray-900': selectedDistrictText}" class="text-base">
47 - :key="size" 47 + {{ selectedDistrictText || '请选择区域' }}
48 - @click="familySize = size" 48 + </text>
49 - :class="[ 49 + <Right size="16" color="#888" />
50 - 'flex-1 py-3 rounded-lg border text-center',
51 - familySize === size
52 - ? 'border-blue-500 bg-blue-50 text-blue-500'
53 - : 'border-gray-200 text-gray-700'
54 - ]"
55 - >
56 - {{ size }}
57 </view> 50 </view>
58 </view> 51 </view>
59 </view> 52 </view>
...@@ -156,22 +149,55 @@ ...@@ -156,22 +149,55 @@
156 :init-no="previewIndex" 149 :init-no="previewIndex"
157 @close="closePreview" 150 @close="closePreview"
158 /> 151 />
152 +
153 + <!-- 区域选择器 -->
154 + <nut-popup v-model:visible="showDistrictPicker" position="bottom">
155 + <nut-picker
156 + v-model="districtValue"
157 + :columns="districtColumns"
158 + @confirm="onDistrictConfirm"
159 + @cancel="showDistrictPicker = false"
160 + title="选择区域战队"
161 + ></nut-picker>
162 + </nut-popup>
159 </view> 163 </view>
160 </template> 164 </template>
161 165
162 <script setup> 166 <script setup>
163 import { ref, onMounted } from 'vue'; 167 import { ref, onMounted } from 'vue';
164 import Taro from '@tarojs/taro'; 168 import Taro from '@tarojs/taro';
165 -import { Edit, Tips, Photograph } from '@nutui/icons-vue-taro'; 169 +import { Edit, Tips, Photograph, Right } from '@nutui/icons-vue-taro';
166 // import AppHeader from '../../components/AppHeader.vue'; 170 // import AppHeader from '../../components/AppHeader.vue';
167 import BASE_URL from '@/utils/config'; 171 import BASE_URL from '@/utils/config';
168 172
169 const familyName = ref(''); 173 const familyName = ref('');
170 const familyIntro = ref(''); 174 const familyIntro = ref('');
171 -const familySize = ref('3-5人'); 175 +const selectedDistrict = ref(null);
176 +const selectedDistrictText = ref('');
172 const familyMotto = ref(['', '', '', '']); 177 const familyMotto = ref(['', '', '', '']);
173 const familyMottoPlaceholder = ref(['孝', '敬', '和', '睦']); 178 const familyMottoPlaceholder = ref(['孝', '敬', '和', '睦']);
174 -const familySizes = ['2人', '3-5人', '6人+']; 179 +
180 +// 区域选择器相关
181 +const showDistrictPicker = ref(false);
182 +const districtValue = ref([]);
183 +const districtColumns = ref([
184 + { text: '黄浦区', value: 310101 },
185 + { text: '徐汇区', value: 310104 },
186 + { text: '长宁区', value: 310105 },
187 + { text: '静安区', value: 310106 },
188 + { text: '普陀区', value: 310107 },
189 + { text: '虹口区', value: 310109 },
190 + { text: '杨浦区', value: 310110 },
191 + { text: '闵行区', value: 310112 },
192 + { text: '宝山区', value: 310113 },
193 + { text: '嘉定区', value: 310114 },
194 + { text: '浦东新区', value: 310115 },
195 + { text: '金山区', value: 310116 },
196 + { text: '松江区', value: 310117 },
197 + { text: '青浦区', value: 310118 },
198 + { text: '奉贤区', value: 310120 },
199 + { text: '崇明区', value: 310151 }
200 +]);
175 const familyAvatar = ref(''); 201 const familyAvatar = ref('');
176 const focusedIndex = ref(-1); 202 const focusedIndex = ref(-1);
177 203
...@@ -185,12 +211,25 @@ onMounted(() => { ...@@ -185,12 +211,25 @@ onMounted(() => {
185 // Mock data for current family information 211 // Mock data for current family information
186 familyName.value = '幸福一家'; 212 familyName.value = '幸福一家';
187 familyIntro.value = '我们是相亲相爱的一家人'; 213 familyIntro.value = '我们是相亲相爱的一家人';
188 - familySize.value = '3-5人'; 214 + districtValue.value = [310104]; // 模拟勾选项已选择徐汇区
215 + // 需要提交的数据集
216 + selectedDistrict.value = 310104; // 模拟已选择徐汇区
217 + selectedDistrictText.value = districtColumns.value.find(item => item.value === selectedDistrict.value).text;
189 familyMotto.value = ['家', '和', '万', '事']; 218 familyMotto.value = ['家', '和', '万', '事'];
190 familyAvatar.value = 'https://img.yzcdn.cn/vant/cat.jpeg'; 219 familyAvatar.value = 'https://img.yzcdn.cn/vant/cat.jpeg';
191 }); 220 });
192 221
193 /** 222 /**
223 + * @description 确认选择区域
224 + * @param {object} param0 - 包含 selectedValue 和 selectedOptions 的对象
225 + */
226 +const onDistrictConfirm = ({ selectedValue, selectedOptions }) => {
227 + selectedDistrict.value = selectedValue[0];
228 + selectedDistrictText.value = selectedOptions.map((option) => option.text).join('');
229 + showDistrictPicker.value = false;
230 +};
231 +
232 +/**
194 * 处理输入变化 233 * 处理输入变化
195 */ 234 */
196 const handleInputChange = (index, value) => { 235 const handleInputChange = (index, value) => {
...@@ -337,8 +376,8 @@ const validateForm = () => { ...@@ -337,8 +376,8 @@ const validateForm = () => {
337 return false; 376 return false;
338 } 377 }
339 378
340 - if (!familySize.value) { 379 + if (!selectedDistrict.value) {
341 - showToast('请选择家庭规模', 'error'); 380 + showToast('请选择区域战队', 'error');
342 return false; 381 return false;
343 } 382 }
344 383
......