news 2026/4/16 13:46:28

线上培训系统领域建模,老师 ,家长,学生,平台管理员 , 单词,语法,如果领域建模

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线上培训系统领域建模,老师 ,家长,学生,平台管理员 , 单词,语法,如果领域建模

针对线上培训系统,我来帮你梳理核心领域模型。这是一个教育领域的DDD建模,主要涉及用户域学习资源域

核心领域模型分层

复制

用户域 (User Domain) ├── 学生 (Student) - 核心聚合根 ├── 老师 (Teacher) - 独立聚合根 ├── 家长 (Parent) - 独立聚合根 └── 平台管理员 (Admin) - 独立聚合根 学习资源域 (Learning Resource Domain) ├── 课程 (Course) - 聚合根 │ ├── 单词 (Word) - 实体 │ └── 语法 (Grammar) - 实体 学习记录域 (Learning Record Domain) └── 学习进度 (LearningProgress) - 聚合根

详细领域模型

1.用户域模型

java

复制

// 用户基类(值对象) class User { String userId; String username; String email; String phone; UserStatus status; // ACTIVE, INACTIVE } // 学生 - 核心聚合根 class Student { User baseInfo; Grade grade; // 年级 Parent parent; // 关联家长 List<Teacher> teachers; // 关联老师 LearningPreferences preferences; // 学习偏好 } // 老师 - 聚合根 class Teacher { User baseInfo; String qualification; // 资质 List<Subject> teachableSubjects; // 可教科目 Schedule availability; // 可用时间表 } // 家长 - 聚合根 class Parent { User baseInfo; List<Student> children; // 关联的孩子 NotificationPreferences notificationPrefs; // 通知偏好 } // 管理员 - 聚合根 class Admin { User baseInfo; AdminRole role; // SUPER_ADMIN, CONTENT_ADMIN, etc. }
2.学习资源域模型

java

复制

// 课程 - 聚合根(包含单词和语法) class Course { String courseId; String name; Subject subject; // ENGLISH, MATH, etc. Teacher createdBy; DifficultyLevel level; List<Word> vocabulary; // 单词列表 List<Grammar> grammars; // 语法点列表 void addWord(Word word); void removeWord(String wordId); void addGrammar(Grammar grammar); } // 单词 - 实体 class Word { String wordId; String spelling; String phonetic; String meaning; String exampleSentence; DifficultyLevel level; List<String> tags; // 标签:如"高考必备", "四级" } // 语法 - 实体 class Grammar { String grammarId; String title; String description; String usage; List<String> exampleSentences; DifficultyLevel level; }
3.学习记录域模型

java

复制

// 学习进度 - 聚合根 class LearningProgress { String progressId; Student student; Course course; Map<String, WordProgress> wordProgress; // 单词ID -> 掌握进度 Map<String, GrammarProgress> grammarProgress; // 语法ID -> 掌握进度 Date startDate; Date lastStudyDate; OverallMasteryLevel masteryLevel; // 整体掌握程度 } // 单词学习进度 - 值对象 class WordProgress { String wordId; MasteryLevel level; // NOT_STARTED, LEARNING, FAMILIAR, MASTERED int reviewCount; Date lastReviewed; Date nextReviewDate; // 用于 spaced repetition } // 语法学习进度 - 值对象 class GrammarProgress { String grammarId; MasteryLevel level; int exerciseCorrectRate; List<String> mistakeRecords; }

关键关系说明

表格

复制

关系类型主体客体说明
关联StudentParent1个学生可有1-2个家长,家长可多个孩子
关联StudentTeacher多对多,老师教多个学生,学生多个老师
聚合CourseWord强聚合,单词生命周期依赖课程
聚合CourseGrammar强聚合,语法生命周期依赖课程
关联LearningProgressStudent学习进度记录特定学生的
关联LearningProgressCourse学习进度针对特定课程的

领域事件(可选)

java

复制

// 关键业务事件 class WordMasteredEvent { Student student; Word word; Date masteredAt; } class ExerciseCompletedEvent { Student student; Course course; int score; } class ParentNotificationEvent { Parent parent; NotificationType type; // 学习报告、成绩预警等 }

