婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go+Vue開發一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)

Go+Vue開發一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)

熱門標簽:400開頭電話怎樣申請 貴州電話智能外呼系統 江蘇呼叫中心外呼系統有效果嗎 官渡電銷外呼管理系統怎么收費 赤峰電銷 地圖區域圖標注后導出 杭州人工智能電銷機器人費用 谷歌美發店地圖標注 利用地圖標注位置

圖形化驗證碼生成和驗證

功能介紹

在使用用戶名和密碼登錄功能時,需要填寫驗證碼,驗證碼是以圖形化的方式進行獲取和展示的。

驗證碼使用原理

驗證碼的使用流程和原理為:在服務器端負責生成圖形化驗證碼,并以數據流的形式供前端訪問獲取,同時將生成的驗證碼存儲到全局的緩存中,在本案例中,我們使用redis作為全局緩存,并設置緩存失效時間。當用戶使用用戶名和密碼進行登錄時,進行驗證碼驗證。驗證通過即可繼續進行登錄。

驗證碼庫安裝

借助開源的驗證碼工具庫可以生成驗證碼。
首先,安裝開源的驗證碼生成庫:

go get -u github.com/mojocn/base64Captcha
go get github.com/mojocn/base64Captcha@v1.2.2

驗證碼代碼示例

在下載后的base64Captcha庫的目錄中,可以看到有_example和_example_redis兩個目錄。第一個example是用于演示生成驗證碼和驗證碼的示例代碼。

按照示例代碼的說明,運行程序并在瀏覽器進行端口訪問:

go run main.go
//瀏覽器中訪問:http://localhost:8777

如下圖所示:

通過自定義配置,可以選擇不同的生成驗證碼的參數,并刷新驗證碼,同時還可以對驗證碼進行驗證。

通過exmaple目錄下的main.go程序可以看到生成驗證碼和驗證驗證碼的邏輯,此處不再贅述。

項目集成驗證碼生成和Redis緩存

通常來說,驗證碼都是有一定的實效性的,過期驗證碼也就無效了。

因此,我們考慮在項目中引入Redis作為數據緩存。當驗證碼生成后,將驗證碼存放在Redis中,并根據配置文件對Redis進行設置。

安裝go-redis庫

在項目中使用redis,需要安裝go-redis庫,可以在https://github.com/go-redis/redis中查看如何下載go-redis和配置。

增加Redis配置

在配置文件app.json中新增redis配置:

"redis_config": {
 "addr": "127.0.0.1",
 "port": "6379",
 "password": "",
 "db": 0
}

同時,新增RedisConfig結構體定義,如下所示:

type RedisConfig struct {
	Addr string `json:"addr"`
	Port string `json:"port"`
	Password string `json:"password"`
	Db int `json:"db"`
}

Redis初始化操

進行了redis配置以后,需要對redis進行初始化。可以封裝redis初始化操作函數如下所示:

type RedisStore struct {
	redisClient *redis.Client
}

var Redis *redis.Client

func InitRediStore() *RedisStore {
	config := GetConfig().RedistConfig

	Redis = redis.NewClient(redis.Options{
		Addr:  config.Addr + ":" + config.Port,
		Password: config.Password,
		DB:  config.Db,
	})

	customeStore := RedisStore{Redis}
	base64Captcha.SetCustomStore(customeStore)

	return customeStore
}

同時,為customeStore提供Set和Get兩個方法,如下所示:

func (cs *RedisStore) Set(id string, value string) {
	err := cs.redisClient.Set(id, value, time.Minute*2).Err()
	if err != nil {
		log.Println(err.Error())
	}
}

func (cs *RedisStore) Get(id string, clear bool) string {
	val, err := cs.redisClient.Get(id).Result()
	if err != nil {
		toolbox.Error(err.Error())
		return ""
	}
	if clear {
		err := cs.redisClient.Del(id).Err()
		if err != nil {
			toolbox.Error(err.Error())
			return ""
		}
	}
	return val
}

對Redis進行初始化和定義完成以后,需要在main中調用一下初始化操作InitRediStore:

func main(){
 ...
 //Redis配置初始化
	 toolbox.InitRediStore()
 ...
}

驗證碼生成和驗證

本項目中采用的驗證碼的生成庫支持三種驗證碼,分別是:audio,character和digit。我們選擇character類型。

定義Captcha.go文件,實現驗證碼的生成和驗證碼函數的定義。在進行驗證碼生成時,默認提供驗證碼的配置,并生成驗證碼后返回給客戶端瀏覽器。如下是生成驗證碼的函數定義:

