diff --git a/cmd/migrate/danke_v3.go b/cmd/migrate/danke_v3.go index 3a7803a..fe64eed 100644 --- a/cmd/migrate/danke_v3.go +++ b/cmd/migrate/danke_v3.go @@ -231,7 +231,8 @@ set upvote_count = (select count(*) from review_vote where review_vote.review_id rank_overall = JSON_EXTRACT(review.rank, '$.overall'), rank_content = JSON_EXTRACT(review.rank, '$.content'), rank_assessment = JSON_EXTRACT(review.rank, '$.assessment'), - rank_workload = JSON_EXTRACT(review.rank, '$.workload') + rank_workload = JSON_EXTRACT(review.rank, '$.workload'), + modify_count = (select count(*) from review_history where review_history.review_id = review.id) where true`).Error if err != nil { return err diff --git a/internal/model/course.go b/internal/model/course.go index bd8ba17..593d623 100644 --- a/internal/model/course.go +++ b/internal/model/course.go @@ -6,54 +6,21 @@ import ( // Course 课程 type Course struct { - // 课程 ID , primary key - ID int `json:"id"` - - // 创建时间 - CreatedAt time.Time `json:"created_at"` - - // 更新时间 - UpdatedAt time.Time `json:"updated_at"` - - // 课程名称 - Name string `json:"name" gorm:"not null"` - - // 课程编号 - Code string `json:"code" gorm:"not null"` - - // 选课序号。用于区分同一课程编号的不同平行班 - CodeID string `json:"code_id" gorm:"not null"` - - // 学分 - Credit float64 `json:"credit" gorm:"not null"` - - // 开课学院 - Department string `json:"department" gorm:"not null"` - - // 开课校区 - CampusName string `json:"campus_name" gorm:"not null"` - - // 老师:多个老师用逗号分隔 - Teachers string `json:"teachers" gorm:"not null"` - - // 最大选课人数 - MaxStudent int `json:"max_student" gorm:"not null"` - - // 周学时 - WeekHour int `json:"week_hour" gorm:"not null"` - - // 学年 - Year int `json:"year" gorm:"not null"` - - // 学期 - Semester int `json:"semester" gorm:"not null"` - - // 课程组类型 - CourseGroupID int `json:"course_group_id" gorm:"not null;index"` - - // 评教数量 - ReviewCount int `json:"review_count" gorm:"not null;default:0"` - - // 所有评教 - Reviews []*Review `json:"reviews"` + ID int `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Name string `json:"name" gorm:"not null"` // 课程名称 + Code string `json:"code" gorm:"not null"` // 课程编号 + CodeID string `json:"code_id" gorm:"not null"` // 选课序号。用于区分同一课程编号的不同平行班 + Credit float64 `json:"credit" gorm:"not null"` // 学分 + Department string `json:"department" gorm:"not null"` // 开课学院 + CampusName string `json:"campus_name" gorm:"not null"` // 开课校区 + Teachers string `json:"teachers" gorm:"not null"` // 老师:多个老师用逗号分隔 + MaxStudent int `json:"max_student" gorm:"not null"` // 最大选课人数 + WeekHour int `json:"week_hour" gorm:"not null"` // 周学时 + Year int `json:"year" gorm:"not null"` // 学年 + Semester int `json:"semester" gorm:"not null"` // 学期 + CourseGroupID int `json:"course_group_id" gorm:"not null;index"` // 课程组类型 + ReviewCount int `json:"review_count" gorm:"not null;default:0"` // 评教数量 + Reviews []*Review `json:"reviews"` // 所有评教 } diff --git a/internal/model/review.go b/internal/model/review.go index bbea5fa..da52c8a 100644 --- a/internal/model/review.go +++ b/internal/model/review.go @@ -4,94 +4,47 @@ import ( "time" ) +// ReviewRank 评教分数 type ReviewRank struct { - Overall int `json:"overall"` - - // 内容、风格方面 - Content int `json:"content"` - - // 工作量方面 - Workload int `json:"workload"` - - // 考核方面 - Assessment int `json:"assessment"` + Overall int `json:"overall"` + Content int `json:"content"` // 内容、风格方面 + Workload int `json:"workload"` // 工作量方面 + Assessment int `json:"assessment"` // 考核方面 } // Review 评教 type Review struct { - // 评教 ID , primary key - ID int `json:"id"` - - // 创建时间 - CreatedAt time.Time `json:"created_at" gorm:"not null"` - - // 更新时间 - UpdatedAt time.Time `json:"updated_at" gorm:"not null"` - - // 课程 ID - CourseID int `json:"course_id" gorm:"not null;index"` - Course *Course `json:"course"` - - // 标题 - Title string `json:"title" gorm:"not null"` - - // 内容 - Content string `json:"content" gorm:"not null"` - - // 评教者 - ReviewerID int `json:"reviewer_id" gorm:"not null;index"` - - // 评分 - Rank *ReviewRank `json:"rank" gorm:"embedded;embeddedPrefix:rank_"` - - // 点赞数 - UpvoteCount int `json:"upvote_count"` - - // 点踩数 - DownvoteCount int `json:"downvote_count"` - - // 评教修改历史 - History []*ReviewHistory `json:"history"` - - // 评教点赞/点踩详情 - Vote []*ReviewVote `json:"vote"` - - // 用户成就 + ID int `json:"id"` + CreatedAt time.Time `json:"created_at" gorm:"not null"` + UpdatedAt time.Time `json:"updated_at" gorm:"not null"` + CourseID int `json:"course_id" gorm:"not null;index"` + Course *Course `json:"course"` + Title string `json:"title" gorm:"not null"` + Content string `json:"content" gorm:"not null"` + ReviewerID int `json:"reviewer_id" gorm:"not null;index"` + Rank *ReviewRank `json:"rank" gorm:"embedded;embeddedPrefix:rank_"` + UpvoteCount int `json:"upvote_count"` + DownvoteCount int `json:"downvote_count"` + ModifyCount int `json:"modify_count" gorm:"not null;default:0"` + History []*ReviewHistory `json:"history"` + Vote []*ReviewVote `json:"vote"` UserAchievements []*UserAchievement `json:"achievements" gorm:"foreignKey:UserID;references:ReviewerID"` } // ReviewHistory 评教修改历史 type ReviewHistory struct { - // 评教修改历史 ID , primary key - ID int `json:"id"` - - // 创建时间,原本是 time_created - CreatedAt time.Time `json:"created_at"` - - // 更新时间,原本是 time_updated - UpdatedAt time.Time `json:"updated_at"` - - // 评教 ID - ReviewID int `json:"review_id" gorm:"not null;index"` - - // 修改人 ID - AlterBy int `json:"alter_by" gorm:"not null"` - - // 修改前的标题 - Title string `json:"title" gorm:"not null"` - - // 修改前的内容 - Content string `json:"content" gorm:"not null"` + ID int `json:"id"` + CreatedAt time.Time `json:"created_at"` // 创建时间,原本是 time_created + UpdatedAt time.Time `json:"updated_at"` // 更新时间,原本是 time_updated + ReviewID int `json:"review_id" gorm:"not null;index"` + AlterBy int `json:"alter_by" gorm:"not null"` // 修改人 ID + Title string `json:"title" gorm:"not null"` // 修改前的标题 + Content string `json:"content" gorm:"not null"` // 修改前的内容 } // ReviewVote 评教点赞/点踩详情 type ReviewVote struct { - // 点赞或点踩人的 ID - UserID int `json:"user_id" gorm:"primaryKey"` - - // 评教 ID - ReviewID int `json:"review_id" gorm:"primaryKey"` - - // 1 为点赞,-1 为点踩 - Data int `json:"data"` + UserID int `json:"user_id" gorm:"primaryKey"` // 点赞或点踩人的 ID + ReviewID int `json:"review_id" gorm:"primaryKey"` // 评教 ID + Data int `json:"data"` // 1 为点赞,-1 为点踩 } diff --git a/internal/schema/course.go b/internal/schema/course.go index 66e1adf..08bf7fa 100644 --- a/internal/schema/course.go +++ b/internal/schema/course.go @@ -6,45 +6,22 @@ import ( "github.com/opentreehole/backend/internal/model" ) -type CourseV1Response struct { - // 课程 ID - ID int `json:"id"` - - // 课程名称 - Name string `json:"name"` - - // 课程编号 - Code string `json:"code"` - - // 选课序号。用于区分同一课程编号的不同平行班 - CodeID string `json:"code_id"` - - // 学分 - Credit float64 `json:"credit"` - - // 开课学院 - Department string `json:"department"` - - // 开课校区 - CampusName string `json:"campus_name"` - - // 老师:多个老师用逗号分隔 - Teachers string `json:"teachers"` +/* V1 */ - // 最大选课人数 - MaxStudent int `json:"max_student"` - - // 周学时 - WeekHour int `json:"week_hour"` - - // 学年 - Year int `json:"year"` - - // 学期 - Semester int `json:"semester"` - - // 评教列表 - ReviewList []*ReviewV1Response `json:"review_list,omitempty"` +type CourseV1Response struct { + ID int `json:"id"` + Name string `json:"name"` // 名称 + Code string `json:"code"` // 编号 + CodeID string `json:"code_id"` // 选课序号。用于区分同一课程编号的不同平行班 + Credit float64 `json:"credit"` // 学分 + Department string `json:"department"` // 开课学院 + CampusName string `json:"campus_name"` // 开课校区 + Teachers string `json:"teachers"` // 老师:多个老师用逗号分隔 + MaxStudent int `json:"max_student"` // 最大选课人数 + WeekHour int `json:"week_hour"` // 周学时 + Year int `json:"year"` // 学年 + Semester int `json:"semester"` // 学期 + ReviewList []*ReviewV1Response `json:"review_list,omitempty"` // 评教列表 } func (r *CourseV1Response) FromModel( @@ -100,3 +77,21 @@ func (r *CreateCourseV1Request) ToCourseGroupModel() *model.CourseGroup { } return &courseGroup } + +/* V3 */ + +type CourseV3Response struct { + ID int `json:"id"` + Name string `json:"name"` // 名称 + Code string `json:"code"` // 编号 + CodeID string `json:"code_id"` // 选课序号。用于区分同一课程编号的不同平行班 + Credit float64 `json:"credit"` // 学分 + Department string `json:"department"` // 开课学院 + CampusName string `json:"campus_name"` // 开课校区 + Teachers string `json:"teachers"` // 老师:多个老师用逗号分隔 + MaxStudent int `json:"max_student"` // 最大选课人数 + WeekHour int `json:"week_hour"` // 周学时 + Year int `json:"year"` // 学年 + Semester int `json:"semester"` // 学期 + ReviewList []*ReviewV1Response `json:"review_list,omitempty"` // 评教列表 +} diff --git a/internal/schema/review.go b/internal/schema/review.go index 747e45c..8162a10 100644 --- a/internal/schema/review.go +++ b/internal/schema/review.go @@ -10,17 +10,10 @@ import ( // ReviewRankV1 旧版本评分 type ReviewRankV1 struct { - // 总体方面 - Overall int `json:"overall" validate:"min=1,max=5"` - - // 内容、风格方面 - Content int `json:"content" validate:"min=1,max=5"` - - // 工作量方面 - Workload int `json:"workload" validate:"min=1,max=5"` - - // 考核方面 - Assessment int `json:"assessment" validate:"min=1,max=5"` + Overall int `json:"overall" validate:"min=1,max=5"` // 总体方面 + Content int `json:"content" validate:"min=1,max=5"` // 内容、风格方面 + Workload int `json:"workload" validate:"min=1,max=5"` // 工作量方面 + Assessment int `json:"assessment" validate:"min=1,max=5"` // 考核方面 } func (r *ReviewRankV1) FromModel(rank *model.ReviewRank) *ReviewRankV1 { @@ -42,14 +35,9 @@ func (r *ReviewRankV1) ToModel() (rank *model.ReviewRank) { // AchievementV1Response 旧版本成就响应 type AchievementV1Response struct { - // 成就名称 - Name string `json:"name"` - - // 成就域 - Domain string `json:"domain"` - - // 获取日期 - ObtainDate time.Time `json:"obtain_date"` + Name string `json:"name"` // 成就名称 + Domain string `json:"domain"` // 成就域 + ObtainDate time.Time `json:"obtain_date"` // 获取日期 } func (r *AchievementV1Response) FromModel( @@ -75,41 +63,18 @@ type UserExtraV1 struct { // ReviewV1Response 旧版本评教响应 type ReviewV1Response struct { - // 评教 ID - ID int `json:"id"` - - // 创建时间 - TimeCreated time.Time `json:"time_created" copier:"CreatedAt"` - - // 更新时间 - TimeUpdated time.Time `json:"time_updated" copier:"UpdatedAt"` - - // 评教标题 - Title string `json:"title"` - - // 评教内容 - Content string `json:"content"` - - // 评教者 ID - ReviewerID int `json:"reviewer_id"` - - // 评价 - Rank *ReviewRankV1 `json:"rank"` - - // 自己是否点赞或点踩,0 未操作,1 点赞,-1 点踩 - Vote int `json:"vote"` - - // Remark = 点赞数 - 点踩数 - Remark int `json:"remark"` - - // 是否是自己的评教 - IsMe bool `json:"is_me"` - - // 修改历史,slices 必须非空 - History []*ReviewHistoryV1Response `json:"history"` - - // 额外信息 - Extra UserExtraV1 `json:"extra"` + ID int `json:"id"` + TimeCreated time.Time `json:"time_created" copier:"CreatedAt"` // 创建时间 + TimeUpdated time.Time `json:"time_updated" copier:"UpdatedAt"` // 更新时间 + Title string `json:"title"` // 评教标题 + Content string `json:"content"` // 评教内容 + ReviewerID int `json:"reviewer_id"` // 评教者 ID + Rank *ReviewRankV1 `json:"rank"` // 评价 + Vote int `json:"vote"` // 自己是否点赞或点踩,0 未操作,1 点赞,-1 点踩 + Remark int `json:"remark"` // Remark = 点赞数 - 点踩数 + IsMe bool `json:"is_me"` // 是否是自己的评教 + History []*ReviewHistoryV1Response `json:"history"` // 修改历史,slices 必须非空 + Extra UserExtraV1 `json:"extra"` // 额外信息 } func (r *ReviewV1Response) FromModel( @@ -148,38 +113,20 @@ func (r *ReviewV1Response) FromModel( } type ReviewHistoryV1 struct { - // 旧标题 - Title string `json:"title"` - - // 旧内容 - Content string `json:"content"` - - // 创建时间 - TimeCreated time.Time `json:"time_created"` - - // 更新时间 - TimeUpdated time.Time `json:"time_updated"` - - // 评教者 - ReviewerID int `json:"reviewer_id"` - - // 评价 - Rank *ReviewRankV1 `json:"rank"` - - // Remark = 点赞数 - 点踩数 - Remark int `json:"remark"` + Title string `json:"title"` // 旧标题 + Content string `json:"content"` // 旧内容 + TimeCreated time.Time `json:"time_created"` // 创建时间 + TimeUpdated time.Time `json:"time_updated"` // 更新时间 + ReviewerID int `json:"reviewer_id"` // 评教者 + Rank *ReviewRankV1 `json:"rank"` // 评价 + Remark int `json:"remark"` // Remark = 点赞数 - 点踩数 } // ReviewHistoryV1Response 旧版本评教修改历史响应 type ReviewHistoryV1Response struct { - // 创建时间 - Time time.Time `json:"time"` - - // 修改者 - AlterBy int `json:"alter_by"` - - // 修改前的评教 - Original *ReviewHistoryV1 `json:"original"` + Time time.Time `json:"time"` // 创建时间 + AlterBy int `json:"alter_by"` // 修改者 + Original *ReviewHistoryV1 `json:"original"` // 修改前的评教 } func (r *ReviewHistoryV1Response) FromModel( @@ -227,44 +174,19 @@ type VoteForReviewV1Request struct { } type MyReviewV1Response struct { - // 评教 ID - ID int `json:"id"` - - // 评教标题 - Title string `json:"title"` - - // 评教内容 - Content string `json:"content"` - - // 修改历史,slices 必须非空 - History []*ReviewHistoryV1Response `json:"history"` - - // 创建时间 - TimeCreated time.Time `json:"time_created" copier:"CreatedAt"` - - // 更新时间 - TimeUpdated time.Time `json:"time_updated" copier:"UpdatedAt"` - - // 评教者 ID - ReviewerID int `json:"reviewer_id"` - - // 评价 - Rank *ReviewRankV1 `json:"rank"` - - // 自己是否点赞或点踩,0 未操作,1 点赞,-1 点踩 - Vote int `json:"vote"` - - // Remark = 点赞数 - 点踩数 - Remark int `json:"remark"` - - // 额外信息 - Extra UserExtraV1 `json:"extra"` - - // 课程信息 - Course *CourseV1Response `json:"course,omitempty"` - - // 课程组信息 - GroupID int `json:"group_id,omitempty"` + ID int `json:"id"` + Title string `json:"title"` // 评教标题 + Content string `json:"content"` // 评教内容 + History []*ReviewHistoryV1Response `json:"history"` // 修改历史,slices 必须非空 + TimeCreated time.Time `json:"time_created" copier:"CreatedAt"` // 创建时间 + TimeUpdated time.Time `json:"time_updated" copier:"UpdatedAt"` // 更新时间 + ReviewerID int `json:"reviewer_id"` // 评教者 ID + Rank *ReviewRankV1 `json:"rank"` // 评价 + Vote int `json:"vote"` // 自己是否点赞或点踩,0 未操作,1 点赞,-1 点踩 + Remark int `json:"remark"` // Remark = 点赞数 - 点踩数 + Extra UserExtraV1 `json:"extra"` // 额外信息 + Course *CourseV1Response `json:"course,omitempty"` // 课程信息 + GroupID int `json:"group_id,omitempty"` // 课程组 ID } func (r *MyReviewV1Response) FromModel( @@ -303,3 +225,23 @@ func (r *MyReviewV1Response) FromModel( } type RandomReviewV1Response = MyReviewV1Response + +/* V3 */ + +type ReviewRankV3 = ReviewRankV1 + +type AchievementV3Response = AchievementV1Response + +type UserExtraV3 = UserExtraV1 + +type ReviewV3Response struct { + ID int `json:"id"` + CreatedAt time.Time `json:"created_at"` // 创建时间 + UpdatedAt time.Time `json:"updated_at"` // 更新时间 + Title string `json:"title"` // 评教标题 + Content string `json:"content"` // 评教内容 + ReviewerID int `json:"reviewer_id"` // 评教者 ID + Rank *ReviewRankV3 `json:"rank"` // 评价 + MyVote int `json:"my_vote"` // 自己是否点赞或点踩,0 未操作,1 点赞,-1 点踩 + VoterCount int `json:"voter_count"` // 点赞数 + 点踩数 +}