用戶注冊(cè)

1.注冊(cè)流程分析

客戶端先發(fā)送一個(gè)手機(jī)號(hào)碼到后端獲取驗(yàn)證碼财破,此時(shí)“獲取驗(yàn)證碼”按鈕是激活狀態(tài)嘁酿,“下一步”按鈕是禁用狀態(tài)

點(diǎn)擊“獲取驗(yàn)證碼”按鈕咸包,該按鈕60秒倒計(jì)時(shí)變?yōu)榻脿顟B(tài),等待用戶接收驗(yàn)證碼并輸入

后端根據(jù)這個(gè)手機(jī)號(hào)先到數(shù)據(jù)庫(kù)查詢?cè)撌謾C(jī)號(hào)是否已被注冊(cè)闪唆,如果已經(jīng)被注冊(cè)就返回“該手機(jī)號(hào)已被注冊(cè)”,不繼續(xù)后續(xù)步驟

如果沒(méi)被注冊(cè),后端為該手機(jī)號(hào)生成一個(gè)隨機(jī)6位驗(yàn)證碼存在Redis中(指定時(shí)限),然后將該驗(yàn)證碼通過(guò)阿里云的短信服務(wù)接口發(fā)送給客戶端

客戶端收到短信徒探,輸入驗(yàn)證碼,點(diǎn)擊下一步

后端收到客戶端發(fā)送的驗(yàn)證碼喂窟,就將其和Redis中暫存的驗(yàn)證碼比對(duì)测暗,如果一致就放行央串,否則提示“驗(yàn)證碼錯(cuò)誤”

驗(yàn)證碼正確,進(jìn)入填寫密碼的頁(yè)面碗啄,填寫完畢提交到后端质和,加密存入數(shù)據(jù)庫(kù),注冊(cè)成功稚字,讓用戶選擇去登錄饲宿,還是回到首頁(yè)

2.Redis準(zhǔn)備

GitHub下載

解壓后放入本地目錄

運(yùn)行運(yùn)行redis-server

cdD:\tools\redisredis-server.exeredis.windows.conf

image.png

再開一個(gè)命令行窗口,進(jìn)入redis目錄胆描,運(yùn)行redis-cli.exe命令瘫想,進(jìn)行一下基本操作

set是設(shè)置鍵值對(duì),keys是列出所有鍵昌讲,get是獲取指定鍵的值国夜,del是刪除指定的鍵值

image.png

3. 阿里云短信服務(wù)

短信服務(wù)

API文檔

demo程序,注意修改其中***的內(nèi)容為自己的

package com.soft1721.jianyue.api.util;importcom.aliyuncs.CommonRequest;importcom.aliyuncs.CommonResponse;importcom.aliyuncs.DefaultAcsClient;importcom.aliyuncs.IAcsClient;importcom.aliyuncs.exceptions.ClientException;importcom.aliyuncs.exceptions.ServerException;importcom.aliyuncs.http.MethodType;importcom.aliyuncs.profile.DefaultProfile;/**

* 短消息測(cè)試程序

*/publicclassSMSTest{publicstaticvoidmain(String[] args){? ? ? ? DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","*******","*****");? ? ? ? IAcsClient client =newDefaultAcsClient(profile);? ? ? ? CommonRequest request =newCommonRequest();? ? ? ? request.setMethod(MethodType.POST);? ? ? ? request.setDomain("dysmsapi.aliyuncs.com");? ? ? ? request.setVersion("2017-05-25");? ? ? ? request.setAction("SendSms");? ? ? ? request.putQueryParameter("RegionId","cn-hangzhou");? ? ? ? request.putQueryParameter("PhoneNumbers","****");? ? ? ? request.putQueryParameter("SignName","****");? ? ? ? request.putQueryParameter("TemplateCode","SMS_135805735");? ? ? ? request.putQueryParameter("TemplateParam","{\"code\":\"888888\"}");try{? ? ? ? ? ? CommonResponse response = client.getCommonResponse(request);? ? ? ? ? ? System.out.println(response.getData());? ? ? ? }catch(ServerException e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }catch(ClientException e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }? ? }}

image.png

4.后端

pom.xml剧蚣,增加阿里云短信服務(wù)SDK依賴和SpringBoot集成redis依賴

com.aliyunaliyun-java-sdk-core4.0.3org.springframework.bootspring-boot-starter-data-redis

util包的StringUtil類增加一個(gè)方法支竹,用來(lái)獲取六位隨機(jī)數(shù)驗(yàn)證碼

publicstaticStringgetVerifyCode(){? ? Random random =newRandom();? ? StringBuilder stringBuilder =newStringBuilder();for(inti =0; i <6; i++) {? ? ? ? stringBuilder.append(String.valueOf(random.nextInt(10)));? ? }returnstringBuilder.toString();}

編寫SMSUtil短信發(fā)送工具類,主要將手機(jī)號(hào)和短信字符串分離成變量鸠按,main方法測(cè)試通過(guò)后即可刪除

