refactor: lesson plan return value.

This commit is contained in:
2026-05-04 09:30:44 +08:00
parent 31b1441394
commit e4091b19ca
+99 -2
View File
@@ -36,6 +36,11 @@ type LessonPlanController struct {
type lessonPlanPaginationParams struct { type lessonPlanPaginationParams struct {
PageNum int `form:"pageNum,default=1"` PageNum int `form:"pageNum,default=1"`
PageSize int `form:"pageSize,default=10"` PageSize int `form:"pageSize,default=10"`
Keyword string `form:"keyword"` // 文件名模糊搜索
UploaderName string `form:"uploaderName"` // 上传者名模糊搜索
RegionID uint32 `form:"regionId"` // 按幼儿园(区域)筛选
SortBy string `form:"sortBy"` // file_size | created_at
SortOrder string `form:"sortOrder"` // asc | desc
} }
type lessonPlanShareCodeResponse struct { type lessonPlanShareCodeResponse struct {
@@ -192,20 +197,112 @@ func (lc *LessonPlanController) Page(c *gin.Context) {
var total int64 var total int64
var records []models.AppFile var records []models.AppFile
query := lc.DB.Model(&models.AppFile{}).Where("file_type = ?", models.AppFileTypeLessonPlan) query := lc.DB.Model(&models.AppFile{}).Where("file_type = ?", models.AppFileTypeLessonPlan)
// 角色权限过滤
if role != models.UserRoleSuperAdmin && role != models.UserRoleRegionAdmin { if role != models.UserRoleSuperAdmin && role != models.UserRoleRegionAdmin {
query = query.Where("uploader_id = ?", userID) query = query.Where("uploader_id = ?", userID)
} }
// 文件名模糊搜索
if params.Keyword != "" {
query = query.Where("original_filename LIKE ?", "%"+params.Keyword+"%")
}
// 上传者名模糊搜索
if params.UploaderName != "" {
query = query.Where("uploader_name LIKE ?", "%"+params.UploaderName+"%")
}
// 按区域(幼儿园)筛选:通过 user_region_bindings 查 uploader_id
if params.RegionID > 0 {
query = query.Where("uploader_id IN (SELECT user_id FROM user_region_bindings WHERE region_id = ?)", params.RegionID)
}
// 排序
orderClause := "created_at DESC"
if params.SortBy != "" {
switch params.SortBy {
case "file_size":
orderClause = "file_size"
case "created_at":
orderClause = "created_at"
}
if params.SortOrder == "asc" {
orderClause += " ASC"
} else {
orderClause += " DESC"
}
}
if err := query.Count(&total).Error; err != nil { if err := query.Count(&total).Error; err != nil {
writeError(c, http.StatusInternalServerError, "failed to count lesson plans") writeError(c, http.StatusInternalServerError, "failed to count lesson plans")
return return
} }
if err := query.Order("created_at DESC").Offset(offset).Limit(params.PageSize).Find(&records).Error; err != nil { if err := query.Order(orderClause).Offset(offset).Limit(params.PageSize).Find(&records).Error; err != nil {
writeError(c, http.StatusInternalServerError, "failed to query lesson plans") writeError(c, http.StatusInternalServerError, "failed to query lesson plans")
return return
} }
// 管理员可见所属幼儿园
isAdmin := role == models.UserRoleSuperAdmin || role == models.UserRoleRegionAdmin
type lessonPlanItem struct {
models.AppFile
KindergartenName string `json:"kindergartenName"`
}
items := make([]lessonPlanItem, len(records))
for i, r := range records {
items[i] = lessonPlanItem{AppFile: r}
}
if isAdmin && len(records) > 0 {
uploaderIDs := make([]uint, len(records))
for i, r := range records {
uploaderIDs[i] = r.UploaderID
}
type uploaderRegion struct {
UserID uint
RegionID uint32
}
var bindings []uploaderRegion
if err := lc.DB.Table("user_region_bindings").
Select("user_id, region_id").
Where("user_id IN ?", uploaderIDs).
Scan(&bindings).Error; err != nil {
writeError(c, http.StatusInternalServerError, "failed to query user regions")
return
}
regionIDs := make([]uint32, len(bindings))
userRegionMap := make(map[uint]uint32, len(bindings))
for _, b := range bindings {
userRegionMap[b.UserID] = b.RegionID
regionIDs = append(regionIDs, b.RegionID)
}
type regionKindergarten struct {
RegionID uint32
Name string
}
var kindergartens []regionKindergarten
if err := lc.DB.Table("kindergartens").
Select("region_id, name").
Where("region_id IN ?", regionIDs).
Scan(&kindergartens).Error; err != nil {
writeError(c, http.StatusInternalServerError, "failed to query kindergartens")
return
}
regionNameMap := make(map[uint32]string, len(kindergartens))
for _, k := range kindergartens {
regionNameMap[k.RegionID] = k.Name
}
for i, r := range records {
if rid, ok := userRegionMap[r.UploaderID]; ok {
if name, ok2 := regionNameMap[rid]; ok2 {
items[i].KindergartenName = name
}
}
}
}
writeSuccess(c, http.StatusOK, "query success", gin.H{ writeSuccess(c, http.StatusOK, "query success", gin.H{
"list": records, "list": items,
"pagination": gin.H{ "pagination": gin.H{
"currentPage": params.PageNum, "currentPage": params.PageNum,
"pageSize": params.PageSize, "pageSize": params.PageSize,