Skip to content

Commit e2bf08b

Browse files
committed
feature: add index cache
1 parent 8ac1542 commit e2bf08b

File tree

1 file changed

+56
-96
lines changed

1 file changed

+56
-96
lines changed

main.go

Lines changed: 56 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ var config = Config{
3030
Dynamic: "false",
3131
}
3232

33+
var categoryCache []Category
34+
35+
type Category struct {
36+
Name string
37+
EncodedName string
38+
CoverImage string
39+
}
40+
3341
var imageExtensions = map[string]bool{
3442
".jpg": true,
3543
".jpeg": true,
@@ -38,6 +46,45 @@ var imageExtensions = map[string]bool{
3846
".webp": true,
3947
}
4048

49+
func scanCategories(imageDir string) []Category {
50+
categories, err := os.ReadDir(imageDir)
51+
if err != nil {
52+
log.Fatalf("无法读取目录 %s: %v", imageDir, err)
53+
}
54+
55+
var categoryList []Category
56+
for _, category := range categories {
57+
if category.IsDir() {
58+
dirPath := filepath.Join(imageDir, category.Name())
59+
entries, err := os.ReadDir(dirPath)
60+
if err != nil {
61+
log.Printf("无法读取目录 %s: %v", dirPath, err)
62+
continue
63+
}
64+
65+
var coverImage string
66+
for _, entry := range entries {
67+
if entry.IsDir() {
68+
continue
69+
}
70+
ext := strings.ToLower(filepath.Ext(entry.Name()))
71+
if imageExtensions[ext] {
72+
coverImage = entry.Name()
73+
break
74+
}
75+
}
76+
if coverImage != "" {
77+
categoryList = append(categoryList, Category{
78+
Name: category.Name(),
79+
EncodedName: url.PathEscape(category.Name()),
80+
CoverImage: coverImage,
81+
})
82+
}
83+
}
84+
}
85+
return categoryList
86+
}
87+
4188
func main() {
4289
envVars := map[string]*string{
4390
"SITE_DIR": &config.ImageDir,
@@ -53,6 +100,9 @@ func main() {
53100
*conf = val
54101
}
55102
}
103+
104+
categoryCache = scanCategories(config.ImageDir)
105+
56106
// 路由设置
57107
http.HandleFunc("/login", loginHandler)
58108
if config.Dynamic == "true" {
@@ -62,7 +112,6 @@ func main() {
62112
http.Handle("/", AuthMiddleware(http.HandlerFunc(indexHandler)))
63113
http.Handle("/category/", AuthMiddleware(http.HandlerFunc(categoryHandler)))
64114
http.Handle("/images/", AuthMiddleware(http.StripPrefix("/images/", http.FileServer(http.Dir(config.ImageDir)))))
65-
http.Handle("/js/", AuthMiddleware(http.StripPrefix("/js/", http.FileServer(http.Dir("./js")))))
66115
log.Println("服务器启动在 :", config.Port)
67116
log.Fatal(http.ListenAndServe(":"+config.Port, nil))
68117
}
@@ -72,59 +121,14 @@ func indexHandler(w http.ResponseWriter, r *http.Request) {
72121
tmpl := template.Must(template.New("index").Parse(indexDynamicTemplate))
73122
tmpl.Execute(w, config)
74123
} else {
75-
categories, err := os.ReadDir(config.ImageDir)
76-
if err != nil {
77-
http.Error(w, "无法读取目录", http.StatusInternalServerError)
78-
return
79-
}
80-
81-
type Category struct {
82-
Name string
83-
EncodedName string
84-
CoverImage string
85-
}
86-
87124
type Tmp struct {
88125
Category []Category
89126
Config Config
90127
}
91-
92-
var categoryList []Category
93-
for _, category := range categories {
94-
if category.IsDir() {
95-
dirPath := filepath.Join(config.ImageDir, category.Name())
96-
entries, err := os.ReadDir(dirPath)
97-
if err != nil {
98-
log.Printf("无法读取目录 %s: %v", dirPath, err)
99-
continue
100-
}
101-
102-
var coverImage string
103-
// 遍历目录项查找第一个有效图片
104-
for _, entry := range entries {
105-
if entry.IsDir() {
106-
continue
107-
}
108-
ext := strings.ToLower(filepath.Ext(entry.Name()))
109-
if imageExtensions[ext] {
110-
coverImage = entry.Name()
111-
break // 找到第一个有效图片即停止
112-
}
113-
}
114-
if coverImage != "" {
115-
categoryList = append(categoryList, Category{
116-
Name: category.Name(),
117-
EncodedName: url.PathEscape(category.Name()),
118-
CoverImage: coverImage,
119-
})
120-
}
121-
}
122-
}
123128
var tmp = Tmp{
124-
Category: categoryList,
129+
Category: categoryCache, // 使用缓存数据
125130
Config: config,
126131
}
127-
128132
tmpl := template.Must(template.New("index").Parse(indexTemplate))
129133
tmpl.Execute(w, tmp)
130134
}
@@ -196,58 +200,15 @@ func indexJson(w http.ResponseWriter, r *http.Request) {
196200
limitStr := r.URL.Query().Get("limit")
197201
page, err := strconv.Atoi(pageStr)
198202
if err != nil || page < 1 {
199-
page = 1 // 默认第一页
203+
page = 1
200204
}
201205
limit, err := strconv.Atoi(limitStr)
202206
if err != nil || limit < 1 {
203-
limit = 20 // 默认每页20个分类
204-
}
205-
206-
// 读取分类目录
207-
categories, err := os.ReadDir(config.ImageDir)
208-
if err != nil {
209-
http.Error(w, "无法读取目录", http.StatusInternalServerError)
210-
return
211-
}
212-
type Category struct {
213-
Name string
214-
EncodedName string
215-
CoverImage string
216-
}
217-
218-
var categoryList []Category
219-
for _, category := range categories {
220-
if category.IsDir() {
221-
dirPath := filepath.Join(config.ImageDir, category.Name())
222-
entries, err := os.ReadDir(dirPath)
223-
if err != nil {
224-
log.Printf("无法读取目录 %s: %v", dirPath, err)
225-
continue
226-
}
227-
228-
var coverImage string
229-
for _, entry := range entries {
230-
if entry.IsDir() {
231-
continue
232-
}
233-
ext := strings.ToLower(filepath.Ext(entry.Name()))
234-
if imageExtensions[ext] {
235-
coverImage = entry.Name()
236-
break
237-
}
238-
}
239-
if coverImage != "" {
240-
categoryList = append(categoryList, Category{
241-
Name: category.Name(),
242-
EncodedName: url.PathEscape(category.Name()),
243-
CoverImage: coverImage,
244-
})
245-
}
246-
}
207+
limit = 20
247208
}
248209

249-
// 计算分页信息
250-
totalCategories := len(categoryList)
210+
// 使用缓存的分类信息
211+
totalCategories := len(categoryCache)
251212
totalPages := (totalCategories + limit - 1) / limit
252213
start := (page - 1) * limit
253214
end := start + limit
@@ -257,9 +218,8 @@ func indexJson(w http.ResponseWriter, r *http.Request) {
257218
if end > totalCategories {
258219
end = totalCategories
259220
}
260-
currentCategories := categoryList[start:end]
221+
currentCategories := categoryCache[start:end]
261222

262-
// 返回 JSON 数据
263223
w.Header().Set("Content-Type", "application/json")
264224
json.NewEncoder(w).Encode(map[string]interface{}{
265225
"categories": currentCategories,

0 commit comments

Comments
 (0)