Database Schema Design
Core User and Course Management
1. Users(用户)
继承自 django.contrib.auth.models.AbstractUser
- id: CharField,主键,max_length=20,用作学号/工号
- username: CharField,max_length=150,真实姓名
- password: 密码字段(继承自AbstractUser)
- email: EmailField,unique=True
- role: CharField,用户角色,max_length=20,choices=[('student', 'Student'), ('teacher', 'Teacher')]
- enroll_time: DateField,入学时间,null=True,blank=True
- favorites: JSONField,存储用户收藏的帖子id,default=list,blank=True
- is_favorites_public: BooleanField,收藏夹是否公开,default=False
- likes: PositiveIntegerField,被点赞数,default=0
- followers: JSONField,存储关注该用户的用户ID列表,default=list,blank=True
- following: JSONField,存储该用户关注的用户ID列表,default=list,blank=True
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
2. PasswordResetToken(密码重置令牌)
- id: 主键,自增,AutoField
- user: 外键,关联到Users表,on_delete=CASCADE
- token: CharField,6位数字验证码,max_length=6
- created_at: DateTimeField,创建时间,auto_now_add=True
- expires_at: DateTimeField,过期时间
3. Courses(课程)
- id: CharField,主键,max_length=20
- semester: CharField,学期,max_length=9,格式YYYY-YYYY(例如2024-1000即为2024上半学期)
- time: JSONField,上课时间(星期几第几节),格式:{'1': [], '2': [], '3': [], '4': [], '5': [], '6': [], '7': []}
- name: CharField,课程名称,max_length=100
- description: TextField,课程描述
- syllabus: TextField,教学大纲
- teacher: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},related_name='taught_courses'
- student_num: PositiveIntegerField,学生数量,default=0,editable=False
- cover: URLField,课程封面,max_length=255,blank=True
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
4. CourseEnrollments(选课记录)
- course: 外键,关联到Courses表,on_delete=CASCADE,related_name='enrollments'
- student: 外键,关联到Users表,on_delete=CASCADE,related_name='enrolled_courses'
- status: CharField,课程状态,max_length=20,choices=['NOT_STARTED','IN_PROGRESS','COMPLETED','RETAKING'],default='NOT_STARTED'
- final_grade: FloatField,最终成绩,null=True,blank=True,validators=[MinValueValidator(0), MaxValueValidator(100)]
- enrolled_at: DateTimeField,选课时间,auto_now_add=True
- completed_at: DateTimeField,完成时间,null=True,blank=True
5. CourseResources(课程资源)
- id: AutoField,主键,自增
- course: 外键,关联到Courses表,on_delete=CASCADE,related_name='resources'
- name: CharField,资源名称,max_length=255
- resource_type: CharField,资源类型,max_length=10,choices=['SLIDES','EXAM','EXERCISE','OTHER']
- file_path: URLField,文件URL,max_length=255,unique=True
- uploaded_at: DateTimeField,上传时间,auto_now_add=True
Assignment Management
6. Assignments(作业)
- id: AutoField,主键,自增
- course: 外键,关联到Courses表,on_delete=CASCADE,related_name='assignments'
- title: CharField,作业标题,max_length=200
- description: TextField,作业描述
- score: PositiveIntegerField,满分分数,validators=[MinValueValidator(1)]
- due_date: DateTimeField,截止时间
- is_peer_review_enabled: BooleanField,是否启用互评,default=False
- peer_review_count: PositiveIntegerField,每个作业分配的互评数量,default=0
- peer_reviews_assigned: BooleanField,是否已完成互评分配,default=False
- peer_review_due_date: DateTimeField,互评截止时间,null=True,blank=True
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
7. AssignmentAttachments(作业附件)
- id: AutoField,主键,自增
- assignment: 外键,关联到Assignments表,on_delete=CASCADE,related_name='attachments'
- file_path: URLField,文件路径
- uploaded_at: DateTimeField,上传时间,auto_now_add=True
8. Submissions(作业提交)
- id: AutoField,主键,自增
- assignment: 外键,关联到Assignments表,on_delete=CASCADE,related_name='submissions'
- student: 外键,关联到Users表,on_delete=CASCADE,related_name='submissions'
- content: TextField,提交内容,blank=True
- submitted_at: DateTimeField,提交时间,null=True,blank=True
- teacher_score: FloatField,教师评分,null=True,blank=True
- feedback: TextField,反馈,blank=True
- graded_at: DateTimeField,评分时间,null=True,blank=True
- status: CharField,状态,max_length=20,choices=['NOT_SUBMITTED','SUBMITTED'],default='NOT_SUBMITTED'
9. SubmissionAttachments(提交附件)
- id: AutoField,主键,自增
- submission: 外键,关联到Submissions表,on_delete=CASCADE,related_name='attachments'
- file_path: URLField,文件路径
- uploaded_at: DateTimeField,上传时间,auto_now_add=True
10. PeerReviewAssignment(互评分配)
- id: AutoField,主键,自增
- reviewer: 外键,关联到Users表,on_delete=CASCADE,related_name='assigned_peer_reviews',互评人
- submission: 外键,关联到Submission表,on_delete=CASCADE,related_name='peer_reviews',被评作业
- assignment: 外键,关联到Assignment表,on_delete=CASCADE,对应作业
- reviewed_at: DateTimeField,互评完成时间,null=True,blank=True
11. PeerReviewScore(互评分数)
- id: AutoField,主键,自增
- peer_review_assignment: 外键,关联到PeerReviewAssignment表,on_delete=CASCADE,related_name='scores'
- score: FloatField,评分,null=True,blank=True
- feedback: TextField,评语,blank=True
Exam Management
12. Exam(考试)
- id: AutoField,主键,自增
- course: 外键,关联到Courses表,related_name='exams'
- title: CharField,考试标题,max_length=200
- description: TextField,考试说明
- exam_date: DateTimeField,考试日期和时间
- classroom: CharField,考试教室,max_length=100
- seating_type: JSONField,存储学号数组表示座位安排,default=list
- status: CharField,考试状态,max_length=20,choices=['NOT_STARTED','IN_PROGRESS','COMPLETED'],default='NOT_STARTED'
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
13. ExamPaper(试卷)
- id: AutoField,主键,自增
- exam: 外键,关联到Exam表,related_name='papers'
- ocr_result: TextField,OCR识别结果,blank=True
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
14. ExamSubmission(试卷提交)
- id: AutoField,主键,自增
- exam: 外键,关联到Exam表,related_name='submissions'
- student: 外键,关联到Users表,related_name='exam_submissions'
- status: CharField,答卷状态,max_length=20,choices=['NOT_SUBMITTED','SUBMITTED','PROCESSING','GRADING','GRADED'],default='NOT_SUBMITTED'
- total_score: FloatField,总分,null=True,blank=True,validators=[MinValueValidator(0)]
- grading_details: JSONField,每道题的得分和评语,default=dict
- grader: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},null=True,blank=True,related_name='graded_exams'
- ocr_content: TextField,所有文件扫描结果整合,default='null',blank=True,null=True
- ai_analysis: JSONField,AI分析结果,default=dict,blank=True
- ai_status: CharField,AI处理状态,max_length=20,choices=['PENDING','PROCESSING','COMPLETED','FAILED'],default='PENDING'
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
15. ExamSubmissionAttachment(考试提交附件)
- id: AutoField,主键,自增
- submission: 外键,关联到ExamSubmission表,related_name='attachments'
- file_path: URLField,学生试卷扫描件路径
- ocr_content: TextField,OCR识别文本内容,blank=True,null=True
- ocr_words_info: JSONField,OCR文字块详细信息,default=dict,blank=True
- ocr_confidence: FloatField,OCR识别置信度,null=True,blank=True
- image_angle: IntegerField,图片旋转角度,null=True,blank=True
- image_height: IntegerField,图片高度,null=True,blank=True
- image_width: IntegerField,图片宽度,null=True,blank=True
- ai_analysis: JSONField,AI分析结果,default=dict,blank=True
- ocr_status: CharField,OCR处理状态,max_length=20,choices=['PENDING','PROCESSING','COMPLETED','FAILED'],default='PENDING'
- ai_status: CharField,AI处理状态,max_length=20,choices=['PENDING','PROCESSING','COMPLETED','FAILED'],default='PENDING'
- uploaded_at: DateTimeField,上传时间,auto_now_add=True
16. ExamAttachment(考试附件)
- id: AutoField,主键,自增
- exam: 外键,关联到Exam表,related_name='attachments'
- file_path: URLField,文件路径
- file_type: CharField,文件类型,max_length=20,choices=['INSTRUCTIONS','RULES','OTHER']
- uploaded_at: DateTimeField,上传时间,auto_now_add=True
17. AnswerAttachment(答案附件)
- id: AutoField,主键,自增
- exam: 外键,关联到Exam表,related_name='answer_attachments'
- file_path: URLField,答案文件路径
- file_type: CharField,文件类型,max_length=20,choices=['ANSWER_KEY','SAMPLE_ANSWER','OTHER']
- uploaded_at: DateTimeField,上传时间,auto_now_add=True
Community Interaction
18. Posts(帖子)
- id: AutoField,主键,自增
- course: 外键,关联到Courses表,on_delete=CASCADE
- user: 外键,关联到Users表,on_delete=CASCADE
- content: TextField,帖子内容(html)
- mentioned_users: JSONField,存储被@的用户ID列表,default=list,blank=True
- topic: CharField,存储话题单个关键词,max_length=50,blank=True
- likes_count: PositiveIntegerField,点赞数量,default=0
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
19. Comments(评论)
- id: AutoField,主键,自增
- post: 外键,关联到Posts表,on_delete=CASCADE,related_name='comments'
- user: 外键,关联到Users表,on_delete=CASCADE
- content: TextField,评论内容
- mentioned_users: JSONField,存储被@的用户ID列表,default=list,blank=True
- likes_count: PositiveIntegerField,点赞数量,default=0
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
20. Notes(笔记)
- id: AutoField,主键,自增
- user: 外键,关联到Users表,on_delete=CASCADE,related_name='notes'
- content: TextField,笔记内容(html)
- topic: CharField,存储单个话题关键词,max_length=50,blank=True
- is_public: BooleanField,是否公开,default=False
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
21. Notifications(通知)
- id: AutoField,主键,自增
- user: 外键,关联到Users表,on_delete=CASCADE
- content: TextField,通知内容
- type: CharField,通知类型,max_length=20,choices=['system','course','mention','like','comment_reply']
- is_read: BooleanField,是否已读,default=False
- created_at: DateTimeField,创建时间,auto_now_add=True
AI Features
22. AIPromptTemplate(AI分析提示词模板)
- id: AutoField,主键,自增
- title: CharField,模板标题,max_length=100
- content: TextField,提示词内容
- created_by: 外键,关联到Users表,limit_choices_to={'role': 'teacher'}
- is_default: BooleanField,是否为默认模板,default=False
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
23. Workspace(工作区)
- id: AutoField,主键,自增
- course: OneToOneField,关联到Courses表,unique=True,related_name='workspace'
- teacher: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},related_name='workspaces'
- name: CharField,工作区显示名称,max_length=255
- slug: CharField,AnythingLLM工作区标识符,unique=True,max_length=255
- openai_temp: FloatField,OpenAI温度参数,null=True,blank=True
- openai_history: IntegerField,历史消息数量,null=True,blank=True
- openai_prompt: TextField,系统提示词,null=True,blank=True
- created_at: DateTimeField,创建时间,auto_now_add=True
- updated_at: DateTimeField,更新时间,auto_now=True
24. Document(文档)
- id: AutoField,主键,自增
- workspace: 外键,关联到Workspace表,related_name='documents'
- uploader: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},null=True,related_name='uploaded_documents'
- filename: CharField,显示的文件名,max_length=255
- file_path: CharField,AnythingLLM中的文件路径,max_length=500
- embedding_status: CharField,嵌入状态,max_length=20,choices=['processing','completed','failed'],default='processing'
- error_message: TextField,当嵌入失败时的错误信息,null=True,blank=True
- created_at: DateTimeField,创建时间,auto_now_add=True
25. ChatThread(对话线程)
- id: AutoField,主键,自增
- workspace: 外键,关联到Workspace表,related_name='chat_threads'
- user: 外键,关联到Users表,related_name='chat_threads'
- thread_slug: CharField,AnythingLLM的对话线程标识符,max_length=255
- name: CharField,对话线程显示名称,max_length=255
- is_active: BooleanField,是否被删除,default=True
- created_at: DateTimeField,创建时间,auto_now_add=True
- last_used_at: DateTimeField,最后一次使用时间,auto_now=True
Meta Information
排序规则 (ordering)
- AIPromptTemplate: ['-created_at']
- ChatThread: ['-last_used_at']
- Comments: ['created_at']
- CourseResource: ['-uploaded_at']
- Document: ['-created_at']
- ExamSubmission: ['-created_at']
- Notes: ['-updated_at']
- Notifications: ['-created_at']
- PeerReviewAssignment: ['-reviewed_at']
- Posts: ['-created_at']
- Submission: ['-submitted_at']
- Workspace: ['-created_at']
索引定义 (indexes)
Posts:
- models.Index(fields=['topic'])
- models.Index(fields=['course', 'created_at'])
Comments:
- models.Index(fields=['post', 'created_at'])
Notes:
- models.Index(fields=['topic'])
- models.Index(fields=['user', 'is_public'])
Notifications:
- models.Index(fields=['user', 'is_read'])
评论区