refactor: lesson plan return value.
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user