1、导入包
import "github.com/gin-gonic/gin"
在浏览器中响应:
2、Restful Api
3、响应前端
//加载静态页面
ginServer.LoadHTMLGlob("templates/*")
//响应页面返回给前端
ginServer.Get( "index" , func( context *gin.Context)) {
//context.JSON() //json数据
context.HTML( http.StatusOK, "index.html" , gin.H){
"msg" : "这是go后台传递来的数据"
}
}
//接受前端传递的参数
//url?userid = xxx &username = XXX
ginServer.GET( "/user/info" , func( context *gin.Context)){
userid := context.Query( "userid" )
username := context.Query( "username")
context.JSON( http.StatusOK , gin.H){
"userod" : userid;
"username" : username,
// /user/info/1/XXX
ginServer.GET( "/user/info/:userid/:username"), func(context *gin.Context){
userid := context.Param( "userid")
username := context.Param( "username")
context.JSON(http.StatusOK, gin.H){
"userid": userid,
"username": username,
}
}
//服务器端口
ginServer.Run( ":8082")
}
}
4、路由
ginServer.GET("/test", func(context *gin.Context)){
//重定向301
context.Redirect( http.StatusMovedPermanently, "https://www.XXX.com")
})
//404 NoRoute
ginServer.NoRoute ( func(context *gin.Context )){
context.HTML(http.StatusNotFound, "404.html", nil)
})
// 路由组 /user/add
userGroup := ginServer.Group("/user"){
userGroup.GET("/add")
userGroup.GET("/login")
userGroup.GET("/logout")
}
orderGroup := ginServer.Group("/order"){
orderGroup.GET(""/add)
orderGroup.DELETE("/delete")
}
5、中间件
自定义一个拦截器
func myHandler() (gin.HandlerFunc){
return func(context *gin.Context){
// 在后续操作中,只要调用了这个中间件都可以拿到这里的参数
context.Set( "usersession" , "userid-1")
context.Next() //放行
//cotext.Abort() //阻止
}
}
定义中间件-》注册-》调用
第二部分
1、路由
提供给前端在浏览器可以访问的链接
package router
import{
"net/http"
"github.com/gin-gonic/gin"
}
user := r.Group("/user")
{
user.GET("/info" , controllers.GetUserInfo)
user.POST( "/list" , func( ctx *gin.Context)){
ctx.String( http.StatusOK, user list")
})
user.PUT( "/add" , func( ctx *gin.Context)){
ctx.String( http.StatusOK, user add")
})
user.POST( "/delete" , func( ctx *gin.Context)){
ctx.String( http.StatusOK, user delete")
})
}
r.Run( ":9999")
}
2、JSON
定义返回给前端的数据格式
package controllers
import "github.com/gin-gonic/gin"
type JsonStruct struct{
Code int 'json: "code" '
Msg interface{} 'json: "msg" '
Data interface{} ‘json: "data" ’
Count int64 'json: "count" '
}
type JsonErrorStruct struct{
Code int 'json: "code" '
Msg interface{} 'json: "msg" '
}
func ReturnSuccess( c *gin.Context, code int, msg interface{}, data interface{}. count int64){
json "= &JsonStruct{Code: code, Msg: msg, Data: data, Count: count}
c.JSON{200 , json}
}
func ReturnEror( c *gin.Context, code int, msg interface{}){
json "= &JsonStruct{Code: code, Msg: msg}
c.JSON{200 , json}
}
3、Controller
路由引用controller,controller引用JSON封装返回的ReturnSuccess函数和ReturnError函数
package controllers
import "github.com/gin-gonic/gin"
func GetUserInfo(c *gin.Context){
ReturnSuccess(c, 0,"success","user info",1)
}
func GetList(c *gin.Context){
RetrunError(c,4004, "没有相关信息")
}
4、Gorm
Gorm是Go的一个ORM(对象关系映射)库。它提供了一个简单易用的API,用于与数据库交互、处理数据库迁移和执行常见的数据库操作,如查询、插入、更新和删除记录。它支持多种数据库后端,包括MySQL、PostgreSQL和SQLite等。
//连接MYSQL数据库
import(
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
//参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name
dsn := "user:pass@tcp( 127.0.0.1"3306) /dbname?charset = utf8mb4&parseTime=True&loc=local"
db, err := gorm.Open( mysql.Open(sdn)) , &gorm.Config{})
}
package config
const(
Mysqldb = "root:123456@tcp( 127.0.0.1:3306) /ranking?charset=utf8"
)
package dao
import(
"gin-ranking/config"
"gin-ranking/pkg/logger"
"time"
"github.com/XXX/gorm"
"github.com/XXX/gorm/dialects/mysql"
)
var(
Db *gorm.DB
err error
)
func init{
Db,err = gorm.Open("mysql" , config.Mysqldb)
if err != nil{
logger.Error( map[string]interface{}{"数据库连接失败"} :err.Error()})
}
if Db.Error != nil{
logger.Error( map[string]interface{}{"数据库连接失败"} : Db.Error()})
}
Db.DB().SetMaxIdleConns(10)
Db.DB().SetMaxOpenConns(100)
Db.DB().SetConnMaxLifetime(time.Hour)
}
package models
import "gin-ranking/dao"
type User struct{
Id int
Username String
}
func (User) TableName() string {
return "user"
}
func GetUserTest( id int )(User, error){
var user User
err := dao.Db.Where(“id= ?”, id).First(&user).Error
return user, err
}
5、数据库下进行增删改查
创建记录
user := User{Name: "XXX" , Age:18 Birthday: time.Now()}
result "= db.Create(&user) //通过数据的指针来创建
user.ID //返回插入数据的主键
result.Error //返回error
result.RowsAffected //返回插入记录的条数
User.go
func addUser(username string) (int,error){
user := User{Username: username}
err := dao.Db.Create(&user).Error
return user.Id, err
}
controller层
func (u UserController) AddUser( c *gin.Context){
username := c.DefaultPostForm("username", "")
id ,err := models.AddUser(username)
if err != nil{
ReturnError(c, 4002, "保存错误")
return
}
ReturnSuccess( c, 0 ,"保存成功", id ,1)
}
添加路由
user.POST("/add", controllers.UserController{}.AddUser)
更新
user.go
func UpdateUser(id int, username string){
dao.Db,Model(&User{}),Where(""id = ?, id).Update("username",username))
}
controller层
func (u UserController) UpdateUser( c *gin.Context){
username := c.DefaultPostForm("username", "")
idStr := c.DefaultPostForm("id" , "")
id,_ "= strconv.Atoi(idStr)
models.UpdateUser( id, username)
ReturnSuccess( c, 0 ,"更新成功", true ,1)
}
定义路由
user.POST("/update", controllers.UserController{}.UpdateUser)
6、注册、登录功能
注册:
controller层
user.go
func (u UserController) Register(c *gin.Context) {
//获取参数信息
username := c.DefaultPostForm("username", "")
password := c.DefaultPostForm("password", "")
confirmPassword := c.DefaultPostForm("confirmPassword", "")
if username == "" || password == "" || confirmPassword == "" {
ReturnError(c, 4001, "请输入正确的信息")
return
}
if password != confirmPassword {
ReturnError(c, 4001, "密码和确认密码不相同")
return
}user, err := models.GetUserInfoByUsername(username)
if user.Id != 0 {
ReturnError(c, 4001, "此用户名已存在")
return
}
_, err = models.AddUser(username, EncryMd5(password))
if err != nil {
ReturnError(c, 4002, "注册失败,请重试")
return
}ReturnSuccess(c, 0, "success", "", 1)
}
model层
user.go
func GetUserInfoByUsername(username string) (User, error) {
var user User
err := dao.Db.Where("username = ?", username).First(&user).Error
return user, err
}
func AddUser(username string, password string) (int, error) {
user := User{Username: username, Password: password, AddTime: time.Now().Unix(), UpdateTime: time.Now().Unix()}
err := dao.Db.Create(&user).Error
return user.Id, err
}
路由
user := r.Group( "/user")
{
user.POST("/register", controllers.UserController{},Register)
}
登录:
controller
user.go
func (u UserController) Register(c *gin.Context) {
//获取参数信息
username := c.DefaultPostForm("username", "")
password := c.DefaultPostForm("password", "")
confirmPassword := c.DefaultPostForm("confirmPassword", "")
if username == "" || password == "" || confirmPassword == "" {
ReturnError(c, 4001, "请输入正确的信息")
return
}
if password != confirmPassword {
ReturnError(c, 4001, "密码和确认密码不相同")
return
}user, err := models.GetUserInfoByUsername(username)
if user.Id != 0 {
ReturnError(c, 4001, "此用户名已存在")
return
}
_, err = models.AddUser(username, EncryMd5(password))
if err != nil {
ReturnError(c, 4002, "注册失败,请重试")
return
}ReturnSuccess(c, 0, "success", "", 1)
}
Session用于登录过程中的身份认证
//调包
"github.com/gin-contrib/sessions"
sessions_redis "github.com/gin-contrib/sessions/redis"
//注册
store, _:= sessions_redis.NewStore(10, "tcp" , config.RedisAddress, "" , []byte("secret"))
//使用
r.Use(sessions.Sessions("mysession",store))
controller层
session := sessions.Default(c)
session.Set("login:" + strconv.Itoa(user.Id), user.Id)
session.Save()
data := UserApi(Id: user.Id,Username: user.Username)
ReturnSuccess(c, 0, "登录成功",data ,1)
}
路由
user.POST("/login" , controllers.UserController{}.login)