处理分享2

This commit is contained in:
wucongxing8150 2024-09-29 16:55:00 +08:00
parent 6431aa890b
commit c7daf18830
12 changed files with 302 additions and 96 deletions

View File

@ -1,22 +1,69 @@
package controller package controller
import ( import (
"fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"knowledge/api/dao" "knowledge/api/dao"
"knowledge/api/dto" "knowledge/api/dto"
"knowledge/api/model"
"knowledge/api/requests" "knowledge/api/requests"
"knowledge/api/responses" "knowledge/api/responses"
"knowledge/consts"
"knowledge/global" "knowledge/global"
"knowledge/utils" "knowledge/utils"
"net/http"
"time" "time"
) )
type Share struct{} type Share struct{}
// GetShare 获取分享数据 // GetBackgroundImage 获取背景图
func (r *Share) GetShare(c *gin.Context) { func (r *Share) GetBackgroundImage(c *gin.Context) {
shareRequest := requests.ShareRequest{} shareRequest := requests.ShareRequest{}
req := shareRequest.GetShare req := shareRequest.GetBackgroundImage
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
}
questionQaDao := dao.QuestionQaDao{}
// 获取题库数据
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
}
if questionQa.QaStatus == 2 {
responses.FailWithMessage("题库已失效", c)
return
}
// 检测过期时间
now := time.Now()
qaExpireTime := time.Time(questionQa.QaExpireTime)
if qaExpireTime.Before(now) {
responses.FailWithMessage("题库已失效", c)
return
}
image := utils.AddOssDomain(questionQa.Image)
responses.OkWithData(image, c)
}
// ShareAuth 授权
func (r *Share) ShareAuth(c *gin.Context) {
shareRequest := requests.ShareRequest{}
req := shareRequest.ShareAuth
if err := c.ShouldBind(&req); err != nil { if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c) responses.FailWithMessage(err.Error(), c)
return return
@ -28,9 +75,7 @@ func (r *Share) GetShare(c *gin.Context) {
return return
} }
// 业务处理
questionQaDao := dao.QuestionQaDao{} questionQaDao := dao.QuestionQaDao{}
questionQaItemDao := dao.QuestionQaItemDao{}
// 获取题库数据 // 获取题库数据
maps := make(map[string]interface{}) maps := make(map[string]interface{})
@ -59,47 +104,120 @@ func (r *Share) GetShare(c *gin.Context) {
return return
} }
//g := dto.ShareDto{} token := &utils.Token{
Client: 1,
QaId: fmt.Sprintf("%d", questionQa.QaId),
}
// 生成jwt
ttl := 5 * time.Hour
jwt, err := token.NewJWT(ttl)
if err != nil {
responses.FailWithMessage("题库错误", c)
return
}
// 处理返回值
g := dto.ShareAuthDto{}
g.Token = jwt
responses.OkWithData(g, c)
}
// GetQuestionQa 获取知识问答数据
func (r *Share) GetQuestionQa(c *gin.Context) {
// 获取知识问答id
qaId := c.GetInt64("QaId")
if qaId == 0 {
c.JSON(http.StatusUnauthorized, gin.H{
"message": "请输入密码后查看",
"code": consts.TokenError,
"data": "",
})
return
}
questionQaDao := dao.QuestionQaDao{}
// 获取题库数据
questionQa, err := questionQaDao.GetQuestionQaById(qaId)
if err != nil || questionQa == nil {
responses.FailWithMessage("题库不存在", c)
return
}
if questionQa.QaStatus == 2 {
responses.FailWithMessage("题库已失效", c)
return
}
// 检测过期时间
now := time.Now()
qaExpireTime := time.Time(questionQa.QaExpireTime)
if qaExpireTime.Before(now) {
responses.FailWithMessage("题库已失效", c)
return
}
g := dto.GetQuestionQaDto(questionQa)
responses.OkWithData(g, c)
}
// GetQuestion 获取题目数据
func (r *Share) GetQuestion(c *gin.Context) {
// 获取知识问答id
qaId := c.GetInt64("QaId")
if qaId == 0 {
c.JSON(http.StatusUnauthorized, gin.H{
"message": "请输入密码后查看",
"code": consts.TokenError,
"data": "",
})
c.Abort()
return
}
questionQaDao := dao.QuestionQaDao{}
questionQaItemDao := dao.QuestionQaItemDao{}
// 获取题库数据
questionQa, err := questionQaDao.GetQuestionQaById(qaId)
if err != nil || questionQa == nil {
responses.FailWithMessage("题库不存在", c)
return
}
if questionQa.QaStatus == 2 {
responses.FailWithMessage("题库已失效", c)
return
}
// 检测过期时间
now := time.Now()
qaExpireTime := time.Time(questionQa.QaExpireTime)
if qaExpireTime.Before(now) {
responses.FailWithMessage("题库已失效", c)
return
}
g := dto.ShareDto{ g := dto.ShareDto{
QuestionQa: &dto.QuestionQaDto{},
Question: []*dto.QuestionDto{}, Question: []*dto.QuestionDto{},
BaseTokenItem: []*dto.BaseTokenItemDto{}, BaseTokenItem: []*dto.BaseTokenItemDto{},
} }
// 加载题库数据 // 题目数据
g.QuestionQa = dto.GetQuestionQaDto(questionQa) var questions []*model.QuestionQaItem
// 题目数据-必备选中 // 题目数据-必备选中
maps = make(map[string]interface{}) maps := make(map[string]interface{})
maps["qa_id"] = questionQa.QaId maps["qa_id"] = questionQa.QaId
maps["is_must_select"] = 1 maps["is_must_select"] = 1
questionQaItems, err := questionQaItemDao.GetQuestionQaItemPreloadList(maps) questionQaItems, err := questionQaItemDao.GetQuestionQaItemPreloadList(maps)
if err == nil && len(questionQaItems) > 0 { if err == nil && len(questionQaItems) > 0 {
for _, item := range questionQaItems { for _, item := range questionQaItems {
questionOptionDao := dao.QuestionOptionDao{} questions = append(questions, item)
maps = make(map[string]interface{})
maps["question_id"] = item.QuestionId
questionOption, err := questionOptionDao.GetQuestionOptionList(maps)
if err != nil {
responses.FailWithMessage("内部错误", c)
return
}
// 处理返回值
questionDto := dto.GetShareQuestionDto(item.Question)
// 加载选项
questionDto.LoadQuestionOption(questionOption)
// 加载图片
questionDto.LoadQuestionImage(item.Question.QuestionImage)
// 加载答案
questionDto.LoadQuestionAnswer(item.Question.QuestionAnswer)
// 将转换后的结构体添加到新切片中
g.Question = append(g.Question, questionDto)
} }
} }
@ -113,33 +231,37 @@ func (r *Share) GetShare(c *gin.Context) {
questionQaItems, err = questionQaItemDao.GetQuestionQaItemWhereListRand(maps, remainingQuantity) questionQaItems, err = questionQaItemDao.GetQuestionQaItemWhereListRand(maps, remainingQuantity)
if err == nil && len(questionQaItems) > 0 { if err == nil && len(questionQaItems) > 0 {
for _, item := range questionQaItems { for _, item := range questionQaItems {
questionOptionDao := dao.QuestionOptionDao{} questions = append(questions, item)
maps = make(map[string]interface{})
maps["question_id"] = item.QuestionId
questionOption, err := questionOptionDao.GetQuestionOptionList(maps)
if err != nil {
responses.FailWithMessage("内部错误", c)
return
}
// 处理返回值
questionDto := dto.GetShareQuestionDto(item.Question)
// 加载选项
questionDto.LoadQuestionOption(questionOption)
// 加载图片
questionDto.LoadQuestionImage(item.Question.QuestionImage)
// 加载答案
questionDto.LoadQuestionAnswer(item.Question.QuestionAnswer)
// 将转换后的结构体添加到新切片中
g.Question = append(g.Question, questionDto)
} }
} }
} }
for _, v := range questions {
questionOptionDao := dao.QuestionOptionDao{}
maps = make(map[string]interface{})
maps["question_id"] = v.QuestionId
questionOption, err := questionOptionDao.GetQuestionOptionList(maps)
if err != nil {
responses.FailWithMessage("内部错误", c)
return
}
// 处理返回值
questionDto := dto.GetShareQuestionDto(v.Question)
// 加载选项
questionDto.LoadQuestionOptionSimplify(questionOption)
// 加载图片
questionDto.LoadQuestionImage(v.Question.QuestionImage)
// 加载答案
questionDto.LoadQuestionAnswer(v.Question)
// 将转换后的结构体添加到新切片中
g.Question = append(g.Question, questionDto)
}
// 按照难度重新排序题目顺序 // 按照难度重新排序题目顺序
//sort.SliceStable(g.Question, func(i, j int) bool { //sort.SliceStable(g.Question, func(i, j int) bool {
// return g.Question[i].Difficulty < g.Question[j].Difficulty // return g.Question[i].Difficulty < g.Question[j].Difficulty

