fix(mp): 医生端添加底部导航栏解决无法退出登录问题
医生端工作台是分包页面,不在 TabBar 配置中,redirectTo 后底部 导航消失导致无法到达"我的"页面退出登录。新增 DoctorTabBar 组件 模拟底部导航,包含工作台/患者/咨询/我的四个入口,使用 reLaunch 切换避免页栈溢出。
This commit is contained in:
52
apps/miniprogram/src/components/ui/DoctorTabBar/index.scss
Normal file
52
apps/miniprogram/src/components/ui/DoctorTabBar/index.scss
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
@import '../../../styles/variables.scss';
|
||||||
|
|
||||||
|
.doctor-tabbar {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: $tabbar-space;
|
||||||
|
background: $card;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
padding-top: 6px;
|
||||||
|
padding-bottom: env(safe-area-inset-bottom, 0px);
|
||||||
|
box-shadow: 0 -1px 0 $bd, $shadow-md;
|
||||||
|
z-index: 999;
|
||||||
|
|
||||||
|
&__item {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 2px;
|
||||||
|
padding: 6px 0;
|
||||||
|
cursor: pointer;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
|
||||||
|
&--active {
|
||||||
|
.doctor-tabbar__icon {
|
||||||
|
transform: scale(1.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.doctor-tabbar__label {
|
||||||
|
color: $doc-pri;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__icon {
|
||||||
|
font-size: 22px;
|
||||||
|
line-height: 1;
|
||||||
|
transition: transform 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
font-size: 10px;
|
||||||
|
color: $tx3;
|
||||||
|
line-height: 1.2;
|
||||||
|
transition: color 0.15s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
47
apps/miniprogram/src/components/ui/DoctorTabBar/index.tsx
Normal file
47
apps/miniprogram/src/components/ui/DoctorTabBar/index.tsx
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import { View, Text } from '@tarojs/components';
|
||||||
|
import Taro from '@tarojs/taro';
|
||||||
|
import './index.scss';
|
||||||
|
|
||||||
|
interface TabItem {
|
||||||
|
key: string;
|
||||||
|
icon: string;
|
||||||
|
activeIcon: string;
|
||||||
|
label: string;
|
||||||
|
url: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DOCTOR_TABS: TabItem[] = [
|
||||||
|
{ key: 'workbench', icon: '🏠', activeIcon: '🏠', label: '工作台', url: '/pages/pkg-doctor-core/index' },
|
||||||
|
{ key: 'patients', icon: '👤', activeIcon: '👤', label: '患者', url: '/pages/pkg-doctor-core/patients/index' },
|
||||||
|
{ key: 'consultation', icon: '💬', activeIcon: '💬', label: '咨询', url: '/pages/pkg-doctor-core/consultation/index' },
|
||||||
|
{ key: 'settings', icon: '⚙️', activeIcon: '⚙️', label: '我的', url: '/pages/pkg-profile/settings/index' },
|
||||||
|
];
|
||||||
|
|
||||||
|
interface DoctorTabBarProps {
|
||||||
|
active?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function DoctorTabBar({ active }: DoctorTabBarProps) {
|
||||||
|
const currentPath = `/${Taro.getCurrentPages().pop()?.path ?? ''}`;
|
||||||
|
const activeKey = active ?? DOCTOR_TABS.find((t) => currentPath.startsWith(t.url.replace('/index', '')))?.key ?? 'workbench';
|
||||||
|
|
||||||
|
const handleTab = (tab: TabItem) => {
|
||||||
|
if (tab.key === activeKey) return;
|
||||||
|
Taro.reLaunch({ url: tab.url });
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View className="doctor-tabbar">
|
||||||
|
{DOCTOR_TABS.map((tab) => (
|
||||||
|
<View
|
||||||
|
key={tab.key}
|
||||||
|
className={`doctor-tabbar__item ${tab.key === activeKey ? 'doctor-tabbar__item--active' : ''}`}
|
||||||
|
onClick={() => handleTab(tab)}
|
||||||
|
>
|
||||||
|
<Text className="doctor-tabbar__icon">{tab.key === activeKey ? tab.activeIcon : tab.icon}</Text>
|
||||||
|
<Text className="doctor-tabbar__label">{tab.label}</Text>
|
||||||
|
</View>
|
||||||
|
))}
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ import LoadingCard from '@/components/ui/LoadingCard';
|
|||||||
import ErrorState from '@/components/ErrorState';
|
import ErrorState from '@/components/ErrorState';
|
||||||
import EmptyState from '@/components/EmptyState';
|
import EmptyState from '@/components/EmptyState';
|
||||||
import { useDoctorClass } from '@/hooks/useDoctorClass';
|
import { useDoctorClass } from '@/hooks/useDoctorClass';
|
||||||
|
import DoctorTabBar from '@/components/ui/DoctorTabBar';
|
||||||
import { safeNavigateTo } from '@/utils/navigate';
|
import { safeNavigateTo } from '@/utils/navigate';
|
||||||
import { formatDateTime } from '@/utils/date';
|
import { formatDateTime } from '@/utils/date';
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
@@ -125,6 +126,7 @@ export default function ConsultationList() {
|
|||||||
))}
|
))}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
)}
|
)}
|
||||||
|
<DoctorTabBar active="consultation" />
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { usePageData } from '@/hooks/usePageData';
|
|||||||
import { getDashboard, type DoctorDashboard } from '@/services/doctor/dashboard';
|
import { getDashboard, type DoctorDashboard } from '@/services/doctor/dashboard';
|
||||||
import Loading from '@/components/Loading';
|
import Loading from '@/components/Loading';
|
||||||
import ContentCard from '@/components/ui/ContentCard';
|
import ContentCard from '@/components/ui/ContentCard';
|
||||||
|
import DoctorTabBar from '@/components/ui/DoctorTabBar';
|
||||||
import ShortcutButton from '@/components/ui/ShortcutButton';
|
import ShortcutButton from '@/components/ui/ShortcutButton';
|
||||||
import TodoAlert from '@/components/ui/TodoAlert';
|
import TodoAlert from '@/components/ui/TodoAlert';
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
@@ -137,6 +138,7 @@ export default function DoctorHome() {
|
|||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
<DoctorTabBar active="workbench" />
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import LoadingCard from '@/components/ui/LoadingCard';
|
|||||||
import EmptyState from '@/components/EmptyState';
|
import EmptyState from '@/components/EmptyState';
|
||||||
import Loading from '@/components/Loading';
|
import Loading from '@/components/Loading';
|
||||||
import { useDoctorClass } from '@/hooks/useDoctorClass';
|
import { useDoctorClass } from '@/hooks/useDoctorClass';
|
||||||
|
import DoctorTabBar from '@/components/ui/DoctorTabBar';
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
|
|
||||||
const AVATAR_COLORS: Array<'pri' | 'acc' | 'wrn' | 'dan'> = ['pri', 'acc', 'wrn', 'dan'];
|
const AVATAR_COLORS: Array<'pri' | 'acc' | 'wrn' | 'dan'> = ['pri', 'acc', 'wrn', 'dan'];
|
||||||
@@ -169,6 +170,7 @@ export default function PatientList() {
|
|||||||
{loading && patients.length > 0 && <Loading />}
|
{loading && patients.length > 0 && <Loading />}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
)}
|
)}
|
||||||
|
<DoctorTabBar active="patients" />
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import { useAuthStore } from '../../../stores/auth';
|
|||||||
import { invalidateHeadersCache, clearRequestCache } from '@/services/request';
|
import { invalidateHeadersCache, clearRequestCache } from '@/services/request';
|
||||||
import { useElderClass } from '../../../hooks/useElderClass';
|
import { useElderClass } from '../../../hooks/useElderClass';
|
||||||
import PageShell from '@/components/ui/PageShell';
|
import PageShell from '@/components/ui/PageShell';
|
||||||
|
import DoctorTabBar from '@/components/ui/DoctorTabBar';
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
|
|
||||||
export default function Settings() {
|
export default function Settings() {
|
||||||
const modeClass = useElderClass();
|
const modeClass = useElderClass();
|
||||||
const logout = useAuthStore((s) => s.logout);
|
const logout = useAuthStore((s) => s.logout);
|
||||||
|
const isMedicalStaff = useAuthStore((s) => s.isMedicalStaff);
|
||||||
|
|
||||||
const handleClearCache = async () => {
|
const handleClearCache = async () => {
|
||||||
const { confirm } = await Taro.showModal({
|
const { confirm } = await Taro.showModal({
|
||||||
@@ -99,6 +101,7 @@ export default function Settings() {
|
|||||||
<Text className='settings-label logout-label'>退出登录</Text>
|
<Text className='settings-label logout-label'>退出登录</Text>
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
{isMedicalStaff() && <DoctorTabBar active="settings" />}
|
||||||
</PageShell>
|
</PageShell>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user