This commit is contained in:
2024-09-27 10:44:43 +08:00
parent 0ee193348a
commit 65f3511ecb
25 changed files with 1368 additions and 209 deletions
+231
View File
@@ -0,0 +1,231 @@
package controller
import (
"github.com/gin-gonic/gin"
"knowledge/api/dao"
"knowledge/api/dto"
"knowledge/api/model"
"knowledge/api/requests"
"knowledge/api/responses"
"knowledge/global"
"knowledge/utils"
"strconv"
)
type BaseToken struct{}
// GetTokenPage 获取列表-分页
func (r *BaseToken) GetTokenPage(c *gin.Context) {
baseTokenRequest := requests.BaseTokenRequest{}
req := baseTokenRequest.GetTokenPage
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
if req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
baseTokenDao := dao.BaseTokenDao{}
baseToken, total, err := baseTokenDao.GetBaseTokenPageSearch(req, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
GetQuestionPageResponses := dto.GetBaseTokenListDto(baseToken)
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = GetQuestionPageResponses
responses.OkWithData(result, c)
}
// GetTokenList 获取列表
func (r *BaseToken) GetTokenList(c *gin.Context) {
baseTokenRequest := requests.BaseTokenRequest{}
req := baseTokenRequest.GetTokenList
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
baseTokenDao := dao.BaseTokenDao{}
baseToken, err := baseTokenDao.GetBaseTokenListSearch(req)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetBaseTokenListDto(baseToken)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
responses.OkWithData(g, c)
}
// AddBaseToken 新增
func (r *BaseToken) AddBaseToken(c *gin.Context) {
baseTokenRequest := requests.BaseTokenRequest{}
req := baseTokenRequest.AddBaseToken
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 新增飞花令
baseTokenDao := dao.BaseTokenDao{}
baseToken := &model.BaseToken{
TokenName: req.TokenName,
}
baseToken, err := baseTokenDao.AddBaseToken(tx, baseToken)
if err != nil {
tx.Rollback()
responses.FailWithMessage("新增失败", c)
return
}
// 新增飞花令明细
baseTokenItemDao := dao.BaseTokenItemDao{}
for _, item := range req.BaseTokenItem {
baseTokenItem := &model.BaseTokenItem{
TokenId: baseToken.TokenId,
ItemName: item.ItemName,
ItemImage: utils.RemoveOssDomain(item.ItemImage),
ItemSort: item.ItemSort,
}
baseTokenItem, err := baseTokenItemDao.AddBaseTokenItem(tx, baseTokenItem)
if err != nil {
tx.Rollback()
responses.FailWithMessage("新增失败", c)
return
}
}
tx.Commit()
responses.Ok(c)
}
// PutBaseToken 修改
func (r *BaseToken) PutBaseToken(c *gin.Context) {
baseTokenRequest := requests.BaseTokenRequest{}
req := baseTokenRequest.PutBaseToken
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
id := c.Param("token_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
tokenId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取详情
baseTokenDao := dao.BaseTokenDao{}
baseToken, err := baseTokenDao.GetBaseTokenById(tokenId)
if err != nil {
responses.FailWithMessage("数据不存在", c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
baseTokenData := make(map[string]interface{})
if req.TokenName != baseToken.TokenName {
baseTokenData["token_name"] = req.TokenName
}
if len(baseTokenData) > 0 {
err := baseTokenDao.EditBaseTokenById(tx, tokenId, baseTokenData)
if err != nil {
tx.Rollback()
responses.FailWithMessage("修改失败", c)
return
}
}
// 删除明细
baseTokenItemDao := dao.BaseTokenItemDao{}
err = baseTokenItemDao.DeleteBaseTokenItemByTokenId(tx, baseToken.TokenId)
if err != nil {
tx.Rollback()
responses.FailWithMessage("修改失败", c)
return
}
// 新增飞花令明细
for _, item := range req.BaseTokenItem {
baseTokenItem := &model.BaseTokenItem{
TokenId: baseToken.TokenId,
ItemName: item.ItemName,
ItemImage: utils.RemoveOssDomain(item.ItemImage),
ItemSort: item.ItemSort,
}
baseTokenItem, err := baseTokenItemDao.AddBaseTokenItem(tx, baseTokenItem)
if err != nil {
tx.Rollback()
responses.FailWithMessage("修改失败", c)
return
}
}
tx.Commit()
responses.Ok(c)
}
+86
View File
@@ -0,0 +1,86 @@
package controller
import (
"github.com/gin-gonic/gin"
"knowledge/api/dao"
"knowledge/api/dto"
"knowledge/api/requests"
"knowledge/api/responses"
"knowledge/global"
"knowledge/utils"
)
type BaseTokenItem struct{}
// GetBaseTokenItemPage 获取列表-分页
func (r *BaseTokenItem) GetBaseTokenItemPage(c *gin.Context) {
baseTokenItemRequest := requests.BaseTokenItemRequest{}
req := baseTokenItemRequest.GetBaseTokenItemPage
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
if req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
baseTokenItemDao := dao.BaseTokenItemDao{}
baseTokenItem, total, err := baseTokenItemDao.GetBaseTokenItemPageSearch(req, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetBaseTokenItemListDto(baseTokenItem)
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetBaseTokenItemList 获取列表
func (r *BaseTokenItem) GetBaseTokenItemList(c *gin.Context) {
baseTokenItemRequest := requests.BaseTokenItemRequest{}
req := baseTokenItemRequest.GetBaseTokenItemList
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
baseTokenItemDao := dao.BaseTokenItemDao{}
baseTokenItem, err := baseTokenItemDao.GetBaseTokenItemListSearch(req)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetBaseTokenItemListDto(baseTokenItem)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
responses.OkWithData(g, c)
}
+2
View File
@@ -11,4 +11,6 @@ type Api struct {
Label // 标签
Static // 统计
Share // 分享
BaseToken // 基础数据-飞花令
BaseTokenItem // 基础数据-飞花令-明细
}
+35 -7
View File
@@ -75,13 +75,22 @@ func (r *QuestionQa) AddQuestionQa(c *gin.Context) {
}
// 参数验证
for _, item := range req.Item {
for _, item := range req.BaseTokenItem {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
if req.BaseTokenItem != nil && req.QaDisplayType == 2 {
for _, item := range req.BaseTokenItem {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
}
// 业务处理
questionQaService := service.QuestionQaService{}
_, err := questionQaService.AddQuestionQa(req)
@@ -109,13 +118,22 @@ func (r *QuestionQa) PutQuestionQa(c *gin.Context) {
}
// 参数验证
for _, item := range req.Item {
for _, item := range req.QuestionQaItem {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
if req.BaseTokenItem != nil && req.QaDisplayType == 2 {
for _, item := range req.BaseTokenItem {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
}
id := c.Param("qa_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
@@ -272,13 +290,23 @@ func (r *QuestionQa) GetQuestionQa(c *gin.Context) {
return
}
// 业务处理
questionQaService := service.QuestionQaService{}
getQuestionQaResponses, err := questionQaService.GetQuestionQa(qaId)
questionQaDao := dao.QuestionQaDao{}
questionQa, err := questionQaDao.GetQuestionQaById(qaId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
responses.FailWithMessage("题库不存在", c)
return
}
responses.OkWithData(getQuestionQaResponses, c)
if questionQa.QaStatus == 2 {
responses.FailWithMessage("题库已失效", c)
return
}
// 处理返回值
g := dto.GetQuestionQaDto(questionQa)
// 加载明细选题规则
g = g.LoadItemContent(questionQa.ItemContent)
responses.OkWithData(g, c)
}
+97 -6
View File
@@ -2,11 +2,14 @@ package controller
import (
"github.com/gin-gonic/gin"
"knowledge/api/dao"
"knowledge/api/dto"
"knowledge/api/requests"
"knowledge/api/responses"
"knowledge/api/service"
"knowledge/global"
"knowledge/utils"
"sort"
"time"
)
type Share struct{}
@@ -27,12 +30,100 @@ func (r *Share) GetShare(c *gin.Context) {
}
// 业务处理
shareService := service.ShareService{}
getShareResponses, err := shareService.GetShare(req)
if err != nil {
responses.FailWithMessage(err.Error(), c)
questionQaDao := dao.QuestionQaDao{}
questionQaItemDao := dao.QuestionQaItemDao{}
questionDao := dao.QuestionDao{}
// 获取题库数据
maps := make(map[string]interface{})
maps["qa_share_id"] = req.QaShareId
questionQa, err := questionQaDao.GetQuestionQa(maps)
if err != nil || questionQa == nil {
responses.FailWithMessage("题库不存在", c)
return
}
responses.OkWithData(getShareResponses, c)
if questionQa.QaStatus == 2 {
responses.FailWithMessage("题库已失效", c)
return
}
if questionQa.QaPassword != req.QaPassword {
responses.FailWithMessage("密码错误", c)
return
}
// 检测过期时间
now := time.Now()
qaExpireTime := time.Time(questionQa.QaExpireTime)
if qaExpireTime.Before(now) {
responses.FailWithMessage("题库已失效", c)
return
}
g := &dto.ShareDto{}
// 加载题库数据
g.QuestionQa = dto.GetQuestionQaDto(questionQa)
// 题目数据-必备选中
maps = make(map[string]interface{})
maps["qa_id"] = questionQa.QaId
maps["is_must_select"] = 1
questionQaItems, err := questionQaItemDao.GetQuestionQaItemList(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
}
shareQuestionDto := dto.GetShareQuestionDto(question)
shareQuestionDto.IsMustSelect = item.IsMustSelect
// 将转换后的结构体添加到新切片中
shareQuestionDtos[i] = shareQuestionDto
}
g.Question = shareQuestionDtos
}
// 题目数据-剩余随机数量
remainingQuantity := questionQa.QaQuantity - len(questionQaItems)
if remainingQuantity > 0 {
// 随机获取剩余题目
maps = make(map[string]interface{})
maps["qa_id"] = questionQa.QaId
maps["is_must_select"] = 0
questionQaItems, err = questionQaItemDao.GetQuestionQaItemListRand(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
}
shareQuestionDto := dto.GetShareQuestionDto(question)
shareQuestionDto.IsMustSelect = item.IsMustSelect
// 将转换后的结构体添加到新切片中
g.Question = append(g.Question, shareQuestionDto)
}
}
}
// 按照难度重新排序题目顺序
sort.SliceStable(g.Question, func(i, j int) bool {
return g.Question[i].Difficulty < g.Question[j].Difficulty
})
responses.OkWithData(g, c)
}