View File

@ -89,7 +89,7 @@ func GetQuestionListDto(m []*model.Question) []*QuestionDto {
// 加载答案 // 加载答案
if v.QuestionAnswer != "" { if v.QuestionAnswer != "" {
response = response.LoadQuestionAnswer(v.QuestionAnswer) response = response.LoadQuestionAnswer(v)
} }
// 将转换后的结构体添加到新切片中 // 将转换后的结构体添加到新切片中
@ -140,6 +140,14 @@ func (r *QuestionDto) LoadQuestionOption(m []*model.QuestionOption) *QuestionDto
return r return r
} }
// LoadQuestionOptionSimplify 加载选项-简化
func (r *QuestionDto) LoadQuestionOptionSimplify(m []*model.QuestionOption) *QuestionDto {
if len(m) > 0 {
r.QuestionOption = GetQuestionOptionSimplifyListDto(m)
}
return r
}
// LoadQuestionImage 加载图片 // LoadQuestionImage 加载图片
func (r *QuestionDto) LoadQuestionImage(s string) *QuestionDto { func (r *QuestionDto) LoadQuestionImage(s string) *QuestionDto {
if s != "" { if s != "" {
@ -155,13 +163,17 @@ func (r *QuestionDto) LoadQuestionImage(s string) *QuestionDto {
} }
// LoadQuestionAnswer 加载答案 // LoadQuestionAnswer 加载答案
func (r *QuestionDto) LoadQuestionAnswer(s string) *QuestionDto { func (r *QuestionDto) LoadQuestionAnswer(m *model.Question) *QuestionDto {
if s != "" { if m.QuestionAnswer != "" {
result := strings.Split(s, ",") if m.QuestionType == 1 || m.QuestionType == 2 {
if len(result) > 0 { result := strings.Split(m.QuestionAnswer, ",")
for _, v := range result { if len(result) > 0 {
r.QuestionAnswer = append(r.QuestionAnswer, v) for _, v := range result {
r.QuestionAnswer = append(r.QuestionAnswer, v)
}
} }
} else {
r.QuestionAnswer[0] = m.QuestionAnswer
} }
} }
return r return r

View File

@ -49,3 +49,22 @@ func GetQuestionOptionListDto(m []*model.QuestionOption) []*QuestionOptionDto {
return responses return responses
} }
// GetQuestionOptionSimplifyListDto 题目选项列表-简化
func GetQuestionOptionSimplifyListDto(m []*model.QuestionOption) []*QuestionOptionDto {
// 处理返回值
responses := make([]*QuestionOptionDto, len(m))
if len(m) > 0 {
for i, v := range m {
response := &QuestionOptionDto{
OptionValue: v.OptionValue,
}
// 将转换后的结构体添加到新切片中
responses[i] = response
}
}
return responses
}

View File

@ -94,7 +94,7 @@ func (r *QuestionQaItemDto) LoadQuestion(m *model.Question) *QuestionQaItemDto {
r.Question = r.Question.LoadQuestionImage(m.QuestionImage) r.Question = r.Question.LoadQuestionImage(m.QuestionImage)
// 加载答案 // 加载答案
r.Question = r.Question.LoadQuestionAnswer(m.QuestionAnswer) r.Question = r.Question.LoadQuestionAnswer(m)
} }
return r return r
} }

View File

@ -1,7 +1,18 @@
package dto package dto
// GetBackgroundImageDto 获取背景图
type GetBackgroundImageDto struct {
Status int `json:"status"` // 状态
Message string `json:"message"` // 提示信息
Data interface{} `json:"data"` // 数据值
}
// ShareAuthDto 授权
type ShareAuthDto struct {
Token string `json:"token"` // token
}
type ShareDto struct { type ShareDto struct {
QuestionQa *QuestionQaDto `json:"question_qa"` // 题库数据
Question []*QuestionDto `json:"question"` // 题库关联题目列表 Question []*QuestionDto `json:"question"` // 题库关联题目列表
BaseTokenItem []*BaseTokenItemDto `json:"base_token_item"` // 题库关联飞花令-列表 BaseTokenItem []*BaseTokenItemDto `json:"base_token_item"` // 题库关联飞花令-列表
} }

View File

@ -9,14 +9,6 @@ import (
// Auth Auth认证 // Auth Auth认证
func Auth() gin.HandlerFunc { func Auth() gin.HandlerFunc {
return func(c *gin.Context) { return func(c *gin.Context) {
// 获取用户id
userId := c.GetInt64("UserId")
if userId == 0 {
responses.Fail(c)
c.Abort()
return
}
// 获取客户端 // 获取客户端
client := c.GetInt("Client") client := c.GetInt("Client")
if client == 0 || (client != 1 && client != 2) { if client == 0 || (client != 1 && client != 2) {
@ -32,6 +24,14 @@ func Auth() gin.HandlerFunc {
// 后台 // 后台
if client == 2 { if client == 2 {
// 获取用户id
userId := c.GetInt64("UserId")
if userId == 0 {
responses.Fail(c)
c.Abort()
return
}
adminUserDao := dao.AdminUserDao{} adminUserDao := dao.AdminUserDao{}
adminUser, err := adminUserDao.GetAdminUserFirstById(userId) adminUser, err := adminUserDao.GetAdminUserFirstById(userId)
if err != nil || adminUser == nil { if err != nil || adminUser == nil {

View File

@ -53,20 +53,41 @@ func Jwt() gin.HandlerFunc {
return return
} }
// 转换类型 var userId int64
userId, err := strconv.ParseInt(t.UserId, 10, 64) var qaId int64
if err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "token错误",
"code": consts.TokenError,
"data": "",
})
c.Abort() // 用户id
return if t.UserId != "" {
userId, err = strconv.ParseInt(t.UserId, 10, 64)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "token错误",
"code": consts.TokenError,
"data": "",
})
c.Abort()
return
}
}
// 知识问答id
if t.QaId != "" {
qaId, err = strconv.ParseInt(t.QaId, 10, 64)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "token错误",
"code": consts.TokenError,
"data": "",
})
c.Abort()
return
}
} }
c.Set("UserId", userId) // 用户id c.Set("UserId", userId) // 用户id
c.Set("QaId", qaId) // 知识问答id
c.Set("Client", t.Client) // 客户端1:前台 2:后台) c.Set("Client", t.Client) // 客户端1:前台 2:后台)
c.Next() c.Next()
} }

View File

@ -1,10 +1,17 @@
package requests package requests
type ShareRequest struct { type ShareRequest struct {
GetShare // 获取分享数据 GetBackgroundImage // 获取背景图
ShareAuth // 授权
} }
type GetShare struct { // GetBackgroundImage 获取背景图
type GetBackgroundImage struct {
QaShareId string `json:"qa_share_id" form:"qa_share_id" label:"分享标识" validate:"required"`
}
// ShareAuth 授权
type ShareAuth struct {
QaShareId string `json:"qa_share_id" form:"qa_share_id" label:"分享标识" validate:"required"` QaShareId string `json:"qa_share_id" form:"qa_share_id" label:"分享标识" validate:"required"`
QaPassword string `json:"qa_password" form:"qa_password" label:"密码" validate:"required"` QaPassword string `json:"qa_password" form:"qa_password" label:"密码" validate:"required"`
} }

View File

@ -78,7 +78,14 @@ func publicRouter(r *gin.Engine, api controller.Api) {
} }
// 获取分享数据 // 获取分享数据
r.GET("/share", api.Share.GetShare) shareGroup := r.Group("/share")
{
// 获取背景图
shareGroup.GET("/background", api.Share.GetBackgroundImage)
// 授权
shareGroup.POST("/auth", api.Share.ShareAuth)
}
// 后台 // 后台
adminGroup := r.Group("/admin") adminGroup := r.Group("/admin")
@ -88,12 +95,6 @@ func publicRouter(r *gin.Engine, api controller.Api) {
// 登陆 // 登陆
adminGroup.POST("/login", api.AdminUser.Login) adminGroup.POST("/login", api.AdminUser.Login)
// 新增题目
adminGroup.POST("/question/test", api.Question.AddQuestionTest)
// 修改题目
adminGroup.PUT("/question/test/:question_id", api.Question.PutQuestionTest)
} }
} }
@ -221,4 +222,14 @@ func privateRouter(r *gin.Engine, api controller.Api) {
staticGroup.GET("", api.Static.GetStatic) staticGroup.GET("", api.Static.GetStatic)
} }
} }
// 获取分享数据
shareGroup := r.Group("/share")
{
// 获取知识问答数据
shareGroup.GET("/qa", api.Share.GetQuestionQa)
// 获取题目数据
shareGroup.GET("/question", api.Share.GetQuestion)
}
} }

