谷粒学院7-13天
谷粒學(xué)院7-13天總結(jié)
1.課程發(fā)布
1.1.前端實(shí)現(xiàn)
1.項(xiàng)目結(jié)構(gòu)
1.1.1.info里面的二級(jí)聯(lián)動(dòng)
1.1.1.1.首先喃我們先來(lái)寫添加的時(shí)候
這個(gè)在created里面進(jìn)行初始化,我們就可以進(jìn)行選擇。
這個(gè)后端方法我們?cè)谡n程分類里面也就已經(jīng)實(shí)現(xiàn)了。
1.1.1.2.回顯的時(shí)候二級(jí)聯(lián)動(dòng)
①.首先喃我們要進(jìn)行判斷我們的路徑里面是有有courseID 因?yàn)檫@樣我們才知道你究竟是回顯還是添加來(lái)做出不同 的邏輯
②.然后就是根據(jù)我們couseId 查詢出對(duì)應(yīng)的課程信息,包括一級(jí)分類id和二級(jí)分類id這都是我們需要的
? 然后在查詢所有的學(xué)科分類(里面包含了我們一級(jí)分類和二級(jí)分類)我們需要根據(jù)courseID查詢出來(lái)的數(shù)據(jù)進(jìn)行 對(duì)比然后就可以得到我們回顯數(shù)據(jù)里面那個(gè)一級(jí)分類所對(duì)應(yīng)的二級(jí)分類。
1.1.2.阿里云視頻的上傳
①先看我們的vue封裝的組件
②.刪除視頻就是根據(jù)我們的id來(lái)進(jìn)行刪除,刪除多個(gè)也是如此(但是刪除多個(gè)后端實(shí)現(xiàn)的方法有所不同)
③.進(jìn)行路由跳轉(zhuǎn)
1.1.3.最終發(fā)布
這個(gè)前端沒(méi)有什么新的技術(shù),就是后端寫了sql語(yǔ)句
1.2.后端實(shí)現(xiàn)
1.2.1.后端二級(jí)聯(lián)動(dòng)的實(shí)現(xiàn)
①.這個(gè)其實(shí)就是基礎(chǔ)的業(yè)務(wù)邏輯代碼,我在課程分類那個(gè)筆記里面已經(jīng)寫了,就不重新進(jìn)行贅述
1.2.2.微服務(wù)的調(diào)用
為什么上傳視頻服務(wù)要使用微服務(wù)
-
首先我們上傳視頻的接口是寫在新的模板里的,不是寫在service-edu模板里面的,那么我們要想調(diào)用就只有使用微服務(wù)把他們都弄在一個(gè)微服務(wù)里面進(jìn)行注冊(cè)
-
那么我們nacos自然是不可少的
-
首先要引入依賴這里
-
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
-
然后就可以在我們要使用上傳視頻那個(gè)模塊創(chuàng)建一個(gè)client
-
啟動(dòng)類的配置
-
下面就是調(diào)用,我們寫的一個(gè)服務(wù)的接口
1.2.3.阿里云視頻上傳
①.阿里云上是有基本的sdk的就是根據(jù)阿里云的幫助文檔就可以實(shí)現(xiàn),而且基本上都是固定的,就是需要你的keyID和你的keySercet 然后修改小部分進(jìn)行實(shí)現(xiàn)
②.這里就是將我們上傳后,然后就可以得到我們視頻的id然后返回給前端
public String uploadAlyVideo(MultipartFile file) {// MultipartFile 表示的是文件// 得到文件的原始名稱 String originalFilename = file.getOriginalFilename();// title 在阿里云顯示的名稱(自己定義)// 這個(gè)就是根據(jù)我們這個(gè)本身的文件名進(jìn)行截取的String title = originalFilename.substring(0, originalFilename.lastIndexOf("."));// fileName 上傳文件原始名稱String fileName = file.getOriginalFilename();// inputStream 上傳視頻到阿里云里面InputStream inputStream = null;try {// 得到輸入流inputStream = file.getInputStream();} catch (IOException e) {e.printStackTrace();}UploadStreamRequest request = new UploadStreamRequest(keyid,keysecret,title, fileName, inputStream);UploadVideoImpl uploader = new UploadVideoImpl();UploadStreamResponse response = uploader.uploadStream(request);//如果設(shè)置回調(diào)URL無(wú)效,不影響視頻上傳,可以返回VideoId同時(shí)會(huì)返回錯(cuò)誤碼。// 其他情況上傳失敗時(shí),VideoId為空,此時(shí)需要根據(jù)返回錯(cuò)誤碼分析具體錯(cuò)誤原因// 得到視頻的idString videoId = response.getVideoId();if (!response.isSuccess()) {String errorMessage = "阿里云上傳錯(cuò)誤:" + "code:" + response.getCode() + ", message:" + response.getMessage();log.warn(errorMessage);if(StringUtils.isEmpty(videoId)){throw new GuliException(20001, errorMessage);}}// 返回視頻idreturn videoId;}
1.2.4.nginx的配置
我們由于使用了nginx來(lái)實(shí)現(xiàn)調(diào)用的,但是nginx有一個(gè)限制,就是你上傳的東西的內(nèi)存,會(huì)經(jīng)過(guò)nginx但是東西過(guò)大就不能到達(dá)后臺(tái),就給你攔截了,所以上傳視頻會(huì)受到限制,因此我們要對(duì)nginx的配置文件進(jìn)行修改。
1.2.5.阿里云視頻刪除
①.首先是刪除單個(gè)視頻的
那什么時(shí)候是刪除多個(gè)視頻喃 就是等你想要?jiǎng)h除章節(jié)或者這個(gè)課程的話就是刪除多個(gè)視頻
public R removeAlyVideo(@PathVariable String id){try {// 初始化對(duì)象DefaultAcsClient client = InitObject.initVodClient("LTAI5tQF4MgKKFNSbKbciX2j", "EScpFOFDJFHdQlL2YFQ35KFlLumK5S");// 創(chuàng)建刪除視頻request對(duì)象DeleteVideoRequest request = new DeleteVideoRequest();// 向request設(shè)置id值// 這個(gè)設(shè)置的id 就是我們刪除視頻的id 這個(gè)我們前端會(huì)傳給我們的// 這個(gè)request.setVideoIds(id);// 調(diào)用初始化實(shí)現(xiàn)的方法// 實(shí)現(xiàn)刪除client.getAcsResponse(request);return R.ok();}catch (Exception e){e.printStackTrace();throw new GuliException(20001,"視頻刪除失敗");}}
那么刪除多個(gè)視頻肯定區(qū)別不到就是我們不止一個(gè)id就是了但是 request.setVideoIds(id);有一個(gè)上傳多個(gè)視頻的格式
2.NUXT框架
1.特點(diǎn)
2.nuxt的結(jié)構(gòu)
3.最主要的核心
4.動(dòng)態(tài)路由和固定路由
固定路由:就是一個(gè)很大概的意思,一般就是固定不變的訪問(wèn)地址 就比如首頁(yè),全部講師,全部課程 這樣的訪問(wèn)路徑不會(huì)改變的。
動(dòng)態(tài)路由:就是針對(duì)某一個(gè)東西,就比如查詢每個(gè)老師的詳情,那每個(gè)老師都有自己的詳情,所以每個(gè)老師所對(duì)應(yīng)的路徑是有差別的,就相當(dāng)于有自己的id。然后根據(jù)id來(lái)查詢就可以了。
5.由于nuxt沒(méi)有vue的框架,我們請(qǐng)求不到后臺(tái),所以我們還要下載axios來(lái)實(shí)現(xiàn)
npm install axios
然后根據(jù)vue的特性,自己寫一個(gè)request.js來(lái)實(shí)現(xiàn)我們的axios的封裝
-
注意的是我們自己封裝的與原來(lái)vue-element-tempate是有一點(diǎn)差別的是什么喃
-
就是我們不是后面都會(huì)使用箭頭函數(shù)把 resp => { resp.data.data} 這個(gè)是nuxt的框架 我們?cè)瓉?lái)vue自帶的框架是自動(dòng)幫助我們封裝了一層data,所以原來(lái)我們寫的vue的箭頭函數(shù)就是 resp.data.這樣,但是我們這個(gè)需要自己進(jìn)行封裝,但是不想封裝的話就要使用兩個(gè)data
然后就可以進(jìn)行正常的調(diào)用了
3.登錄注冊(cè)功能
3.1.后端實(shí)現(xiàn)
三種登錄方式
3.1.1.jwt令牌
這個(gè)就相當(dāng)于我們的steam令牌,需要這個(gè)令牌才能獲取你的信息,然后生成對(duì)應(yīng)的token來(lái)實(shí)現(xiàn)
至于怎么寫出jwt我們也不用擔(dān)心,這就是一個(gè)工具類,你只需要會(huì)用就行了
那么這個(gè)工具類具體有什么方法喃
package com.atguigu.commonutils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;
import java.util.Date;/*** @author helen* @since 2019/10/16*/
public class JwtUtils {// 常量 過(guò)期時(shí)間public static final long EXPIRE = 1000 * 60 * 60 * 24;// 這個(gè)是我們密鑰// 這個(gè)一般都是公司會(huì)給的public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";// 生成token的方法// 根據(jù)用戶id 和 用戶名稱生成的tokenpublic static String getJwtToken(String id, String nickname){String JwtToken = Jwts.builder().setHeaderParam("typ", "JWT").setHeaderParam("alg", "HS256").setSubject("guli-user").setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRE)).claim("id", id) // 設(shè)置主體部分 存儲(chǔ)用戶信息.claim("nickname", nickname).signWith(SignatureAlgorithm.HS256, APP_SECRET) // 聲明hash.compact();return JwtToken;}/*** 判斷token是否存在與有效* @param jwtToken* @return*/public static boolean checkToken(String jwtToken) {if(StringUtils.isEmpty(jwtToken)) return false;try {Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 判斷token是否存在與有效(頭信息)* @param request* @return*/public static boolean checkToken(HttpServletRequest request) {try {String jwtToken = request.getHeader("token");if(StringUtils.isEmpty(jwtToken)) return false;Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 根據(jù)token獲取用戶id* @param request* @return*/public static String getMemberIdByJwtToken(HttpServletRequest request) {String jwtToken = request.getHeader("token");if(StringUtils.isEmpty(jwtToken)) return "";Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);Claims claims = claimsJws.getBody();return (String)claims.get("id");}
}
上面的4個(gè)方法我們直接使用就可以了。
-
在我們登錄過(guò)程中會(huì)進(jìn)行一系列的判斷,最終就可以知道賬號(hào)密碼是否正確,這個(gè)時(shí)候我們就可以是jwt工具類來(lái)生成一個(gè)token 根據(jù)我們用戶id 和 用戶名 然后返回給前端。
3.1.2.MD5加密處理
我們將用戶的密碼存入數(shù)據(jù)庫(kù)是不可能以一種明文的形式存入數(shù)據(jù)庫(kù)的不然,會(huì)存在極大的安全隱患。
因此我們就可以使用MD5進(jìn)行加密(md5只能加密,不能解密)
也是一個(gè)工具類,我們直接拿來(lái)用就可以了
3.1.3.騰訊云短信驗(yàn)證
-
首先我們需要開(kāi)通騰訊云的短信服務(wù),得到我們的id 和 key
-
然后根據(jù)騰訊云提供的sdk文檔進(jìn)行操作
-
首先你要自己寫一個(gè)生成幾位數(shù)的驗(yàn)證碼的工具類
-
然后就是根據(jù)騰訊云提供的api進(jìn)行復(fù)制然后修改為你的就行
-
@Overridepublic boolean sendSms(String phone, String code) {try {// 整合騰訊云短信服務(wù)發(fā)送Credential cred = new Credential(secretID, secretKey);// 實(shí)例化一個(gè)http選項(xiàng),可選,沒(méi)有特殊需求可以跳過(guò)HttpProfile httpProfile = new HttpProfile();httpProfile.setReqMethod("POST");/* SDK有默認(rèn)的超時(shí)時(shí)間,非必要請(qǐng)不要進(jìn)行調(diào)整* 如有需要請(qǐng)?jiān)诖a中查閱以獲取最新的默認(rèn)值 */httpProfile.setConnTimeout(60);/* 指定接入地域域名,默認(rèn)就近地域接入域名為 sms.tencentcloudapi.com ,也支持指定地域域名訪問(wèn),例如廣州地域的域名為 sms.ap-guangzhou.tencentcloudapi.com */httpProfile.setEndpoint("sms.tencentcloudapi.com");/* 非必要步驟:* 實(shí)例化一個(gè)客戶端配置對(duì)象,可以指定超時(shí)時(shí)間等配置 */ClientProfile clientProfile = new ClientProfile();/* SDK默認(rèn)用TC3-HMAC-SHA256進(jìn)行簽名* 非必要請(qǐng)不要修改這個(gè)字段 */clientProfile.setSignMethod("HmacSHA256");clientProfile.setHttpProfile(httpProfile);SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);/* 實(shí)例化一個(gè)請(qǐng)求對(duì)象,根據(jù)調(diào)用的接口和實(shí)際情況,可以進(jìn)一步設(shè)置請(qǐng)求參數(shù)* 你可以直接查詢SDK源碼確定接口有哪些屬性可以設(shè)置* 屬性可能是基本類型,也可能引用了另一個(gè)數(shù)據(jù)結(jié)構(gòu)* 推薦使用IDE進(jìn)行開(kāi)發(fā),可以方便的跳轉(zhuǎn)查閱各個(gè)接口和數(shù)據(jù)結(jié)構(gòu)的文檔說(shuō)明 */SendSmsRequest req = new SendSmsRequest();/* 填充請(qǐng)求參數(shù),這里request對(duì)象的成員變量即對(duì)應(yīng)接口的入?yún)? 你可以通過(guò)官網(wǎng)接口文檔或跳轉(zhuǎn)到request對(duì)象的定義處查看請(qǐng)求參數(shù)的定義* 基本類型的設(shè)置:* 幫助鏈接:* 短信控制臺(tái): https://console.cloud.tencent.com/smsv2* sms helper: https://cloud.tencent.com/document/product/382/3773 *//* 短信應(yīng)用ID: 短信SdkAppId在 [短信控制臺(tái)] 添加應(yīng)用后生成的實(shí)際SdkAppId,示例如1400006666 */String sdkAppId = "1400742926";req.setSmsSdkAppId(sdkAppId);/* 短信簽名內(nèi)容: 使用 UTF-8 編碼,必須填寫已審核通過(guò)的簽名,簽名信息可登錄 [短信控制臺(tái)] 查看 */String signName = "林謀不萌"; // 這個(gè)必須寫的req.setSignName(signName);/* 國(guó)際/港澳臺(tái)短信 SenderId: 國(guó)內(nèi)短信填空,默認(rèn)未開(kāi)通,如需開(kāi)通請(qǐng)聯(lián)系 [sms helper] */String senderid = "";req.setSenderId(senderid);/* 用戶的 session 內(nèi)容: 可以攜帶用戶側(cè) ID 等上下文信息,server 會(huì)原樣返回 */String sessionContext = "";req.setSessionContext(sessionContext);/* 短信號(hào)碼擴(kuò)展號(hào): 默認(rèn)未開(kāi)通,如需開(kāi)通請(qǐng)聯(lián)系 [sms helper] */String extendCode = "";req.setExtendCode(extendCode);/* 模板 ID: 必須填寫已審核通過(guò)的模板 ID。模板ID可登錄 [短信控制臺(tái)] 查看 */String templateId = "1557106";req.setTemplateId(templateId);/* 下發(fā)手機(jī)號(hào)碼,采用 E.164 標(biāo)準(zhǔn),+[國(guó)家或地區(qū)碼][手機(jī)號(hào)]* 示例如:+8613711112222, 其中前面有一個(gè)+號(hào) ,86為國(guó)家碼,13711112222為手機(jī) 號(hào),最多不要超過(guò)200個(gè)手機(jī)號(hào) *///String[] phoneNumberSet = {"+8618777777777", "+8615888888888","+8618555555555","+8618333333333","+8613566666666"};String[] phoneNumberSet = {"+86" + phone};req.setPhoneNumberSet(phoneNumberSet);/* 模板參數(shù): 若無(wú)模板參數(shù),則設(shè)置為空 */String[] templateParamSet = {code};req.setTemplateParamSet(templateParamSet);/* 通過(guò) client 對(duì)象調(diào)用 SendSms 方法發(fā)起請(qǐng)求。注意請(qǐng)求方法名與請(qǐng)求對(duì)象是對(duì)應(yīng)的* 返回的 res 是一個(gè) SendSmsResponse 類的實(shí)例,與請(qǐng)求對(duì)象對(duì)應(yīng) */SendSmsResponse res = client.SendSms(req);// 輸出json格式的字符串回包System.out.println(SendSmsResponse.toJsonString(res));// 也可以取出單個(gè)值,你可以通過(guò)官網(wǎng)接口文檔或跳轉(zhuǎn)到response對(duì)象的定義處查看返回字段 的定義System.out.println(res.getSendStatusSet()[0].getCode());if ("Ok".equals(res.getSendStatusSet()[0].getCode())) {return true;}} catch (TencentCloudSDKException e) {e.printStackTrace();return false;}return false;}就可以發(fā)送成功了。
-
-
首先我們將phone作為key,驗(yàn)證碼作為value然后存入redis里面,并且設(shè)置過(guò)期時(shí)長(zhǎng),等到用戶輸入驗(yàn)證碼的時(shí)候,根據(jù)用戶輸入的phone獲取里面的value(驗(yàn)證碼) 然后進(jìn)行比對(duì),如果正確了則能進(jìn)行注冊(cè)。
3.1.4.獲取登錄用戶的信息
這個(gè)就要使用到token了,我們的token就存儲(chǔ)了他的id 和 昵稱的信息
通過(guò)前端頁(yè)面發(fā)來(lái)請(qǐng)求里面的請(qǐng)求體也就是我們的request 然后通過(guò)里面的token得到id
實(shí)現(xiàn)查詢返回給前端
3.2.前端實(shí)現(xiàn)
3.2.1.注冊(cè)
- 首先就是定義出我們發(fā)送短信的api這樣就可以實(shí)現(xiàn)
- 根據(jù)前端的數(shù)據(jù),創(chuàng)建對(duì)應(yīng)的實(shí)體類
3.2.2.登錄
- 首先我們需要一個(gè)攔截器,這攔截器就你每一次發(fā)送請(qǐng)求都會(huì)去執(zhí)行的,目的就得能一直得到用戶的信息,那么前端的攔截器是怎么實(shí)現(xiàn)。
- 使用cookie,我們將token上傳到cookie里面,然后在取出來(lái),然后回調(diào)我們方法,根據(jù)token得到該用戶的信息,那么我們就能在那個(gè)登錄的地方進(jìn)行回顯。
-
登錄接口
?
-
攔截器
攔截器就是幫助我們把token設(shè)置在請(qǐng)求頭上,以后我們每一次的請(qǐng)求里面都會(huì)有token
-
從cookie里面獲取用戶信息
首先是要引入cookie,然后對(duì)cookie里面的值進(jìn)行判斷不然就會(huì)有讀取為空,程序可能就有錯(cuò)
4.微信掃碼登錄功能
4.1.前端實(shí)現(xiàn)
先來(lái)簡(jiǎn)單說(shuō)明一下微信登錄與密碼登錄的區(qū)別,我實(shí)現(xiàn)的這個(gè)喃就是,如果你是微信登錄的話,那么你的token就會(huì)顯示在首頁(yè)的路徑上面,我們正好通過(guò)路徑來(lái)獲取你的token,就不是通過(guò)后臺(tái)返回了。
然后我們就可以得到這token,操作和我們登錄的操作基本上是一樣的。
然后我們前端獲取路徑中的值與以往vue獲取的方式有一點(diǎn)不一樣
將得到的token設(shè)置到cookie里面,然后又再次調(diào)用那個(gè)根據(jù)token查詢用戶信息的方法就可以實(shí)現(xiàn)了
4.2.后端實(shí)現(xiàn)
4.2.1.生成二維碼
首先我們要有微信開(kāi)放平臺(tái)的賬號(hào),要去申請(qǐng),得到我們一些基本的密鑰、id等
但是值的注意的是,我們這里不能使用restContrloler,因?yàn)槲覀兪且囟ㄏ虻侥骋粋€(gè)地址,而不是將這個(gè)地址返回給誰(shuí)。
然后訪問(wèn)微信給出來(lái)的固定的地址
使用我們c語(yǔ)言的占位符的形式來(lái)實(shí)現(xiàn)參數(shù)的賦值
4.2.2.掃描二維碼
我們掃描二維碼后 原本是該區(qū) http://guli_shop/…什么那個(gè)地址
但是我們是沒(méi)有辦法實(shí)現(xiàn)的,于是尚硅谷就幫我寫了一個(gè)程序掃描后是跳轉(zhuǎn)到我們本地的一個(gè)地址,
然后我們手動(dòng)添加邏輯就可以了
還需要將回調(diào)的地址與我們下面新的域名請(qǐng)求的地址要一樣,這樣就能自動(dòng)執(zhí)行到我們接口的方法
這個(gè)參數(shù)有code,和state我們也要加上
// 獲取掃描人信息,添加數(shù)據(jù)@GetMapping("callback")public String callback(String code, String state) {try {// 1.code 獲取code值 臨時(shí)票據(jù) 類似于驗(yàn)證碼// 2.拿著code去請(qǐng)求微信固定的一個(gè)地址// 得到access_token 和 openid//向認(rèn)證服務(wù)器發(fā)送請(qǐng)求換取access_tokenString baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +"?appid=%s" +"&secret=%s" +"&code=%s" +"&grant_type=authorization_code";String accessTokenUrl = String.format(baseAccessTokenUrl,ConstantWxUtils.WX_OPEN_APP_ID,ConstantWxUtils.WX_OPEN_APP_SECRET,code);
// accessTokenUrl 就是我們最終訪問(wèn)的地址// 請(qǐng)求拼接好的值 得到那兩個(gè)返回值String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);
// System.out.println("accessTokenInfo:" + accessTokenInfo);// 從accessTokenInfo獲取我們的open_id 和 access_token// 先將我們的字符串轉(zhuǎn)為map集合 根據(jù)map的key就可以得到Gson gson = new Gson();// 當(dāng)然huuutoll也是建議使用的HashMap mapAccessToken = gson.fromJson(accessTokenInfo, HashMap.class);String accessToken = (String) mapAccessToken.get("access_token");String openid = (String) mapAccessToken.get("openid");// 判斷數(shù)據(jù)庫(kù)是否有相同的微信id openId// 沒(méi)有的話就查找得到用戶信息再進(jìn)行保存 如果存在了 就直接跳過(guò)UcenterMember ucenterMember = ucenterMemberService.getOpenId(openid);if(ucenterMember == null) {// 3.拿著我們的 access_token 和 openid 去請(qǐng)求微信固定的地址 獲取掃碼人信息//訪問(wèn)微信的資源服務(wù)器,獲取用戶信息String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +"?access_token=%s" +"&openid=%s";// 拼接參數(shù)(就是我們的地址了)String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openid);// 發(fā)送請(qǐng)求String userInfo = HttpClientUtils.get(userInfoUrl);// 這個(gè)就是我們用戶信息
// System.out.println("userInfo:" + userInfo);// 獲取返回userInfo掃碼人的信息HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);String openid1 = (String) userInfoMap.get("openid");// 這個(gè)openid 和上面的openid是一樣的// 昵稱String nickname = (String) userInfoMap.get("nickname");// 頭像String headimgurl = (String) userInfoMap.get("headimgurl");// 幫助用戶注冊(cè)// 表示新用戶// 進(jìn)行添加ucenterMember = new UcenterMember();ucenterMember.setOpenid(openid);ucenterMember.setNickname(nickname);ucenterMember.setAvatar(headimgurl);ucenterMemberService.save(ucenterMember);}// 使用jwt 根據(jù)member對(duì)象生成一個(gè)token字符串String jwtToken = JwtUtils.getJwtToken(ucenterMember.getId(), ucenterMember.getNickname());// 然后就跳轉(zhuǎn)到我們的前端的頁(yè)面// 所以說(shuō)為什么我們前端是query.token喃// 將token放在路徑里面,然后進(jìn)行重定向return "redirect:http://localhost:3000?token=" + jwtToken;} catch (Exception e) {e.printStackTrace();throw new GuliException(20001,"登陸失敗");}
}
這樣我們掃碼登錄也就實(shí)現(xiàn)了
總結(jié)
- 上一篇: java中的asList_Java Ar
- 下一篇: 盘点52个全球人工智能和机器学习重要会议