1.實現方案
使用GO框架Gin用戶路由控制和返回數據。
使用Gorm用於操作數據庫。
使用jwt 生成token進行接口認證。
2.代碼邏輯
入口
import (
"gin-gorm/jwtgo"
"gin-gorm/route"
"github.com/gin-gonic/gin"
)
func main() {
router()
}
func router() {
router := gin.Default()
gin.SetMode(gin.DebugMode)
//不用認證
v1 := router.Group("/api/v1")
route.Test(v1)
//需要認證,啓動jwt中間件
v2 := router.Group("/api/auth")
// 加載自定義的JWTAuth()中間件,在整個sv1的路由組中都生效
v2.Use(jwtgo.JWTAuth())
route.User(v2)
router.Run()
}
數據訪問
package controller import ( "fmt" "gin-gorm/dao" "gin-gorm/model" "github.com/gin-gonic/gin" "net/http" "strconv" ) var db = dao.GetDB() /** 創建新用戶 { "name":"xinihuhua", "age":30 } */ func CreateUser(c *gin.Context) { var user model.UserModel if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": err.Error()}) return } //會自動創建create_at update_at deleted_at 字段信息 ret := db.Table("user").Create(&user) if ret.Error != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": ret.Error.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "msg": "創建成功", "data": user.ID}) } func FetchAllUser(c *gin.Context) { var users []model.UserModel var _users []model.TransformedUser page := c.DefaultQuery("page", "1") size := c.DefaultQuery("size", "10") limit, err := strconv.Atoi(size) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": err.Error()}) return } p, err := strconv.Atoi(page) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": err.Error()}) return } offset := (p - 1) * limit ret := db.Table("user").Limit(limit).Offset(offset).Find(&users) if ret.Error != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": ret.Error.Error()}) return } for _, item := range users { _users = append(_users, model.TransformedUser{ ID: item.ID, Name: item.Name, Age: item.Age, }) } c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "msg": "查詢列表成功", "data": gin.H{"count": ret.RowsAffected, "list": _users}}) } func FetchSingleUser(c *gin.Context) { var user model.UserModel var _user model.TransformedUser if err := c.ShouldBindUri(&_user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusOK, "msg": err.Error()}) return } ret := db.Table("user").First(&user, _user.ID) if ret.Error != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": ret.Error.Error()}) return } _user = model.TransformedUser{ ID: user.ID, Name: user.Name, Age: user.Age, } c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "msg": "查詢詳情成功", "data": _user}) } func UpdateUser(c *gin.Context) { var user model.UserModel var _user model.TransformedUser if err := c.ShouldBindUri(&_user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": err.Error()}) return } if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": err.Error()}) return } fmt.Println(_user.ID) ret := db.Table("user").Model(&_user).Updates(&user) if ret.Error != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": ret.Error.Error()}) return } _user = model.TransformedUser{ ID: user.ID, Name: user.Name, Age: user.Age, } c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "msg": "更新成功", "data": _user}) } func DeleteUser(c *gin.Context) { //var controller model.UserModel var _user model.TransformedUser if err := c.ShouldBindUri(&_user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"msg": err.Error()}) return } ret := db.Table("user").Delete(&_user) if ret.Error != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "msg": ret.Error.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "msg": "刪除成功", "data": ret.RowsAffected}) }
參考: https://gitee.com/xinihuhu/gin-gorm