package api import ( "errors" "fmt" "github.com/gin-gonic/gin" db "main.go/database" . "main.go/type" "strings" ) //GetAllChallenges 获取全部题目 func GetAllChallenges(c *gin.Context) { var challenges []ChallengeResponse if err := getAllChallenges(c, &challenges); err != nil { c.JSON(400, gin.H{"code": 400, "msg": "Get all challenges failure!"}) return } c.JSON(200, gin.H{"code": 200, "data": challenges}) } //GetChallengesByCategory 获取某个分类下的题目 func GetChallengesByCategory(c *gin.Context) { category := c.Param("category") if matched := CheckCategory(category); !matched { c.JSON(400, gin.H{"code": 400, "msg": "Wrong category!"}) return } var challenges []ChallengeResponse if err := getCategory(c, &challenges); err != nil { c.JSON(400, gin.H{"code": 400, "msg": "Get all challenges failure!"}) return } c.JSON(200, gin.H{"code": 200, "data": challenges}) } //getCategory 操作数据库获取某个分类下的题目 func getCategory(c *gin.Context, challenges *[]ChallengeResponse) error { var attachmentString, hints string Link() DB := db.DBsnctf category := c.Param("category") rows, err := DB.Raw("SELECT id, name, score, description, attachment, category, tags, hints FROM challenge WHERE visible=1 AND category=?;", category).Rows() if err != nil { return err } defer rows.Close() for rows.Next() { var challenge ChallengeResponse err = rows.Scan(&challenge.ID, &challenge.Name, &challenge.Score, &challenge.Description, &attachmentString, &challenge.Category, &challenge.Tags, &hints) fmt.Println(err) if err != nil { return err } // 解析为切片 challenge.Attachment = strings.Split(attachmentString, ",") challenge.Hints = strings.Split(hints, ",") solverCount, err := getSolverCount(challenge.ID) if err != nil { return err } challenge.SolverCount = solverCount session, err := Store.Get(c.Request, "SNCTFSESSID") if err != nil { c.JSON(200, gin.H{"code": 400, "msg": "Get SNCTFSESSID error"}) return err } user, ok := session.Values["user"].(User) if !ok { c.JSON(200, gin.H{"code": 400, "msg": "No session"}) return errors.New("no session") } challenge.IsSolved = hasAlreadySolved(user.ID, challenge.ID) *challenges = append(*challenges, challenge) } return rows.Err() } // getAllChallenges 操作数据库获取所有题目。 func getAllChallenges(c *gin.Context, challenges *[]ChallengeResponse) error { var attachmentString, hints string Link() DB := db.DBsnctf rows, err := DB.Raw("SELECT id, name, score, description, attachment, category, tags, hints FROM challenge WHERE visible=1;").Rows() if err != nil { return err } defer rows.Close() for rows.Next() { var challenge ChallengeResponse err = rows.Scan(&challenge.ID, &challenge.Name, &challenge.Score, &challenge.Description, &attachmentString, &challenge.Category, &challenge.Tags, &hints) fmt.Println(err) if err != nil { return err } // 解析为切片 challenge.Attachment = strings.Split(attachmentString, ",") challenge.Hints = strings.Split(hints, ",") solverCount, err := getSolverCount(challenge.ID) if err != nil { return err } challenge.SolverCount = solverCount session, err := Store.Get(c.Request, "SNCTFSESSID") if err != nil { c.JSON(200, gin.H{"code": 400, "msg": "Get SNCTFSESSID error"}) return err } user, ok := session.Values["user"].(User) if !ok { c.JSON(200, gin.H{"code": 400, "msg": "No session"}) return errors.New("no session") } challenge.IsSolved = hasAlreadySolved(user.ID, challenge.ID) *challenges = append(*challenges, challenge) } return rows.Err() }