refactor(dashboard): V2 审计重构 — i18n 补齐 + 共享抽象 + 单测 + a11y
V2 审计报告(docs/architecture/audit/dashboard-audit-report-v2.md)发现并修复: - P0 i18n:10 个子组件硬编码字符串全部接入 next-intl(teacher-quick-actions / teacher-classes-card / teacher-homework-card / teacher-schedule / recent-submissions / teacher-grade-trends / student-grades-card / student-today-schedule-card / student-upcoming-assignments-card / admin-dashboard),新增 ~50 个翻译键 - P1 共享抽象:新增 DashboardGreetingHeader 组件,消除 teacher/student 头部 90% 重复代码,两个 Header 改为薄包装 - P2 单测:为 6 个纯函数添加 31 个单元测试 (tests/integration/dashboard/dashboard-utils.test.ts) - P2 a11y:admin 表格 caption、teacher/student 视图语义化标签 (header / section aria-label / aside aria-label) - 同步架构图 004/005
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
"use client";
|
||||
|
||||
import {
|
||||
getLessonPlansAction,
|
||||
getLessonPlanVersionsAction,
|
||||
revertLessonPlanVersionAction,
|
||||
duplicateLessonPlanAction,
|
||||
deleteLessonPlanAction,
|
||||
} from "../actions";
|
||||
import type { LessonPlanDataService } from "../providers/lesson-plan-provider";
|
||||
|
||||
/**
|
||||
* 默认数据服务实现:包装现有 Server Actions。
|
||||
* 通过 LessonPlanProvider 注入,组件不直接 import actions。
|
||||
* 测试时可替换为 mock 实现。
|
||||
*/
|
||||
export function createDefaultDataService(): LessonPlanDataService {
|
||||
return {
|
||||
async getLessonPlans(params) {
|
||||
const res = await getLessonPlansAction(params ?? {});
|
||||
if (res.success && res.data) {
|
||||
return { success: true, data: { items: res.data.items } };
|
||||
}
|
||||
return { success: false, message: res.message };
|
||||
},
|
||||
|
||||
async getLessonPlanVersions(planId) {
|
||||
const res = await getLessonPlanVersionsAction(planId);
|
||||
if (res.success && res.data) {
|
||||
return { success: true, data: { versions: res.data.versions } };
|
||||
}
|
||||
return { success: false, message: res.message };
|
||||
},
|
||||
|
||||
async revertLessonPlanVersion(params) {
|
||||
const res = await revertLessonPlanVersionAction(params);
|
||||
return { success: res.success, message: res.message };
|
||||
},
|
||||
|
||||
async duplicateLessonPlan(planId) {
|
||||
const res = await duplicateLessonPlanAction(planId);
|
||||
return { success: res.success, message: res.message };
|
||||
},
|
||||
|
||||
async deleteLessonPlan(planId) {
|
||||
const res = await deleteLessonPlanAction(planId);
|
||||
return { success: res.success, message: res.message };
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user