根因:主包 2MB 全量组件注入导致 DevTools 渲染引擎内存渐增, 叠加离线时固定 3s 抑制期后的请求洪泛。 修复: - app.config.ts 添加 lazyCodeLoading: requiredComponents 主包 2.0MB→766KB,taro.js 526→131KB,vendors.js 230→28KB - request.ts 离线抑制改为指数退避(3s→6s→12s→30s cap) 后端不可达时自动延长抑制,防止请求风暴 - SegmentTabs Tab 接口改为 readonly,修复 TS 编译错误 - AbortController polyfill 补齐小程序运行时缺失 - 健康首页/设备同步/健康档案/报告/设置页 UI 重构 - 文章页公开端点适配游客访问 - 健康首页 Swiper 间隔优化 4s→5s,动画 500→300ms
120 lines
4.1 KiB
TypeScript
120 lines
4.1 KiB
TypeScript
import { View, Text } from '@tarojs/components';
|
|
import Taro from '@tarojs/taro';
|
|
import { safeNavigateTo } from '@/utils/navigate';
|
|
import { useAuthStore } from '../../../stores/auth';
|
|
import { useUIStore } from '../../../stores/ui';
|
|
import { invalidateHeadersCache, clearRequestCache } from '@/services/request';
|
|
import { useElderClass } from '../../../hooks/useElderClass';
|
|
import PageShell from '@/components/ui/PageShell';
|
|
import DoctorTabBar from '@/components/ui/DoctorTabBar';
|
|
import './index.scss';
|
|
|
|
export default function Settings() {
|
|
const modeClass = useElderClass();
|
|
const logout = useAuthStore((s) => s.logout);
|
|
const isMedicalStaff = useAuthStore((s) => s.isMedicalStaff);
|
|
const mode = useUIStore((s) => s.mode);
|
|
const toggleMode = useUIStore((s) => s.toggle);
|
|
|
|
const handleClearCache = async () => {
|
|
const { confirm } = await Taro.showModal({
|
|
title: '清除缓存',
|
|
content: '确定要清除本地缓存数据吗?不会影响账号信息。',
|
|
});
|
|
if (!confirm) return;
|
|
|
|
const preservedKeys = ['access_token', 'refresh_token', 'user_data', 'user_roles', 'tenant_id', 'wechat_openid', 'current_patient', 'current_patient_id'];
|
|
const preserved: Record<string, unknown> = {};
|
|
await Promise.all(
|
|
preservedKeys.map(async (key) => {
|
|
try {
|
|
const val = await Taro.getStorage({ key });
|
|
if (val.data) preserved[key] = val.data;
|
|
} catch { /* key not found */ }
|
|
}),
|
|
);
|
|
|
|
await Taro.clearStorage();
|
|
|
|
await Promise.all(
|
|
Object.entries(preserved).map(([key, val]) =>
|
|
Taro.setStorage({ key, data: val }),
|
|
),
|
|
);
|
|
|
|
clearRequestCache();
|
|
invalidateHeadersCache();
|
|
Taro.showToast({ title: '缓存已清除', icon: 'success' });
|
|
};
|
|
|
|
const handleAbout = () => {
|
|
Taro.showModal({
|
|
title: '关于我们',
|
|
content: 'HMS 健康管理平台 v1.0.0\n为您的健康保驾护航',
|
|
showCancel: false,
|
|
});
|
|
};
|
|
|
|
const handlePrivacy = () => {
|
|
safeNavigateTo('/pages/legal/privacy-policy');
|
|
};
|
|
|
|
const handleLogout = () => {
|
|
Taro.showModal({
|
|
title: '退出登录',
|
|
content: '确定要退出登录吗?',
|
|
}).then((res) => {
|
|
if (res.confirm) {
|
|
logout();
|
|
}
|
|
});
|
|
};
|
|
|
|
return (
|
|
<PageShell className={modeClass}>
|
|
<Text className='page-title'>设置</Text>
|
|
|
|
<View className='settings-group'>
|
|
<View className='settings-item' onClick={toggleMode}>
|
|
<View className='settings-icon'>
|
|
<Text className='settings-icon-text'>老</Text>
|
|
</View>
|
|
<Text className='settings-label'>长辈模式</Text>
|
|
<Text className={`settings-toggle ${mode === 'elder' ? 'settings-toggle--active' : ''}`}>
|
|
{mode === 'elder' ? '已开启' : '未开启'}
|
|
</Text>
|
|
<Text className='settings-arrow'>{'>'}</Text>
|
|
</View>
|
|
<View className='settings-item' onClick={handleClearCache}>
|
|
<View className='settings-icon'>
|
|
<Text className='settings-icon-text'>缓</Text>
|
|
</View>
|
|
<Text className='settings-label'>清除缓存</Text>
|
|
<Text className='settings-arrow'>{'>'}</Text>
|
|
</View>
|
|
<View className='settings-item' onClick={handleAbout}>
|
|
<View className='settings-icon'>
|
|
<Text className='settings-icon-text'>关</Text>
|
|
</View>
|
|
<Text className='settings-label'>关于我们</Text>
|
|
<Text className='settings-arrow'>{'>'}</Text>
|
|
</View>
|
|
<View className='settings-item' onClick={handlePrivacy}>
|
|
<View className='settings-icon'>
|
|
<Text className='settings-icon-text'>隐</Text>
|
|
</View>
|
|
<Text className='settings-label'>隐私政策</Text>
|
|
<Text className='settings-arrow'>{'>'}</Text>
|
|
</View>
|
|
</View>
|
|
|
|
<View className='settings-group'>
|
|
<View className='settings-item logout-item' onClick={handleLogout}>
|
|
<Text className='settings-label logout-label'>退出登录</Text>
|
|
</View>
|
|
</View>
|
|
{isMedicalStaff() && <DoctorTabBar active="settings" />}
|
|
</PageShell>
|
|
);
|
|
}
|