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
测试接口是不是可以正常使用