importcom.aliyuncs.CommonRequest;importcom.aliyuncs.CommonResponse;importcom.aliyuncs.DefaultAcsClient;importcom.aliyuncs.IAcsClient;importcom.aliyuncs.exceptions.ClientException;importcom.aliyuncs.exceptions.ServerException;importcom.aliyuncs.http.MethodType;importcom.aliyuncs.profile.DefaultProfile;/**

* 短信發(fā)送工具類,返回生成的隨機(jī)驗(yàn)證碼

*/publicclassSMSUtil{publicstaticStringsend(String mobile){? ? ? ? DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","*******","*******");? ? ? ? IAcsClient client =newDefaultAcsClient(profile);? ? ? ? CommonRequest request =newCommonRequest();? ? ? ? request.setMethod(MethodType.POST);? ? ? ? request.setDomain("dysmsapi.aliyuncs.com");? ? ? ? request.setVersion("2017-05-25");? ? ? ? request.setAction("SendSms");? ? ? ? request.putQueryParameter("RegionId","cn-hangzhou");? ? ? ? request.putQueryParameter("PhoneNumbers", mobile);? ? ? ? request.putQueryParameter("SignName","*****");? ? ? ? request.putQueryParameter("TemplateCode","SMS_135805735");? ? ? ? String verifyCode = StringUtil.getVerifyCode();? ? ? ? request.putQueryParameter("TemplateParam","{\"code\":"+ verifyCode +"}");try{? ? ? ? ? ? CommonResponse response = client.getCommonResponse(request);? ? ? ? ? ? System.out.println(response.getData());? ? ? ? }catch(ServerException e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }catch(ClientException e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }returnverifyCode;? ? }publicstaticvoidmain(String[] args){? ? ? ? System.out.println(send("139****1489"));? ? }}

mapper層增加insertUser方法饶碘,自行實(shí)現(xiàn)(id和token不用給值)

service接口增加注冊(cè)方法

voidsignUp(UserDTO userDTO);

signUp方法實(shí)現(xiàn)代碼

@OverridepublicvoidsignUp(UserDTO userDTO){? ? User user1 =newUser();? ? user1.setMobile(userDTO.getMobile()); user1.setPassword(StringUtil.getBase64Encoder(userDTO.getPassword()));? ? user1.setNickname("新用戶"); user1.setAvatar("http://ppeto2k90.bkt.clouddn.com/avatar/default.png");? ? user1.setRegtime(newDate());? ? user1.setStatus((short)1);? ? userMapper.insert(user1);}

單元測(cè)試

@TestpublicvoidsignUp(){? ? UserDTO userDTO =newUserDTO();? ? userDTO.setMobile("139****1489");? ? userDTO.setPassword("111");? ? userService.signUp(userDTO); }

controller層編寫前目尖,先到StatusConst和MsgConst添加需要用到的常量

publicstaticfinalintMOBILE_EXIST =5;publicstaticfinalintVERIFYCODE_ERROR =6;

publicstaticfinalString MOBILE_EXIST ="手機(jī)號(hào)已被注冊(cè)";publicstaticfinalString VERIFYCODE_ERROR ="驗(yàn)證碼錯(cuò)誤";

獲取短信驗(yàn)證碼接口

@PostMapping(value ="/verify")publicResponseResultgetVerifyCode(@RequestParam("mobile")String mobile){? ? ? ? User user = userService.getUserByMobile(mobile);//手機(jī)號(hào)已經(jīng)被注冊(cè)if(user !=null) {returnResponseResult.error(StatusConst.MOBILE_EXIST, MsgConst.MOBILE_EXIST);? ? ? ? }else{//發(fā)送驗(yàn)證碼String verifyCode = SMSUtil.send(mobile);//? ? ? ? ? ? String verifyCode = StringUtil.getVerifyCode();System.out.println(verifyCode);//手機(jī)號(hào)和驗(yàn)證碼作為鍵值對(duì)存入redis中redisService.set(mobile, verifyCode);returnResponseResult.success();? ? ? ? }? ? }

驗(yàn)證短信碼接口

@PostMapping(value ="/check")public ResponseResult checkVerifyCode(@RequestParam("mobile") String mobile, @RequestParam("verifyCode") String verifyCode) {//從Redis中取出這個(gè)手機(jī)號(hào)的驗(yàn)證碼? ? String code = redisService.get(mobile).toString();//System.out.println(code +"---");//System.out.println(verifyCode);//和客戶端傳過(guò)來(lái)的驗(yàn)證碼比對(duì)if(code.equals(verifyCode)) {returnResponseResult.success();? ? }else{returnResponseResult.error(StatusConst.VERIFYCODE_ERROR, MsgConst.VERIFYCODE_ERROR);? ? }}

注冊(cè)接口

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扎运,隨后出現(xiàn)的幾起案子瑟曲,更是在濱河造成了極大的恐慌,老刑警劉巖豪治,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洞拨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡负拟,警方通過(guò)查閱死者的電腦和手機(jī)烦衣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掩浙,“玉大人花吟,你說(shuō)我怎么就攤上這事〕Γ” “怎么了衅澈?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谬墙。 經(jīng)常有香客問(wèn)我今布,道長(zhǎng)经备,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任部默,我火速辦了婚禮侵蒙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甩牺。我一直安慰自己蘑志,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布贬派。 她就那樣靜靜地躺著急但,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搞乏。 梳的紋絲不亂的頭發(fā)上波桩,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音请敦,去河邊找鬼镐躲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侍筛,可吹牛的內(nèi)容都是我干的萤皂。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼匣椰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裆熙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起禽笑,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤入录,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后佳镜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僚稿,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年蟀伸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚀同。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡望蜡,死狀恐怖唤崭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脖律,我是刑警寧澤谢肾,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站小泉,受9級(jí)特大地震影響芦疏,放射性物質(zhì)發(fā)生泄漏冕杠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一酸茴、第九天 我趴在偏房一處隱蔽的房頂上張望分预。 院中可真熱鬧,春花似錦薪捍、人聲如沸笼痹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凳干。三九已至,卻和暖如春被济,著一層夾襖步出監(jiān)牢的瞬間救赐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工只磷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留经磅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓钮追,卻偏偏與公主長(zhǎng)得像预厌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子元媚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361