diff --git a/vblog/README.md b/vblog/README.md
index 0d472ac..9d8dd3e 100644
--- a/vblog/README.md
+++ b/vblog/README.md
@@ -543,4 +543,7 @@ type TokenServiceImpl struct {
func (*TokenServiceImpl) Name() string {
return token.AppName
}
-```
\ No newline at end of file
+```
+
+## 项目的部署
+
diff --git a/vblog/docs/deploy.drawio b/vblog/docs/deploy.drawio
new file mode 100644
index 0000000..3352e33
--- /dev/null
+++ b/vblog/docs/deploy.drawio
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vblog/logs/vblog.log b/vblog/logs/vblog.log
index 571748c..3249cd8 100644
--- a/vblog/logs/vblog.log
+++ b/vblog/logs/vblog.log
@@ -499,3 +499,79 @@
{"level":"debug","time":"2025-01-19T15:29:38+08:00","caller":"token/api/api.go:57","message":"cookie domain: localhost"}
{"level":"debug","time":"2025-01-19T15:32:21+08:00","caller":"token/api/api.go:57","message":"cookie domain: localhost"}
{"level":"debug","time":"2025-01-19T15:57:25+08:00","caller":"token/api/api.go:57","message":"cookie domain: localhost"}
+{"level":"debug","time":"2025-01-19T17:06:33+08:00","caller":"token/api/api.go:57","message":"cookie domain: localhost"}
+{"level":"info","component":"server","time":"2025-01-19T17:25:39+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T17:25:39+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T17:25:39+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T17:25:39+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T17:25:42+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T17:25:42+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T17:25:42+08:00","caller":"ioc/server/server.go:74","message":"loaded configs: [app.v1 trace.v1 log.v1 validator.v1 gin_webframework.v1 datasource.v1 grpc.v1 http.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:25:42+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:25:42+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:25:42+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T17:25:42+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T17:44:31+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T17:44:31+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T17:44:31+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T17:44:31+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T17:46:25+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T17:46:25+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T17:47:58+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T17:47:58+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T17:47:58+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-19T17:47:58+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:47:58+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:47:58+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T17:47:58+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T17:52:46+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T17:52:46+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T17:52:46+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T17:52:46+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T17:52:48+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T17:52:48+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T17:52:48+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-19T17:52:48+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:52:48+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:52:48+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T17:52:48+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T17:57:13+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T17:57:13+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T17:57:13+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T17:57:13+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T17:57:16+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T17:57:16+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T17:57:16+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-19T17:57:16+08:00","caller":"ioc/server/server.go:75","message":"loaded controllers: [token.v1 user.v1 blog.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:57:16+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T17:57:16+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T17:57:16+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:01:56+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:01:56+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:01:56+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:01:56+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:01:59+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:01:59+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:01:59+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:01:59+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:01:59+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:01:59+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:01:59+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"debug","time":"2025-01-19T18:02:22+08:00","caller":"token/api/api.go:57","message":"cookie domain: localhost"}
+{"level":"info","component":"server","time":"2025-01-19T18:09:22+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:09:22+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:09:22+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:09:22+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:09:39+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:09:39+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"gin_webframework","time":"2025-01-19T18:09:42+08:00","caller":"config/gin/framework.go:41","message":"enable gin recovery"}
+{"level":"debug","time":"2025-01-19T18:09:42+08:00","caller":"token/impl/impl.go:39","message":"DefaultExpiredTTL: 3600"}
+{"level":"info","component":"server","time":"2025-01-19T18:09:42+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:09:42+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:09:42+08:00","caller":"ioc/server/server.go:76","message":"loaded apis: [blogs.v1 tokens.v1]"}
+{"level":"info","component":"server","time":"2025-01-19T18:09:42+08:00","caller":"ioc/server/server.go:77","message":"loaded defaults: []"}
+{"level":"info","component":"http","time":"2025-01-19T18:09:42+08:00","caller":"config/http/http.go:144","message":"HTTP服务启动成功, 监听地址: 127.0.0.1:8080"}
+{"level":"info","component":"server","time":"2025-01-19T18:14:23+08:00","caller":"ioc/server/server.go:101","message":"receive signal 'interrupt', start graceful shutdown"}
+{"level":"info","component":"http","time":"2025-01-19T18:14:23+08:00","caller":"config/http/http.go:152","message":"start graceful shutdown"}
+{"level":"error","component":"http","time":"2025-01-19T18:14:23+08:00","caller":"config/http/http.go:146","message":"http: Server closed"}
+{"level":"info","component":"server","time":"2025-01-19T18:14:23+08:00","caller":"ioc/server/server.go:115","message":"http service stop complete"}
diff --git a/vblog/main.go b/vblog/main.go
index 851f872..845ddeb 100644
--- a/vblog/main.go
+++ b/vblog/main.go
@@ -5,6 +5,8 @@ import (
// 导入程序所有的对
_ "gitlab.com/go-course-project/go17/vblog/apps"
+ // web程序注入
+ _ "gitlab.com/go-course-project/go17/vblog/web"
)
func main() {
@@ -21,6 +23,8 @@ func main() {
// panic(err)
// }
+ // ioc 获取到 当前的 gin Engine
+
// load config and run with cobra cli
cmd.Start()
}
diff --git a/vblog/vblog b/vblog/vblog
new file mode 100755
index 0000000..81313dd
Binary files /dev/null and b/vblog/vblog differ
diff --git a/vblog/web/README.md b/vblog/web/README.md
index 3f0dffe..0f9eda2 100644
--- a/vblog/web/README.md
+++ b/vblog/web/README.md
@@ -763,3 +763,160 @@ const (
STAGE_PUBLISHED
)
```
+
+## 前台布局
+
+1. 前台整体的布局, 组件的复用,Login/Logout
+
+```vue
+
+
+
+ 退出
+
+
+
+ 登录
+
+
+
+
+
+
+
+```
+
+前台布局模版:
+
+```vue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## 前台的列表页
+
+```vue
+
+
+
+
+
+ 83
+ {{ item.id }}
+ Reply
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+```
+
+## 前台的详情页
+
+自己补充上
+
+```vue
+
+ 文章详情
+
+
+
+
+
+```
+
+可以在后台的编辑页面,给一个跳转按钮,跳转到详情页进行预览。
diff --git a/vblog/web/web.go b/vblog/web/web.go
new file mode 100644
index 0000000..bf78131
--- /dev/null
+++ b/vblog/web/web.go
@@ -0,0 +1,67 @@
+package web
+
+import (
+ "embed"
+ "io/fs"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+ "github.com/infraboard/mcube/v2/ioc"
+ ioc_gin "github.com/infraboard/mcube/v2/ioc/config/gin"
+)
+
+func init() {
+ ioc.Config().Registry(&Web{})
+}
+
+// 把当前的dist文件 作为静态资源 加载到Gin
+
+type Web struct {
+ ioc.ObjectImpl
+}
+
+func (w *Web) Name() string {
+ return "web"
+}
+
+//go:embed dist/assets/*
+var assetsFs embed.FS
+
+//go:embed dist/index.html
+var indexFs 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)
+ 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) 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))
+}