從零用java實現 小紅書 springboot vue uniapp(14) 集成阿里云短信驗證碼


從零用java實現 小紅書 springboot vue uniapp(14) 集成阿里云短信驗證碼

移動端演示 http://8.146.211.120:8081/#/

管理端演示 http://8.146.211.120:8088/#/

項目整體介紹及演示

前言

在現代應用中,手機號不僅是用戶的唯一標識,更是保障賬戶安全的第一道防線。通過短信驗證碼進行登錄或注冊,已成為行業標準。它省去了用戶記憶復雜密碼的麻煩,同時提供了可靠的身份驗證。在本文中,我們將為我們的小紅書項目集成阿里云短信服務,實現一個完整、安全、且對開發者友好的手機驗證碼登錄流程。


在這里插入圖片描述

核心技術實現

整個流程分為后端和前端兩部分。后端負責生成驗證碼、調用阿里云接口發送短信、以及校驗驗證碼的有效性。前端則負責提供用戶界面,引導用戶輸入手機號并完成驗證。

1. 后端實現:從配置到接口
步驟一:引入阿里云SDK依賴

首先,我們需要在項目的 pom.xml 中加入阿里云短信服務的Java SDK。

<dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.24</version> <!-- 請使用最新版本 -->
</dependency>
步驟二:參數化配置

為了代碼的靈活性和安全性,我們將所有敏感信息和配置項都放入 application.yml 中。這樣做的好處是,我們可以在不同環境(開發、測試、生產)中使用不同的配置,而無需修改代碼。

# 阿里云短信服務
aliyun:sms:# 是否啟用真實短信發送, false則為測試模式enabled: false # 阿里云賬號的accessKeyIdaccess-key-id: YOUR_ACCESS_KEY_ID# 阿里云賬號的accessKeySecretaccess-key-secret: YOUR_ACCESS_KEY_SECRET# 短信簽名名稱 (需在阿里云控制臺申請)sign-name: 你的簽名# 短信模板CODE (需在阿里云控制臺申請)template-code: SMS_XXXXXX# 短信驗證碼有效期(分鐘)expire-minutes: 1
  • enabled: 這是一個非常有用的開關。當設為 false 時,系統進入“測試模式”,驗證碼會直接在接口中返回,而不會真實發送,方便開發調試。
  • access-key-id & access-key-secret: 你的阿里云賬戶憑證。
  • sign-name & template-code: 在阿里云短信服務控制臺創建的短信簽名和模板。
步驟三:封裝短信發送服務

接下來,我們創建一個 SmsServiceImpl,它將負責所有與發送短信相關的邏輯。這種封裝能讓我們的業務代碼(如登錄邏輯)保持干凈,只需調用一個簡單的方法即可。

SmsServiceImpl.java:

@Slf4j
@Service
public class SmsServiceImpl implements SmsService {@Autowiredprivate SmsProperties smsProperties;@Autowiredprivate AliyunSmsConfig aliyunSmsConfig;@Autowiredprivate SystemSettingService systemSettingService; // 用于獲取系統設置@Overridepublic void sendMessage(String phoneNumber, String code) throws Exception {// 從系統設置或配置中獲取當前的模式// String smsMode = systemSettingService.getSmsMode();// 此處我們直接使用yml中的配置boolean isRealMode = smsProperties.isEnabled();if (!isRealMode) {// 測試模式:只記錄日志,不真實發送log.info("【測試模式】短信發送 - 手機號: {}, 驗證碼: {}", phoneNumber, code);return;}try {log.info("【真實模式】開始發送短信 - 手機號: {}, 驗證碼: {}", phoneNumber, code);Client client = aliyunSmsConfig.createClient();Map<String, String> templateParamMap = new HashMap<>();templateParamMap.put("code", code); // 模板參數,key必須與模板中的變量名一致String templateParam = JSON.toJSONString(templateParamMap);SendSmsRequest sendSmsRequest = new SendSmsRequest().setPhoneNumbers(phoneNumber).setSignName(smsProperties.getSignName()).setTemplateCode(smsProperties.getTemplateCode()).setTemplateParam(templateParam);RuntimeOptions runtime = new RuntimeOptions();SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);log.info("短信發送結果: {}", sendSmsResponse.getBody().getMessage());if (sendSmsResponse.getBody() == null || !"OK".equals(sendSmsResponse.getBody().getCode())) {throw new ApiException("短信發送失敗: " + (sendSmsResponse.getBody() != null ? sendSmsResponse.getBody().getMessage() : "未知錯誤"));}} catch (Exception e) {log.error("短信發送異常", e);throw new ApiException("短信發送異常: " + e.getMessage());}}
}

