请把涉及到的实体类以及Airequest也进行修改
时间: 2025-07-22 17:47:42 浏览: 8
<think>我们之前已经提供了Service层、DTO、Util等代码,现在需要补充实体类(Entity)和AiRequest DTO的代码。
根据项目结构,实体类在`com.teacher.model.entity`包下,DTO在`com.teacher.model.dto`包下。
需要实现的实体类包括:
- KnowledgeDoc(知识库文档实体)
- StudentAnswer(学生答题实体)
- KnowledgePoint(知识点实体)
- 以及之前可能已经存在的Courseware, Exercise, User(但这里我们只关注新增的)
同时,需要修改或补充的DTO包括:
- AiRequest(AI请求DTO)
注意:实体类需要与数据库表对应,使用JPA注解。DTO用于数据传输,不需要持久化注解。
我们将按照以下步骤进行:
1. 实现KnowledgeDoc实体类
2. 实现StudentAnswer实体类
3. 实现KnowledgePoint实体类
4. 修改AiRequest DTO(如果之前没有,则实现)
注意:实体类需要包含必要的字段、构造方法、getter/setter以及JPA注解(如@Entity, @Id等)。
另外,考虑到之前已经存在Courseware、Exercise、User等实体,这里不再重复,只关注新增实体。</think>### 完整的实体类与 DTO 实现(与 Service 层完全匹配)
#### 1. KnowledgeDoc.java(知识库文档实体)
```java
package com.teacher.model.entity;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "knowledge_docs")
@Getter
@Setter
public class KnowledgeDoc {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Lob
@Column(nullable = false)
private String content;
@Column(name = "user_id", nullable = false)
private Long userId;
@Column(name = "vector_id")
private String vectorId;
@Column(nullable = false)
private String status = "PENDING"; // PENDING, INDEXED, FAILED
@CreationTimestamp
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
@UpdateTimestamp
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@Column(name = "file_type")
private String fileType; // PDF, DOCX, TXT
// 知识点关联(可选)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "knowledge_point_id")
private KnowledgePoint knowledgePoint;
// 默认构造方法
public KnowledgeDoc() {}
// 业务构造方法
public KnowledgeDoc(String title, String content, Long userId) {
this.title = title;
this.content = content;
this.userId = userId;
}
}
```
#### 2. StudentAnswer.java(学生答题实体)
```java
package com.teacher.model.entity;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "student_answers")
@Getter
@Setter
public class StudentAnswer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "student_id", nullable = false)
private Long studentId;
@Column(name = "exercise_id", nullable = false)
private Long exerciseId;
@Column(nullable = false)
private String answer;
@Column(name = "is_correct", nullable = false)
private Boolean isCorrect;
@Column(name = "score")
private Double score;
@Column(name = "knowledge_point", nullable = false)
private String knowledgePoint;
@CreationTimestamp
@Column(name = "submitted_at", updatable = false)
private LocalDateTime submittedAt;
// 与习题的关联(可选)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "exercise_id", insertable = false, updatable = false)
private Exercise exercise;
// 默认构造方法
public StudentAnswer() {}
// 业务构造方法
public StudentAnswer(Long studentId, Long exerciseId, String answer,
Boolean isCorrect, String knowledgePoint) {
this.studentId = studentId;
this.exerciseId = exerciseId;
this.answer = answer;
this.isCorrect = isCorrect;
this.knowledgePoint = knowledgePoint;
}
}
```
#### 3. KnowledgePoint.java(知识点实体)
```java
package com.teacher.model.entity;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "knowledge_points")
@Getter
@Setter
public class KnowledgePoint {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String name;
@Column
private String description;
@Column(name = "subject_area")
private String subjectArea; // 如:数学、物理等
@Column(name = "difficulty_level")
private String difficultyLevel; // 基础、中等、高级
@CreationTimestamp
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
// 关联文档
@OneToMany(mappedBy = "knowledgePoint", cascade = CascadeType.ALL, orphanRemoval = true)
private List<KnowledgeDoc> documents = new ArrayList<>();
// 关联习题
@OneToMany(mappedBy = "knowledgePoint", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Exercise> exercises = new ArrayList<>();
// 默认构造方法
public KnowledgePoint() {}
// 业务构造方法
public KnowledgePoint(String name, String subjectArea) {
this.name = name;
this.subjectArea = subjectArea;
}
}
```
#### 4. Exercise.java(习题实体 - 更新版)
```java
package com.teacher.model.entity;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "exercises")
@Getter
@Setter
public class Exercise {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Lob
@Column(nullable = false)
private String content;
@Column(name = "exercise_type", nullable = false)
private String exerciseType; // CHOICE, FILL_BLANK, ESSAY
@Column(name = "difficulty_level")
private String difficultyLevel; // EASY, MEDIUM, HARD
@Column(name = "correct_answer")
private String correctAnswer;
@Column(name = "knowledge_point_id")
private Long knowledgePointId;
// 知识点关联
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "knowledge_point_id", insertable = false, updatable = false)
private KnowledgePoint knowledgePoint;
@CreationTimestamp
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
// 默认构造方法
public Exercise() {}
// 业务构造方法
public Exercise(String title, String content, String exerciseType,
String knowledgePoint) {
this.title = title;
this.content = content;
this.exerciseType = exerciseType;
if (knowledgePoint != null) {
this.knowledgePoint = new KnowledgePoint(knowledgePoint, "数学");
}
}
}
```
#### 5. AiRequest.java(AI 请求 DTO - 更新版)
```java
package com.teacher.model.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AiRequest {
private String type; // 请求类型:TEACHING_PLAN, EXERCISE, CONTENT
private String topic; // 主题
private String audience; // 目标受众(如:七年级学生)
private int length; // 期望内容长度(字数)
private String additionalParams; // 附加参数(JSON格式)
private String style; // 风格(如:正式、简洁)
private String language = "zh-CN"; // 语言
// 教学计划特定参数
private String subject; // 学科
private String gradeLevel; // 年级
// 习题生成特定参数
private String knowledgePoint; // 知识点
private int exerciseCount; // 习题数量
private String difficulty; // 难度级别
// 默认构造方法
public AiRequest() {}
// 内容生成构造方法
public AiRequest(String type, String topic, String audience) {
this.type = type;
this.topic = topic;
this.audience = audience;
}
// 教学计划构造方法
public AiRequest(String subject, String gradeLevel) {
this.type = "TEACHING_PLAN";
this.subject = subject;
this.gradeLevel = gradeLevel;
}
// 习题生成构造方法
public AiRequest(String knowledgePoint, int exerciseCount, String difficulty) {
this.type = "EXERCISE";
this.knowledgePoint = knowledgePoint;
this.exerciseCount = exerciseCount;
this.difficulty = difficulty;
}
}
```
### 关键设计说明
#### 1. 实体类设计要点
1. **JPA 注解**:
- `@Entity` 标记持久化实体
- `@Table` 指定数据库表名
- `@Id` 和 `@GeneratedValue` 定义主键
- `@Column` 控制字段映射
- `@CreationTimestamp` 自动管理创建时间
2. **关联关系**:
```java
// 一对多关系(知识点 -> 文档)
@OneToMany(mappedBy = "knowledgePoint")
private List<KnowledgeDoc> documents;
// 多对一关系(文档 -> 知识点)
@ManyToOne
@JoinColumn(name = "knowledge_point_id")
private KnowledgePoint knowledgePoint;
```
3. **LOB 字段处理**:
```java
@Lob
@Column(nullable = false)
private String content; // 存储大文本内容
```
#### 2. DTO 设计要点
1. **职责分离**:
- `AiRequest` 包含所有可能的 AI 请求参数
- 使用特定构造方法创建不同类型的请求
- 避免与实体类耦合
2. **灵活扩展**:
```java
// 通用参数
private String type;
private String topic;
// 特定场景参数
private String subject; // 教学计划专用
private String knowledgePoint; // 习题生成专用
```
3. **默认值设置**:
```java
private String status = "PENDING"; // 实体类默认状态
private String language = "zh-CN"; // DTO 默认语言
```
### 与 Service 层的完美集成
1. **KnowledgeService 使用实体类**:
```java
// 保存文档
public KnowledgeDoc saveDocument(KnowledgeDoc doc) {
return knowledgeRepo.save(doc);
}
// 索引文档
public void indexKnowledgeDocument(Long docId) {
KnowledgeDoc doc = knowledgeRepo.findById(docId).orElseThrow();
// 使用 doc.getContent() 处理内容
}
```
2. **AssessmentService 使用实体类**:
```java
// 生成习题
public List<Exercise> generateExercises(String knowledgePoint, int count) {
return exerciseRepository.findByKnowledgePoint(knowledgePoint);
}
// 保存答案
public void saveStudentAnswers(List<StudentAnswer> answers) {
answerRepo.saveAll(answers);
}
```
3. **AiService 使用 DTO**:
```java
// 生成内容
public String generateContent(AiRequest request) {
String prompt = promptBuilder.buildPrompt(request);
return qwenClient.generateText(prompt);
}
// 生成教学计划
public TeachingPlanDto generateTeachingPlan(String subject, String gradeLevel) {
AiRequest request = new AiRequest(subject, gradeLevel);
return generateTeachingPlan(request);
}
```
这些实体类和 DTO 完全匹配之前提供的 Service 层实现,确保整个系统的一致性和可维护性。实体类使用 JPA 注解进行持久化映射,DTO 专注于数据传输,符合分层架构的最佳实践。
阅读全文
相关推荐

















