@@ -16,21 +16,88 @@ use admin_handlers::{
1616 batch_delete_vods, create_collection, create_config, create_indexes, create_or_update_binding,
1717 create_type, create_vod, delete_binding, delete_collection, delete_config, delete_type,
1818 delete_vod, get_bindings, get_collect_progress, get_collection_binding_status, get_collections,
19- get_config_by_key, get_configs, get_index_status, get_indexes_data, get_running_tasks, get_scheduled_task_logs,
20- get_scheduled_task_status, get_statistics, get_types, get_vods_admin, list_indexes, start_collection_collect,
21- start_scheduled_task, stop_collect_task, stop_scheduled_task, update_collection, update_config,
22- update_scheduled_task_config, update_type, update_vod,
19+ get_config_by_key, get_configs, get_index_status, get_indexes_data, get_running_tasks,
20+ get_scheduled_task_logs, get_scheduled_task_status, get_statistics, get_types, get_vods_admin,
21+ list_indexes, start_collection_collect, start_scheduled_task, stop_collect_task,
22+ stop_scheduled_task, update_collection, update_config, update_scheduled_task_config,
23+ update_type, update_vod,
2324} ;
2425use collect_handlers:: { get_collect_categories, get_collect_videos, start_collect_task} ;
2526use site_data:: SiteDataManager ;
2627
2728use actix_files:: Files ;
2829use actix_session:: { storage:: CookieSessionStore , SessionMiddleware } ;
2930use actix_web:: cookie:: Key ;
30- use actix_web:: { get, web, App , HttpResponse , HttpServer , Responder } ;
31+ use actix_web:: dev:: { forward_ready, Service , Transform } ;
32+ use actix_web:: http:: header:: { HeaderValue , CACHE_CONTROL } ;
33+ use actix_web:: {
34+ dev:: { ServiceRequest , ServiceResponse } ,
35+ get, web, App , Error , HttpResponse , HttpServer , Responder , Result ,
36+ } ;
3137use actix_web_flash_messages:: { storage:: CookieMessageStore , FlashMessagesFramework } ;
3238use futures:: stream:: TryStreamExt ;
3339use mongodb:: Database ;
40+ use std:: future:: { ready, Ready } ;
41+ use std:: rc:: Rc ;
42+
43+ // Static file cache middleware
44+ pub struct StaticCacheMiddleware ;
45+
46+ impl < S , B > Transform < S , ServiceRequest > for StaticCacheMiddleware
47+ where
48+ S : Service < ServiceRequest , Response = ServiceResponse < B > , Error = Error > + ' static ,
49+ S :: Future : ' static ,
50+ B : ' static ,
51+ {
52+ type Response = ServiceResponse < B > ;
53+ type Error = Error ;
54+ type InitError = ( ) ;
55+ type Transform = StaticCacheMiddlewareService < S > ;
56+ type Future = Ready < Result < Self :: Transform , Self :: InitError > > ;
57+
58+ fn new_transform ( & self , service : S ) -> Self :: Future {
59+ ready ( Ok ( StaticCacheMiddlewareService {
60+ service : Rc :: new ( service) ,
61+ } ) )
62+ }
63+ }
64+
65+ pub struct StaticCacheMiddlewareService < S > {
66+ service : Rc < S > ,
67+ }
68+
69+ impl < S , B > Service < ServiceRequest > for StaticCacheMiddlewareService < S >
70+ where
71+ S : Service < ServiceRequest , Response = ServiceResponse < B > , Error = Error > + ' static ,
72+ S :: Future : ' static ,
73+ B : ' static ,
74+ {
75+ type Response = ServiceResponse < B > ;
76+ type Error = Error ;
77+ type Future =
78+ std:: pin:: Pin < Box < dyn std:: future:: Future < Output = Result < Self :: Response , Self :: Error > > > > ;
79+
80+ forward_ready ! ( service) ;
81+
82+ fn call ( & self , req : ServiceRequest ) -> Self :: Future {
83+ let service = self . service . clone ( ) ;
84+
85+ Box :: pin ( async move {
86+ let is_static = req. path ( ) . starts_with ( "/static/" ) ;
87+ let mut res = service. call ( req) . await ?;
88+
89+ if is_static {
90+ // Set cache headers for static files (24 hours)
91+ res. headers_mut ( ) . insert (
92+ CACHE_CONTROL ,
93+ HeaderValue :: from_static ( "public, max-age=86400" ) ,
94+ ) ;
95+ }
96+
97+ Ok ( res)
98+ } )
99+ }
100+ }
34101
35102// Handler to get a list of vods
36103#[ get( "/vods" ) ]
@@ -114,7 +181,8 @@ async fn main() -> std::io::Result<()> {
114181
115182 // 初始化定时任务配置
116183 println ! ( "🔧 正在初始化定时任务配置..." ) ;
117- let scheduled_task_manager = std:: sync:: Arc :: new ( scheduled_task:: ScheduledTaskManager :: new ( db. clone ( ) ) ) ;
184+ let scheduled_task_manager =
185+ std:: sync:: Arc :: new ( scheduled_task:: ScheduledTaskManager :: new ( db. clone ( ) ) ) ;
118186 match scheduled_task_manager. initialize_config ( ) . await {
119187 Ok ( _) => {
120188 println ! ( "✅ 定时任务配置初始化完成" ) ;
@@ -137,6 +205,8 @@ async fn main() -> std::io::Result<()> {
137205 . app_data ( web:: Data :: new ( site_data_manager. clone ( ) ) )
138206 // Store the scheduled task manager in the application state
139207 . app_data ( web:: Data :: new ( scheduled_task_manager. clone ( ) ) )
208+ // Static file cache middleware
209+ . wrap ( StaticCacheMiddleware )
140210 // Session and Flash Messages Middleware
141211 . wrap (
142212 FlashMessagesFramework :: builder (
@@ -169,8 +239,14 @@ async fn main() -> std::io::Result<()> {
169239 web:: resource ( "/search" )
170240 . route ( web:: get ( ) . to ( web_handlers:: search_page_handler_wrapper) ) ,
171241 )
172- // Static files
173- . service ( Files :: new ( "/static" , "./static" ) . show_files_listing ( ) )
242+ // Static files with cache configuration
243+ . service (
244+ Files :: new ( "/static" , "./static" )
245+ . show_files_listing ( )
246+ . use_etag ( true )
247+ . use_last_modified ( true )
248+ . prefer_utf8 ( true ) ,
249+ )
174250 // Admin Web routes
175251 . service (
176252 web:: resource ( "/admin/login" )
0 commit comments