//生成驗證碼
func GenerateCaptchaHandler(ctx *gin.Context) {
	//圖形驗證碼的默認配置
	parameters := base64Captcha.ConfigCharacter{
		Height:    60,
		Width:    240,
		Mode:    3,
		ComplexOfNoiseText: 0,
		ComplexOfNoiseDot: 0,
		IsUseSimpleFont: true,
		IsShowHollowLine: false,
		IsShowNoiseDot:  false,
		IsShowNoiseText: false,
		IsShowSlimeLine: false,
		IsShowSineLine:  false,
		CaptchaLen:   4,
		BgColor: color.RGBA{
			R: 3,
			G: 102,
			B: 214,
			A: 254,
		},
	}

	captchaId, captcaInterfaceInstance := base64Captcha.GenerateCaptcha("", parameters)
	base64blob := base64Captcha.CaptchaWriteToBase64Encoding(captcaInterfaceInstance)

	captchaResult := CaptchaResult{Id: captchaId, Base64Blob: base64blob}

	// 設置json響應
	tool.Success(ctx, map[string]interface{}{
		"captcha_result": captchaResult,
	})
}

驗證碼接口解析

圖形化驗證碼是用戶名和密碼登錄功能的數據,屬于Member模塊。因此在MemberController中增加獲取驗證碼的接口解析,如下:

func (mc *MemberController) Router(engine *gin.Engine){
 //獲取驗證碼
 engine.GET("/api/captcha", mc.captcha)
}

測試結果如下,能夠正常獲取到數據:

驗證碼的驗證

同理,可以對客戶端提交的驗證碼進行驗證,具體實現邏輯如下:

//驗證驗證碼是否正確
func CaptchaVerify(r *http.Request) bool {
	
	var captchaResult CaptchaResult
	//接收客戶端發送來的請求參數
	decoder := json.NewDecoder(r.Body)
	err := decoder.Decode(captchaResult)
	if err != nil {
		log.Println(err)
	}
	defer r.Body.Close()

	//比較圖像驗證碼
	verifyResult := base64Captcha.VerifyCaptcha(captchaResult.Id, captchaResult.VertifyValue)

	return verifyResult
}

用戶名密碼登錄功能開發

功能介紹

上節課已經完成了驗證碼的生成,本節課來開發用戶名、密碼和驗證碼登錄功能。

接口和參數解析定義

用戶名和密碼的登錄接口為:

/api/login_pwd

接口請求類型為POST,接口參數有三個:name,pwd,captcha。其中:captcha為驗證碼。

定義登錄參數結構體LoginParam:

//用戶名,密碼和驗證碼登錄
type LoginParam struct {
	Name  string    `json:"name"` //用戶名
	Password string    `json:"pwd"` //密碼
	Id  string    `json:"id"`// captchaId 驗證碼ID
	Value string    `json:"value"` //驗證碼
}

邏輯控制層實現登錄流程控制

方法解析

在MemberController.go文件中,編寫方法用于處理用戶名密碼登錄的解析方法如下所示:

func (mc *MemberController) Router(engine *gin.Engine){
 engine.POST("/api/login_pwd", mc.nameLogin)
}

登錄流程編程實現

定義新的func并命名為nameLogin,實現登錄流程邏輯控制:

//用戶名、密碼登錄
func (mc *MemberController) nameLogin(context *gin.Context) {

	//1、登錄參數解析
	var loginParam param.LoginParam

	err := toolbox.Decode(context.Request.Body, loginParam)
	if err != nil {
		toolbox.Failed(context, "參數解析失敗")
		return
	}

	//2、驗證驗證碼
	service := impl.NewMemberService()
	validate := toolbox.CaptchaVerify(loginParam.Id, loginParam.Value)
	fmt.Println(validate)
	if !validate {
		toolbox.ValidateFailed(context, "驗證碼不正確, 請重新驗證 ")
		return
	}

	//3、登錄
	member := service.Login(loginParam.Name, loginParam.Password)
	if member.Id == 0 {
		toolbox.Failed(context, "登錄失敗")
		return
	}
	toolbox.Success(context, member)
}

在控制層的nameLogin方法中,主要有3個邏輯處理:

  • 1、通過*gin.Context解析請求登錄請求攜帶的參數。
  • 2、從攜帶的參數中得到提交的驗證碼數據,調用驗證碼判斷驗證碼方法對驗證碼進行判斷。驗證碼驗證失敗或者驗證碼失效,直接返回登錄失敗信息。
  • 3、使用用戶名、密碼參數進行登錄,判斷登錄結果。如果登錄成功,返回用戶登錄信息,否則返回登錄失敗。

