init: 第一次提交

- 以实现登录获取个人信息和课程
- 实现了获取视频记录
- 实现了学习接口
This commit is contained in:
2026-03-25 22:39:44 +08:00
commit 858c29a799
19 changed files with 1541 additions and 0 deletions

173
internal/handler/ckwk.go Normal file
View File

@@ -0,0 +1,173 @@
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,
}))
}