feat(content): v2 扩展 Elective/LessonPlan/CoursePlan 三业务域

新增 3 个业务域(10 RPC):
- ElectiveService: 选修课列表/学生选课记录/选课/退课(含容量与重复校验)
- LessonPlanService: 教师备课列表/学生备课列表(仅 published)/详情
- CoursePlanService: 学生课程计划列表/详情
- KnowledgeGraphService.GetKnowledgePath: 与 GetLearningPath 同实现

新增 4 张 MySQL 表(elective_courses/selections/lesson_plans/course_plans),含完整索引。

新增 11 个权限点,覆盖 admin/teacher/student/parent 四角色。

proto 由 4 Service/22 RPC 扩展至 7 Service/32 RPC,v1 全部 RPC 保持向后兼容。

修复 logger.ts pino 导入: default import 在 NodeNext ESM 下不可调用,
改用 named import(与 iam/msg/core-edu 对齐)。

Docker 本地测试全部通过(HTTP + gRPC 双协议),健康检查、
Elective/LessonPlan/CoursePlan CRUD、4 个新 gRPC Service 全部验证通过。

nextstep-v2.md 已创建,记录上下游依赖与 6 项联调待办。
This commit is contained in:
SpecialX
2026-07-14 17:54:37 +08:00
parent abde336876
commit 78e406b317
32 changed files with 2086 additions and 13 deletions

View File

@@ -25,6 +25,18 @@ export const Permissions = {
CONTENT_KNOWLEDGE_POINT_READ: "CONTENT_KNOWLEDGE_POINT_READ" as const,
CONTENT_KNOWLEDGE_POINT_UPDATE: "CONTENT_KNOWLEDGE_POINT_UPDATE" as const,
CONTENT_KNOWLEDGE_POINT_DELETE: "CONTENT_KNOWLEDGE_POINT_DELETE" as const,
// v2 新增:选修课 / 备课计划 / 课程计划
CONTENT_ELECTIVE_CREATE: "CONTENT_ELECTIVE_CREATE" as const,
CONTENT_ELECTIVE_READ: "CONTENT_ELECTIVE_READ" as const,
CONTENT_ELECTIVE_SELECT: "CONTENT_ELECTIVE_SELECT" as const,
CONTENT_LESSON_PLAN_CREATE: "CONTENT_LESSON_PLAN_CREATE" as const,
CONTENT_LESSON_PLAN_READ: "CONTENT_LESSON_PLAN_READ" as const,
CONTENT_LESSON_PLAN_UPDATE: "CONTENT_LESSON_PLAN_UPDATE" as const,
CONTENT_LESSON_PLAN_DELETE: "CONTENT_LESSON_PLAN_DELETE" as const,
CONTENT_COURSE_PLAN_CREATE: "CONTENT_COURSE_PLAN_CREATE" as const,
CONTENT_COURSE_PLAN_READ: "CONTENT_COURSE_PLAN_READ" as const,
CONTENT_COURSE_PLAN_UPDATE: "CONTENT_COURSE_PLAN_UPDATE" as const,
CONTENT_COURSE_PLAN_DELETE: "CONTENT_COURSE_PLAN_DELETE" as const,
} as const;
export type Permission = (typeof Permissions)[keyof typeof Permissions];
@@ -51,6 +63,17 @@ const ROLE_PERMISSIONS: Record<string, Permission[]> = {
Permissions.CONTENT_KNOWLEDGE_POINT_READ,
Permissions.CONTENT_KNOWLEDGE_POINT_UPDATE,
Permissions.CONTENT_KNOWLEDGE_POINT_DELETE,
Permissions.CONTENT_ELECTIVE_CREATE,
Permissions.CONTENT_ELECTIVE_READ,
Permissions.CONTENT_ELECTIVE_SELECT,
Permissions.CONTENT_LESSON_PLAN_CREATE,
Permissions.CONTENT_LESSON_PLAN_READ,
Permissions.CONTENT_LESSON_PLAN_UPDATE,
Permissions.CONTENT_LESSON_PLAN_DELETE,
Permissions.CONTENT_COURSE_PLAN_CREATE,
Permissions.CONTENT_COURSE_PLAN_READ,
Permissions.CONTENT_COURSE_PLAN_UPDATE,
Permissions.CONTENT_COURSE_PLAN_DELETE,
],
teacher: [
Permissions.CONTENT_TEXTBOOK_READ,
@@ -63,12 +86,30 @@ const ROLE_PERMISSIONS: Record<string, Permission[]> = {
Permissions.CONTENT_KNOWLEDGE_POINT_CREATE,
Permissions.CONTENT_KNOWLEDGE_POINT_READ,
Permissions.CONTENT_KNOWLEDGE_POINT_UPDATE,
Permissions.CONTENT_ELECTIVE_CREATE,
Permissions.CONTENT_ELECTIVE_READ,
Permissions.CONTENT_LESSON_PLAN_CREATE,
Permissions.CONTENT_LESSON_PLAN_READ,
Permissions.CONTENT_LESSON_PLAN_UPDATE,
Permissions.CONTENT_COURSE_PLAN_READ,
],
student: [
Permissions.CONTENT_TEXTBOOK_READ,
Permissions.CONTENT_CHAPTER_READ,
Permissions.CONTENT_QUESTION_READ,
Permissions.CONTENT_KNOWLEDGE_POINT_READ,
Permissions.CONTENT_ELECTIVE_READ,
Permissions.CONTENT_ELECTIVE_SELECT,
Permissions.CONTENT_LESSON_PLAN_READ,
Permissions.CONTENT_COURSE_PLAN_READ,
],
parent: [
Permissions.CONTENT_TEXTBOOK_READ,
Permissions.CONTENT_CHAPTER_READ,
Permissions.CONTENT_KNOWLEDGE_POINT_READ,
Permissions.CONTENT_LESSON_PLAN_READ,
Permissions.CONTENT_COURSE_PLAN_READ,
Permissions.CONTENT_ELECTIVE_READ,
],
};