1. 調用的時序圖
2. 安裝redis
因爲短息驗證碼是存在redis服務中,所以需要安裝redis,redis的安裝比較簡單可以自行安裝即可。
3. 啓動redis
4. 監聽端口代碼
package main
import (
"fmt"
"log"
"net/http"
"src/login"
)
func main() {
fmt.Println("server start")
http.HandleFunc("/login", loginByPassword)
// 獲取驗證碼
http.HandleFunc("/getPhoneCode", getPhoneCode)
// 校驗驗證碼
http.HandleFunc("/checkCode", checkCode)
if err := http.ListenAndServe(":8888", nil); err != nil{
log.Fatal("Server error", err)
}
fmt.Println("server out")
}
func loginByPassword(w http.ResponseWriter, r *http.Request) {
login.Login(w, r)
}
func getPhoneCode(w http.ResponseWriter, r *http.Request) {
login.GetPhoneCode(w, r)
}
func checkCode(w http.ResponseWriter, r *http.Request) {
login.CheckCode(w, r)
}
5. 獲取驗證碼及調用短息服務
// 獲取手機號驗證碼
func GetPhoneCode(w http.ResponseWriter, r *http.Request) {
var result pojo.Resp
query := r.URL.Query()
phone := query["phone"][0]
// 1.手機號校驗
// 2.獲取隨機驗證碼
code := randCode()
// 3. redis記錄
redis.SetMini(phone, code,5)
// 4. 異步發送驗證碼
go func() {
// time.Sleep(time.Duration(10)*time.Second)
send(phone, code)
}()
// 5.返回
result.Msg = "success"
result.Data = code
if err := json.NewEncoder(w).Encode(result); err != nil {
log.Fatal(err)
}
}
6. 隨機生成6位數短息驗證碼
// 6位隨機驗證碼
func randCode() string {
rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
rndCode := fmt.Sprintf("%06v", rnd.Int31n(1000000))
fmt.Println(rndCode)
return rndCode
}
7. redis的連接
package redis
import (
"log"
"strconv"
"github.com/go-redis/redis"
"fmt"
)
var server = "127.0.0.1"
var port = 6379
var password = ""
var db = 0
// 注意int轉字符串
var addr = server + ":" + strconv.Itoa(port)
/*
基於go-redis
github地址:https://github.com/go-redis/redis
redis連接demo,連接數等自行設置
*/
func GetClient() (clint *redis.Client) {
fmt.Println(addr)
fmt.Println(port)
client := redis.NewClient(&redis.Options{
Addr: addr,
Password: password, // no password set
DB: db, // use default DB
})
pong, err := client.Ping().Result()
log.Println(pong, err)
return client
}
8. redis的工具類型如get或set
package redis
import (
"github.com/go-redis/redis"
_ "github.com/go-redis/redis"
"time"
)
/*
基於go-redis
github地址:https://github.com/go-redis/redis
設置小時demo
*/
func SetHour() (result *redis.StatusCmd) {
client := GetClient()
// 注意time.Hour 要乘以一個具體的數值
set := client.Set("hour", "3個小時", time.Hour*3)
return set
}
/*
基於go-redis
github地址:https://github.com/go-redis/redis
設置分鐘demo
*/
func SetMini(key string, value string, i int64) (result *redis.StatusCmd) {
client := GetClient()
// 注意time.Minute 要乘以一個具體的數值
set := client.Set(key, value, time.Duration(i) * time.Minute)
return set
}
/*
基於go-redis
github地址:https://github.com/go-redis/redis
get的demo
*/
func Get(key string) string {
c := GetClient()
get := c.Get(key)
result, _ := get.Result()
return result
}
9. 基本的代碼如上,如有疑問或需要源碼歡迎留言溝通。