This commit is contained in:
jiayuqi7813
2022-05-21 23:29:23 +08:00
parent b8859af6d8
commit 7cb171bc90
83 changed files with 1687 additions and 0 deletions

153
api/solve.go Normal file
View File

@@ -0,0 +1,153 @@
package api
import (
"github.com/gin-gonic/gin"
db "main.go/database"
."main.go/type"
"strconv"
)
//GetAllSolves 获取所有解题记录
func GetAllSolves(c *gin.Context){
var solves []SolveResponse
if err := getAllSolves(&solves); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Get all solves failure!"})
return
}
c.JSON(200, gin.H{"code": 200, "data": solves})
}
//GetSolvesByCid 获取某个用户的所有解题记录
func GetSolvesByCid(c *gin.Context){
var solves []SolveResponse
cid, err := strconv.ParseInt(c.Param("cid"), 10, 64)
if err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Get solves failure!"})
return
}
if err := getSolvesByCid(&solves, int(cid)); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Get solves failure!"})
return
}
c.JSON(200, gin.H{"code": 200, "data": solves})
}
// GetSolvesByUid 根据用户id获取正确的flag提交记录。
func GetSolvesByUid(c *gin.Context) {
uid, err := strconv.ParseInt(c.Param("uid"), 10, 64)
if err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Wrong uid!"})
return
}
if uid == 1 {
c.JSON(400, gin.H{"code": 400, "msg": "Not allowed!"})
return
}
var solves []SolveResponse
if err := getSolvesByUid(&solves, int(uid)); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Get specified solves failure!"})
return
}
c.JSON(200, gin.H{"code": 200, "data": solves})
}
// GetSelfSolves 获取当前用户的所有解题记录
func GetSelfSolves(c *gin.Context){
var solves []SolveResponse
session, err := Store.Get(c.Request, "SNCTFSESSID")
if err != nil {
c.JSON(200, gin.H{"code": 400, "msg": "Get SNCTFSESSID error"})
return
}
user, ok := session.Values["user"].(User)
if !ok {
c.JSON(200, gin.H{"code": 400, "msg": "No session"})
return
}
if err := getSolvesByUid(&solves, user.ID); err != nil {
c.JSON(400, gin.H{"code": 400, "msg": "Get self solves failure!"})
return
}
c.JSON(200, gin.H{"code": 200, "data": solves})
}
// getSolverCount 操作数据库获取指定id题目的解出人数。
func getSolverCount(id int) (count int, err error) {
Link()
DB := db.DBsnctf
//SELECT COUNT(*) FROM solve WHERE cid = ?;
err = DB.Table("solve").Select("COUNT(*)").Where("cid = ?", id).Scan(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// getAllSolves 操作数据库获取所有正确的提交记录,按提交时间从早到晚排序。
func getAllSolves(solves *[]SolveResponse) error {
DB :=db.DBsnctf
rows,err := DB.Raw("SELECT s.id, s.uid, s.cid, u.username, c.name, s.submitted_at, c.score FROM solve AS s, user AS u, challenge AS c WHERE u.hidden=0 AND s.uid=u.id AND s.cid=c.id ORDER BY s.submitted_at ASC;").Rows()
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
var s SolveResponse
err = rows.Scan(&s.ID, &s.Uid, &s.Cid, &s.Username, &s.ChallengeName, &s.SubmittedAt, &s.Score)
if err != nil {
return err
}
*solves = append(*solves, s)
}
return rows.Err()
}
// getSolvesByUid 操作数据库根据用户id获取正确的flag提交记录按提交时间从早到晚排序。
func getSolvesByUid(solves *[]SolveResponse, uid int) error {
DB :=db.DBsnctf
rows,err := DB.Debug().Raw("SELECT s.id, s.uid, s.cid, u.username, c.name, s.submitted_at, c.score FROM solve AS s, user AS u, challenge AS c WHERE u.hidden=0 AND s.uid=? AND u.id=s.uid AND c.id=s.cid ORDER BY s.submitted_at ASC;",uid).Rows()
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
var s SolveResponse
err = rows.Scan(&s.ID, &s.Uid, &s.Cid, &s.Username, &s.ChallengeName, &s.SubmittedAt, &s.Score)
if err != nil {
return err
}
*solves = append(*solves, s)
}
return rows.Err()
}
// getSolvesByCid 操作数据库根据题目id获取正确的提交记录按提交时间从早到晚排序。
func getSolvesByCid(solves *[]SolveResponse, cid int) error {
DB :=db.DBsnctf
rows,err := DB.Raw("SELECT s.id, s.uid, s.cid, u.username, c.name, s.submitted_at, c.score FROM solve AS s, user AS u, challenge AS c WHERE u.hidden=0 AND s.cid=? AND u.id=s.uid AND c.id=s.cid ORDER BY s.submitted_at ASC;",cid).Rows()
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
var s SolveResponse
err = rows.Scan(&s.ID, &s.Uid, &s.Cid, &s.Username, &s.ChallengeName, &s.SubmittedAt, &s.Score)
if err != nil {
return err
}
*solves = append(*solves, s)
}
return rows.Err()
}