View File

@ -52,7 +52,7 @@ func (r *AdminUserService) Login(req requests.Login) (res *dto.AdminUserDto, err
} }
// 生成jwt // 生成jwt
jwt, err := token.NewJWT() jwt, err := token.NewJWT(0)
if err != nil { if err != nil {
return nil, errors.New("登陆失败") return nil, errors.New("登陆失败")
} }

View File

@ -819,7 +819,7 @@ func (r *QuestionService) GetQuestion(questionId int64) (g *dto.QuestionDto, err
g.LoadQuestionImage(question.QuestionImage) g.LoadQuestionImage(question.QuestionImage)
// 加载答案 // 加载答案
g.LoadQuestionAnswer(question.QuestionAnswer) g.LoadQuestionAnswer(question)
return g, nil return g, nil
} }

View File

@ -9,12 +9,15 @@ import (
type Token struct { type Token struct {
UserId string `json:"user_id"` // 用户id UserId string `json:"user_id"` // 用户id
Client int `json:"client"` // 客户端1:前台 2:后台) Client int `json:"client"` // 客户端1:前台 2:后台)
QaId string `json:"qa_id"` // 知识问答id
jwt.RegisteredClaims // v5版本新加的方法 jwt.RegisteredClaims // v5版本新加的方法
} }
// NewJWT GenerateJWT 生成JWT // NewJWT GenerateJWT 生成JWT
func (t Token) NewJWT() (string, error) { func (t Token) NewJWT(ttl time.Duration) (string, error) {
ttl := time.Duration(config.C.Jwt.Ttl) if ttl == 0 {
ttl = time.Duration(config.C.Jwt.Ttl)
}
t.RegisteredClaims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(ttl * time.Hour)) // 过期时间24小时 t.RegisteredClaims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(ttl * time.Hour)) // 过期时间24小时
t.RegisteredClaims.IssuedAt = jwt.NewNumericDate(time.Now()) // 签发时间 t.RegisteredClaims.IssuedAt = jwt.NewNumericDate(time.Now()) // 签发时间