补充静态服务

This commit is contained in:
yumaojun03 2025-01-19 18:16:29 +08:00
parent c319804716
commit 308acd4277
7 changed files with 387 additions and 1 deletions

View File

@ -544,3 +544,6 @@ func (*TokenServiceImpl) Name() string {
return token.AppName return token.AppName
} }
``` ```
## 项目的部署

79
vblog/docs/deploy.drawio Normal file
View File

@ -0,0 +1,79 @@
<mxfile host="65bd71144e">
<diagram id="dN3YsOiiXfhDtiho1mRT" name="第 1 页">
<mxGraphModel dx="927" dy="534" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="14" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="2" target="13">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="2" value="Nginx&lt;br&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="150" y="170" width="410" height="130" as="geometry"/>
</mxCell>
<mxCell id="3" value="静态站点" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="440" y="240" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="4" value="后端服务" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="150" y="340" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="6" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="5" target="4">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="proxy" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="150" y="240" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="7" value="基于Nginx服务的前后端一台部署" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="250" y="50" width="200" height="30" as="geometry"/>
</mxCell>
<mxCell id="9" style="edgeStyle=none;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="8" target="3">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="11" value="/" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9">
<mxGeometry x="0.0285" y="-3" relative="1" as="geometry">
<mxPoint x="1" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="10" style="edgeStyle=none;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="8" target="5">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="12" value="/api/xxxx" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="10">
<mxGeometry x="-0.15" y="4" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="8" value="xxxx.blog" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="310" y="170" width="60" height="30" as="geometry"/>
</mxCell>
<mxCell id="15" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=0.122;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="13" target="2">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="13" value="broswer" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="620" y="80" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="16" value="前后端一体:Go 同时也充当Nginx)" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="250" y="450" width="200" height="30" as="geometry"/>
</mxCell>
<mxCell id="21" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="17" target="20">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="22" value="build" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="21">
<mxGeometry x="-0.3133" y="-2" relative="1" as="geometry">
<mxPoint x="9" y="-2" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="17" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="145" y="500" width="410" height="130" as="geometry"/>
</mxCell>
<mxCell id="18" value="后端 API" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="145" y="570" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="19" value="静态站点" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="435" y="570" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="20" value="http" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" vertex="1" parent="1">
<mxGeometry x="630" y="525" width="120" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -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: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: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-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"}

View File

@ -5,6 +5,8 @@ import (
// 导入程序所有的对 // 导入程序所有的对
_ "gitlab.com/go-course-project/go17/vblog/apps" _ "gitlab.com/go-course-project/go17/vblog/apps"
// web程序注入
_ "gitlab.com/go-course-project/go17/vblog/web"
) )
func main() { func main() {
@ -21,6 +23,8 @@ func main() {
// panic(err) // panic(err)
// } // }
// ioc 获取到 当前的 gin Engine
// load config and run with cobra cli // load config and run with cobra cli
cmd.Start() cmd.Start()
} }

BIN
vblog/vblog Executable file

Binary file not shown.

View File

@ -763,3 +763,160 @@ const (
STAGE_PUBLISHED STAGE_PUBLISHED
) )
``` ```
## 前台布局
1. 前台整体的布局, 组件的复用Login/Logout
```vue
<template>
<a-space>
<a-button v-if="isLogin()" @click="logout">
<span style="margin-right: 12px;"> 退出 </span>
<icon-export />
</a-button>
<a-button v-else @click="$router.push({ name: 'login' })">
<span> 登录 </span>
</a-button>
</a-space>
</template>
<script setup>
import { isLogin, token } from '@/stores/token'
import { useRouter } from 'vue-router'
const props = defineProps({
redirectToLogin: {
type: Boolean,
value: true,
},
})
const router = useRouter()
const logout = () => {
token.value = undefined
if (props.redirectToLogin) {
router.push({ name: 'login' })
}
}
</script>
<style lang="css" scoped></style>
```
前台布局模版:
```vue
<template>
<a-layout class="layout">
<!-- 顶部导航 -->
<a-layout-header class="header">
<div style="font-size: 16px;font-weight: 500;">博客管理系统</div>
<div>
<LogoutButton :redirectToLogin="false"></LogoutButton>
</div>
</a-layout-header>
<a-layout-content class="content">
<div class="left"></div>
<div class="center">
<RouterView></RouterView>
</div>
<div class="right"></div>
</a-layout-content>
</a-layout>
</template>
<script setup>
import LogoutButton from '@/components/LogoutButton.vue'
</script>
```
## 前台的列表页
```vue
<template>
<a-list
:loading="queryBlogLoadding"
class="list-demo-action-layout"
:bordered="false"
:data="data.items"
:pagination-props="{ pageSize: blogQueryRequest.page_size, total: data.total }"
>
<template #item="{ item }">
<a-list-item class="list-demo-item" action-layout="vertical">
<template #actions>
<span><icon-heart />83</span>
<span><icon-star />{{ item.id }}</span>
<span><icon-message />Reply</span>
</template>
<template #extra>
<div className="image-area">
<img
@click="$router.push({ name: 'frontend_blog_detail', query: { id: item.id } })"
alt="arco-design"
width="200"
height="120"
src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/1f61854a849a076318ed527c8fca1bbf.png~tplv-uwbnlip3yd-webp.webp"
/>
</div>
</template>
<a-list-item-meta :title="item.title" :description="item.summary"> </a-list-item-meta>
</a-list-item>
</template>
</a-list>
</template>
<script setup>
import { onMounted, reactive, ref } from 'vue'
import { QUERY_BLOG } from '@/api/blog'
onMounted(() => {
queryData()
})
// API 请求数据
const blogQueryRequest = reactive({
keywords: '',
category: '',
page_size: 10,
page_number: 1,
// 只能查询出已发布,未发布,不能查询出来
})
// 数据, reactive, 一个一个修改每个属性的值 ({data...})
// ref data.value = {}
const data = ref({
items: [],
total: 0,
})
// 查询函数
const queryBlogLoadding = ref(false)
const queryData = async () => {
try {
queryBlogLoadding.value = true
data.value = await QUERY_BLOG(blogQueryRequest)
} finally {
queryBlogLoadding.value = false
}
}
</script>
<style lang="css" scoped></style>
```
## 前台的详情页
自己补充上
```vue
<template>
<div>文章详情</div>
</template>
<script setup></script>
<style lang="css" scoped></style>
```
可以在后台的编辑页面,给一个跳转按钮,跳转到详情页进行预览。

67
vblog/web/web.go Normal file
View File

@ -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))
}