fix(web+config): E2E 测试发现的问题修复
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- 排班状态过滤 'active' → 'enabled'(与后端 validation.rs 一致)
- 全局 403 拦截器不再弹出"权限不足" toast(AuthButton 已隐藏入口)
- 角色未关联菜单时回退显示全部(避免种子数据阶段菜单空白)
This commit is contained in:
iven
2026-05-05 13:01:14 +08:00
parent 84b671d1e5
commit 93f6e87220
5 changed files with 19 additions and 6 deletions

View File

@@ -160,13 +160,23 @@ function showGlobalError(msg: string) {
}
// 全局错误拦截 — 在响应拦截器之后、组件 catch 之前执行
// 组件可通过 axios config 中设置 skipGlobalError: true 来抑制全局提示
declare module 'axios' {
interface InternalAxiosRequestConfig {
skipGlobalError?: boolean;
}
}
client.interceptors.response.use(
(response) => response,
(error) => {
if (error.config?.skipGlobalError) {
return Promise.reject(error);
}
if (!error.response) {
showGlobalError('网络连接异常,请检查网络');
} else if (error.response.status === 403) {
showGlobalError('权限不足,无法执行此操作');
// 403 通常是权限不足,不全局提示 — 组件层通过 AuthButton 已隐藏操作入口
} else if (error.response.status === 404) {
// 404 通常由组件自行处理(如跳转),不全局提示
} else if (error.response.status >= 500) {

View File

@@ -229,7 +229,7 @@ export default function AppointmentList() {
setScheduleHint(`该医生在 ${selectedDate} 暂无排班,请确认是否需要先创建排班`);
} else {
const slots = schedules
.filter((s) => s.status === 'active' && s.current_appointments < s.max_appointments)
.filter((s) => s.status === 'enabled' && s.current_appointments < s.max_appointments)
.map((s) => `${s.start_time}-${s.end_time}(${s.current_appointments}/${s.max_appointments})`)
.join('、');
setScheduleHint(slots ? `可约时段:${slots}` : `该医生在 ${selectedDate} 排班已满或已停用`);

View File

@@ -223,7 +223,7 @@ export function createScheduleFixture(overrides: Record<string, unknown> = {}) {
end_time: '12:00',
max_appointments: 10,
current_appointments: 3,
status: 'active',
status: 'enabled',
created_at: '2026-04-01T10:00:00Z',
updated_at: '2026-04-01T10:00:00Z',
version: 1,

View File

@@ -359,7 +359,7 @@ const mockSchedules = Array.from({ length: 8 }, (_, i) => ({
end_time: i % 2 === 0 ? '12:00' : '17:00',
max_appointments: 10,
current_appointments: i % 3,
status: 'active',
status: 'enabled',
created_at: '2026-04-01T10:00:00Z',
updated_at: '2026-04-01T10:00:00Z',
version: 1,

View File

@@ -47,9 +47,12 @@ impl MenuService {
let ids: Vec<Uuid> = mr_rows.iter().map(|mr| mr.menu_id).collect();
if ids.is_empty() {
return Ok(vec![]);
// 角色未关联菜单时回退到显示全部菜单,
// 避免种子数据阶段 menu_roles 为空导致所有有角色用户看不到菜单
None
} else {
Some(ids)
}
Some(ids)
} else {
None
};