文章

go-zero实战

https://github.com/zeromicro/go-zero

安装goctl

$ GO111MODULE=on go install github.com/zeromicro/go-zero/tools/goctl@latest

新建项目

$ mkdir smartscan && cd smartscan
$ go mod init smartscan 
$ go get -u github.com/zeromicro/go-zero@latest

代码快速生成

goctl api new api

logic添加逻辑代码

	resp = new(types.Response)
	resp.Message = req.Name

初始化项目依赖

cd api
go mod tidy
go run api.go

访问http://127.0.0.1:8888/from/me,成功返回证明环境没问题

集成gorm支持数据库操作

新建models/user_basic.go

package models

import "gorm.io/gorm"

type UserBasic struct {
	gorm.Model
	Identity string `gorm:"column:identity;type:varchar(255);" json:"identity"`
	Name     string `gorm:"column:name;type:varchar(50);" json:"name"`
	Password string `gorm:"column:password;type:varchar(50);" json:"password"`
}

func (table UserBasic) TableName() string {
	return "user_basic"
}

新建全局配置

common/init_gorm/enter.go

package init_gorm

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"smartscan/models"
)

func InitGorm(MysqlDataSource string) *gorm.DB {
	db, err := gorm.Open(mysql.Open(MysqlDataSource), &gorm.Config{})
	if err != nil {
		panic("数据库连接失败,error=" + err.Error())
	} else {
		fmt.Println("数据库连接成功")
	}

	err = db.AutoMigrate(&models.UserBasic{})
	if err != nil {
		panic("AutoMigrate失败,error=" + err.Error())
	}

	return db
}

api/user.api

type LoginRequest {
  Username string `json:"usernme"`
  Password string `json:"password"`
}

@server (
  prefix: /api/users
)
service users{
  @handler login
  post /login (LoginRequest) returns (string )
}


生成api文件

goctl api go -api user.api -dir .

编辑smartscan/api/internal/config/config.go

package config

import "github.com/zeromicro/go-zero/rest"

type Config struct {
  rest.RestConf
  Mysql struct{
    DataSource string
  }
}

编辑smartscan/api/etc/users.yaml

Name: users
Host: 0.0.0.0
Port: 8888
Mysql:
  DataSource: root:root@tcp(127.0.0.1:3306)/zero_db?charset=utf8mb4&parseTime=True&loc=Local

编辑user_gorm/api/internal/svc/servicecontext.go

package svc

import (
  "gorm.io/gorm"
  "zero_study/common/init_gorm"
  "zero_study/user_gorm/api/internal/config"
)

type ServiceContext struct {
  Config config.Config
  DB     *gorm.DB
}

func NewServiceContext(c config.Config) *ServiceContext {
  return &ServiceContext{
    Config: c,
    DB:     init_gorm.InitGorm(c.Mysql.DataSource),
  }
}

编辑逻辑代码 user_gorm/api/internal/logic/loginlogic.go

func (l *LoginLogic) Login(req *types.LoginRequest) (resp string, err error) {

	var user models.UserBasic
	err = l.svcCtx.DB.Take(&user, "username = ? and password = ?", req.Username, req.Password).Error

	if err != nil {
		return "", errors.New("登陆失败")
	}
	return user.Name, nil
}


运行后自动生成数据库