174 lines
3.6 KiB
Go
174 lines
3.6 KiB
Go
package handler
|
||
|
||
import (
|
||
"ckwk/internal/ckwk"
|
||
"ckwk/internal/dto"
|
||
"ckwk/pkg/log"
|
||
"fmt"
|
||
"net/http"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
type WKHandler struct {
|
||
Session *ckwk.SessionManager
|
||
}
|
||
|
||
func NewWKHandler() *WKHandler {
|
||
return &WKHandler{
|
||
Session: ckwk.NewSessionManager(),
|
||
}
|
||
}
|
||
|
||
func (h *WKHandler) Login(ctx *gin.Context) {
|
||
var req dto.LoginReq
|
||
if err := ctx.ShouldBindJSON(&req); err != nil {
|
||
ctx.JSON(200, dto.Error(-1, "请求参数错误"))
|
||
return
|
||
}
|
||
log.Debug("请求数据", zap.Any("req", req))
|
||
var cookies = []*http.Cookie{
|
||
{
|
||
Name: "token",
|
||
Value: req.Token,
|
||
Path: "/"},
|
||
}
|
||
wk := ckwk.NewWK(req.Username, req.Password, req.Host, cookies)
|
||
if wk == nil {
|
||
ctx.JSON(200, dto.Error(-1, "登录失败:请提供账号密码或有效的 Token,并确保 Host 正确"))
|
||
return
|
||
}
|
||
|
||
userinfo, err := wk.UserInfoGet()
|
||
if err != nil {
|
||
ctx.JSON(200, dto.Error(-1, err.Error()))
|
||
return
|
||
}
|
||
|
||
courses, err := wk.CourseGet(req.Status)
|
||
if err != nil {
|
||
ctx.JSON(200, dto.Error(-1, err.Error()))
|
||
return
|
||
}
|
||
|
||
sessionID := h.Session.Store(wk)
|
||
|
||
ctx.JSON(200, dto.Success(map[string]any{
|
||
"session_id": sessionID,
|
||
"user": userinfo,
|
||
"courses": courses,
|
||
}))
|
||
}
|
||
|
||
func (h *WKHandler) Online(ctx *gin.Context) {
|
||
val, ok := ctx.Get("wk_instance")
|
||
if !ok {
|
||
ctx.JSON(http.StatusOK, dto.Error(-1, "登录已过期"))
|
||
return
|
||
}
|
||
wk := val.(*ckwk.WK)
|
||
|
||
flag, err := wk.Online()
|
||
if err != nil {
|
||
ctx.JSON(200, dto.Error(-1, err.Error()))
|
||
return
|
||
}
|
||
|
||
if !flag {
|
||
ctx.JSON(200, dto.Error(-1, "保持账号状态失败"))
|
||
return
|
||
}
|
||
ctx.JSON(200, dto.Ok())
|
||
}
|
||
|
||
func (h *WKHandler) Logout(ctx *gin.Context) {
|
||
sessionID := ctx.GetString("session_id")
|
||
h.Session.Del(sessionID)
|
||
ctx.JSON(200, dto.Ok())
|
||
}
|
||
|
||
func (h *WKHandler) Study(ctx *gin.Context) {
|
||
val, ok := ctx.Get("wk_instance")
|
||
if !ok {
|
||
ctx.JSON(200, dto.Error(-1, "登录已过期"))
|
||
return
|
||
}
|
||
wk := val.(*ckwk.WK)
|
||
|
||
var req dto.StudyReq
|
||
if err := ctx.ShouldBindJSON(&req); err != nil {
|
||
ctx.JSON(200, dto.Error(-1, "请求参数错误"))
|
||
return
|
||
}
|
||
|
||
result, err := wk.Study(req.NodeID, req.StudyID, req.StudyTime, req.Status)
|
||
if err != nil {
|
||
ctx.JSON(200, dto.Error(-1, err.Error()))
|
||
return
|
||
}
|
||
|
||
ctx.JSON(200, dto.Success(result))
|
||
}
|
||
|
||
func (h *WKHandler) AllRecord(ctx *gin.Context) {
|
||
val, ok := ctx.Get("wk_instance")
|
||
if !ok {
|
||
ctx.JSON(200, dto.Error(-1, "登录已过期"))
|
||
return
|
||
}
|
||
wk := val.(*ckwk.WK)
|
||
|
||
var req dto.AllRecordReq
|
||
if err := ctx.ShouldBindJSON(&req); err != nil {
|
||
ctx.JSON(200, dto.Error(-1, "请求参数错误"))
|
||
return
|
||
}
|
||
if req.Page < 1 {
|
||
req.Page = 1
|
||
}
|
||
var list any
|
||
var pageInfo any
|
||
var err error
|
||
|
||
// 根据类型调用不同的泛型方法
|
||
switch req.RecordType {
|
||
case ckwk.RecordStudy:
|
||
res, e := wk.GetStudyList(req.CourseID, fmt.Sprint(req.Page))
|
||
err = e
|
||
if e == nil {
|
||
list, pageInfo = res.List, res.PageInfo
|
||
}
|
||
case ckwk.RecordWork:
|
||
res, e := wk.GetWorkList(req.CourseID, fmt.Sprint(req.Page))
|
||
err = e
|
||
if e == nil {
|
||
list, pageInfo = res.List, res.PageInfo
|
||
}
|
||
case ckwk.RecordExam:
|
||
res, e := wk.GetExamList(req.CourseID, fmt.Sprint(req.Page))
|
||
err = e
|
||
if e == nil {
|
||
list, pageInfo = res.List, res.PageInfo
|
||
}
|
||
case ckwk.RecordDiscuss:
|
||
res, e := wk.GetDiscussList(req.CourseID, fmt.Sprint(req.Page))
|
||
err = e
|
||
if e == nil {
|
||
list, pageInfo = res.List, res.PageInfo
|
||
}
|
||
default:
|
||
ctx.JSON(200, dto.Error(-1, "不支持的记录类型"))
|
||
return
|
||
}
|
||
if err != nil {
|
||
ctx.JSON(200, dto.Error(-1, err.Error()))
|
||
return
|
||
}
|
||
|
||
ctx.JSON(200, dto.Success(map[string]any{
|
||
"list": list,
|
||
"page_info": pageInfo,
|
||
}))
|
||
}
|