补充静态服务
This commit is contained in:
parent
c319804716
commit
308acd4277
@ -543,4 +543,7 @@ type TokenServiceImpl struct {
|
||||
func (*TokenServiceImpl) Name() string {
|
||||
return token.AppName
|
||||
}
|
||||
```
|
||||
```
|
||||
|
||||
## 项目的部署
|
||||
|
||||
|
79
vblog/docs/deploy.drawio
Normal file
79
vblog/docs/deploy.drawio
Normal 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<br>" 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>
|
@ -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"}
|
||||
|
@ -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()
|
||||
}
|
||||
|
BIN
vblog/vblog
Executable file
BIN
vblog/vblog
Executable file
Binary file not shown.
@ -763,3 +763,160 @@ const (
|
||||
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
67
vblog/web/web.go
Normal 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))
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user