使用go的gin和gorm框架實現切換身份的接口,接收前端發送的JSON對象,查詢數據庫并更新,返回前端信息
接收前端發來的JSON對象,包含由openid和登陸狀態組成的一個string和要切換的身份碼int型
后端接收后判斷要切換的身份是否低于該用戶身份,是則更新數據庫的登錄狀態為要切換的身份碼,返回由openid和新的登錄狀態組成的string,否則返回錯誤碼和權限不足的錯誤信息
測試代碼
創建兩個結構體,一個用來查詢數據庫,一個用來接收前端發送的JSON對象
連接數據庫,接收前端POST請求,提取數據,查庫,處理,返回信息
package mainimport ("github.com/gin-gonic/gin""gorm.io/driver/mysql""gorm.io/gorm""log""net/http""strconv"
)type User struct {Openid string `json:"openid" gorm:"primaryKey"`IdCode int `json:"idcode"`LoginState int `json:"login_state"`
}
type RequestData struct {OpenidAndLoginStatus string `json:"openidAndLoginState"`IdCodeToChange int `json:"idcodeToChange"`
}func main() {dsn := "username:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {log.Fatal(err)}err = db.AutoMigrate(&User{})if err != nil {log.Fatal(err)}router := gin.Default()// 接口測試地址 192.168.160.128:8080/updaterouter.POST("/update", func(c *gin.Context) {var requestData RequestDataif err := c.ShouldBindJSON(&requestData); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON data"})return}openidAndLoginState := requestData.OpenidAndLoginStatusopenID := openidAndLoginState[:len(openidAndLoginState)-1]loginStatus, _ := strconv.Atoi(openidAndLoginState[len(openidAndLoginState)-1:])idCode := requestData.IdCodeToChangevar user Userresult := db.Where("openid = ?", openID).First(&user)if result.Error != nil {c.JSON(http.StatusOK, gin.H{"error": "Invalid openid"})return}if user.IdCode >= idCode {user.LoginState = loginStatusresult = db.Save(&user)if result.Error != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": "Database save error"})return}} else {c.JSON(http.StatusOK, gin.H{"error": "Insufficient privileges"})return}response := openID + strconv.Itoa(idCode)c.JSON(http.StatusOK, gin.H{"response": response})})err = router.Run(":8080")if err != nil {return}
}