該服務通過檢查 aliyun.sms.enabled 的值來決定是打印日志(測試模式)還是調用阿里云API(真實模式)。

步驟四:創建登錄接口

最后,我們在 LoginApi 中創建兩個端點:一個用于獲取驗證碼,另一個用于通過驗證碼登錄。

LoginApi.java:

@RestController
public class LoginApi {@AutowiredLoginService loginService;@AutowiredAuthorService authorService;@Autowiredprivate JwtTokenUtil jwtTokenUtil;@ApiOperation(value = "獲取驗證碼")@GetMapping("/api/getCode")public ResultBean<String> getCode(String phoneNumber) {// loginService 內部會生成驗證碼、存入Redis、并調用SmsService發送String code = loginService.sendSmsCode(phoneNumber);if (code == null) {// 真實模式下,service層返回null,提示用戶return ResultBean.success("驗證碼已發送,請注意查收");}// 測試模式下,service層返回驗證碼,直接顯示給前端return ResultBean.success(code);}@ApiOperation(value = "驗證碼登陸")@PostMapping("/api/checkCode")@Transactionalpublic ResultBean<Author> checkCode(@RequestBody PhoneLoginDto phoneLoginDto) {// 1. 校驗驗證碼是否正確 (loginService會去Redis中比對)loginService.checkCode(phoneLoginDto);// 2. 驗證通過,執行登錄或注冊邏輯Author author = authorService.selectAuthorByPhoneNumber(phoneLoginDto.getPhoneNumber());if(author == null){// 用戶不存在,創建新用戶author = authorService.createNewAuthor(phoneLoginDto.getPhoneNumber());} else if(author.getDeleted().equals(1)){throw new ApiException("當前用戶狀態異常~");}// 3. 生成Token并返回用戶信息final String token = jwtTokenUtil.generateTokenByUserId(author.getAuthorId());author.setToken(token);return ResultBean.success(author);}
}
  • /api/getCode: 這個接口的設計完美地結合了測試與真實模式。在開發階段,我們能立刻看到驗證碼,極大提高了調試效率。
  • /api/checkCode: 它首先驗證驗證碼的正確性,然后執行“查找或創建”用戶的邏輯,最后簽發JWT令牌,完成整個登錄閉環。
    主要邏輯是將驗證碼保存到redis 設置過期時間 到期重新發送 根據輸入的值和redis數據庫比較

2. 前端交互:Uniapp 實現

前端的實現相對直接,主要是在登錄頁面 login.vue 中完成。
在這里插入圖片描述