建模建议

  1. 学生是核心聚合根:系统围绕学生展开,所有学习行为都以学生为中心

  2. 课程是资源聚合根:单词和语法作为课程内部实体,不独立存在

  3. 分离读写模型:查询学习进度可独立建READ MODEL,避免聚合根过大

  4. 值对象:User、WordProgress等作为不可变值对象,确保数据一致性

  5. 边界上下文:用户管理、内容管理、学习记录三个子域可独立演进

这样的模型能支撑单词语法学习进度跟踪家长监督老师指导等核心业务流程,也方便后续扩展如智能推荐、** spaced repetition**等高级功能。

需要我展开某个特定部分的详细设计吗?

下面是用Go语言实现的线上培训系统领域模型,遵循DDD原则和Go的最佳实践。

项目目录结构

复制

online-training/ ├── domain/ # 领域层 │ ├── user/ # 用户子域 │ │ ├── user.go # 用户基类(值对象) │ │ ├── student.go # 学生聚合根 │ │ ├── teacher.go # 老师聚合根 │ │ ├── parent.go # 家长聚合根 │ │ └── admin.go # 管理员聚合根 │ ├── resource/ # 学习资源子域 │ │ ├── course.go # 课程聚合根 │ │ ├── word.go # 单词实体 │ │ └── grammar.go # 语法实体 │ ├── progress/ # 学习记录子域 │ │ ├── learning_progress.go # 学习进度聚合根 │ │ ├── word_progress.go # 单词进度值对象 │ │ └── grammar_progress.go # 语法进度值对象 │ └── vo/ # 共享值对象 │ ├── user_status.go │ ├── difficulty_level.go │ └── mastery_level.go ├── repository/ # 仓储接口 │ ├── student_repository.go │ ├── course_repository.go │ └── progress_repository.go └── service/ # 应用服务层 └── student_service.go

1. 共享值对象

go

复制

// domain/vo/user_status.go package vo type UserStatus string const ( StatusActive UserStatus = "ACTIVE" StatusInactive UserStatus = "INACTIVE" ) // domain/vo/difficulty_level.go package vo type DifficultyLevel string const ( LevelBeginner DifficultyLevel = "BEGINNER" LevelIntermediate DifficultyLevel = "INTERMEDIATE" LevelAdvanced DifficultyLevel = "ADVANCED" ) // domain/vo/mastery_level.go package vo type MasteryLevel string const ( MasteryNotStarted MasteryLevel = "NOT_STARTED" MasteryLearning MasteryLevel = "LEARNING" MasteryFamiliar MasteryLevel = "FAMILIAR" MasteryMastered MasteryLevel = "MASTERED" )

2. 用户域实现

go

复制

// domain/user/user.go package user import "online-training/domain/vo" // User 用户基类(值对象) type User struct { UserID string Username string Email string Phone string Status vo.UserStatus } // Equals 值对象相等性判断 func (u User) Equals(other User) bool { return u.UserID == other.UserID } // domain/user/student.go package user import ( "time" "online-training/domain/vo" ) // Student 学生聚合根 type Student struct { User User Grade string ParentID string TeacherIDs []string LearningPrefs LearningPreferences CreatedAt time.Time UpdatedAt time.Time } // LearningPreferences 学习偏好(值对象) type LearningPreferences struct { DailyGoal int // 每日学习目标 PreferredTime string // 偏好学习时间 ReminderEnabled bool // 是否开启提醒 } // NewStudent 工厂函数 func NewStudent(user User, grade string, parentID string) *Student { return &Student{ User: user, Grade: grade, ParentID: parentID, TeacherIDs: make([]string, 0), LearningPrefs: LearningPreferences{}, CreatedAt: time.Now(), UpdatedAt: time.Now(), } } // AddTeacher 聚合根方法:添加老师 func (s *Student) AddTeacher(teacherID string) { for _, id := range s.TeacherIDs { if id == teacherID { return // 已存在 } } s.TeacherIDs = append(s.TeacherIDs, teacherID) s.UpdatedAt = time.Now() } // VerifyLearningAbility 业务规则验证 func (s *Student) VerifyLearningAbility() error { if s.User.Status != vo.StatusActive { return &domainError{message: "学生账号未激活"} } return nil } // domain/user/teacher.go package user import "time" type Teacher struct { User User Qualification string TeachableSubjects []string Availability Schedule CreatedAt time.Time UpdatedAt time.Time } type Schedule struct { Weekdays []int // 可用的星期几 TimeSlots []string // 时间段 } // domain/user/parent.go package user type Parent struct { User User ChildIDs []string NotificationPrefs NotificationPreferences } type NotificationPreferences struct { EmailEnabled bool SMSEnabled bool WeChatEnabled bool DailyReport bool }

