fix(mp): P1+P2 稳定性加固 — 导航安全+生产日志+分包预加载+logout清理

P1:
- 全局 23 个页面 Taro.navigateTo → safeNavigateTo,防止页栈超10层
- 生产构建保留 console.warn/error,便于线上问题排查
- 添加 preloadRule 分包预加载(首页预加载健康/医生/文章分包)

P2:
- logout 时清理 ai_chat_history + BLE DataBuffer 缓存
- restore() 移除冗余的双重 Storage 读取(secureGet 已包含 getStorageSync)
- 首页文章图片添加 lazyLoad
This commit is contained in:
iven
2026-05-17 17:13:35 +08:00
parent 1576709342
commit 59dd5ef38e
26 changed files with 122 additions and 80 deletions

View File

@@ -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<Article[]>([]);
const [articles, setArticles] = useState<ArticleItem[]>([]);
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<ArticleCategory[]>([]);
const [activeCategory, setActiveCategory] = useState<string | null>(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 <LoadingCard count={3} />;
}
return (
<PageShell safeBottom padding="none" className={modeClass}>
{/* 分类筛选 */}
{categories.length > 0 && (
<ScrollView scrollX className='article-categories'>
<View
@@ -132,11 +139,6 @@ export default function ArticleList() {
)}
</View>
</View>
{a.cover_image && (
<View className='article-card-cover'>
<Image className='cover-img' src={a.cover_image} mode='aspectFill' lazyLoad />
</View>
)}
</ContentCard>
))}
</View>