02-cloud-disk搭建开发环境

项目技术栈

go-zero
mysql
redis
xorm

创建项目

使用golang创建好项目
打开终端,下载xorm   go get xorm.io/xorm
引入go-zero
go install github.com/zeromicro/go-zero/tools/goctl@latest(go version 1.16)
go get -u github.com/zeromicro/go-zero/tools/goctl(go version 1.16 之前)
goctl api new greet
go mod tidy
go run greet.go -f etc/greet-api.yaml  这个时候就可以看到cloud-disk运行起来

开发第一个handler

进入greet目录找到greet.api
在service greet-api{

}
增加
@handler PhoneCodeSendRegister
post /phone/code/send/register(PhoneCodeSendRequest) returns (Response)
然后再定义requset和response
type PhoneCodeSendRequest {
	Phone string `json:"phone"`
}
type Response {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}
然后在终端执行
goctl api go  -api greet.api -dir . --style go_zero
会在greet/internal/handler & logic生成对应的类  
在PhoneCodeSendRegisterLogic去开发业务逻辑
整合阿里云的短信服务去发送验证码

整合阿里云短信服务

下载sdk在greet上层目录执行
go get github.com/alibabacloud-go/darabonba-openapi/v2/client
go get github.com/alibabacloud-go/dysmsapi-20170525/v3
去阿里云申请短信服务 & 创建短信模板
点击账户头像-AccessKey管理里面可以获取	AccessKeyId  & AccessKeySecret
短信服务-国内消息    签名管理和模板管理可以获取到 SignName  &  TemplateCode

UserBasic

package models
import "time"
type UserBasic struct {
	Id          int
	Identity    string
	Name        string
	Password    string
	Email       string
	Phone       string
	NowVolume   int       `json:"now_volume"`
	TotalVolume int       `json:"total_volume"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
	DeletedAt   time.Time `json:"deleted_at"`
}
func (table UserBasic) TableName() string {
	return "user_basic"
}

初始化mysql和redis

go get github.com/go-redis/redis/v8
go get github.com/satori/go.uuid
go get  github.com/go-sql-driver/mysql
package models
import (
	"fmt"
	"github.com/go-redis/redis/v8"
	_ "github.com/go-sql-driver/mysql"
	"xorm.io/xorm"
)

var Engine = Init()
var Redis = InitRedis()
func Init() *xorm.Engine {
	engine, err := xorm.NewEngine("mysql", "name:password@tcp(xxxxxx:3306)/go?charset=utf8")
	if err != nil {
		fmt.Printf("mysql")
		fmt.Printf(err.Error())
	}
	return engine
}
func InitRedis() *redis.Client {
	return redis.NewClient(&redis.Options{
		Addr:     "xxxxxxx:6379",
		Password: "xxxx", // no password set
		DB:       0,          // use default DB
	})
}

创建client

func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
	var config = &openapi.Config{
		// 必填,您的 AccessKey ID
		AccessKeyId: accessKeyId,
		// 必填,您的 AccessKey Secret
		AccessKeySecret: accessKeySecret,
	} // 访问的域名
	config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
	_result = &dysmsapi20170525.Client{}
	_result, _err = dysmsapi20170525.NewClient(config)
	return _result, _err
}

完整调用代码

func (l *PhoneCodeSendRegisterLogic) PhoneCodeSendRegister(req *types.PhoneCodeSendRequest) (resp *types.PhoneCodeSendReply, err error) {
	// todo: add your logic here and delete this line
	//判断是否已经注册
	resp = new(types.PhoneCodeSendReply)
	cnt, err := models.Engine.Where("phone=?", req.Phone).Count(new(models.UserBasic))
	if err != nil {
		return
	}
	if cnt > 0 {
		resp.Code = 200
		resp.Msg = "Error"
		resp.Data = "该手机号已注册"
		return
	}
	//发送短信
	client, err := helper.CreateClient(tea.String(define.AccessKeyId), tea.String(define.AccessKeySecret))
	if err != nil {
		log.Printf(err.Error())
		resp.Code = 200
		resp.Msg = "Error"
		resp.Data = "获取验证码失败"
		return
	}
	code := helper.RandCode()
	//生成code
	par, _ := json.Marshal(map[string]interface{}{
		"code": code,
	})
	//构造发送参数
	sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
		PhoneNumbers:  tea.String(req.Phone),
		SignName:      tea.String("xxxx"),
		TemplateCode:  tea.String("xxxxxx"),
		TemplateParam: tea.String(string(par)),
	}
	tryErr := func() (_e error) {
		defer func() {
			if r := tea.Recover(recover()); r != nil {
				_e = r
			}
		}()
		// 复制代码运行请自行打印 API 的返回值
		_, err := client.SendSmsWithOptions(sendSmsRequest, &util.RuntimeOptions{})
		if err != nil {
			fmt.Println(err.Error())
			return err
		}
		return nil
	}()

	if tryErr != nil {
		var error = &tea.SDKError{}
		if _t, ok := tryErr.(*tea.SDKError); ok {
			error = _t
		} else {
			error.Message = tea.String(tryErr.Error())
		}
		// 如有需要,请打印 error
		_, err = util.AssertAsString(error.Message)
		if err != nil {
			log.Printf(err.Error())
			resp.Code = 200
			resp.Msg = "Error"
			resp.Data = "获取验证码失败"
			return
		}
	}
	//写到redis里面
	models.Redis.Set(l.ctx, req.Phone, code, time.Second*time.Duration(define.CodeExpire))
	resp.Code = 200
	resp.Msg = "Success"
	resp.Data = code
	return

}

验证

开发后之后运行go run greet.go -f etc/greet-api.yaml
测试接口是不是可以正常使用

最后

xorm官方文档
go-zero官方文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值