3. 学习资源域实现

go

复制

// domain/resource/course.go package resource import ( "time" "online-training/domain/user" "online-training/domain/vo" ) // Course 课程聚合根 type Course struct { CourseID string Name string Subject string Teacher user.Teacher Level vo.DifficultyLevel Vocabulary []Word // 单词列表(实体) Grammars []Grammar // 语法列表(实体) CreatedAt time.Time UpdatedAt time.Time } // AddWord 聚合根方法:添加单词(业务规则:防止重复) func (c *Course) AddWord(word Word) error { for _, w := range c.Vocabulary { if w.WordID == word.WordID { return &domainError{message: "单词已存在"} } } c.Vocabulary = append(c.Vocabulary, word) c.UpdatedAt = time.Now() return nil } // RemoveWord 聚合根方法:删除单词 func (c *Course) RemoveWord(wordID string) { for i, w := range c.Vocabulary { if w.WordID == wordID { c.Vocabulary = append(c.Vocabulary[:i], c.Vocabulary[i+1:]...) c.UpdatedAt = time.Now() return } } } // domain/resource/word.go package resource import "online-training/domain/vo" // Word 单词实体 type Word struct { WordID string Spelling string Phonetic string Meaning string ExampleSentence string Level vo.DifficultyLevel Tags []string } // Equals 实体相等性判断(基于ID) func (w Word) Equals(other Word) bool { return w.WordID == other.WordID } // domain/resource/grammar.go package resource import "online-training/domain/vo" // Grammar 语法实体 type Grammar struct { GrammarID string Title string Description string Usage string ExampleSentences []string Level vo.DifficultyLevel }

4. 学习记录域实现

go

复制

// domain/progress/learning_progress.go package progress import ( "time" "online-training/domain/resource" "online-training/domain/user" "online-training/domain/vo" ) // LearningProgress 学习进度聚合根 type LearningProgress struct { ProgressID string StudentID string CourseID string WordProgress map[string]WordProgress // 单词ID -> 进度 GrammarProgress map[string]GrammarProgress // 语法ID -> 进度 StartDate time.Time LastStudyDate time.Time MasteryLevel vo.MasteryLevel } // UpdateWordProgress 更新单词进度(核心领域逻辑) func (lp *LearningProgress) UpdateWordProgress(wordID string, newLevel vo.MasteryLevel) error { progress, exists := lp.WordProgress[wordID] if !exists { return &domainError{message: "单词不在课程中"} } // 业务规则:掌握程度只能向前推进 if !lp.canTransition(progress.Level, newLevel) { return &domainError{message: "无效的进度状态转换"} } progress.Level = newLevel progress.ReviewCount++ progress.LastReviewed = time.Now() progress.NextReviewDate = lp.calculateNextReviewDate(newLevel) lp.WordProgress[wordID] = progress lp.LastStudyDate = time.Now() lp.updateOverallMastery() return nil } // 计算下次复习时间( spaced repetition算法 ) func (lp *LearningProgress) calculateNextReviewDate(level vo.MasteryLevel) time.Time { intervals := map[vo.MasteryLevel]time.Duration{ vo.MasteryLearning: 24 * time.Hour, vo.MasteryFamiliar: 72 * time.Hour, vo.MasteryMastered: 168 * time.Hour, } return time.Now().Add(intervals[level]) } // domain/progress/word_progress.go package progress import ( "time" "online-training/domain/vo" ) // WordProgress 单词进度值对象 type WordProgress struct { WordID string Level vo.MasteryLevel ReviewCount int LastReviewed time.Time NextReviewDate time.Time } // IsDueForReview 判断是否该复习了 func (wp WordProgress) IsDueForReview() bool { return time.Now().After(wp.NextReviewDate) }

5. 仓储接口定义

go

复制

// repository/student_repository.go package repository import "online-training/domain/user" type StudentRepository interface { Save(student *user.Student) error FindByID(id string) (*user.Student, error) FindByParentID(parentID string) ([]*user.Student, error) } // repository/course_repository.go package repository import "online-training/domain/resource" type CourseRepository interface { Save(course *resource.Course) error FindByID(id string) (*resource.Course, error) FindByTeacherID(teacherID string) ([]*resource.Course, error) }

