type
User
struct
{
ID
int
`gorm:"primaryKey"`
Username
string
`gorm:"not null;unique;size:255"`
Password
string
`gorm:"not null"`
Mobile
string
`gorm:"unique;not null;"`
然后在common/db.go加入
func InitDB(){
db, err := gorm.Open(driverName, args)
db.AutoMigrate(&model.User{})
func GetDB(){
go run main.go
后可以看到mysql中自动生成表users
然后就可以开始写用户注册的逻辑,在gin-demo文件夹下创建controller/user.go,如下
package controller
import (
"gin-demo/common"
"gin-demo/model"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"golang.org/x/crypto/bcrypt"
"math/rand"
"net/http"
"time"
func Register(c *gin.Context){
db := common.GetDB()
reqUser := model.User{}
c.Bind(&reqUser)
username := reqUser.Username
mobile := reqUser.Mobile
password := reqUser.Password
if len(mobile) != 11 {
c.JSON(http.StatusUnprocessableEntity,gin.H{
"code":422,
"msg":"手机号不为11位",
return
if len(password) < 6 {
c.JSON(http.StatusUnprocessableEntity,gin.H{
"code":422,
"msg":"密码必须大于6位",
return
if len(username) == 0 {
username = RandomString(10)
if isMobileExist(db,mobile){
c.JSON(http.StatusUnprocessableEntity,gin.H{
"code":422,
"msg":"当前手机号已经注册",
return
hashPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
c.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 500,
"msg": "加密错误",
return
newUser := &model.User{
Username:username,
Password: string(hashPassword),
Mobile: mobile,
db.Create(newUser)
c.JSON(http.StatusOK,gin.H{
"code":200,
"msg":"注册成功",
func RandomString(n int) string {
var letters = []byte("abcdefghijklmnopqlstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_")
result := make([]byte, n)
rand.Seed(time.Now().Unix())
for i := range result {
result[i] = letters[rand.Intn(len(letters))]
return string(result)
func isMobileExist(db *gorm.DB, mobile string) bool {
var user model.User
db.Where("mobile = ?", mobile).First(&user)
if user.ID != 0 {
return true
return false
然后在main.go里这样写
package main
import (
"gin-demo/common"
"gin-demo/controller"
"github.com/gin-gonic/gin"
"net/http"
func main(){
r := gin.Default()
common.InitDB()
db := common.GetDB()
defer db.Close();
r.GET("/ping",func(c *gin.Context){
c.JSON(http.StatusOK,gin.H{
"code":200,
"msg":"pong",
r.POST("/user/register",controller.Register)
r.Run(":8888")
启动后,在postman中进行测试
注册成功,数据插入
即可。
这里是简单的,后续会将上面这段代码分离。以及db的配置会加入viper来进行读取。
接下来是登录的接口。
登录的接口后,就将整个代码重新整理分离。努力学习。
一直以为文件夹是gin-demo没想到是go-demo,好气!!
在gin-demo下创建model目录,目录下创建user.go来写user的结构体user.go的内容如下:package model// Usertype User struct { ID int `gorm:"primaryKey"`//设置为主键 Username string `gorm:"not null;unique;size:255"`//唯一,不为空 Password string `gorm:"not null"` Mobile string `gorm:"uniqu
1、在
gin框架中文文档是这么介绍的
Gin 是一个用 Go (Golang) 编写的 web
框架。 它是一个类似于 martini 但拥有更好性能的 API
框架,由于 httprouter,速度提高了近 40 倍。 如果你是性能和高效的追求者,你会爱上
Gin。两款Web
框架相比较,
Gin自己说他比Martini要强很多。
2、
Gin的基本
使用方法
首先在项目终端下载安装
gin包:
go get -u github.com/
gin-gonic/
gin
举一个简单的例子:
package main
最近学习了gin基础,实现了一个简单的基于gin+postgresql+redis技术的登陆注册接口,今天是周五,就总结一下在项目中学到的东西吧
文章目录前言项目结构实现过程数据库连接池的设计模型的设计缓存层的设计中间件的设计服务器状态码的封装文件配置解析封装控制器的设计注册路由
项目的需求很简单,实现一个登陆注册的接口,当用户第一次登陆时,系统会去redis中验证用户信息,如果没有则会去p...
包含前端vue,后端
gin框架的登录
注册以及mysql数据库的连接
使用,主要是练习后端
框架的
使用,前端简陋见谅。
一.前端vue部分
首先搭建vue
框架,可以参考我的这篇博客https://blog.csdn.net/m0_49049914/article/details/112527510
前端登录页面展示如下
代码如下:主要是
使用的vant组件库
<template>
<van-form @submit="onSubmit">
在提供的引用中,没有提到关于gin框架使用minio的信息。因此,我无法回答关于gin框架使用minio的问题。如果您有其他关于gin框架或minio的问题,我将很乐意帮助您回答。
#### 引用[.reference_title]
- *1* *2* *3* [Go语言 gin框架集成Casbin实现访问权限控制](https://blog.csdn.net/weixin_37717557/article/details/108983361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]