feat(api): implement exam and grade synchronization modules
Add new functionality for managing and synchronizing academic grades and exam schedules. This includes new models, repositories, services, and HTTP handlers, along with updated gRPC definitions and dependency injection configuration. Additionally, improve the reliability of unread message count tracking by implementing an atomic Lua script for Redis operations in the conversation cache.
This commit is contained in:
28
internal/model/exam.go
Normal file
28
internal/model/exam.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Exam struct {
|
||||
ID string `json:"id" gorm:"type:varchar(36);primaryKey"`
|
||||
UserID string `json:"user_id" gorm:"type:varchar(36);index;not null"`
|
||||
Semester string `json:"semester" gorm:"type:varchar(30);not null"`
|
||||
CourseName string `json:"course_name" gorm:"type:varchar(120);not null"`
|
||||
ExamType string `json:"exam_type" gorm:"type:varchar(30)"`
|
||||
Date string `json:"date" gorm:"type:varchar(20)"`
|
||||
Time string `json:"time" gorm:"type:varchar(30)"`
|
||||
Week string `json:"week" gorm:"type:varchar(20)"`
|
||||
Weekday string `json:"weekday" gorm:"type:varchar(10)"`
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
}
|
||||
|
||||
func (e *Exam) BeforeCreate(tx *gorm.DB) error {
|
||||
SetUUIDIfEmpty(&e.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (Exam) TableName() string { return "exams" }
|
||||
51
internal/model/grade.go
Normal file
51
internal/model/grade.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Grade struct {
|
||||
ID string `json:"id" gorm:"type:varchar(36);primaryKey"`
|
||||
UserID string `json:"user_id" gorm:"type:varchar(36);index;not null"`
|
||||
Term string `json:"term" gorm:"type:varchar(30);not null"`
|
||||
CourseCode string `json:"course_code" gorm:"type:varchar(30)"`
|
||||
CourseName string `json:"course_name" gorm:"type:varchar(120);not null"`
|
||||
Nature string `json:"nature" gorm:"type:varchar(30)"`
|
||||
Category string `json:"category" gorm:"type:varchar(30)"`
|
||||
Credit string `json:"credit" gorm:"type:varchar(10)"`
|
||||
Score string `json:"score" gorm:"type:varchar(20)"`
|
||||
GradePoint string `json:"grade_point" gorm:"type:varchar(10)"`
|
||||
IsExam string `json:"is_exam" gorm:"type:varchar(10)"`
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
}
|
||||
|
||||
func (g *Grade) BeforeCreate(tx *gorm.DB) error {
|
||||
SetUUIDIfEmpty(&g.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (Grade) TableName() string { return "grades" }
|
||||
|
||||
type GpaSummary struct {
|
||||
ID string `json:"id" gorm:"type:varchar(36);primaryKey"`
|
||||
UserID string `json:"user_id" gorm:"type:varchar(36);index;not null"`
|
||||
Semester string `json:"semester" gorm:"type:varchar(30);not null"`
|
||||
AverageGpa string `json:"average_gpa" gorm:"type:varchar(20)"`
|
||||
Rank string `json:"rank" gorm:"type:varchar(30)"`
|
||||
ExamTotalGpa string `json:"exam_total_gpa" gorm:"type:varchar(20)"`
|
||||
ExamTotalCredits string `json:"exam_total_credits" gorm:"type:varchar(20)"`
|
||||
FailCredits string `json:"fail_credits" gorm:"type:varchar(20)"`
|
||||
Semesters string `json:"semesters" gorm:"type:varchar(20)"`
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
}
|
||||
|
||||
func (g *GpaSummary) BeforeCreate(tx *gorm.DB) error {
|
||||
SetUUIDIfEmpty(&g.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (GpaSummary) TableName() string { return "gpa_summaries" }
|
||||
@@ -154,6 +154,11 @@ func autoMigrate(db *gorm.DB) error {
|
||||
// 课表
|
||||
&ScheduleCourse{},
|
||||
|
||||
// 成绩与考试
|
||||
&Grade{},
|
||||
&GpaSummary{},
|
||||
&Exam{},
|
||||
|
||||
// 用户活跃相关
|
||||
&UserActiveLog{},
|
||||
&UserActivityStat{},
|
||||
|
||||
Reference in New Issue
Block a user