6. 应用服务示例

go

复制

// service/student_service.go package service import ( "online-training/domain/user" "online-training/domain/progress" "online-training/repository" ) type StudentService struct { studentRepo repository.StudentRepository progressRepo repository.ProgressRepository } // EnrollCourse 学生选课 func (s *StudentService) EnrollCourse(studentID string, courseID string) error { // 加载聚合根 student, err := s.studentRepo.FindByID(studentID) if err != nil { return err } // 执行业务逻辑 if err := student.VerifyLearningAbility(); err != nil { return err } // 创建学习进度 progress := progress.NewLearningProgress(studentID, courseID) // 保存到仓储 return s.progressRepo.Save(progress) } // domainError 领域错误 type domainError struct { message string } func (e *domainError) Error() string { return e.message }

Go实现的关键设计要点

表格

复制

设计点Go实现方式说明
聚合根结构体+方法通过方法实现业务规则,控制内部状态
值对象结构体+Equals()不可变,通过相等性判断比较
工厂函数NewXXX()函数封装聚合根创建逻辑,确保不变性
仓储接口Interface定义在领域层,实现在基础设施层
领域错误自定义error类型明确区分业务异常和技术异常
依赖方向领域层不依赖其他层通过接口解耦,符合整洁架构

这个实现严格遵循DDD原则,同时充分利用了Go的特性(接口、组合、包管理)。需要我展开某个特定部分的实现细节吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 5:40:31

MediaPipe Pose推理机制解析:底层计算流程与优化原理

MediaPipe Pose推理机制解析&#xff1a;底层计算流程与优化原理 1. 引言&#xff1a;AI人体骨骼关键点检测的技术演进 随着计算机视觉技术的快速发展&#xff0c;人体姿态估计&#xff08;Human Pose Estimation&#xff09;已成为智能健身、动作捕捉、虚拟现实和人机交互等…

作者头像 李华
网站建设 2026/4/14 9:29:40

企业级人脸隐私解决方案:AI自动打码系统部署最佳实践

企业级人脸隐私解决方案&#xff1a;AI自动打码系统部署最佳实践 1. 引言&#xff1a;AI 人脸隐私卫士 - 智能自动打码 在数字化办公、智能安防与内容共享日益普及的今天&#xff0c;图像中的个人隐私泄露风险正成为企业和组织不可忽视的安全隐患。尤其在会议纪要、培训记录、…

作者头像 李华
网站建设 2026/4/16 12:32:11

GLM-4.6V-Flash-WEB部署出错?常见问题避坑指南

GLM-4.6V-Flash-WEB部署出错&#xff1f;常见问题避坑指南 智谱最新开源&#xff0c;视觉大模型。 1. 背景与部署价值 1.1 GLM-4.6V-Flash-WEB 简介 GLM-4.6V-Flash-WEB 是智谱AI推出的最新开源视觉语言大模型&#xff08;Vision-Language Model, VLM&#xff09;的Web集成版…

作者头像 李华
网站建设 2026/4/9 5:27:39

HunyuanVideo-Foley插件开发:为第三方软件打造扩展模块

HunyuanVideo-Foley插件开发&#xff1a;为第三方软件打造扩展模块 1. 背景与技术价值 1.1 视频音效生成的行业痛点 在传统视频制作流程中&#xff0c;音效设计&#xff08;Foley&#xff09;是一项高度依赖人工的专业工作。音频工程师需要逐帧匹配动作与声音——如脚步声、…

作者头像 李华
网站建设 2026/4/16 12:46:21

GLM-4.6V-Flash-WEB横向评测:准确率与速度平衡分析

GLM-4.6V-Flash-WEB横向评测&#xff1a;准确率与速度平衡分析 &#x1f4a1; 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0c;支…

作者头像 李华
网站建设 2026/4/15 6:26:13

HunyuanVideo-Foley技术揭秘:为何能实现电影级音效合成?

HunyuanVideo-Foley技术揭秘&#xff1a;为何能实现电影级音效合成&#xff1f; 1. 背景与问题&#xff1a;传统音效制作的瓶颈 在影视、短视频和广告制作中&#xff0c;音效&#xff08;Foley Sound&#xff09;是提升沉浸感的关键环节。传统音效制作依赖专业录音师在 Foley…

作者头像 李华