From a027c6ce2fc05ac7f0908a3b7d4a5523117843db Mon Sep 17 00:00:00 2001 From: ozh Date: Thu, 17 Sep 2026 14:05:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E5=88=86=E4=BA=AB=E5=8D=A1?= =?UTF-8?q?=E7=9B=B4=E8=BE=BE=E8=AF=A6=E6=83=85=E9=A1=B5=E6=9C=AA=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E5=85=88=E8=B7=B3=E7=99=BB=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8E=E5=9B=9E=E8=B7=B3=E5=8E=9F=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 家庭详情页 useDidShow 检测无 token 时 reLaunch 登录页并携带 redirect 参数 - 登录页登录成功/已有 token 时优先回跳 redirect 目标,无参数仍进首页 --- src/pages/family/detail.tsx | 10 +++++++++- src/pages/login/index.tsx | 14 +++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/pages/family/detail.tsx b/src/pages/family/detail.tsx index 6653253..e8e8b59 100644 --- a/src/pages/family/detail.tsx +++ b/src/pages/family/detail.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import { useRouter, useDidShow, useShareAppMessage } from '@tarojs/taro' import { View, Text, Button } from '@tarojs/components' +import { useAppSelector } from '@/store/hooks' import { Navbar } from '@/components/navbar' import { Loading } from '@/components/loading' import { StateView } from '@/components/state-view' @@ -10,7 +11,7 @@ import { getHomeDetail, getHomeMemberList, type HomeInfo, type HomeMember } from import { getCareMemberList, type CareMember } from '@/api/careMember' import { MAX_CARED_PER_FAMILY } from '@/constants/family' import { ROUTES } from '@/constants/routes' -import { navigateBack, navigateTo } from '@/utils/navigation' +import { navigateBack, navigateTo, reLaunch } from '@/utils/navigation' import { showToast } from '@/utils/toast' import styles from './detail.module.scss' @@ -29,6 +30,7 @@ const contactsSummary = (c: CareMember): string => { export default function FamilyDetail() { const router = useRouter() const familyId = router.params.id ?? '' + const token = useAppSelector((s) => s.auth.token) const [loading, setLoading] = useState(true) const [family, setFamily] = useState(null) @@ -36,6 +38,12 @@ export default function FamilyDetail() { const [caredList, setCaredList] = useState([]) const load = async () => { + // 分享卡直达本页且未登录:先去登录,登录后回跳本页 + if (!token) { + const target = encodeURIComponent(`${ROUTES.FAMILY_DETAIL}?id=${familyId}&invite=1`) + reLaunch(`${ROUTES.LOGIN}?redirect=${target}`) + return + } setLoading(true) try { const [home, memberList, careList] = await Promise.all([ diff --git a/src/pages/login/index.tsx b/src/pages/login/index.tsx index 23d2797..ab05e2d 100644 --- a/src/pages/login/index.tsx +++ b/src/pages/login/index.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { View, Text } from '@tarojs/components' -import { useDidShow } from '@tarojs/taro' +import { useRouter, useDidShow } from '@tarojs/taro' import { useAppDispatch, useAppSelector } from '@/store/hooks' import { setAuth } from '@/store/authSlice' import { performWxLogin, completeUserInfoLogin, getLoginSubState } from './wxLoginFlow' @@ -14,15 +14,23 @@ import styles from './index.module.scss' export default function Login() { const dispatch = useAppDispatch() const toast = useToast() + const router = useRouter() const token = useAppSelector((s) => s.auth.token) const [loading, setLoading] = useState(false) // 注册中间态:needUserInfo(待用户资料授权)→ null(初始/完成) const [needAuth, setNeedAuth] = useState(false) const [openId, setOpenId] = useState('') + // 登录后落地页:携带 redirect 参数时优先回跳(守卫踢登录/分享卡直达场景),否则进首页 + const afterLoginUrl = () => { + const raw = router.params.redirect + const target = typeof raw === 'string' && raw.startsWith('/') ? decodeURIComponent(raw) : '' + return target || ROUTES.HOME + } + // 已有 token 直接进首页(本期不做 checkLogin 校验,spec D5) useDidShow(() => { - if (token && !loading) reLaunch(ROUTES.HOME) + if (token && !loading) reLaunch(afterLoginUrl()) }) // 完整登录态校验与落地;未完成时推进授权态 @@ -49,7 +57,7 @@ export default function Login() { console.log('[login-page] 登录完成,token 已落地') setNeedAuth(false) dispatch(setAuth({ token, userInfo: result.userInfo })) - await reLaunch(ROUTES.HOME) + await reLaunch(afterLoginUrl()) } const handleWxLogin = async () => {