Browse Source

11.19修改了结构体的小驼峰和下划线混用问题,数据库表别名abc的问题和部分where用法的优化

lijikun/hotfix-20251118170922-股票知识测评修改代码问题
wangguixi 2 months ago
parent
commit
99f7e92266
  1. 8
      Knowledge_Test_Go/api/v1/questionBank.go
  2. 22
      Knowledge_Test_Go/internal/logic/knowledge/knowledge.go
  3. 66
      Knowledge_Test_Go/internal/logic/questionBank/questionBank.go

8
Knowledge_Test_Go/api/v1/questionBank.go

@ -24,8 +24,8 @@ type SubmitAnswersReq struct {
// AnswerItem 答案项 // AnswerItem 答案项
type AnswerItem struct { type AnswerItem struct {
QuestionId int `json:"questionId" dc:"题目ID"`
UserAnswer string `json:"userAnswer" dc:"用户答案"`
QuestionId int `json:"question_id" dc:"题目ID"`
UserAnswer string `json:"user_answer" dc:"用户答案"`
} }
// SubmitAnswersRes 提交答案响应 // SubmitAnswersRes 提交答案响应
@ -64,8 +64,8 @@ type GetCourseRes struct {
// GetWrongQuestionsRes 错题详情 // GetWrongQuestionsRes 错题详情
type GetWrongQuestionsRes struct { type GetWrongQuestionsRes struct {
GetQuestionsRes `json:"question"` GetQuestionsRes `json:"question"`
UserAnswer string `json:"userAnswer" dc:"用户答案"`
CorrectAnswer string `json:"correctAnswer" dc:"正确答案"`
UserAnswer string `json:"user_answer" dc:"用户答案"`
CorrectAnswer string `json:"correct_answer" dc:"正确答案"`
} }
//------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------

22
Knowledge_Test_Go/internal/logic/knowledge/knowledge.go

@ -21,7 +21,7 @@ func init() {
// GetQuestions 获取题目列表 // GetQuestions 获取题目列表
func (s *sKnowledgeTest) GetQuestions(ctx context.Context, req *v1.GetQuestionsReq) (res []*v1.GetQuestionsRes, total int, err error) { func (s *sKnowledgeTest) GetQuestions(ctx context.Context, req *v1.GetQuestionsReq) (res []*v1.GetQuestionsRes, total int, err error) {
db := g.Model("question_bank a").Where("isdel=0").Fields("a.id", "a.stem", "a.a", "a.b", "a.c", "a.d")
db := g.Model("question_bank qb").Where("isdel=0").Fields("qb.id", "qb.stem", "qb.a", "qb.b", "qb.c", "qb.d")
err = db.Page(req.Page, req.PageSize).ScanAndCount(&res, &total, false) err = db.Page(req.Page, req.PageSize).ScanAndCount(&res, &total, false)
return return
} }
@ -48,13 +48,13 @@ func (s *sKnowledgeTest) GetCourse(ctx context.Context, req *v1.GetCourseReq) (r
var courses []Course var courses []Course
// 查询数据 // 查询数据
err = g.Model("question_record a").
LeftJoin("question_bank b", "a.question_bank_id = b.id").
LeftJoin("course_recommend c", "b.course_recommendation_id = c.id").
Where("a.jwcode = ?", req.Jwcode).
Where("c.cr_name IS NOT NULL").
Where("c.cr_name != ''").
Fields("DISTINCT c.cr_name"). // DISTINCT去重
err = g.Model("question_record qr").
LeftJoin("question_bank qb", "qr.question_bank_id = qb.id").
LeftJoin("course_recommend cr", "qb.course_recommendation_id = cr.id").
Where("qr.jwcode = ?", req.Jwcode).
Where("cr.cr_name IS NOT NULL").
Where("cr.cr_name != ''").
Fields("DISTINCT cr.cr_name"). // DISTINCT去重
Ctx(ctx). Ctx(ctx).
Scan(&courses) Scan(&courses)
@ -225,9 +225,9 @@ func (s *sKnowledgeTest) updateErrorRatesInTransaction(ctx context.Context, tx g
// GetWrongQuestions 获取错题列表 // GetWrongQuestions 获取错题列表
func (s *sKnowledgeTest) GetWrongQuestions(ctx context.Context, req *v1.GetWrongQuestionsReq) (res []*v1.GetWrongQuestionsRes, total int, err error) { func (s *sKnowledgeTest) GetWrongQuestions(ctx context.Context, req *v1.GetWrongQuestionsReq) (res []*v1.GetWrongQuestionsRes, total int, err error) {
err = g.Model("question_record b").
RightJoin("question_bank a", "a.id=b.question_bank_id").
Where("b.jwcode=?", req.Jwcode).Fields("a.id", "a.stem", "a.a", "a.b", "a.c", "a.d", "a.correct_answer", "b.user_answer").
err = g.Model("question_record qr").
RightJoin("question_bank qb", "qb.id=qr.question_bank_id").
Where("qr.jwcode=?", req.Jwcode).Fields("qb.id", "qb.stem", "qb.a", "qb.b", "qb.c", "qb.d", "qb.correct_answer", "qr.user_answer").
Page(req.Page, req.PageSize).ScanAndCount(&res, &total, false) Page(req.Page, req.PageSize).ScanAndCount(&res, &total, false)
return return
} }

66
Knowledge_Test_Go/internal/logic/questionBank/questionBank.go

@ -6,10 +6,11 @@ import (
"Knowledge_Test_Go/utility/response" "Knowledge_Test_Go/utility/response"
"context" "context"
"fmt" "fmt"
"github.com/gogf/gf/v2/util/gconv"
"regexp" "regexp"
"strconv" "strconv"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
@ -36,7 +37,7 @@ func (s *sQuestionBank) GetQuestions(ctx context.Context, req *v1.QuestionOutput
// 添加查询条件 // 添加查询条件
if req.Stem != "" { if req.Stem != "" {
// 对题干进行模糊查询 // 对题干进行模糊查询
db = db.Where("qb.stem LIKE ?", "%"+req.Stem+"%")
db = db.WhereLike("qb.stem", "%"+req.Stem+"%")
} }
if req.QuestionTypeId != "" { if req.QuestionTypeId != "" {
@ -60,20 +61,20 @@ func (s *sQuestionBank) GetQuestions(ctx context.Context, req *v1.QuestionOutput
func (s *sQuestionBank) buildSortCondition(db *gdb.Model, req *v1.QuestionOutputReq) *gdb.Model { func (s *sQuestionBank) buildSortCondition(db *gdb.Model, req *v1.QuestionOutputReq) *gdb.Model {
// 默认排序(按ID倒序) // 默认排序(按ID倒序)
if req.SortField == "" { if req.SortField == "" {
return db.OrderDesc("a.created_at") //! 尽量不要用id进行排序
return db.OrderDesc("qb.created_at") //! 尽量不要用id进行排序
} }
// 根据排序字段构建排序条件 // 根据排序字段构建排序条件
switch req.SortField { switch req.SortField {
case "error_count": case "error_count":
return db.Order("a.error_count " + req.SortOrder)
return db.Order("qb.error_count " + req.SortOrder)
case "error_rate": case "error_rate":
return db.Order("a.error_rate " + req.SortOrder)
return db.Order("qb.error_rate " + req.SortOrder)
case "id": case "id":
return db.Order("a.id " + req.SortOrder)
return db.Order("qb.id " + req.SortOrder)
default: default:
// 默认按ID倒序 // 默认按ID倒序
return db.OrderDesc("a.created_at")
return db.OrderDesc("qb.created_at")
} }
} }
@ -133,17 +134,17 @@ func (s *sQuestionBank) QuestionDel(ctx context.Context, req *v1.QuestionDelReq)
// UserScoreOutput 获取用户成绩列表 // UserScoreOutput 获取用户成绩列表
func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOutputReq) (res []*v1.UserScoreOutputRes, total int, err error) { func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOutputReq) (res []*v1.UserScoreOutputRes, total int, err error) {
db := g.Model("user a"). //! 别名尽量别用a, b, c之类的
RightJoin("total_score b", "a.jwcode = b.jwcode").
Fields("a.id", "a.user_name", "a.user_identity", "a.jwcode", "b.created_at", "b.score")
db := g.Model("user u"). //! 别名尽量别用a, b, c之类的
RightJoin("total_score ts", "u.jwcode = ts.jwcode").
Fields("u.id", "u.user_name", "u.user_identity", "u.jwcode", "ts.created_at", "ts.score")
// 添加查询条件 // 添加查询条件
if req.UserName != "" { if req.UserName != "" {
db = db.Where("a.user_name LIKE ?", "%"+req.UserName+"%")
db = db.WhereLike("u.user_name", "%"+req.UserName+"%")
} }
if req.UserIdentity != "" { if req.UserIdentity != "" {
db = db.Where("a.user_identity = ?", req.UserIdentity)
db = db.Where("u.user_identity = ?", req.UserIdentity)
} }
// 预编译正则:匹配8位数字(^表示开头,$表示结尾,\d{8}表示8位数字) // 预编译正则:匹配8位数字(^表示开头,$表示结尾,\d{8}表示8位数字)
@ -155,30 +156,9 @@ func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOu
return nil, 0, fmt.Errorf("Jwcode必须是8位数字") return nil, 0, fmt.Errorf("Jwcode必须是8位数字")
} }
// 校验通过,添加查询条件 // 校验通过,添加查询条件
db = db.Where("a.jwcode = ?", req.Jwcode)
}
//// 1. 定义时间格式(根据业务实际格式调整)
//const timeLayout = "2006-01-02 15:04:05"
//// 2. 解析开始时间和结束时间(校验格式)
//var startTime, endTime time.Time
//
//if req.StartTime != "" {
// if startTime, err = time.Parse(timeLayout, req.StartTime); err != nil {
// return nil, 0, fmt.Errorf("开始时间格式错误,需为 %s", timeLayout)
// }
//}
//if req.EndTime != "" {
// if endTime, err = time.Parse(timeLayout, req.EndTime); err != nil {
// return nil, 0, fmt.Errorf("结束时间格式错误,需为 %s", timeLayout)
// }
//}
//// 3. 校验结束时间不能早于开始时间(两者都存在时)
//if req.StartTime != "" && req.EndTime != "" {
// if endTime.Before(startTime) { // 用time.Before()判断时间顺序
// return nil, 0, fmt.Errorf("结束时间不能早于开始时间")
// }
//}
db = db.Where("u.jwcode = ?", req.Jwcode)
}
if req.StartTime != "" && req.EndTime != "" { if req.StartTime != "" && req.EndTime != "" {
if req.StartTime > req.EndTime { if req.StartTime > req.EndTime {
return nil, 0, fmt.Errorf("结束时间不能早于开始时间") return nil, 0, fmt.Errorf("结束时间不能早于开始时间")
@ -186,11 +166,11 @@ func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOu
} }
// 4.时间范围查询 // 4.时间范围查询
if req.StartTime != "" && req.EndTime != "" { if req.StartTime != "" && req.EndTime != "" {
db = db.Where("b.created_at BETWEEN ? AND ?", req.StartTime, req.EndTime)
db = db.Where("ts.created_at BETWEEN ? AND ?", req.StartTime, req.EndTime)
} else if req.StartTime != "" { } else if req.StartTime != "" {
db = db.Where("b.created_at >= ?", req.StartTime)
db = db.WhereGTE("ts.created_at", req.StartTime)
} else if req.EndTime != "" { } else if req.EndTime != "" {
db = db.Where("b.created_at <= ?", req.EndTime)
db = db.WhereLTE("ts.created_at ", req.EndTime)
} }
// 添加排序逻辑 // 添加排序逻辑
@ -204,7 +184,7 @@ func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOu
func (s *sQuestionBank) buildUserScoreSortCondition(db *gdb.Model, req *v1.UserScoreOutputReq) *gdb.Model { func (s *sQuestionBank) buildUserScoreSortCondition(db *gdb.Model, req *v1.UserScoreOutputReq) *gdb.Model {
// 默认排序(按创建时间倒序) // 默认排序(按创建时间倒序)
if req.SortField == "" { if req.SortField == "" {
return db.OrderDesc("b.created_at")
return db.OrderDesc("ts.created_at")
} }
// 确定排序方向 // 确定排序方向
@ -216,12 +196,12 @@ func (s *sQuestionBank) buildUserScoreSortCondition(db *gdb.Model, req *v1.UserS
// 根据排序字段构建排序条件 // 根据排序字段构建排序条件
switch req.SortField { switch req.SortField {
case "score": case "score":
return db.Order("b.score " + order)
return db.Order("ts.score " + order)
case "created_at": case "created_at":
return db.Order("b.created_at " + order)
return db.Order("ts.created_at " + order)
default: default:
// 默认按创建时间倒序 // 默认按创建时间倒序
return db.OrderDesc("b.created_at")
return db.OrderDesc("ts.created_at")
} }
} }

Loading…
Cancel
Save