  1. UI布局: 包含一個手機號輸入框、一個“獲取驗證碼”按鈕和一個“登錄”按鈕。
  2. 獲取驗證碼:
    • 點擊“獲取驗證碼”按鈕時,調用后端的 /api/getCode 接口。
    • 接口調用成功后,啟動一個60秒的倒計時,期間按鈕變為不可點擊狀態,防止用戶重復發送。
  3. 登錄:
    • 用戶輸入手機號和收到的驗證碼后,點擊“登錄”按鈕。
    • 調用后端的 /api/checkCode 接口,并傳遞手機號和驗證碼。
    • 登錄成功后,后端會返回用戶信息和Token。前端需要將這些信息(特別是Token)保存到本地存儲(如 uni.setStorageSync),并跳轉到應用主頁。

通過前后端的緊密配合,我們就構建了一個完整且健壯的短信驗證碼登錄功能。

代碼地址
https://gitee.com/ddeatrr/springboot_vue_xhs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92912.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

`<< EOF` 與 `<< ‘EOF‘` 與 `<< “EOF“`有無引號的區別多回答筆記250722

<< EOF 與 << EOF 與 << "EOF"有無引號的區別多回答筆記250722 實測 自測代碼: # 定義變量 hello"ni hao"# 無引號 tee << EOF # 無引號 ${hello} world \n $(date) # 無引號 EOF# 單引號 tee << EOF # 單…

點擊按鈕滾動到底功能vue的v-on:scroll運用

使用vue自帶的監聽滾動功能v-on:scroll&#xff0c;滾動條變化時&#xff0c;會調用方法 checkScrollStatus&#xff0c;如果滾動條在容器底部時&#xff0c;則隱藏按鈕&#xff0c;否則顯示按鈕&#xff0c;點擊按鈕能一鍵滾動到底部。<div class"chat-area" ref…

Linux下編譯SLEPc

本文記錄在Linux下編譯安裝SLEPc的流程。 一、下載代碼 git clone https://github.com/slepc/slepc.git cd ./slepc二、安裝依賴 2.1 安裝PETSc 參見: <Linux下編譯安裝PETSc> 2.2 安裝intel oneAPI sudo apt install intel-oneapi-base-toolkit sudo apt install i…

【無標題】qwen3-8b 強化學習訓練后的模型,可以接著 進行其他grpo 強化學習訓練 嗎

ser_count’, 0),)} {((‘valid_user_count’, 1),)} 44 0.0 88 [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6, 0.0, 0.6, 0.0, 0.6] 55 100%|???{‘loss’: 0.0132, ‘grad_norm’: 0.07552657276391983, ‘learning_rate’: 2e-06, ‘num_tokens’: 2098…

IDC權威認可:瑞數信息雙項入選《中國大模型安全保護市場概覽》

近日&#xff0c;國際數據公司IDC正式發布了《中國大模型安全保護市場概覽&#xff0c;2025&#xff1a;全方位安全檢測與防護構建可信AI》報告。本次報告中IDC結合全球統一定義以及中國市場特色&#xff0c;將中國大模型安全保護市場劃分為7個細分領域&#xff0c;并通過對中國…

多智能體(Multi-agent)策略模式:思維鏈CoT和ReAct

參考&#xff1a;https://zhuanlan.zhihu.com/p/704523060 &#x1f3af; 一句話記住 CoT&#xff1a;像“考試時在草稿紙上寫完所有步驟&#xff0c;再抄答案”。ReAct&#xff1a;像“玩密室逃脫&#xff0c;每開一個箱子就去找下一個線索”。 用小學生能聽懂的話 兩個小故事…

ChatGPT指令大全:輸入需求=輸出完整方案

ChatGPT指令大全提供數百個精煉過的指令語句 (提示詞)&#xff0c;讓你充分發揮 ChatGPT 的強大功能 一、核心功能模塊分類 1. 求職與面試 簡歷優化 專業反饋&#xff1a;按面試官視角分析簡歷并提出改進建議量化數據&#xff1a;為經歷添加具體數字&#xff08;如提升效率30…

Java零基礎入門學習知識點2-JDK安裝配置+Maven

文章目錄版本提示參考視頻Maven環境準備一、安裝Java開發工具包&#xff08;JDK&#xff09;二、JDK環境配置三、下載Maven安裝包*四、Maven環境配置&#xff08;可省略&#xff09;*五、驗證安裝&#xff08;上一步沒做&#xff0c;這步無法驗證&#xff0c;可省&#xff09;六…

基于單片機智能衣柜/智能衣櫥設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的多功能智能衣柜&#xff0c;融合環境檢測、安全防護與用戶交互功能…

自動語音識別(ASR)技術詳解

語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能和自然語言處理領域的重要技術&#xff0c;旨在將人類的語音信號轉換為對應的文本。近年來&#xff0c;深度學習的突破推動語音識別系統從實驗室走入日常生活&#xff0c;為智能助手、實時翻譯、醫…

【MySQL】MySQL 事務和鎖詳解

一、MySQL 事務 1.1 事務介紹 在 MySQL 中&#xff0c;事務&#xff08;Transaction&#xff09; 是一組不可分割的 SQL 操作序列&#xff0c;這些操作要么全部成功執行&#xff0c;要么全部失敗回滾&#xff0c;以此保證數據庫操作的完整性和一致性。 事務將數據庫從一種一致…

虛擬直線閾值告警人員計數算法暑期應用

智慧人員計數助力暑期&#xff1a;技術賦能安全管理的創新實踐一、背景&#xff1a;暑期人流激增下的安全管理挑戰暑期是旅游、商業、交通等場景的客流高峰期&#xff0c;人員密集區域易引發踩踏事故、管理混亂等安全隱患。傳統人工計數方式效率低、誤差大&#xff0c;難以滿足…

SQL164 2021年11月每天新用戶的次日留存率

SQL164 2021年11月每天新用戶的次日留存率 思路 ?找出新用戶?&#xff1a;確定每個用戶首次活躍的日期&#xff08;即新用戶&#xff09; 例如101用戶在11月1日首次出現 ?處理跨天活躍?&#xff1a;考慮用戶可能跨天活躍的情況&#xff08;in_time和out_time不在同一天&a…

基于單片機的數字電壓表設計

2 系統原理及基本框圖 如圖2.1所示&#xff0c;模擬電壓經過檔位切換到不同的分壓電路衰減后&#xff0c;經隔離干擾送到A/D轉換器進行A/D轉換&#xff0c;然后送到單片機中進行數據處理。處理后的數據送到LCD中顯示&#xff0c;同時通過串行通訊與上位機通信。圖2.1系統基本方…

[NLP]UPF基本語法及其在 native low power verification中的典型流程

UPF基本語法及其在 native low power verification中的典型流程 摘要:本文首先簡要介紹 UPF(Unified Power Format),然后解釋其在 native low power verification(原生低功耗驗證)中的典型流程。最后,我將使用50個具體例子來完整展示 UPF 的關鍵語法。這些例子基…

fish-speech 在50系列顯卡使用 --compile加速兼容

#環境說明 GPU: NVIDIA GeForce RTX 5080 Laptop GPU (sm_120) win11家庭版 24H2 #問題匯總 baize.exceptions.HTTPException: (500, "RuntimeError: ptxas failed with error code 4294967295: \\n\\n") 問題匯總 1 baize.exceptions.HTTPException: (500, "…

UI自動化測試實戰

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;一、設計背景 隨著IT行業的發展&#xff0c;產品愈漸復雜&#xff0c;web端業務及流程更加繁瑣&#xff0c;目前UI測試僅是針對單一頁面&#xff0c;操作量大。為了滿足多頁面功能及流程的需求及節省工…

面試實戰,問題六,被問數據庫索引,怎么回答

Java開發面試&#xff1a;數據庫索引的原理及常見問題解答 在Java開發面試中&#xff0c;數據庫索引是核心知識點&#xff0c;涉及數據庫優化和性能調優。索引通過高效的數據結構加速數據檢索&#xff0c;降低磁盤IO成本&#xff0c;并支持排序操作。下面我將逐步解釋索引的原理…

ARM-I2C硬實現

硬件I2C-GD32F4系列的實現初始化操作在初始化函數里執行以下代碼uint32_t i2cx_scl_port_rcu RCU_GPIOB; uint32_t i2cx_scl_port GPIOB; uint32_t i2cx_scl_pin GPIO_PIN_6; uint32_t i2cx_scl_af GPIO_AF_4;uint32_t i2cx_sda_port_rcu RCU_GPIOB; uint32_t i2cx_sda_po…

WinUI3開發_過渡動畫

簡介 過渡動畫是當發生事件時控件UI狀態發生改變時以一種動畫形式來演變到另外一種狀態&#xff0c;而非瞬間改變&#xff0c;使用一種更加平滑的方式來進行切換&#xff0c;例如下圖是文字切換的交叉柵欄效果&#xff1a;還有頁面切換動畫&#xff1a;在或者是圖標動畫&#x…