fix: 修复 Space 模板缺少 formatCount/str 函数导致的启动 panic
- 在 theme/loader.go FuncMap 中添加 formatCount 和 str 函数 - formatCount 将 int64 格式化为中文计数(如 2.5万) - 控制器 ActiveFolderID 改为 uint 类型,避免模板中 str 类型比较 - 控制器传递 ActiveFolder 对象,移除模板内查找逻辑 - 清理旧模板替换残留的孤儿 HTML/SVG 代码
This commit is contained in:
@ -179,21 +179,25 @@ func (ctrl *SpaceController) loadCollectionsData(c *gin.Context, data gin.H, uid
|
||||
data["FoldersResult"] = folders
|
||||
|
||||
// 默认展示第一个收藏夹的内容
|
||||
activeFolderID := c.DefaultQuery("folder", "")
|
||||
if activeFolderID == "" && len(folders.Folders) > 0 {
|
||||
activeFolderID = strconv.FormatUint(uint64(folders.Folders[0].ID), 10)
|
||||
folderParam := c.DefaultQuery("folder", "")
|
||||
var activeFolderID uint
|
||||
if folderParam != "" {
|
||||
fid, parseErr := strconv.ParseUint(folderParam, 10, 64)
|
||||
if parseErr == nil {
|
||||
activeFolderID = uint(fid)
|
||||
}
|
||||
}
|
||||
if activeFolderID == 0 && len(folders.Folders) > 0 {
|
||||
activeFolderID = folders.Folders[0].ID
|
||||
}
|
||||
|
||||
var folderItems *service.FolderItemsResult
|
||||
if activeFolderID != "" {
|
||||
fid, parseErr := strconv.ParseUint(activeFolderID, 10, 64)
|
||||
if parseErr == nil {
|
||||
items, itemErr := ctrl.favoriteSvc.ListFolderItems(uid, uint(fid), page, pageSize)
|
||||
if itemErr != nil || items == nil {
|
||||
folderItems = &service.FolderItemsResult{Items: []model.FolderItem{}, Total: 0}
|
||||
} else {
|
||||
folderItems = items
|
||||
}
|
||||
if activeFolderID > 0 {
|
||||
items, itemErr := ctrl.favoriteSvc.ListFolderItems(uid, activeFolderID, page, pageSize)
|
||||
if itemErr != nil || items == nil {
|
||||
folderItems = &service.FolderItemsResult{Items: []model.FolderItem{}, Total: 0}
|
||||
} else {
|
||||
folderItems = items
|
||||
}
|
||||
}
|
||||
if folderItems == nil {
|
||||
@ -201,6 +205,17 @@ func (ctrl *SpaceController) loadCollectionsData(c *gin.Context, data gin.H, uid
|
||||
}
|
||||
data["FolderItems"] = folderItems
|
||||
data["ActiveFolderID"] = activeFolderID
|
||||
|
||||
// 找到当前激活的收藏夹对象传给模板
|
||||
var activeFolder *model.Folder
|
||||
for i := range folders.Folders {
|
||||
if folders.Folders[i].ID == activeFolderID {
|
||||
activeFolder = &folders.Folders[i]
|
||||
break
|
||||
}
|
||||
}
|
||||
data["ActiveFolder"] = activeFolder
|
||||
|
||||
data["Page"] = page
|
||||
data["TotalPages"] = folderItems.TotalPages
|
||||
data["PrevPage"] = max(1, page-1)
|
||||
|
||||
@ -22,8 +22,10 @@ func LoadTemplates(roots ...TemplateRoot) (*template.Template, error) {
|
||||
funcMap := template.FuncMap{
|
||||
"add": func(a, b int) int { return a + b },
|
||||
"subtract": func(a, b int) int { return a - b },
|
||||
"formatTTL": formatTTL,
|
||||
"assetV": common.AssetV,
|
||||
"formatTTL": formatTTL,
|
||||
"formatCount": formatCount,
|
||||
"str": str,
|
||||
"assetV": common.AssetV,
|
||||
"substr": func(s string, start, length int) string {
|
||||
runes := []rune(s)
|
||||
if start >= len(runes) {
|
||||
@ -100,3 +102,19 @@ func formatTTL(minutes int) string {
|
||||
}
|
||||
return fmt.Sprintf("%d 天 %d 小时", days, remainHours)
|
||||
}
|
||||
|
||||
// formatCount 将 int64 数字格式化为简洁中文计数(如 "2.5万"、"70.3万"、"0")
|
||||
func formatCount(n int64) string {
|
||||
if n < 10000 {
|
||||
return fmt.Sprintf("%d", n)
|
||||
}
|
||||
if n < 100000000 {
|
||||
v := float64(n) / 10000.0
|
||||
return fmt.Sprintf("%.1f万", v)
|
||||
}
|
||||
v := float64(n) / 100000000.0
|
||||
return fmt.Sprintf("%.1f亿", v)
|
||||
}
|
||||
|
||||
// str 将 uint 转为字符串,用于模板中与字符串比较
|
||||
func str(n uint) string { return fmt.Sprintf("%d", n) }
|
||||
|
||||
Reference in New Issue
Block a user