[终极巨坑]golang+vue开发日记【三】,登陆界面制作(二)
写在前面
本期内容是承接上期已经做好了登陆界面来写的,不过本期是以golang为主,可能需要大家把最基本的语法结构熟悉一下:菜鸟教程。这样的话方便展开,自然而然的,本篇也是直接实战为主。这次需要依赖mysql,这个必须安装,redis最好也安装一下,以后会用到。
启动一个go项目
这里我打算启动一个go的web application,那么很多人的话都会自己从头开始,不过这的确有点麻烦,网上其实很多大佬写了一些脚手架,这里我打算直接使用bydmm大佬的singo项目来开发,可以看他的B站空间的系列教程:bydmm的个人空间。
所以首先在github把项目弄下来把:
git clone https://github.com/Gourouting/singo.git
然后把项目文件夹目录改称自己的项目名称把,就是把singo这个文件夹名字给改了,然后对应里面的所有文件import都需要把singo改成你的项目名称。
我们可以顺便看一看项目结构,说明一下:

这些文件夹的名字都很明显暴露意图,这里我打算暂时不一个个去讲,因为这里我打算说一些所有go项目应该都有的基础东西,就是main.go。如果学过编程都明白,有且只有一个程序的入口,因此这个入口就是main.go,并且他只需要满足他的package是main,并且有一个func main()就可以了:
package main
func main() {
}
项目环境配置
这个脚手架他的环境配置使用.env来配置的,他也有一个.env exmaple,如果你想知道在哪里实现的可以看conf文件夹下面的conf.go,就是通过.env设置项目下的环境变量,然后在conf.go获取而已,所以你修改一下文件名和把MYSQL_DSN修改成自己的即可,如果不懂DSN的,可以参考如下格式写:
username:password@protocol(address)/dbname?param=value
一个例子,因为默认的localhost:3306,可以不用写protocol字段
root:123456@/ysyh?charset=utf8&parseTime=True&loc=Local
go mod怎么用
go mod在这里面是包管理器,在第一篇应该已经配好了goproxy和go111module,这个包管理器在如今版本很牛逼,你只需要做2件事情就可以完成,为了演示,我们先把原来项目中的go.mod和go.sum给删了,然后在shell输入:
go mod init your_projectname
这样你就弄好了go mod,之后你在运行项目的时候他会自动检测你缺少的依赖,并且安装,你可以直接试一试:
go run main.go
本来你只有一行的go.mod文件多了一堆依赖声明,并且可以运行项目。
路由
后端第一件事是做接收请求,只有你能接受了请求,并且把他发到对应的地址才有接下来的操作,所以我们从路由看起。对于gin的路由,官方已经写的很清楚了,在项目里面就是server下的router.go,下面是关键的几个代码
func NewRouter() *gin.Engine {
r := gin.Default()
r.Use(middleware.Cors())
v1 := r.Group("/api/v1")
{
v1.POST("ping", api.Ping)
auth := v1.Group("")
auth.Use(middleware.AuthRequired())
{
auth.GET("user/me", api.UserMe)
}
}
}
我只截取了几个知识点,首先 gin.Default()就是路由了,你直接r.Run(":port")就可以直接在该端口上执行该路由。
接下来有个r.Use,这个是中间件的意思,中间件其实就是到你路由的方法前,他会做这个方法里面的内容,例如例子中的Cors,因为我几乎所有的请求都要做Cors,所以我不可能在每个方法里面都写一遍这段代码,因此我们放在中间件里面就省事了。可以看一下gin的middlerware的格式:
import(
"github.com/gin-contrib/cors"
)
func Cors() gin.HandlerFunc {
config := cors.DefaultConfig()
return cors.New(config)
}
拿Cors为例子,只是把一个gin.HandlerFunc传入Use方法里面就可以实现中间件注册。
Group方法,其实Group方法就是把他下面的地址加上一段地址,例如上例子,v1下面的post方法呢,他的地址就是/api/v1/ping,调用的三api.ping这个方法。其实单看这个功能感觉也一般,但是可以看一下下面的auth的例子,他在auth下面直接Use,做了个登陆认证,所以在auth下面的地址都有一个middlerware,没有登陆的都没办法访问。因此分组之后可以给组内成员加上middlerware,这样就可以节省很多代码量。
处理函数
路由之后呢,就会到达你想要处理这个请求的函数,我直接拿注册为例子来说明。
func UserRegister(c *gin.Context) {
var service service.UserRegisterService
if err := c.ShouldBind(&service); err == nil {
res := service.Register()
c.JSON(200, res)
} else {
c.JSON(200, ErrorResponse(err))
}
}
这个就是注册的处理函数,但是这个是这个脚手架做了封装的,但是已经有灵魂了。首先可以函数有个参数进来,是gin.Context指针的值。Context顾名思义的上下文,其实就是请求的cookie,headers,content之类的。所以我们请求的信息都要从这里面拿到。
之后有个这个c.ShouldBind(&service),这个意思是可以对请求的内容做一个验证,如果符合service这个strcut呢,他就告诉你请求的内容是没有问题的,这里可以看一看这个struct的写法
type UserRegisterService struct {
Email string `form:"email" json:"email" binding:"required,email"`
UserName string `form:"user_name" json:"user_name" binding:"required,min=5,max=30"`
Password string `form:"password" json:"password" binding:"required,min=8,max=40"`
PasswordConfirm string `form:"password_confirm" json:"password_confirm" binding:"required,min=8,max=40"`
}
除了最后的字段应该都可以看得懂的。就是最后面有段内容,gin可以读取到那里,并且根据这里的内容去判断传入的参数是否有问题,可以看一下Email这个例子,他要求前段可以用form提交或者json提交,他对应的字段是email,并且后面有个binding,这个是验证的规则了,required代表他必须存在,第二个email是代表他是一个email格式的文本。
最后呢,我们处理完了就要返回结果了,这里直接c.JSON就可以以json的格式返回了。
数据库操作
后端操作不可避免要与数据库交互的,所以这里数据库操作也是很重要的,我们这里用到的数据库叫做gorm,可以看看gorm官方文档。不过gorm只支持mysql,PostgreSQL和Sqlite3,其他的数据库可能要用别的orm。这里可以在model下init.go看到数据库的基本操作
func Database(connString string) {
db, err := gorm.Open("mysql", connString)
if err != nil {
util.Log().Panic("连接数据库不成功", err)
}
//设置连接池
//空闲
db.DB().SetMaxIdleConns(50)
//打开
db.DB().SetMaxOpenConns(100)
//超时
db.DB().SetConnMaxLifetime(time.Second * 30)
migration()
}
我这里也是把跟数据库链接比较重要的代码拿出来了,这里用单例我就没贴了。首先怎么去链接数据库,就是gorm.Open就完事了,然后第一个参数是数据库种类,第二个是DSN,DSN上面已经讲过了。
之后呢我们就要设置一些参数,上面也写的很清楚了,最后有个migration,这个是gorm的很厉害的功能,他可以自动的去生成表和修改表结构。其实就是DB.AutoMigrate这个方法,每次运行的时候,他都会先去把里面的struct加入到数据库中,例如这里的user表,就是用如下的stcut自动迁移:
// User 用户模型
type User struct {
gorm.Model
UserName string
PasswordDigest string
Email string
Status string
Avatar string `gorm:"size:1000"`
}
这里面的gorm.Model是这样的,这里面可能会涉及到gorm的软删除的内容,所以建议加上gorm.Model在你任意的表结构中:
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time `sql:"index"`
}
前端请求
我们已经把最基本的后端逻辑给弄懂了,虽然没有弄实现逻辑。但是我们Vue怎么给后端发请求?可能懂得人应该知道是ajax了,在Vue里面的话大家常用的是axios,是基于Promise机制的,首先可以安装一下。
npm install axios
然后呢在main.js里面加上(其中第二行是为了防止做Cors的时候出问题):
import axios from 'axios';
axios.defaults.withCredentials=true
Vue.prototype.$axios = axios;
之后我们在我们的项目文件做请求就可以:
this.$axios.get("http://127.0.0.1:3000/api/v1/user/me").then((res) => {
//todo
}).catch(err => {
//todo
}).finally(() => {
})
如果是post请求就在后面把请求的参数加上去。这个请求发送之后如果正确了,就会到then里面,结果就是用一个变量去接受即可。出现问题就可以catch错误,最后也可以用finally,这个函数不管成功与否都会去做。
[终极巨坑]golang+vue开发日记【三】,登陆界面制作(二)的更多相关文章
- [终极巨坑]golang+vue开发日记【一】,环境搭建篇
写在前面 这个golang+vue大部分的内容是基于bydmm(橙卡)大佬的视频学来的,我在这里只是做一下个人开发的笔记,就是图一个乐,毕竟我只是个应届毕业生,如果真的要学请:bydmm的b站空间. ...
- [终极巨坑]golang+vue开发日记【二】,登陆界面制作(一)
写在前面 本期内容是适合第一次使用vue或者golang开发的,内容会以实战的形式来讲解.看懂本段内容需要了解基础内容有html,css,最好可以看一下vue的基础.并且这里的每个知识点不可能详细解说 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(二)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...
- Android应用开发-数据存储和界面展现(二)(重制版)
SQLite数据库 // 自定义类MyOpenHelper继承自SQLiteOpenHelper MyOpenHelper oh = new MyOpenHelper(getContext(), &q ...
- 【Android UI设计与开发】2.引导界面(二)使用ViewPager实现欢迎引导页面
1.实现的效果 2.编码前的准备工作 ViewPager是Android3.0之后提供的新特性,所以要想让你的应用向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自 ...
- Android应用开发-数据存储和界面展现(二)
SQLite数据库 // 自定义类MyOpenHelper继承自SQLiteOpenHelper MyOpenHelper oh = new MyOpenHelper(getContext(), &q ...
- vue开发环境搭建Mac版
一.前言 要做一个移动端app,面对webapp最流行的三个技术React,angular,vue,三选一,如何选,可参考blog移动app技术选型,react,angular, vue, 下面是对 ...
- 使用vue开发项目需要注意的问题和可能踩到的坑
最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下: 一.生命钩子使用需要注意的地方 1.beforeCreat ...
- oracle入坑日记<三>用户详解(角色理解)
1 用户是什么 1.1.权限管理是Oracle的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种.如果把Oracl ...
随机推荐
- XSS靶场练习
0x00:前言 一个XSS练习平台,闯关形式,一共20关 0x01:开始 第一行都是代码插入点,下面几行是payloads(插入点和payloads中间空一行) LV1 <script>a ...
- SpringMVC中控制器接收JSP页面表单的参数接收方式详解及细节注意(400错误)
控制器方法中参数的接收 (1)以前的参数接收: String param = req.getParameter(name): (2)SpringMVC简化这个操作,只需要给控制器方法添加参数即可 a ...
- frameset frame 页面空白
<html style="background:#213039;"> <head> <title>网站后台管理中心</title> ...
- ELK安装过程中一些注意的地方
安装流程比较简单,只需要下载安装包,解压安装包,修改配置文件,然后启动组件即可,但还是遇到一些小问题,这里做一下记录. 各个组件版本号需要保持一样,例如都使用7.1.1版本 es不能以root账户启用 ...
- IE浏览器下AJAX缓存问题导致数据不更新的解决办法
一直知道使用ajax的时候,有的时候会出现数据缓存的问题,当时也没有深究,就是所有的简单粗暴的全部加上cache:false,或者使用在url处加上随机时间函数 今天无意间看见了为什么会出现缓存的原因 ...
- 201671030103 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 任课教师首页链接 这个作业的要求在哪里 作业链接地址 课程学习目标 (1)掌握软件项目评审会流程 (2)反思总结课程学习内容 任务一: 团队项目Github仓库中提交 ...
- Eslint 允许使用双等号
资料 网址 ESlint: Expected !== and instead saw != https://stackoverflow.com/questions/48375316/eslint-ex ...
- 循环递减算法 [a,b,c] 求 ab,ac,bc
有数组 lineList=[a,b,c] 求所有不同的两两组合 ,结果:ab,ac,bc lineList.forEach((lineA,lineIndex)=>{ ==len){ return ...
- zzulioj - 2558 数字的差值
首先感谢抱抱熊dalao的题解,提供了一种比较简单的思路.[抱抱熊dalao的题解](https://note.youdao.com/ynoteshare1/index.html?id=52f087d ...
- 洛谷P2504 [HAOI2006]聪明的猴子题解
题目 记录悲伤 已知猴子的数量以及猴子跳的最大距离 已知数的数量以及树的坐标 最小生成树 每两棵树之间的距离需要枚举来计算 算出最大值之后再与n只猴子进行比较记录答案 需要注意 在使用最小生成树的时候 ...