首先说一下个人博客的需求
- 实现账户的注册和登录功能
- 实现对文章的增删改查
账户的注册和登录功能
首先连接数据库
在common包下创建一个database.go
package common
import (
"boke/middleware"
_ "github.com/jinzhu/gorm/dialects/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// models的初始化使用
var DB *gorm.DB
func InitDB() *gorm.DB {
dsn := "root:qj251213`@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database, err:" + err.Error())
}
//迁移
db.AutoMigrate(&middleware.User{})
db.AutoMigrate(&middleware.Passage{})
DB = db
return db
}
func GetDB() *gorm.DB{
return DB
}
接着就是在数据库中创建一个表用来承接我们要创建的数据 创建一个middleware文件夹,创建user.go
package middleware
import (
"gorm.io/gorm"
)
type User struct {
//ID int `gorm:"primary_key" json:"id"`
//CreatedOn int `json:"created_on"`
//ModifiedOn int `json:"modified_on"`
gorm.Model
Name string `gorm:"varchar(20);not null"`
Telephone string `gorm:"varchar(20);not null;unique"`
Password string `gorm:"size:255;not null"`
}
然后再创建一个models文件夹创建models.go
注册
func Register(c *gin.Context){
//获取初始化的数据库
db := common.GetDB()
// 获取参数
var requestUser middleware.User
c.Bind(&requestUser)
name := requestUser.Name
telephone := requestUser.Telephone
password := requestUser.Password
//数据验证
if len(name) == 0 {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "用户名不能为空",
})
return
}
if len(telephone) != 11 {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "手机号必须为11位",
})
return
}
if len(password) < 6 {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "密码不能少于6位",
})
return
}
//判断手机号是否存在
var user middleware.User
db.Where("telephone = ?", telephone).First(&user)
if user.ID != 0 {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "用户已存在",
})
return
}
//创建用户
hasedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 500,
"message": "密码加密错误",
})
return
}
newUser := middleware.User{
Name: name,
Telephone: telephone,
Password: string(hasedPassword),
}
db.Create(&newUser)
//返回结果
c.JSON(http.StatusOK, gin.H{
"code": 200,
"message": "注册成功",
})
}
登录
func Login(c *gin.Context){
db := common.GetDB()
// 获取参数
var requestUser middleware.User
c.Bind(&requestUser)
telephone := requestUser.Telephone
password := requestUser.Password
//数据验证
if len(telephone) != 11 {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "手机号必须为11位",
})
return
}
if len(password) < 6 {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "密码不能少于6位",
})
return
}
//判断手机号是否存在
var user middleware.User
db.Where("telephone = ?", telephone).First(&user)
if user.ID == 0 {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "用户不存在",
})
return
}
//判断密码是否正确
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"message": "密码错误",
})
}
//返回结果
c.JSON(http.StatusOK, gin.H{
"code": 200,
"message": "登录成功",
})
}
然后创建一个routers文件夹,创建一个router.go 文件,用来连接路由
package routers
package routers
import (
"boke/models"
"github.com/gin-gonic/gin"
)
func CollectRoutes(r *gin.Engine) *gin.Engine{
//注册
r.POST("/register", models.Register)
// 登录
r.POST("/login", models.Login)
return r
}
创建main.go
package main
import (
"boke/common"
"boke/routers"
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
//获取初始化的数据库
db :=common.InitDB()
fmt.Println(db)
r := gin.Default()
// 启动路由
routers.CollectRoutes(r)
//在9090端口启动服务
panic(r.Run(":8000"))
}
这样登录和注册功能就实现了