背景:使用Golang的Gin框架开发内部运维后端API接口,对外提供json类型的数据响应。但是这种方法的数据格式在浏览器访问数据时并不友好(因为是API接口,通常需要使用postman等工具验证接口返回数据)。尝试使用Golang模板结合html进行数据渲染,但也发现缺乏美感。然后我决定使用前端框架来渲染后端数据。因为 vue 框架的优点,比如简单,双向数据绑定等等,我决定使用 vue 框架开始我的前端之旅。接下来,简单讲解一下使用Golang后端和vue前端进行融合的例子。
基于 Gin 框架的后端 API
编写一个基于 Gin 框架的 API:
# 查看源文件
$ 猫 main.go
/**
* @文件名:main.go
* @Author: xxbandy @http://xxbandy.github.io
* @电子邮件:
* @创建日期:2018-12-02 22:12:59
* @描述:
*/
包主
进口(
_“fmt”
“github.com/gin-gonic/gin”
“数学/兰特”
“网络/http”
)
func HelloPage(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "欢迎来到bgops,请访问https://xxbandy.github.io!",
})
}
功能主() {
r :u003d gin.Default()
v1 :u003d r.Group("/v1")
{
v1.GET("/hello", HelloPage)
v1.GET("/hello/:name", func(c *gin.Context) {
名称 :u003d c.Param("名称")
c.String(http.StatusOK, "你好 %s", 名字)
})
v1.GET("/line", func(c *gin.Context) {
// 注意:前后端分离时,要注意跨域问题,所以需要设置请求头。
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
legendData :u003d []string{“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”}
xAxisData :u003d []int{120, 240, rand.Intn(500), rand.Intn(500), 150, 230, 180}
c.JSON(200, 杜松子酒.H{
“图例_data”:图例数据,
“xAxis_data”:xAxisData,
})
})
}
//定义默认路由
r.NoRoute(func(c *gin.Context) {
c.JSON(http.StatusNotFound, gin.H{
“状态”:404,
"error": "404,页面不存在!",
})
})
r.Run(":8000")
}
操作流程
$ 去运行 main.go
[GIN-debug] [WARNING] 创建一个 Engine 实例,其中已经附加了 Logger 和 Recovery 中间件。
[GIN-debug] [WARNING] 在“调试”模式下运行。在生产中切换到“发布”模式。
- 使用环境:导出 GIN_MODEu003drelease
- 使用代码:gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /v1/hello --> main.HelloPage(3 个处理程序)
[GIN-debug] GET /v1/hello/:name --> main.main.func1(3 个处理程序)
[GIN-debug] GET /v1/line --> main.main.func2(3 个处理程序)
测试相关接口
$ curl -s localhost:8000/v1/hello | python -m json.tool
{
"message": "欢迎来到bgops,请访问https://xxbandy.github.io!"
}
$ curl -s localhost:8000/v1/hello/bgops
你好 bgops
$ curl -s localhost:8000/v1/line
{"legend_data":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],"x 轴\data":[120,240 ,81,387,150,230,180]}
可以看到接口以json结构返回数据
$ curl -s localhost:8000/v1/line | python -m json.tool
{
“图例_数据”:[
"\u5468\u4e00",
"\u5468\u4e8c",
"\u5468\u4e09",
"\我订婚了 468\\我订婚了",
"\u5468\u4e94",
u5468u516d
"\\\\\'s 468\\'s
],
“xAxis_data”:[
120,
240,
347,
59,
150,
230,
180
]
}
基于vue框架的前端项目
使用 vue-cli 脚手架快速构建 Vue 项目。注:前提是需要node环境且有npm源可用
# 查看版本
$ npm -v
2.3.0
#升级 npm
cnpm 安装 npm -g
升级或安装cnpm
npm 安装 cnpm -g
最新稳定版
$ cnpm 安装 vue
全局安装 vue-cli
$ cnpm install --global vue-cli
新建一个基于Webpack模板的项目
➜ 视图文档视图初始化 webpack 视图测试
?目标目录存在。继续?是的
?项目名称 vue-test
?项目描述 一个 Vue.js 项目
?作者 xxbandy
? Vue 独立构建
?安装Vue路由器?是的
?使用 ESLint 对代码进行 lint?是的
?选择一个 ESLint 预设标准
?设置单元测试 是
?选择一个测试跑者笑话
?使用 Nightwatch 设置 e2e 测试?是的
//有两种方式[npm和yarn,如果默认选择npm,从外部下载资源,可能无法访问谷歌的外部]
?我们应该在项目创建后为您运行 `npm install`吗? (推荐)没有
vue-cli · 生成“vue-test”。
项目初始化完成!
u003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003du003d
开始:
cd 查看测试
npm install (或者如果使用yarn:yarn)
npm run lint -- --fix (或者对于纱线:yarn run lint --fix)
npm 运行开发
文档可以在 https://vuejs-templates.github.io/webpack 找到
$ cd vue 测试
$ cnpm 安装
✔ 安装了 58 个包
✔ 已链接 0 个最新版本
✔ 运行 0 个脚本
✔ 安装的所有包(使用 237ms(网络 227ms),速度 0B/s,json 0(0B),tarball 0B)
根据配置运行编译好的 webpack 静态资源
$ cnpm 运行开发
DONE 4388ms 编译成功
收听 http://localhost:8080
当使用 cnpm run dev 时,一个前端服务运行成功,所以你会看到类似下图的页面
vue渲染后端API数据
1.首先,快速看一下vue项目的代码结构。
$ 树 -L 1 。
。
├── README.md
├── 建造
├── 配置
├── index.html
├── 节点_模块
├── package.json
├── src
├── 静态
└── 测试
快速开发只需要知道src目录下vue相关的代码,也就是我们看到vue的欢迎页面在src下。
$树-L 2 src
源
├── app.vue
├── 资产
│ └── logo.png
├── 组件
│ └── HelloWorld.vue
├── main.js
└── 路由器
└── index.js
注意:可以看到一个vue项目的源码部分由几个部分组成
-
JS主文件main.js
-
vue主文件App.vue
-
静态文件目录资产
-
自定义组件组件
-
路由器目录
我们先看一下App.vue代码
#我们可以看到div中有一个img标签,其实就是我们刚才看到的欢迎页面上vue的logo。
其实可以看到使用了<router-view>标签,其实就是定义了默认组件,就是下面导入的HelloWorld。
$ 猫应用程序.vue
<!--显示模板-->
<模板>
<!--这里我们使用id Selector来绑定css样式-->
<div idu003d"app">
<img srcu003d"./assets/logo.png">
<路由器视图></路由器视图>
</div>
</模板>
<脚本>
从“./components/HelloWorld”导入 HelloWorld
导出默认 {
名称:“你好世界”,
组件:{
你好世界
}
}
</脚本>
<!--样式代码-->
<样式>
#app {
字体系列:'Avenir'、Helvetica、Arial、sans-serif;
-webkit-font-smoothing:抗锯齿;
-moz-osx-font-smoothing:灰度;
文本对齐:居中;
颜色:#2c3e50;
上边距:60px;
}
</style>
我们再来看看 components/HelloWorld.vue 文件:
# 其实我们刚才看到的欢迎页面下面还有一些超链接。
$ 猫组件/HelloWorld.vue
<模板>
<div classu003d"HelloWorld">
<h1>{{ 消息 }}</h1>
<h2>基本链接</h2>
<ul>
<li>
<一个
hrefu003d"https://vuejs.org"
目标u003d"_空白"
核心文档
</a>
</li>
<li>
<一个
hrefu003d"https://forum.vuejs.org"
目标u003d"_空白"
论坛
</a>
</li>
<li>
<一个
hrefu003d"https://chat.vuejs.org"
目标u003d"_空白"
社区聊天
</a>
</li>
<li>
<一个
hrefu003d"https://twitter.com/vuejs"
目标u003d"_空白"
推特
</a>
</li>
.........
其实到这里,我们基本知道整个vue项目是如何渲染资源的了。但是让我们看一下路由器的定义。
# 这实际上是关于定义我们如何访问该资源。
$ 猫路由器/index.js
从“视图”导入视图
从 'vue-router' 导入路由器
从“@/components/HelloWorld”导入 HelloWorld
Vue.use(路由器)
导出默认新路由器({
路线:[
{
路径:'/',
名称:'HelloWorld',
组件:HelloWorld
}
]
})
2.想想我们接下来要做什么。
现在我们知道了vue是如何渲染相关数据的,也知道了编码规则,但是我们的数据不是本地的,而是一个外部的API,这时候就需要想办法获取vue后端数据了。
是的,此时我们需要异步请求vue来获取数据,比如ajax,但是在大前端时代,有一个更好的工具,axios,然后在我们的vue环境中安装axios:
# 安装异步请求包
$ npm install --save axios
3. vue 渲染后端数据
模拟编写一个组件/HelloWorld组件
# 编写一个 ApiData.vue 组件
$ 猫组件/ApiData.vue
<模板>
<!--使用class来绑定css样式文件-->
<div 类u003d“你好”>
<!--{{}} 输出对象属性和函数返回值-->
<h1>{{ 消息 }}</h1>
<h1>站点:{{站点}}</h1>
<h1>网址:{{url}}</h1>
<h3>{{details()}}</h3>
<h1 v-foru003d"ydata 中的数据" :keyu003d"data">{{data}}</h1>
<h3 v-foru003d"item in xdata" :keyu003d"item">{{item}}</h3>
</div>
</模板>
<脚本>
从“axios”导入 axios
导出默认 {
名称:'apidata',
// 数据用于定义返回数据的属性
数据(){
返回{
味精:'你好,xxbandy!',
网站:“bgops”,
网址:“https://xxbandy.github.io”,
xdata:空,
ydata:空,
}
},
// 定义js的方法
方法:{
详细信息:函数(){
返回 this.site
},
},
挂载 () {
// 响应返回一个 json{"data": "data", "status", "status code", "status text", "headers": {"content-type": "application/json; charset u003d utf- 8"}, "config", "配置文件", "方法", "url","request url", "request body"}.
axios.get('http://localhost:8000/v1/line').then(response u003d> (this.xdata u003d response.data.legend_data,this.ydata u003d response.data.xAxis_data) )
}
}
</脚本>
<!--使用css的类选择器[多种样式的有效优先级]-->
<样式>
.你好{
字体粗细:正常;
文本对齐:中心;
字体大小:8pt;
}
哈
{
文本对齐:中心;
字体大小:20pt;
颜色:红色;
}
</style>
将我们的组件添加到路由中
# 添加路由
猫路由器/index.js
从“视图”导入视图
从 'vue-router' 导入路由器
从“@/components/HelloWorld”导入 HelloWorld
// 添加我们的自定义 API 数据组件
从“@/components/ApiData”导入 Hello
Vue.use(路由器)
导出默认新路由器({
路线:[
{
路径:'/',
名称:'HelloWorld',
组件:HelloWorld
},
// 这里引用我们的组件
{
路径:'/xxb',
名称:'你好',
组件:你好
}
]
})
在 App.vue 文件中定义我们的 Vue 脚本
# 添加以下内容
<脚本>
从“./components/ApiData”导入 Hello
导出默认 {
名称:'xxb',
组件:{
你好
}
}
</脚本>
运营服务
此时,我们可以运行服务来检测我们的程序。
#在vue项目主目录下运行(由于我们的golang api接口运行在8000端口,需要修改vue端口)
$ cnpm 运行开发
您的应用程序正在这里运行:http://localhost:8082


至此,我们可以看到vue成功渲染了后端Golang的API数据。虽然只是简单的渲染,但基本实现了后端API与前端vue项目的融合。接下来,我们需要根据需要继续改造。欢迎关注我的公众号