Service層實現

在功能服務層的MemberService文件中,定義和實現用戶名密碼登錄的Login方法。詳細實現如下:

//用戶登錄: 如果沒有登錄過,自動進行登錄
func (msi *MemberServiceImpl) Login(name string, password string) *model.Member {

	dao := impl.NewMemberDao()

	//1、先查詢是否已經存在該用戶
	member := dao.Query(name, password)
	if member.Id != 0 {
		return member
	}

	user := model.Member{}
	user.UserName = name
	user.Password = toolbox.EncoderSha256(password)
	user.RegisterTime = time.Now().Unix()

	result := dao.InsertMember(user)
	user.Id = result
	return user
}

在service層的Login方法中,分為兩步邏輯判斷:

1、先查詢是否已經存在該用戶,如果該用于已經存在,則直接將查詢到的用戶信息返回。

2、如果用戶不存在,將用戶信息作為新記錄保存到數據庫中,新增一條記錄。并返回用戶信息。

最后,涉及到操作數據庫的兩個方法分別是:Query和InsertMember方法。InsertMember方法之前已經編寫過,只需要重新編寫一個Query方法即可,Query方法實現如下所示:

//根據用戶名和密碼查詢用戶記錄
func (mdi *MemberDaoImpl) Query(name string, password string) *model.Member {
	var member model.Member

	password = toolbox.EncoderSha256(password)

	_, err := mdi.Where(" user_name = ? and password = ? ", name, password).Get(member)
	if err != nil {
		toolbox.Error(err.Error())
		return nil
	}

	return member
}

到此這篇關于Go+Vue開發一個線上外賣應用(用戶名密碼和圖形驗證碼)的文章就介紹到這了,更多相關Go線上外賣內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • vue實現驗證用戶名是否可用
  • vue+element-ui集成隨機驗證碼+用戶名+密碼的form表單驗證功能
  • Vue驗證用戶名是否可用的方法

標簽:鷹潭 保定 泰安 河池 宜春 黔西 武漢 松原

