From 694b5e1e7af800ca4f13a9591c7700fa9a672b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sun, 22 Feb 2026 11:36:18 +0800 Subject: [PATCH] =?UTF-8?q?```=20fix(address):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E7=AE=A1=E7=90=86=E4=B8=AD=E7=9A=84=E7=BB=8F?= =?UTF-8?q?=E7=BA=AC=E5=BA=A6=E9=AA=8C=E8=AF=81=E5=92=8C=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 parseLngLatFromText 工具函数用于解析经纬度坐标 - 实现 hasValidLngLat 函数验证地址是否包含有效经纬度信息 - 在新增地址时检查默认地址是否缺少经纬度并引导用户完善定位 - 使用 hasValidLngLat 替换原有的经纬度验证逻辑 - 添加安全返回功能避免地址列表页导航异常 - 设置默认地址后自动返回上一页提升用户体验 ``` --- src/user/address/add.tsx | 41 ++++++++++++++++++++++++++++++++++---- src/user/address/index.tsx | 19 +++++++++++++++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/user/address/add.tsx b/src/user/address/add.tsx index 3554724..5d1eb11 100644 --- a/src/user/address/add.tsx +++ b/src/user/address/add.tsx @@ -9,6 +9,7 @@ import {ShopUserAddress} from "@/api/shop/shopUserAddress/model"; import {getShopUserAddress, listShopUserAddress, updateShopUserAddress, addShopUserAddress} from "@/api/shop/shopUserAddress"; import RegionData from '@/api/json/regions-data.json'; import FixedButton from "@/components/FixedButton"; +import { parseLngLatFromText } from "@/utils/geofence"; type SelectedLocation = { lng: string; lat: string; name?: string; address?: string } @@ -28,6 +29,15 @@ const isUserCancel = (e: any) => { return msg.includes('cancel') } +const hasValidLngLat = (addr?: Partial | null) => { + if (!addr) return false + const p = parseLngLatFromText(`${(addr as any)?.lng ?? ''},${(addr as any)?.lat ?? ''}`) + if (!p) return false + // Treat "0,0" as missing in this app (typically used as placeholder by backends). + if (p.lng === 0 && p.lat === 0) return false + return true +} + const AddUserAddress = () => { const {params} = useRouter(); const [loading, setLoading] = useState(true) @@ -47,6 +57,31 @@ const AddUserAddress = () => { // 整理地区数据 setRegionData() + // 新增模式:若存在“默认地址”但缺少经纬度,则强制引导到编辑页完善定位 + // 目的:确保业务依赖默认地址坐标(选店/配送范围)时不会因为缺失坐标而失败 + if (!isEditMode) { + try { + const defaultList = await listShopUserAddress({ isDefault: true }) + const defaultAddr = defaultList?.[0] + if (defaultAddr && !hasValidLngLat(defaultAddr)) { + await Taro.showModal({ + title: '需要完善定位', + content: '默认收货地址缺少定位信息,请先进入编辑页面选择定位并保存后再继续。', + confirmText: '去完善', + showCancel: false + }) + if (defaultAddr.id) { + Taro.navigateTo({ url: `/user/address/add?id=${defaultAddr.id}` }) + } else { + Taro.navigateTo({ url: '/user/address/index' }) + } + return + } + } catch (_e) { + // ignore: 新增页不阻塞渲染 + } + } + // 如果是编辑模式,加载地址数据 if (isEditMode && addressId) { try { @@ -55,9 +90,7 @@ const AddUserAddress = () => { // 设置所在地区 setText(`${address.province} ${address.city} ${address.region}`) // 回显已保存的经纬度(编辑模式) - if (address?.lng && address?.lat) { - setSelectedLocation({ lng: String(address.lng), lat: String(address.lat) }) - } + if (hasValidLngLat(address)) setSelectedLocation({ lng: String(address.lng), lat: String(address.lat) }) } catch (error) { console.error('加载地址失败:', error) Taro.showToast({ @@ -348,7 +381,7 @@ const AddUserAddress = () => { const submitSucceed = async (values: any) => { const loc = selectedLocation || - (FormData?.lng && FormData?.lat ? { lng: String(FormData.lng), lat: String(FormData.lat) } : null) + (hasValidLngLat(FormData) ? { lng: String(FormData.lng), lat: String(FormData.lat) } : null) if (!loc) { Taro.showToast({ title: '请选择定位', icon: 'none' }) return diff --git a/src/user/address/index.tsx b/src/user/address/index.tsx index c2f2023..2cb6cfc 100644 --- a/src/user/address/index.tsx +++ b/src/user/address/index.tsx @@ -13,6 +13,19 @@ const Address = () => { const [list, setList] = useState([]) const [address, setAddress] = useState() + const safeNavigateBack = async () => { + try { + const pages = (Taro as any).getCurrentPages?.() || [] + if (Array.isArray(pages) && pages.length > 1) { + await Taro.navigateBack() + return true + } + } catch (_e) { + // ignore + } + return false + } + const parseTime = (raw?: unknown) => { if (raw === undefined || raw === null || raw === '') return null; // 兼容秒/毫秒时间戳 @@ -78,7 +91,11 @@ const Address = () => { title: '设置成功', icon: 'success' }); - reload(); + // 设置默认地址通常是“选择地址”的动作:成功后返回上一页,体验更顺滑 + setTimeout(async () => { + const backed = await safeNavigateBack() + if (!backed) reload() + }, 400) } const onDel = async (id?: number) => {