From c209dafac5b08e9d2f54d321289c3716630cddce Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Sun, 29 Sep 2024 11:42:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=88=86=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/share.go | 79 ++++++++++++++++++------------ api/dao/BaseTokenItem.go | 12 +++++ api/dao/QuestionQaItem.go | 46 ++++++++++++++++++ api/dao/QuestionQaToken.go | 9 ++++ api/dto/Question.go | 26 ++++++++++ api/dto/Share.go | 93 +++++++++++++++++++++--------------- api/model/QuestionQaToken.go | 1 + 7 files changed, 196 insertions(+), 70 deletions(-) diff --git a/api/controller/share.go b/api/controller/share.go index 4799782..89eba32 100644 --- a/api/controller/share.go +++ b/api/controller/share.go @@ -8,7 +8,6 @@ import ( "knowledge/api/responses" "knowledge/global" "knowledge/utils" - "sort" "time" ) @@ -32,7 +31,6 @@ func (r *Share) GetShare(c *gin.Context) { // 业务处理 questionQaDao := dao.QuestionQaDao{} questionQaItemDao := dao.QuestionQaItemDao{} - questionDao := dao.QuestionDao{} // 获取题库数据 maps := make(map[string]interface{}) @@ -70,27 +68,18 @@ func (r *Share) GetShare(c *gin.Context) { maps = make(map[string]interface{}) maps["qa_id"] = questionQa.QaId maps["is_must_select"] = 1 - questionQaItems, err := questionQaItemDao.GetQuestionQaItemList(maps) + questionQaItems, err := questionQaItemDao.GetQuestionQaItemrPreloadList(maps) if err == nil && len(questionQaItems) > 0 { - shareQuestionDtos := make([]*dto.ShareQuestionDto, len(questionQaItems)) - for i, item := range questionQaItems { - // 获取题目数据 - question, err := questionDao.GetQuestionById(item.QuestionId) - if err != nil { - responses.FailWithMessage("题目错误", c) - return - } + // 处理返回值 + questionDto := dto.GetShareQuestionDto(item.Question) - shareQuestionDto := dto.GetShareQuestionDto(question) - - shareQuestionDto.IsMustSelect = item.IsMustSelect + // 加载选项 + questionDto.LoadQuestionOption(item.Question.QuestionOption) // 将转换后的结构体添加到新切片中 - shareQuestionDtos[i] = shareQuestionDto + g.Question[i] = questionDto } - - g.Question = shareQuestionDtos } // 题目数据-剩余随机数量 @@ -100,30 +89,58 @@ func (r *Share) GetShare(c *gin.Context) { maps = make(map[string]interface{}) maps["qa_id"] = questionQa.QaId maps["is_must_select"] = 0 - questionQaItems, err = questionQaItemDao.GetQuestionQaItemListRand(maps, remainingQuantity) + questionQaItems, err = questionQaItemDao.GetQuestionQaItemWhereListRand(maps, remainingQuantity) if err == nil && len(questionQaItems) > 0 { for _, item := range questionQaItems { - // 获取题目数据 - question, err := questionDao.GetQuestionById(item.QuestionId) - if err != nil { - responses.FailWithMessage("题目错误", c) - return - } + // 处理返回值 + questionDto := dto.GetShareQuestionDto(item.Question) - shareQuestionDto := dto.GetShareQuestionDto(question) - - shareQuestionDto.IsMustSelect = item.IsMustSelect + // 加载选项 + questionDto.LoadQuestionOption(item.Question.QuestionOption) // 将转换后的结构体添加到新切片中 - g.Question = append(g.Question, shareQuestionDto) + g.Question = append(g.Question, questionDto) } } } // 按照难度重新排序题目顺序 - sort.SliceStable(g.Question, func(i, j int) bool { - return g.Question[i].Difficulty < g.Question[j].Difficulty - }) + //sort.SliceStable(g.Question, func(i, j int) bool { + // return g.Question[i].Difficulty < g.Question[j].Difficulty + //}) + + // 加载飞花令 + if questionQa.QaDisplayType == 2 { + questionQaTokenDao := dao.QuestionQaTokenDao{} + maps = make(map[string]interface{}) + maps["qa_id"] = questionQa.QaId + questionQaToken, err := questionQaTokenDao.GetQuestionQaTokenList(maps) + if err != nil { + responses.FailWithMessage("内部错误", c) + return + } + + baseTokenItemDao := dao.BaseTokenItemDao{} + for _, v := range questionQaToken { + // 加载详细飞花令 + baseTokenItem, err := baseTokenItemDao.GetBaseTokenItemPreloadOrderByTokenId(v.TokenId) + if err != nil { + responses.FailWithMessage("内部错误", c) + return + } + + // 处理返回值 + for _, item := range baseTokenItem { + if len(g.BaseTokenItem) < questionQa.QaQuantity { + // 处理返回值 + baseTokenItemDto := dto.GetBaseTokenItemDto(item) + + // 将转换后的结构体添加到新切片中 + g.BaseTokenItem = append(g.BaseTokenItem, baseTokenItemDto) + } + } + } + } responses.OkWithData(g, c) } diff --git a/api/dao/BaseTokenItem.go b/api/dao/BaseTokenItem.go index d05782b..9d8f65d 100644 --- a/api/dao/BaseTokenItem.go +++ b/api/dao/BaseTokenItem.go @@ -29,6 +29,18 @@ func (r *BaseTokenItemDao) GetBaseTokenItemPreloadById(ItemId int64) (m *model.B return m, nil } +// GetBaseTokenItemPreloadOrderByTokenId 获取数据-加载全部关联-排序-TokenId +func (r *BaseTokenItemDao) GetBaseTokenItemPreloadOrderByTokenId(tokenId int64) (m []*model.BaseTokenItem, err error) { + err = global.Db.Where("token_id = ?", tokenId). + Order("item_sort desc"). + Order("created_at desc"). + Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // DeleteBaseTokenItem 删除 func (r *BaseTokenItemDao) DeleteBaseTokenItem(tx *gorm.DB, maps interface{}) error { err := tx.Where(maps).Delete(&model.BaseTokenItem{}).Error diff --git a/api/dao/QuestionQaItem.go b/api/dao/QuestionQaItem.go index 12aea3f..cc84daa 100644 --- a/api/dao/QuestionQaItem.go +++ b/api/dao/QuestionQaItem.go @@ -3,6 +3,7 @@ package dao import ( "errors" "gorm.io/gorm" + "gorm.io/gorm/clause" "knowledge/api/model" "knowledge/api/requests" "knowledge/global" @@ -81,6 +82,15 @@ func (r *QuestionQaItemDao) GetQuestionQaItemList(maps interface{}) (m []*model. return m, nil } +// GetQuestionQaItemrPreloadList 获取列表-加载全部关联 +func (r *QuestionQaItemDao) GetQuestionQaItemrPreloadList(maps interface{}) (m []*model.QuestionQaItem, err error) { + err = global.Db.Preload(clause.Associations).Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // GetQuestionQaItemListRand 获取列表-随机 func (r *QuestionQaItemDao) GetQuestionQaItemListRand(maps interface{}, limit int) (m []*model.QuestionQaItem, err error) { err = global.Db.Where(maps).Limit(limit).Order("rand()").Find(&m).Error @@ -221,3 +231,39 @@ func (r *QuestionQaItemDao) GetQuestionQaItemPageSearch(req requests.GetQuestion } return m, totalRecords, nil } + +// GetQuestionQaItemWhereListRand 获取列表-随机 +func (r *QuestionQaItemDao) GetQuestionQaItemWhereListRand(maps interface{}, limit int) (m []*model.QuestionQaItem, err error) { + query := global.Db.Model(&model.QuestionQaItem{}) + query = query.Where(maps) + + query = query.Preload("Question") + + // 选项 + query = query.Preload("Question.QuestionOption") + + subQuery := global.Db.Model(&model.Question{}). + Select("question_id"). + Where("question_status = ?", 1). + Where("is_delete = ?", 0) + + query = query.Where(gorm.Expr("question_id IN (?)", subQuery)) + + query = query.Limit(limit).Order("rand()") + + err = query.Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +//subQuery := global.Db.Model(&model.Question{}). +//Where("kb_question.question_id = kb_question_qa_item.question_id"). +//Where("question_status = ?", 1). +//Where("is_delete = ?", 0). +//Select("1") +// +//query = query.Where("EXISTS (?)", subQuery) +// +//query = query.Limit(limit).Order("rand()") diff --git a/api/dao/QuestionQaToken.go b/api/dao/QuestionQaToken.go index 121ecda..47870e9 100644 --- a/api/dao/QuestionQaToken.go +++ b/api/dao/QuestionQaToken.go @@ -72,6 +72,15 @@ func (r *QuestionQaTokenDao) GetQuestionQaTokenList(maps interface{}) (m []*mode return m, nil } +// GetQuestionQaTokenPreloadList 获取列表-加载全部关联 +func (r *QuestionQaTokenDao) GetQuestionQaTokenPreloadList(maps interface{}) (m []*model.QuestionQaToken, err error) { + err = global.Db.Preload(clause.Associations).Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // GetQuestionQaTokenCount 获取数量 func (r *QuestionQaTokenDao) GetQuestionQaTokenCount(maps interface{}) (total int64, err error) { err = global.Db.Model(&model.QuestionQaToken{}).Where(maps).Count(&total).Error diff --git a/api/dto/Question.go b/api/dto/Question.go index 7f9493d..2ae36b3 100644 --- a/api/dto/Question.go +++ b/api/dto/Question.go @@ -112,6 +112,32 @@ func GetQuestionListDto(m []*model.Question) []*QuestionDto { return responses } +// GetShareQuestionDto 题目详情-分享 +func GetShareQuestionDto(m *model.Question) *QuestionDto { + var questionImage []string + if m.QuestionImage != "" { + result := strings.Split(m.QuestionImage, ",") + if len(result) > 0 { + for _, v := range result { + v = utils.AddOssDomain(v) + questionImage = append(questionImage, v) + } + } + } + + return &QuestionDto{ + QuestionId: fmt.Sprintf("%d", m.QuestionId), + QuestionName: m.QuestionName, + QuestionType: m.QuestionType, + QuestionSource: m.QuestionSource, + QuestionImage: questionImage, + QuestionAnalysis: m.QuestionAnalysis, + Difficulty: m.Difficulty, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + // LoadFirstLabel 加载一级标签 func (r *QuestionDto) LoadFirstLabel(m *model.Label) *QuestionDto { if m != nil { diff --git a/api/dto/Share.go b/api/dto/Share.go index a776b57..34096da 100644 --- a/api/dto/Share.go +++ b/api/dto/Share.go @@ -2,50 +2,49 @@ package dto import ( "knowledge/api/model" - "knowledge/utils" - "strings" ) type ShareDto struct { - QuestionQa *QuestionQaDto `json:"question_qa"` // 题库数据 - Question []*ShareQuestionDto `json:"question"` // 题目数据 + QuestionQa *QuestionQaDto `json:"question_qa"` // 题库数据 + Question []*QuestionDto `json:"question"` // 题库关联题目列表 + BaseTokenItem []*BaseTokenItemDto `json:"base_token_item"` // 题库关联飞花令-列表 } -// ShareQuestionDto 题目数据 -type ShareQuestionDto struct { - QuestionName string `json:"question_name"` // 题目名称 - QuestionType int `json:"question_type"` // 题目类型(1:单选 2:多选 3:问答 4:判断) - QuestionSource int `json:"question_source"` // 题目来源(1:本题库 2:外部数据) - QuestionImage []string `json:"question_image"` // 题目图片 - QuestionAnswer string `json:"question_answer"` // 答案 - QuestionAnalysis string `json:"question_analysis"` // 解析 - Difficulty int `json:"difficulty"` // 难度(0:未知 1:低 2:中 3:高) - IsMustSelect int `json:"is_must_select"` // 是否必被选中 -} - -// GetShareQuestionDto 分享题目详情 -func GetShareQuestionDto(m *model.Question) *ShareQuestionDto { - var questionImage []string - if m.QuestionImage != "" { - result := strings.Split(m.QuestionImage, ",") - if len(result) > 0 { - for _, v := range result { - v = utils.AddOssDomain(v) - questionImage = append(questionImage, v) - } - } - } - - return &ShareQuestionDto{ - QuestionName: m.QuestionName, - QuestionType: m.QuestionType, - QuestionSource: m.QuestionSource, - QuestionImage: questionImage, - QuestionAnswer: m.QuestionAnswer, - QuestionAnalysis: m.QuestionAnalysis, - Difficulty: m.Difficulty, - } -} +//// ShareQuestionDto 题目数据 +//type ShareQuestionDto struct { +// QuestionName string `json:"question_name"` // 题目名称 +// QuestionType int `json:"question_type"` // 题目类型(1:单选 2:多选 3:问答 4:判断) +// QuestionSource int `json:"question_source"` // 题目来源(1:本题库 2:外部数据) +// QuestionImage []string `json:"question_image"` // 题目图片 +// QuestionAnswer string `json:"question_answer"` // 答案 +// QuestionAnalysis string `json:"question_analysis"` // 解析 +// Difficulty int `json:"difficulty"` // 难度(0:未知 1:低 2:中 3:高) +// IsMustSelect int `json:"is_must_select"` // 是否必被选中 +//} +// +//// GetShareQuestionDto 分享题目详情 +//func GetShareQuestionDto(m *model.Question) *ShareQuestionDto { +// var questionImage []string +// if m.QuestionImage != "" { +// result := strings.Split(m.QuestionImage, ",") +// if len(result) > 0 { +// for _, v := range result { +// v = utils.AddOssDomain(v) +// questionImage = append(questionImage, v) +// } +// } +// } +// +// return &ShareQuestionDto{ +// QuestionName: m.QuestionName, +// QuestionType: m.QuestionType, +// QuestionSource: m.QuestionSource, +// QuestionImage: questionImage, +// QuestionAnswer: m.QuestionAnswer, +// QuestionAnalysis: m.QuestionAnalysis, +// Difficulty: m.Difficulty, +// } +//} // LoadQuestionQa 加载题库数据 func (r *ShareDto) LoadQuestionQa(m *model.QuestionQa) *ShareDto { @@ -54,3 +53,19 @@ func (r *ShareDto) LoadQuestionQa(m *model.QuestionQa) *ShareDto { } return r } + +// LoadQuestion 加载题库关联题目列表 +func (r *ShareDto) LoadQuestion(m []*model.Question) *ShareDto { + if len(m) > 0 { + r.Question = GetQuestionListDto(m) + } + return r +} + +// LoadBaseTokenItem 加载题库关联飞花令-列表 +func (r *ShareDto) LoadBaseTokenItem(m []*model.BaseTokenItem) *ShareDto { + if len(m) > 0 { + r.BaseTokenItem = GetBaseTokenItemListDto(m) + } + return r +} diff --git a/api/model/QuestionQaToken.go b/api/model/QuestionQaToken.go index 600f022..61c58f9 100644 --- a/api/model/QuestionQaToken.go +++ b/api/model/QuestionQaToken.go @@ -12,6 +12,7 @@ type QuestionQaToken struct { TokenId int64 `gorm:"column:token_id;type:bigint(19);comment:飞花令id" json:"token_id"` Sort int `gorm:"column:sort;type:tinyint(1);comment:排序(越大越靠前)" json:"sort"` Model + BaseTokenItem []*BaseTokenItem `gorm:"foreignKey:TokenId;references:token_id" json:"base_token_item"` } func (m *QuestionQaToken) TableName() string {