From 59dd5ef38e0a598fa2e2876e7f612466cd98e4c5 Mon Sep 17 00:00:00 2001 From: iven Date: Sun, 17 May 2026 17:13:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(mp):=20P1+P2=20=E7=A8=B3=E5=AE=9A=E6=80=A7?= =?UTF-8?q?=E5=8A=A0=E5=9B=BA=20=E2=80=94=20=E5=AF=BC=E8=88=AA=E5=AE=89?= =?UTF-8?q?=E5=85=A8+=E7=94=9F=E4=BA=A7=E6=97=A5=E5=BF=97+=E5=88=86?= =?UTF-8?q?=E5=8C=85=E9=A2=84=E5=8A=A0=E8=BD=BD+logout=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P1: - 全局 23 个页面 Taro.navigateTo → safeNavigateTo,防止页栈超10层 - 生产构建保留 console.warn/error,便于线上问题排查 - 添加 preloadRule 分包预加载(首页预加载健康/医生/文章分包) P2: - logout 时清理 ai_chat_history + BLE DataBuffer 缓存 - restore() 移除冗余的双重 Storage 读取(secureGet 已包含 getStorageSync) - 首页文章图片添加 lazyLoad --- apps/miniprogram/config/prod.ts | 2 +- apps/miniprogram/src/app.config.ts | 14 ++++ .../src/pages/ai-report/list/index.tsx | 3 +- .../src/pages/appointment/index.tsx | 5 +- apps/miniprogram/src/pages/article/index.tsx | 68 ++++++++++--------- .../src/pages/consultation/index.tsx | 5 +- apps/miniprogram/src/pages/health/index.tsx | 7 +- apps/miniprogram/src/pages/index/index.tsx | 13 ++-- apps/miniprogram/src/pages/login/index.tsx | 5 +- apps/miniprogram/src/pages/mall/index.tsx | 5 +- .../dialysis/detail/index.tsx | 5 +- .../pkg-doctor-clinical/report/index.tsx | 5 +- .../pages/pkg-doctor-core/followup/index.tsx | 3 +- .../src/pages/pkg-doctor-core/index.tsx | 9 +-- .../pkg-doctor-core/patients/detail/index.tsx | 7 +- .../pages/pkg-doctor-core/patients/index.tsx | 3 +- .../src/pages/pkg-health/alerts/index.tsx | 3 +- .../src/pages/pkg-health/input/index.tsx | 3 +- .../dialysis-prescriptions/index.tsx | 3 +- .../pkg-profile/dialysis-records/index.tsx | 3 +- .../src/pages/pkg-profile/family/index.tsx | 5 +- .../src/pages/pkg-profile/followups/index.tsx | 3 +- .../src/pages/pkg-profile/reports/index.tsx | 3 +- .../src/pages/pkg-profile/settings/index.tsx | 3 +- apps/miniprogram/src/pages/profile/index.tsx | 5 +- apps/miniprogram/src/stores/auth.ts | 12 +++- 26 files changed, 122 insertions(+), 80 deletions(-) diff --git a/apps/miniprogram/config/prod.ts b/apps/miniprogram/config/prod.ts index 508f670..bc08b32 100644 --- a/apps/miniprogram/config/prod.ts +++ b/apps/miniprogram/config/prod.ts @@ -8,7 +8,7 @@ export default { compress: { drop_console: true, drop_debugger: true, - pure_funcs: ['console.log', 'console.info', 'console.debug', 'console.warn', 'console.error'], + pure_funcs: ['console.log', 'console.info', 'console.debug'], }, format: { comments: false, diff --git a/apps/miniprogram/src/app.config.ts b/apps/miniprogram/src/app.config.ts index bd05280..e27d769 100644 --- a/apps/miniprogram/src/app.config.ts +++ b/apps/miniprogram/src/app.config.ts @@ -76,6 +76,20 @@ export default defineAppConfig({ { pagePath: 'pages/profile/index', text: '我的', iconPath: 'assets/tabbar/profile.png', selectedIconPath: 'assets/tabbar/profile-active.png' }, ], }, + preloadRule: { + 'pages/index/index': { + network: 'all', + packages: ['pages/pkg-health', 'pages/pkg-doctor-core', 'pages/article'], + }, + 'pages/health/index': { + network: 'all', + packages: ['pages/pkg-health'], + }, + 'pages/consultation/index': { + network: 'all', + packages: ['pages/pkg-consultation'], + }, + }, window: { backgroundTextStyle: 'dark', navigationBarBackgroundColor: '#FFFFFF', diff --git a/apps/miniprogram/src/pages/ai-report/list/index.tsx b/apps/miniprogram/src/pages/ai-report/list/index.tsx index fb8e748..f759b05 100644 --- a/apps/miniprogram/src/pages/ai-report/list/index.tsx +++ b/apps/miniprogram/src/pages/ai-report/list/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text, ScrollView } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listAiAnalysis, type AiAnalysisItem } from '@/services/ai-analysis'; import Loading from '@/components/Loading'; @@ -49,7 +50,7 @@ export default function AiReportList() { usePageData(async () => { await loadList(1); }, { throttleMs: 5000, enablePullDown: true }); const goDetail = (id: string) => { - Taro.navigateTo({ url: `/pages/ai-report/detail/index?id=${id}` }); + safeNavigateTo(`/pages/ai-report/detail/index?id=${id}`); }; const loadMore = () => { diff --git a/apps/miniprogram/src/pages/appointment/index.tsx b/apps/miniprogram/src/pages/appointment/index.tsx index 9b0123f..b50acb3 100644 --- a/apps/miniprogram/src/pages/appointment/index.tsx +++ b/apps/miniprogram/src/pages/appointment/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useReachBottom } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listAppointments } from '../../services/appointment'; import type { Appointment } from '../../services/appointment'; @@ -65,11 +66,11 @@ export default function AppointmentList() { }); const goCreate = () => { - Taro.navigateTo({ url: '/pages/appointment/create/index' }); + safeNavigateTo('/pages/appointment/create/index'); }; const goDetail = (id: string) => { - Taro.navigateTo({ url: `/pages/appointment/detail/index?id=${id}` }); + safeNavigateTo(`/pages/appointment/detail/index?id=${id}`); }; const getStatusTag = (status: string) => { diff --git a/apps/miniprogram/src/pages/article/index.tsx b/apps/miniprogram/src/pages/article/index.tsx index c699479..97892b4 100644 --- a/apps/miniprogram/src/pages/article/index.tsx +++ b/apps/miniprogram/src/pages/article/index.tsx @@ -1,8 +1,9 @@ -import React, { useState, useCallback, useEffect } from 'react'; -import { View, Text, Image, ScrollView } from '@tarojs/components'; -import Taro, { useReachBottom } from '@tarojs/taro'; +import { useState, useCallback } from 'react'; +import { View, Text, ScrollView } from '@tarojs/components'; +import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; -import { listArticles, listCategories, Article, ArticleCategory } from '../../services/article'; +import { listArticles, listCategories } from '../../services/article'; import PageShell from '@/components/ui/PageShell'; import ContentCard from '@/components/ui/ContentCard'; import LoadingCard from '@/components/ui/LoadingCard'; @@ -12,9 +13,27 @@ import Loading from '@/components/Loading'; import { useElderClass } from '../../hooks/useElderClass'; import './index.scss'; +interface ArticleItem { + id: string; + title: string; + summary?: string; + cover_image?: string; + category?: string; + category_id?: string; + category_name?: string; + published_at?: string; + status?: string; +} + +interface ArticleCategory { + id: string; + name: string; + parent_id?: string | null; +} + export default function ArticleList() { const modeClass = useElderClass(); - const [articles, setArticles] = useState([]); + const [articles, setArticles] = useState([]); const [page, setPage] = useState(1); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); @@ -22,15 +41,6 @@ export default function ArticleList() { const [categories, setCategories] = useState([]); const [activeCategory, setActiveCategory] = useState(null); - const fetchCategories = useCallback(async () => { - try { - const data = await listCategories(); - setCategories(data || []); - } catch { - setCategories([]); - } - }, []); - const fetchData = useCallback(async (p: number, append = false, categoryId?: string | null) => { setLoading(true); setError(false); @@ -52,37 +62,34 @@ export default function ArticleList() { } }, [activeCategory]); - useEffect(() => { - fetchCategories(); - }, [fetchCategories]); - usePageData( - useCallback(() => fetchData(1, false, null), [fetchData]), + useCallback(async () => { + try { + const cats = await listCategories(); + setCategories(cats || []); + } catch { + setCategories([]); + } + await fetchData(1); + }, [fetchData]), { throttleMs: 10000, enablePullDown: true }, ); - useReachBottom(() => { - if (!loading && articles.length < total) { - fetchData(page + 1, true); - } - }); - const handleCategoryChange = (categoryId: string | null) => { setActiveCategory(categoryId); fetchData(1, false, categoryId); }; const goToDetail = (id: string) => { - Taro.navigateTo({ url: `/pages/article/detail/index?id=${id}` }); + safeNavigateTo(`/pages/article/detail/index?id=${id}`); }; - if (!loading && articles.length === 0 && !error && !categories.length) { + if (loading && articles.length === 0 && !error) { return ; } return ( - {/* 分类筛选 */} {categories.length > 0 && ( - {a.cover_image && ( - - - - )} ))} diff --git a/apps/miniprogram/src/pages/consultation/index.tsx b/apps/miniprogram/src/pages/consultation/index.tsx index ef90f82..6ae6994 100644 --- a/apps/miniprogram/src/pages/consultation/index.tsx +++ b/apps/miniprogram/src/pages/consultation/index.tsx @@ -1,6 +1,7 @@ import { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useReachBottom } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { useAuthStore } from '@/stores/auth'; import { listConsultations, ConsultationSession } from '@/services/consultation'; @@ -99,7 +100,7 @@ export default function Consultation() { }); const handleTapSession = (session: ConsultationSession) => { - Taro.navigateTo({ url: `/pages/pkg-consultation/detail/index?id=${session.id}` }); + safeNavigateTo(`/pages/pkg-consultation/detail/index?id=${session.id}`); }; if (!user) { @@ -130,7 +131,7 @@ export default function Consultation() { {/* 发起咨询按钮 */} Taro.navigateTo({ url: '/pages/consultation/create/index' })} + onClick={() => safeNavigateTo('/pages/consultation/create/index')} > 发起咨询 diff --git a/apps/miniprogram/src/pages/health/index.tsx b/apps/miniprogram/src/pages/health/index.tsx index a4f3a0f..c6efef9 100644 --- a/apps/miniprogram/src/pages/health/index.tsx +++ b/apps/miniprogram/src/pages/health/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import { View, Text, Input } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { useAuthStore } from '../../stores/auth'; import { useElderClass } from '../../hooks/useElderClass'; import { findThreshold, inputVitalSign, type HealthThreshold } from '../../services/health'; @@ -173,9 +174,9 @@ export default function Health() { { const first = aiSuggestions[0]; if (first?.suggestion_type === 'appointment') { - Taro.navigateTo({ url: `/pages/appointment/create/index` }); + safeNavigateTo(`/pages/appointment/create/index`); } else if (first?.suggestion_type === 'followup') { - Taro.navigateTo({ url: '/pages/pkg-profile/followups/index' }); + safeNavigateTo('/pages/pkg-profile/followups/index'); } else { Taro.switchTab({ url: '/pages/health/index' }); } @@ -326,7 +327,7 @@ export default function Health() { Taro.navigateTo({ url: '/pages/article/index' })} + onPress={() => safeNavigateTo('/pages/article/index')} > 最新健康资讯 › diff --git a/apps/miniprogram/src/pages/index/index.tsx b/apps/miniprogram/src/pages/index/index.tsx index 9d928f5..747df2a 100644 --- a/apps/miniprogram/src/pages/index/index.tsx +++ b/apps/miniprogram/src/pages/index/index.tsx @@ -1,6 +1,7 @@ import { View, Text, Swiper, SwiperItem, Image } from '@tarojs/components'; import { useState } from 'react'; import Taro, { useDidShow, useDidHide } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { useAuthStore } from '../../stores/auth'; import { useUIStore } from '../../stores/ui'; import { navigateToLogin } from '../../utils/navigate'; @@ -120,12 +121,12 @@ function GuestHome({ modeClass }: { modeClass: string }) { {articles.map((article) => ( Taro.navigateTo({ url: `/pages/article/detail/index?id=${article.id}` })} + onPress={() => safeNavigateTo(`/pages/article/detail/index?id=${article.id}`)} activeFeedback="opacity" padding="none" > {article.cover_image && ( - + )} {article.title} @@ -229,7 +230,7 @@ function HomeDashboard({ modeClass }: { modeClass: string }) { return ( Taro.navigateTo({ url: `/pages/pkg-health/trend/index?indicator=${item.indicator}` })} + onPress={() => safeNavigateTo(`/pages/pkg-health/trend/index?indicator=${item.indicator}`)} activeFeedback="opacity" > {item.label} @@ -259,8 +260,8 @@ function HomeDashboard({ modeClass }: { modeClass: string }) { key={r.id} className={`reminder-item ${i > 0 ? 'reminder-item-border' : ''}`} onClick={() => { - if (r.type === 'appointment') Taro.navigateTo({ url: '/pages/appointment/index' }); - else if (r.type === 'followup') Taro.navigateTo({ url: `/pages/pkg-profile/followups/detail/index?id=${r.id}` }); + if (r.type === 'appointment') safeNavigateTo('/pages/appointment/index'); + else if (r.type === 'followup') safeNavigateTo(`/pages/pkg-profile/followups/detail/index?id=${r.id}`); }} > {r.tag} @@ -275,7 +276,7 @@ function HomeDashboard({ modeClass }: { modeClass: string }) { Taro.switchTab({ url: '/pages/health/index' })}> 记录体征 - Taro.navigateTo({ url: '/pages/appointment/create/index' })}> + safeNavigateTo('/pages/appointment/create/index')}> 预约挂号 diff --git a/apps/miniprogram/src/pages/login/index.tsx b/apps/miniprogram/src/pages/login/index.tsx index 9c1f215..a4b9b81 100644 --- a/apps/miniprogram/src/pages/login/index.tsx +++ b/apps/miniprogram/src/pages/login/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import { View, Text, Input, Button } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { useAuthStore } from '../../stores/auth'; import './index.scss'; @@ -191,9 +192,9 @@ export default function Login() { 登录即同意 - Taro.navigateTo({ url: '/pages/legal/user-agreement' })}>《用户协议》 + safeNavigateTo('/pages/legal/user-agreement')}>《用户协议》 和 - Taro.navigateTo({ url: '/pages/legal/privacy-policy' })}>《隐私政策》 + safeNavigateTo('/pages/legal/privacy-policy')}>《隐私政策》 diff --git a/apps/miniprogram/src/pages/mall/index.tsx b/apps/miniprogram/src/pages/mall/index.tsx index 85c2245..41202a6 100644 --- a/apps/miniprogram/src/pages/mall/index.tsx +++ b/apps/miniprogram/src/pages/mall/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useReachBottom } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listProducts } from '../../services/points'; import type { PointsProduct } from '../../services/points'; @@ -132,7 +133,7 @@ export default function Mall() { Taro.showToast({ title: '已兑完', icon: 'none' }); return; } - Taro.navigateTo({ url: `/pages/pkg-mall/exchange/index?product_id=${item.id}` }); + safeNavigateTo(`/pages/pkg-mall/exchange/index?product_id=${item.id}`); }; const balance = account?.balance ?? 0; @@ -145,7 +146,7 @@ export default function Mall() { text='请先完善个人档案' hint='建档后即可使用积分商城、签到等功能' actionText='去建档' - onAction={() => Taro.navigateTo({ url: '/pages/pkg-profile/family-add/index' })} + onAction={() => safeNavigateTo('/pages/pkg-profile/family-add/index')} /> ); diff --git a/apps/miniprogram/src/pages/pkg-doctor-clinical/dialysis/detail/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-clinical/dialysis/detail/index.tsx index 0666123..cbf22fb 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-clinical/dialysis/detail/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-clinical/dialysis/detail/index.tsx @@ -1,6 +1,7 @@ import { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useRouter } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { getDialysisRecord, reviewDialysisRecord, @@ -167,9 +168,7 @@ export default function DialysisDetail() { )} {record.status === 'draft' && ( - Taro.navigateTo({ - url: `/pages/pkg-doctor-clinical/dialysis/create/index?id=${id}&version=${record.version}`, - })}> + safeNavigateTo(`/pages/pkg-doctor-clinical/dialysis/create/index?id=${id}&version=${record.version}`)}> 编辑 )} diff --git a/apps/miniprogram/src/pages/pkg-doctor-clinical/report/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-clinical/report/index.tsx index 106831b..a395937 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-clinical/report/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-clinical/report/index.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, useCallback, useRef } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useRouter } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listLabReports, type LabReportItem } from '@/services/doctor/labReport'; import { listPatients } from '@/services/doctor/patient'; @@ -99,9 +100,7 @@ export default function ReportList() { {reports.map((r) => ( Taro.navigateTo({ - url: `/pages/pkg-doctor-clinical/report/detail/index?patientId=${currentPatientId}&id=${r.id}`, - })} + onPress={() => safeNavigateTo(`/pages/pkg-doctor-clinical/report/detail/index?patientId=${currentPatientId}&id=${r.id}`)} > {r.report_type} diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/followup/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-core/followup/index.tsx index b1136c5..2af621c 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/followup/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-core/followup/index.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, useCallback, useRef } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useRouter } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listFollowUpTasks, type FollowUpTask } from '@/services/doctor/followup'; import PageShell from '@/components/ui/PageShell'; @@ -106,7 +107,7 @@ export default function FollowUpList() { {tasks.map((task) => ( Taro.navigateTo({ url: `/pages/pkg-doctor-core/followup/detail/index?id=${task.id}` })} + onPress={() => safeNavigateTo(`/pages/pkg-doctor-core/followup/detail/index?id=${task.id}`)} > {getTypeLabel(task.follow_up_type)} diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx index e13615c..78b4063 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx @@ -1,6 +1,7 @@ import { useState, useMemo, useCallback } from 'react'; import { View, Text, Input } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { useAuthStore } from '@/stores/auth'; import { useDoctorClass } from '@/hooks/useDoctorClass'; import { usePageData } from '@/hooks/usePageData'; @@ -93,7 +94,7 @@ export default function DoctorHome() { usePageData(loadDashboard, { throttleMs: 10000 }); const handleCardClick = (card: CardConfig) => { - Taro.navigateTo({ url: card.route }); + safeNavigateTo(card.route); }; const handleLogout = () => { @@ -123,7 +124,7 @@ export default function DoctorHome() { ! {alertCount} 位患者体征异常 - Taro.navigateTo({ url: '/pages/pkg-doctor-clinical/alerts/index' })}>查看 → + safeNavigateTo('/pages/pkg-doctor-clinical/alerts/index')}>查看 → )} @@ -131,7 +132,7 @@ export default function DoctorHome() { Taro.navigateTo({ url: '/pages/pkg-doctor-core/patients/index' })} + onFocus={() => safeNavigateTo('/pages/pkg-doctor-core/patients/index')} /> @@ -176,7 +177,7 @@ export default function DoctorHome() { Taro.navigateTo({ url: action.route })} + onClick={() => safeNavigateTo(action.route)} > {action.initial} diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/patients/detail/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-core/patients/detail/index.tsx index 6ed96cc..67b639b 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/patients/detail/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-core/patients/detail/index.tsx @@ -1,6 +1,7 @@ import { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useRouter } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { getPatient, getHealthSummary, type PatientDetail, type HealthSummary } from '@/services/doctor/patient'; import Loading from '@/components/Loading'; @@ -127,7 +128,7 @@ export default function PatientDetail() { 近期化验 Taro.navigateTo({ url: `/pages/pkg-doctor-clinical/report/detail/index?patientId=${patientId}&id=${summary.latest_lab_report!.id}` })} + onClick={() => safeNavigateTo(`/pages/pkg-doctor-clinical/report/detail/index?patientId=${patientId}&id=${summary.latest_lab_report!.id}`)} > {summary.latest_lab_report.report_type} @@ -144,10 +145,10 @@ export default function PatientDetail() { 操作 - Taro.navigateTo({ url: `/pages/pkg-doctor-clinical/report/index?patientId=${patientId}` })}> + safeNavigateTo(`/pages/pkg-doctor-clinical/report/index?patientId=${patientId}`)}> 查看化验报告 - Taro.navigateTo({ url: `/pages/pkg-doctor-core/followup/index?patientId=${patientId}` })}> + safeNavigateTo(`/pages/pkg-doctor-core/followup/index?patientId=${patientId}`)}> 随访记录 diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/patients/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-core/patients/index.tsx index c3a8d7f..5bd86d0 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/patients/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-core/patients/index.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, useCallback, useRef } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useReachBottom } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listPatients, listPatientTags, type PatientItem, type PatientTag } from '@/services/doctor/patient'; import PageShell from '@/components/ui/PageShell'; @@ -118,7 +119,7 @@ export default function PatientList() { {patients.map((p) => ( Taro.navigateTo({ url: `/pages/pkg-doctor-core/patients/detail/index?id=${p.id}` })} + onPress={() => safeNavigateTo(`/pages/pkg-doctor-core/patients/detail/index?id=${p.id}`)} > {p.name} diff --git a/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx b/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx index 5a06dcd..d8108e2 100644 --- a/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx +++ b/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listPatientAlerts, type Alert } from '@/services/alert'; import { useAuthStore } from '@/stores/auth'; @@ -82,7 +83,7 @@ export default function PatientAlerts() { if (!currentPatient) { return ( - Taro.navigateTo({ url: '/pages/pkg-profile/family-add/index' })} /> + safeNavigateTo('/pages/pkg-profile/family-add/index')} /> ); } diff --git a/apps/miniprogram/src/pages/pkg-health/input/index.tsx b/apps/miniprogram/src/pages/pkg-health/input/index.tsx index 8345783..f2ee0cd 100644 --- a/apps/miniprogram/src/pages/pkg-health/input/index.tsx +++ b/apps/miniprogram/src/pages/pkg-health/input/index.tsx @@ -1,6 +1,7 @@ import { useState, useCallback } from 'react'; import { View, Text, Input, Picker } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { num, validateStr } from '@/utils/validate'; import { inputVitalSign, getHealthThresholds, findThreshold, DEFAULT_THRESHOLDS, type HealthThreshold } from '../../../services/health'; @@ -193,7 +194,7 @@ export default function HealthInput() { {/* 从设备同步入口 */} - Taro.navigateTo({ url: '/pages/pkg-health/device-sync/index?returnTo=input' })}> + safeNavigateTo('/pages/pkg-health/device-sync/index?returnTo=input')}> 从设备同步 蓝牙连接设备自动获取数据 diff --git a/apps/miniprogram/src/pages/pkg-profile/dialysis-prescriptions/index.tsx b/apps/miniprogram/src/pages/pkg-profile/dialysis-prescriptions/index.tsx index 8c62176..04f3e6b 100644 --- a/apps/miniprogram/src/pages/pkg-profile/dialysis-prescriptions/index.tsx +++ b/apps/miniprogram/src/pages/pkg-profile/dialysis-prescriptions/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useReachBottom } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { getCachedPatientId } from '@/services/request'; import { listDialysisPrescriptions } from '@/services/dialysis'; @@ -68,7 +69,7 @@ export default function DialysisPrescriptionList() { Taro.navigateTo({ url: `/pages/pkg-profile/dialysis-prescriptions/detail/index?id=${p.id}` })} + onClick={() => safeNavigateTo(`/pages/pkg-profile/dialysis-prescriptions/detail/index?id=${p.id}`)} > {p.dialyzer_model || '未指定型号'} diff --git a/apps/miniprogram/src/pages/pkg-profile/dialysis-records/index.tsx b/apps/miniprogram/src/pages/pkg-profile/dialysis-records/index.tsx index 4815185..c9546cc 100644 --- a/apps/miniprogram/src/pages/pkg-profile/dialysis-records/index.tsx +++ b/apps/miniprogram/src/pages/pkg-profile/dialysis-records/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useReachBottom } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { getCachedPatientId } from '@/services/request'; import { listDialysisRecords } from '@/services/dialysis'; @@ -76,7 +77,7 @@ export default function DialysisRecordList() { Taro.navigateTo({ url: `/pages/pkg-profile/dialysis-records/detail/index?id=${r.id}` })} + onClick={() => safeNavigateTo(`/pages/pkg-profile/dialysis-records/detail/index?id=${r.id}`)} > {ti.label} diff --git a/apps/miniprogram/src/pages/pkg-profile/family/index.tsx b/apps/miniprogram/src/pages/pkg-profile/family/index.tsx index df6a614..6d988e1 100644 --- a/apps/miniprogram/src/pages/pkg-profile/family/index.tsx +++ b/apps/miniprogram/src/pages/pkg-profile/family/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listPatients, Patient } from '../../../services/patient'; import { useAuthStore } from '../../../stores/auth'; @@ -42,12 +43,12 @@ export default function FamilyList() { }; const goToAdd = () => { - Taro.navigateTo({ url: '/pages/pkg-profile/family-add/index' }); + safeNavigateTo('/pages/pkg-profile/family-add/index'); }; const goToEdit = (patient: Patient) => { Taro.setStorageSync('edit_patient', patient); - Taro.navigateTo({ url: `/pages/pkg-profile/family-add/index?id=${patient.id}` }); + safeNavigateTo(`/pages/pkg-profile/family-add/index?id=${patient.id}`); }; const genderText = (g?: string) => { diff --git a/apps/miniprogram/src/pages/pkg-profile/followups/index.tsx b/apps/miniprogram/src/pages/pkg-profile/followups/index.tsx index d4183cf..44fb89e 100644 --- a/apps/miniprogram/src/pages/pkg-profile/followups/index.tsx +++ b/apps/miniprogram/src/pages/pkg-profile/followups/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { listTasks, FollowUpTask } from '../../../services/followup'; import EmptyState from '../../../components/EmptyState'; @@ -45,7 +46,7 @@ export default function MyFollowUps() { }; const goToDetail = (id: string) => { - Taro.navigateTo({ url: `/pages/pkg-profile/followups/detail/index?id=${id}` }); + safeNavigateTo(`/pages/pkg-profile/followups/detail/index?id=${id}`); }; const getStatusClass = (status: string) => { diff --git a/apps/miniprogram/src/pages/pkg-profile/reports/index.tsx b/apps/miniprogram/src/pages/pkg-profile/reports/index.tsx index 33dcd0f..321879b 100644 --- a/apps/miniprogram/src/pages/pkg-profile/reports/index.tsx +++ b/apps/miniprogram/src/pages/pkg-profile/reports/index.tsx @@ -1,6 +1,7 @@ import React, { useState, useCallback } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useReachBottom } from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { usePageData } from '@/hooks/usePageData'; import { getCachedPatientId } from '@/services/request'; import { listReports, LabReport } from '../../../services/report'; @@ -49,7 +50,7 @@ export default function MyReports() { }); const goToDetail = (id: string) => { - Taro.navigateTo({ url: `/pages/pkg-profile/reports/detail/index?id=${id}` }); + safeNavigateTo(`/pages/pkg-profile/reports/detail/index?id=${id}`); }; const formatStatus = (report: LabReport) => { diff --git a/apps/miniprogram/src/pages/pkg-profile/settings/index.tsx b/apps/miniprogram/src/pages/pkg-profile/settings/index.tsx index 7a57481..86c95d1 100644 --- a/apps/miniprogram/src/pages/pkg-profile/settings/index.tsx +++ b/apps/miniprogram/src/pages/pkg-profile/settings/index.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { View, Text } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { useAuthStore } from '../../../stores/auth'; import { invalidateHeadersCache, clearRequestCache } from '@/services/request'; import { useElderClass } from '../../../hooks/useElderClass'; @@ -51,7 +52,7 @@ export default function Settings() { }; const handlePrivacy = () => { - Taro.navigateTo({ url: '/pages/legal/privacy-policy' }); + safeNavigateTo('/pages/legal/privacy-policy'); }; const handleLogout = () => { diff --git a/apps/miniprogram/src/pages/profile/index.tsx b/apps/miniprogram/src/pages/profile/index.tsx index 060b044..42892c8 100644 --- a/apps/miniprogram/src/pages/profile/index.tsx +++ b/apps/miniprogram/src/pages/profile/index.tsx @@ -1,5 +1,6 @@ import { View, Text } from '@tarojs/components'; import Taro from '@tarojs/taro'; +import { safeNavigateTo } from '@/utils/navigate'; import { useState, useCallback } from 'react'; import { useAuthStore } from '../../stores/auth'; import { usePointsStore } from '../../stores/points'; @@ -113,7 +114,7 @@ export default function Profile() { if (item.isSwitchTab) { Taro.switchTab({ url: item.path }); } else { - Taro.navigateTo({ url: item.path }); + safeNavigateTo(item.path); } }; @@ -188,7 +189,7 @@ export default function Profile() { Taro.navigateTo({ url: '/pages/pkg-profile/notifications/index' })} + onPress={() => safeNavigateTo('/pages/pkg-profile/notifications/index')} > diff --git a/apps/miniprogram/src/stores/auth.ts b/apps/miniprogram/src/stores/auth.ts index f7749df..8f9025c 100644 --- a/apps/miniprogram/src/stores/auth.ts +++ b/apps/miniprogram/src/stores/auth.ts @@ -81,12 +81,12 @@ export const useAuthStore = create((set, get) => ({ restore: () => { // 利用内存缓存避免重复 Storage IPC + JSON.parse try { - const userData = secureGet('user_data') || Taro.getStorageSync('user_data') || ''; + const userData = secureGet('user_data'); if (userData !== cachedUserJson) { cachedUserJson = userData; cachedUserObj = userData ? JSON.parse(userData) : null; } - const rolesData = secureGet('user_roles') || Taro.getStorageSync('user_roles') || ''; + const rolesData = secureGet('user_roles'); if (rolesData !== cachedRolesJson) { cachedRolesJson = rolesData; cachedRolesObj = rolesData ? JSON.parse(rolesData) : []; @@ -252,6 +252,14 @@ export const useAuthStore = create((set, get) => ({ Taro.removeStorageSync('current_patient_id'); Taro.removeStorageSync('analytics_queue'); Taro.removeStorageSync('edit_patient'); + Taro.removeStorageSync('ai_chat_history'); + // 清理 BLE DataBuffer 缓存(key 格式:ble_buffer_{patientId}_{bucket}) + const storageInfo = Taro.getStorageInfoSync(); + storageInfo.keys.forEach((key) => { + if (key.startsWith('ble_buffer_') || key.startsWith('last_ble_sync')) { + Taro.removeStorageSync(key); + } + }); resetAllStores(); set({ user: null, roles: [], currentPatient: null, patients: [] }); Taro.reLaunch({ url: '/pages/index/index' });