Files
wk-backend/internal/handler/ckwk.go
zhilv 858c29a799 init: 第一次提交
- 以实现登录获取个人信息和课程
- 实现了获取视频记录
- 实现了学习接口
2026-03-25 22:39:44 +08:00

174 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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,
}))
}