巨人網絡通訊聲明:本文標題《Go+Vue開發一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)》,本文關鍵詞  Go+Vue,開發,一個,線上,外賣,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go+Vue開發一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)》相關的同類信息!
  • 本頁收集關于Go+Vue開發一個線上外賣應用的流程(用戶名密碼和圖形驗證碼)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    天天操天天综合网| 精品奇米国产一区二区三区| 国产成人亚洲精品青草天美| 日韩精品免费专区| 日韩电影网1区2区| 日韩制服丝袜先锋影音| 亚洲国产精品影院| 天堂av在线一区| 人人精品人人爱| 秋霞影院一区二区| 久久99热这里只有精品| 九九在线精品视频| 国产成人在线观看免费网站| 国产精品18久久久久久久久| 国产精品1区2区3区在线观看| 国产东北露脸精品视频| 成人免费毛片高清视频| av不卡一区二区三区| 色欲综合视频天天天| 在线欧美小视频| 日韩午夜激情av| 26uuu国产日韩综合| 中文字幕一区不卡| 亚洲国产人成综合网站| 麻豆成人在线观看| 成人动漫视频在线| 欧美综合在线视频| 欧美精品一区二区蜜臀亚洲| 中文字幕av不卡| 亚洲福利一区二区三区| 免费不卡在线视频| av中文字幕一区| 3d动漫精品啪啪1区2区免费| 久久综合九色综合97婷婷女人| 国产精品久久久久久久浪潮网站| 亚洲黄色免费网站| 国内成人自拍视频| 色狠狠色噜噜噜综合网| 日韩视频免费观看高清完整版在线观看 | 色哟哟亚洲精品| 日韩欧美国产小视频| 国产精品久久久久久久午夜片 | 亚洲视频在线一区观看| 天天综合天天做天天综合| 国产精品亚洲一区二区三区在线 | 国产精品网站导航| 日韩精品亚洲一区二区三区免费| 韩国女主播成人在线| 色噜噜久久综合| 日本一区二区免费在线观看视频| 亚洲福中文字幕伊人影院| 成人免费va视频| 日韩免费视频一区| 伊人色综合久久天天人手人婷| 裸体一区二区三区| 91黄色激情网站| 国产精品久久久久久久浪潮网站| 精东粉嫩av免费一区二区三区| 色综合色综合色综合色综合色综合| 久久免费电影网| 首页欧美精品中文字幕| 欧美性色综合网| 亚洲美女免费视频| 91碰在线视频| 亚洲欧美综合色| 国产成人av在线影院| 国产亚洲综合色| 黄色日韩三级电影| 精品国产伦一区二区三区观看体验 | 精品国产免费一区二区三区香蕉| 亚洲自拍都市欧美小说| 99r国产精品| 亚洲美女屁股眼交3| 色婷婷久久99综合精品jk白丝| 国产女同互慰高潮91漫画| 国产一区二区导航在线播放| 日韩精品最新网址| 麻豆精品在线视频| 欧美va亚洲va| 国产乱人伦偷精品视频免下载| 欧美成人精品福利| 麻豆精品国产91久久久久久| 日韩免费在线观看| 久久精品噜噜噜成人88aⅴ| 91精品国产手机| 免费成人性网站| 久久久久国色av免费看影院| 国产一区二区精品久久| 中文字幕在线观看不卡| 一本一道久久a久久精品| 亚洲国产精品麻豆| 欧美一级在线视频| 国产一二精品视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 捆绑变态av一区二区三区| 欧美大胆人体bbbb| 国产大陆亚洲精品国产| 中文一区二区完整视频在线观看| 92精品国产成人观看免费| 五月激情六月综合| 久久久久国产精品厨房| 91麻豆免费看| 日本中文字幕一区二区视频| 2014亚洲片线观看视频免费| 成人av电影在线| 天天av天天翘天天综合网| 久久色.com| 欧美在线观看一区| 久久99精品国产.久久久久久| 国产精品欧美久久久久一区二区| 欧美日韩在线播放三区四区| 国产麻豆精品95视频| 亚洲图片有声小说| 国产日韩在线不卡| 欧美日韩久久不卡| 成熟亚洲日本毛茸茸凸凹| 石原莉奈在线亚洲二区| 国产精品视频在线看| 91精品国产色综合久久不卡电影 | 国产91清纯白嫩初高中在线观看| 依依成人精品视频| 国产欧美一区二区在线观看| 欧美日韩国产高清一区二区三区| 国产精品一区二区三区网站| 日韩在线一区二区| 亚洲色图在线视频| 国产视频一区不卡| 日韩三级精品电影久久久| 色老综合老女人久久久| eeuss鲁一区二区三区| 激情av综合网| 麻豆精品久久久| 免费观看在线色综合| 亚洲一区欧美一区| 亚洲少妇屁股交4| 国产精品初高中害羞小美女文| 精品毛片乱码1区2区3区| 欧美日韩亚洲另类| 欧美性大战xxxxx久久久| caoporm超碰国产精品| 国产成人av福利| 九九视频精品免费| 麻豆精品久久精品色综合| 日本麻豆一区二区三区视频| 亚洲综合色在线| 亚洲精品乱码久久久久久久久 | 国产乱码一区二区三区| 麻豆freexxxx性91精品| 奇米一区二区三区av| 偷拍与自拍一区| 日韩av一区二区三区四区| 丝袜美腿亚洲一区二区图片| 一二三四区精品视频| 亚洲一区中文在线| 午夜精品久久久久久久久久久| 亚洲午夜视频在线| 亚洲国产综合91精品麻豆| 亚洲综合激情网| 性做久久久久久免费观看| 午夜欧美在线一二页| 免费成人美女在线观看.| 精品一区二区三区久久| 国产在线精品一区在线观看麻豆| 老司机精品视频在线| 国产精品1区二区.| 99国产精品久久久久| 欧美偷拍一区二区| 精品久久久影院| 国产精品美女久久久久久| 亚洲一区在线免费观看| 捆绑变态av一区二区三区| 成人免费黄色大片| 欧美日韩一级二级三级| 久久影音资源网| 亚洲乱码国产乱码精品精可以看 | 日日夜夜一区二区| 蜜桃视频一区二区三区| 高清久久久久久| 欧美视频在线一区| 久久免费看少妇高潮| 亚洲欧美偷拍三级| 久久99精品久久久久| 91麻豆免费在线观看| 精品免费日韩av| 亚洲欧美日韩国产综合| 午夜精品久久久久久久久久| 国产成人免费在线| 欧美美女一区二区在线观看| 国产精品入口麻豆原神| 美女精品自拍一二三四| 国产69精品一区二区亚洲孕妇| 91成人免费在线视频| 国产亚洲一区二区三区四区| 一区二区三区在线免费视频| 久久99久国产精品黄毛片色诱| 成人毛片视频在线观看| 欧美美女直播网站| 国产精品福利一区| 国产精品一区二区三区乱码| 欧美一区二区三区视频在线|