@@ -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+
3341var 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+
4188func 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