feat: 添加我的课程API接口
✨ 新增功能: - 新增 GET /api/mycourse/list 接口 - 支持JWT认证获取用户课程列表 - 按学习状态筛选 (learning/completed) - 支持分页查询 (page/pageSize) 🔧 技术实现: - 控制器: server/internal/controller/api/mycourse/ - 路由集成: server/internal/router/api.go - JWT中间件集成,自动解析用户ID 📋 接口特性: - 模拟数据响应(4门课程示例) - 完整的分页和筛选逻辑 - 符合团队API规范
This commit is contained in:
parent
4bab884e99
commit
2ecf594db6
18
server/internal/controller/api/mycourse/mycourse.go
Normal file
18
server/internal/controller/api/mycourse/mycourse.go
Normal file
@ -0,0 +1,18 @@
|
||||
// Package mycourse
|
||||
// @Link https://github.com/bufanyun/hotgo
|
||||
// @Copyright Copyright (c) 2023 HotGo CLI
|
||||
// @Author Ms <133814250@qq.com>
|
||||
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
||||
package mycourse
|
||||
|
||||
import (
|
||||
"hotgo/api/api/mycourse"
|
||||
)
|
||||
|
||||
// ControllerV1 我的课程控制器v1
|
||||
type ControllerV1 struct{}
|
||||
|
||||
// NewV1 创建我的课程控制器v1
|
||||
func NewV1() mycourse.IMyCourseV1 {
|
||||
return &ControllerV1{}
|
||||
}
|
118
server/internal/controller/api/mycourse/mycourse_v1_list.go
Normal file
118
server/internal/controller/api/mycourse/mycourse_v1_list.go
Normal file
@ -0,0 +1,118 @@
|
||||
package mycourse
|
||||
|
||||
import (
|
||||
"context"
|
||||
"hotgo/api/api/mycourse/v1"
|
||||
"hotgo/internal/library/contexts"
|
||||
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
)
|
||||
|
||||
// MyCourseList 获取我的课程列表
|
||||
func (c *ControllerV1) MyCourseList(ctx context.Context, req *v1.MyCourseListReq) (res *v1.MyCourseListRes, err error) {
|
||||
// 从JWT中间件解析出的用户ID
|
||||
userId := contexts.GetUserId(ctx)
|
||||
if userId <= 0 {
|
||||
err = gerror.New("用户未登录")
|
||||
return
|
||||
}
|
||||
|
||||
// 模拟数据 - 实际项目中应该从数据库查询
|
||||
mockData := []*v1.MyCourseItem{
|
||||
{
|
||||
Id: 1,
|
||||
Title: "Go语言基础教程",
|
||||
Description: "从零开始学习Go语言,掌握基础语法和核心概念",
|
||||
Cover: "https://example.com/covers/go-basic.jpg",
|
||||
Instructor: "张老师",
|
||||
Duration: 7200, // 2小时
|
||||
Progress: 75,
|
||||
Status: "learning",
|
||||
EnrollTime: gtime.New("2024-01-15 10:30:00"),
|
||||
LastStudyTime: gtime.New("2024-01-20 14:20:00"),
|
||||
},
|
||||
{
|
||||
Id: 2,
|
||||
Title: "Vue.js实战开发",
|
||||
Description: "深入学习Vue.js框架,构建现代化前端应用",
|
||||
Cover: "https://example.com/covers/vue-practice.jpg",
|
||||
Instructor: "李老师",
|
||||
Duration: 10800, // 3小时
|
||||
Progress: 100,
|
||||
Status: "completed",
|
||||
EnrollTime: gtime.New("2024-01-10 09:15:00"),
|
||||
LastStudyTime: gtime.New("2024-01-18 16:45:00"),
|
||||
},
|
||||
{
|
||||
Id: 3,
|
||||
Title: "MySQL数据库优化",
|
||||
Description: "学习MySQL性能优化技巧和最佳实践",
|
||||
Cover: "https://example.com/covers/mysql-optimization.jpg",
|
||||
Instructor: "王老师",
|
||||
Duration: 5400, // 1.5小时
|
||||
Progress: 45,
|
||||
Status: "learning",
|
||||
EnrollTime: gtime.New("2024-01-20 14:00:00"),
|
||||
LastStudyTime: gtime.New("2024-01-22 10:30:00"),
|
||||
},
|
||||
{
|
||||
Id: 4,
|
||||
Title: "Python数据分析",
|
||||
Description: "使用Python进行数据分析和可视化",
|
||||
Cover: "https://example.com/covers/python-analysis.jpg",
|
||||
Instructor: "赵老师",
|
||||
Duration: 9000, // 2.5小时
|
||||
Progress: 100,
|
||||
Status: "completed",
|
||||
EnrollTime: gtime.New("2024-01-05 11:00:00"),
|
||||
LastStudyTime: gtime.New("2024-01-12 15:30:00"),
|
||||
},
|
||||
}
|
||||
|
||||
// 根据状态筛选
|
||||
var filteredData []*v1.MyCourseItem
|
||||
if req.Status != "" {
|
||||
for _, item := range mockData {
|
||||
if item.Status == req.Status {
|
||||
filteredData = append(filteredData, item)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
filteredData = mockData
|
||||
}
|
||||
|
||||
totalCount := len(filteredData)
|
||||
|
||||
// 分页处理
|
||||
pageNum := req.Page
|
||||
pageSize := req.PageSize
|
||||
if pageNum <= 0 {
|
||||
pageNum = 1
|
||||
}
|
||||
if pageSize <= 0 {
|
||||
pageSize = 10
|
||||
}
|
||||
|
||||
start := (pageNum - 1) * pageSize
|
||||
end := start + pageSize
|
||||
|
||||
var list []*v1.MyCourseItem
|
||||
if start >= totalCount {
|
||||
list = []*v1.MyCourseItem{}
|
||||
} else {
|
||||
if end > totalCount {
|
||||
end = totalCount
|
||||
}
|
||||
list = filteredData[start:end]
|
||||
}
|
||||
|
||||
res = &v1.MyCourseListRes{
|
||||
List: list,
|
||||
Total: totalCount,
|
||||
Page: pageNum,
|
||||
PageSize: pageSize,
|
||||
}
|
||||
|
||||
return
|
||||
}
|
@ -10,6 +10,7 @@ import (
|
||||
"hotgo/internal/consts"
|
||||
"hotgo/internal/controller/api/lesson"
|
||||
"hotgo/internal/controller/api/member"
|
||||
"hotgo/internal/controller/api/mycourse"
|
||||
"hotgo/internal/controller/api/pay"
|
||||
"hotgo/internal/controller/api/users"
|
||||
"hotgo/internal/service"
|
||||
@ -27,6 +28,7 @@ func Api(ctx context.Context, group *ghttp.RouterGroup) {
|
||||
group.Middleware(service.Middleware().ApiAuth)
|
||||
group.Bind(
|
||||
member.NewV1(), // 管理员
|
||||
mycourse.NewV1(), // 我的课程
|
||||
)
|
||||
})
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user