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 + + + + + +``` + +## 前台的详情页 + +自己补充上 + +```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)) +}