fix(user): 修复地址和购物车相关的多个问题

- 解决鸿蒙手机首次打开地图选择不显示 POI 列表,先获取当前位置传入地图
- 修正收货地址编辑接口路径,改为无 id 的 PUT /shop/shop-user-address
- 防御性合并旧地址数据,避免 null 字段覆盖初始值
- 新用户注册和登录后同步更新 UserContext 状态,确保页面刷新购物车数据
- 各页面 useDidShow 内增加从 storage 同步用户状态,解决状态不同步问题
- 优化地图选择初始化逻辑,提升用户体验
- 保证购物车、商品详情和首页登录状态及时同步更新
This commit is contained in:
2026-07-17 01:07:54 +08:00
parent 22fed3b163
commit 1077b16f58
9 changed files with 99 additions and 18 deletions

View File

@@ -6,6 +6,7 @@ import { getWxOpenId } from '@/api/layout'
import { getUserInfo } from '@/api/layout'
import { saveStorageByLoginUser, SERVER_API_URL } from '@/utils/server'
import { isUserDisabled } from '@/utils/auth'
import { useUserContext } from '@/contexts/UserContext'
import request from '@/utils/request'
import {
getPhoneAuthCooldownRemaining,
@@ -108,6 +109,7 @@ const Login = () => {
const [phoneAuthPending, setPhoneAuthPending] = useState(false)
const [phoneAuthCooling, setPhoneAuthCooling] = useState(isPhoneAuthCoolingDown())
const [showContent, setShowContent] = useState(false)
const { loginUser } = useUserContext()
const phoneAuthInFlightRef = useRef(false)
const phoneAuthPendingRef = useRef(false)
const phoneAuthTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
@@ -346,6 +348,8 @@ const Login = () => {
}
saveStorageByLoginUser(token, user)
// 同步更新 UserContext 状态,确保后续页面 isLoggedIn 为 true
loginUser(token, user)
// 绑定 openid + 处理邀请关系
await ensureWxOpenIdSaved()

View File

@@ -6,6 +6,7 @@ import { TenantId } from '@/config/app'
import { getUserInfo, getWxOpenId } from '@/api/layout'
import { saveStorageByLoginUser } from '@/utils/server'
import { isUserDisabled } from '@/utils/auth'
import { useUserContext } from '@/contexts/UserContext'
import {
getStoredInviteParams,
parseInviteParams,
@@ -98,6 +99,7 @@ function isTabBarUrl(url: string) {
const Register = () => {
const [isAgree, setIsAgree] = useState(false)
const [loading, setLoading] = useState(false)
const { loginUser } = useUserContext()
// 短信验证码登录仅在非微信小程序端展示
const isWeapp = useMemo(() => {
@@ -234,6 +236,8 @@ const Register = () => {
}
saveStorageByLoginUser(token, user)
// 同步更新 UserContext 状态,确保后续页面 isLoggedIn 为 true
loginUser(token, user)
// 注册/登录成功后,立即补齐 openidJSAPI 支付必需)
try {

View File

@@ -4,12 +4,14 @@ import { View, Text, Input } from '@tarojs/components'
import {loginBySms, sendSmsCaptcha} from "@/api/passport/login";
import {LoginParam} from "@/api/passport/login/model";
import {checkAndHandleInviteRelation, hasPendingInvite, parseInviteParams, saveInviteParams, trackInviteSource} from "@/utils/invite";
import { useUserContext } from '@/contexts/UserContext'
import './sms-login.scss'
const SmsLogin = () => {
const [loading, setLoading] = useState<boolean>(false)
const [sendingCode, setSendingCode] = useState<boolean>(false)
const [countdown, setCountdown] = useState<number>(0)
const { syncFromStorage } = useUserContext()
const [formData, setFormData] = useState<LoginParam>({
phone: '',
code: ''
@@ -182,6 +184,9 @@ const SmsLogin = () => {
code: formData.code
})
// loginBySms 内部已调 saveStorageByLoginUser这里同步 UserContext 状态
syncFromStorage()
// 登录成功后(可能是新注册用户),检查是否存在待处理的邀请关系并尝试绑定
if (hasPendingInvite()) {
try {