diff --git a/vblog/docs/deploy.drawio b/vblog/docs/deploy.drawio
index 3352e33..d71f69b 100644
--- a/vblog/docs/deploy.drawio
+++ b/vblog/docs/deploy.drawio
@@ -73,6 +73,14 @@
+
+
+
+
+
+
+
+
diff --git a/vblog/logs/vblog.log b/vblog/logs/vblog.log
index 3199840..cc422df 100644
--- a/vblog/logs/vblog.log
+++ b/vblog/logs/vblog.log
@@ -586,3 +586,160 @@
{"level":"info","component":"http","time":"2025-01-19T18:18:33+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
{"level":"error","component":"http","time":"2025-01-19T18:18:33+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
{"level":"info","component":"server","time":"2025-01-19T18:18:33+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:22:10+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:22:10+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:22:10+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:22:10+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:22:10+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:22:10+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:22:10+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"debug","time":"2025-01-19T18:23:13+08:00","caller":"token/api/api.go:57","message":"cookie domain: localhost"}
+{"level":"info","component":"server","time":"2025-01-19T18:24:51+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:24:51+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:24:51+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:24:51+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:24:53+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:24:53+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:24:53+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:24:53+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:24:53+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:24:53+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:24:53+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:25:33+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:25:33+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:25:33+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:25:33+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:25:35+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:25:35+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:25:35+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:25:35+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:25:35+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:25:35+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:25:35+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:26:54+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:26:54+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:26:54+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:26:54+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:26:57+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:26:57+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:26:57+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:26:57+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:26:57+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:26:57+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:26:57+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:27:53+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:27:53+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:27:53+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:27:53+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:27:56+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:27:56+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:27:56+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:27:56+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:27:56+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:27:56+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:27:56+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:28:38+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:28:38+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:28:38+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:28:38+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:28:41+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:28:41+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:28:43+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:28:43+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:28:43+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:28:43+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:28:43+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:28:43+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:28:43+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:29:22+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:29:22+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:29:22+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:29:22+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:30:04+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:30:04+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:04+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:04+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:04+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:04+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:30:04+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:05+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:30:05+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:30:05+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:05+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:30:09+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:30:09+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:09+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:09+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:09+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:30:09+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:30:09+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:32:42+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:32:42+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:32:42+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:32:42+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:33:55+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:33:55+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:33:55+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:33:55+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:33:55+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:33:55+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:33:55+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:39:31+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:39:31+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:39:31+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:39:31+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:39:33+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:39:33+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:39:33+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:39:33+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:39:33+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:39:33+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:39:33+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:44:06+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:44:06+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:44:06+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:44:06+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:44:09+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:44:09+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:44:09+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:44:09+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:44:09+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:44:09+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:44:09+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:45:29+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:45:29+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:45:29+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:45:29+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:45:47+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:45:47+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:45:47+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:45:47+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:45:47+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:45:47+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:45:47+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:46:14+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:46:14+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:46:14+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:46:14+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:47:18+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:47:18+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:47:18+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:47:18+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:47:18+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:47:18+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:47:18+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:47:58+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:47:58+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:47:58+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:47:58+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:49:03+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:49:03+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:49:03+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 web.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:49:03+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:49:03+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:49:03+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:49:03+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-02-16T09:07:56+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'hangup', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-02-16T09:07:56+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-02-16T09:07:56+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-02-16T09:07:56+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
diff --git a/vblog/web/web.go b/vblog/web/web.go
index bf78131..9b8787c 100644
--- a/vblog/web/web.go
+++ b/vblog/web/web.go
@@ -24,44 +24,33 @@ func (w *Web) Name() string {
return "web"
}
-//go:embed dist/assets/*
-var assetsFs embed.FS
-
-//go:embed dist/index.html
-var indexFs embed.FS
+//go:embed dist/*
+var WebDir embed.FS
func (w Web) Init() error {
rr := ioc_gin.RootRouter()
- // dist/assets/xxx/xxx --> /assets/xxx/xxx
- assets, _ := fs.Sub(assetsFs, "dist/assets")
-
- // /assets/xx.jpg --> dist/assets(root), xx.jpg
- rr.StaticFS("/assets", http.FS(assets))
-
- // index页面
- rr.GET("", w.Index)
-
- // 解决刷新404问题, 解决不了刷新 URL重置问题
- rr.NoRoute(w.RedirectIndex)
+ // 嵌入的 embed 就是一个文件系统,获取 web 目录下的资源文件
+ staticFp, err := fs.Sub(WebDir, "dist")
+ if err != nil {
+ return err
+ }
+ // 所有请求先匹配 api 路由,如果没匹配到就当作静态资源文件处理
+ rr.NoRoute(gin.WrapH(http.FileServer(http.FS(staticFp))))
return nil
}
-// RedirectIndex 重定向
-//
-// location / {
-// try_files $uri $uri/ /index.html;
-// }
-func (h *Web) RedirectIndex(c *gin.Context) {
- c.Redirect(http.StatusFound, "/")
-}
+// // RedirectIndex 重定向
+// func (h *Web) RedirectIndex(c *gin.Context) {
+// c.Redirect(http.StatusFound, "/")
+// }
-// RedirectIndex 重定向
-func (h *Web) Index(c *gin.Context) {
- c.Header("Content-Type", "text/html;charset=utf-8")
- index, err := indexFs.ReadFile("dist/index.html")
- if err != nil {
- panic(err)
- }
- c.String(200, string(index))
-}
+// // RedirectIndex 重定向
+// func (h *Web) Index(c *gin.Context) {
+// c.Header("Content-Type", "text/html;charset=utf-8")
+// index, err := indexFs.ReadFile("dist/index.html")
+// if err != nil {
+// panic(err)
+// }
+// c.String(200, string(index))
+// }