国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5

這篇具有很好參考價(jià)值的文章主要介紹了springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

part1
part2
part3
part4
part5 本頁(yè)

6 移動(dòng)端短信發(fā)送和手機(jī)驗(yàn)證碼登入

6.1 短信發(fā)送
6.2 手機(jī)驗(yàn)證碼登入

6.1 短信發(fā)送

6.1.1整體分析

springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5
2.
springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5
3. 注冊(cè)登入阿里云賬戶。找到短信服務(wù),設(shè)置短信簽名(上面圖片的阿里云、菜鳥裹裹、天貓…),模板等等
springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5
4. 設(shè)置AccessKey
5. 看幫助文檔,導(dǎo)入對(duì)應(yīng)的Util包

6.2 手機(jī)驗(yàn)證碼登入

6.2.1 整體思路整理

  1. 需求分析springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5
  2. 涉及表的操作(數(shù)據(jù)模型)
    springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5
  3. 代碼開發(fā)思路
    springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5
    想要判斷當(dāng)前手機(jī)號(hào)是否在表中,如果不在,說(shuō)明是新用戶,將改號(hào)碼保存
  4. 使用瀏覽器的手機(jī)模式查看H5的頁(yè)面
    springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5
  5. 攔截器改造,現(xiàn)在加入移動(dòng)端的登入(session中是否有user,user是成功登入后設(shè)置的),設(shè)置threadLocal等信息。
  6. 后端思路:短信發(fā)送的controller處理完之后,把發(fā)送的驗(yàn)證碼存到session中。之后是登入的controller,把前端提交的短信驗(yàn)證碼和session中的驗(yàn)證碼進(jìn)行比較,如果手機(jī)號(hào)和驗(yàn)證碼都沒(méi)錯(cuò),那就放行(設(shè)置一個(gè)User的session,攔截器就會(huì)放行),同時(shí)查數(shù)據(jù)庫(kù),看看有沒(méi)有對(duì)應(yīng)的手機(jī)號(hào),沒(méi)有的話就插入這條手機(jī)號(hào)的數(shù)據(jù)

6.2.2 前端代碼分析

  1. login.html顯示到頁(yè)面上的代碼如下:
<div id="login" v-loading="loading">
    <div class="divHead">登錄</div>
    <div class="divContainer">
        <el-input placeholder=" 請(qǐng)輸入手機(jī)號(hào)碼" v-model="form.phone"  maxlength='20'/></el-input>
        <div class="divSplit"></div>
        <el-input placeholder=" 請(qǐng)輸入驗(yàn)證碼" v-model="form.code"  maxlength='20'/></el-input>
        <span @click='getCode'>獲取驗(yàn)證碼</span>
    </div>
    <div class="divMsg" v-if="msgFlag">手機(jī)號(hào)輸入不正確,請(qǐng)重新輸入</div>
    <el-button type="primary" :class="{btnSubmit:1===1,btnNoPhone:!form.phone,btnPhone:form.phone}" @click="btnLogin">登錄</el-button>
</div>
  1. 獲取驗(yàn)證碼,注意發(fā)送請(qǐng)求的參數(shù)是sendMsgApi({phone:this.form.phone}),json的格式,后端使用注解@RequestParam接收,可以直接接收到一個(gè)對(duì)象中,屬性含有phone字段
getCode(){
    this.form.code = ''
    //正則表達(dá)式驗(yàn)證手機(jī)號(hào)是否正確
    const regex = /^(13[0-9]{9})|(15[0-9]{9})|(17[0-9]{9})|(18[0-9]{9})|(19[0-9]{9})$/;
    if (regex.test(this.form.phone)) {
        this.msgFlag = false
        //sendMsgApi({phone:this.form.phone}) 一個(gè)json,key是phone,value是前端輸入的手機(jī)號(hào)
        this.form.code = (Math.random()*1000000).toFixed(0)
    }else{
        this.msgFlag = true
    }
},

這里的msgFlag作用是對(duì)應(yīng)之前的:<div class="divMsg" v-if="msgFlag">手機(jī)號(hào)輸入不正確,請(qǐng)重新輸入</div>,即已經(jīng)通過(guò)了驗(yàn)證,不需要彈出提示信息
正常情況下,通過(guò)sendMsgApi發(fā)送axios請(qǐng)求,請(qǐng)求到后端發(fā)送驗(yàn)證碼

function sendMsgApi(data) {
    return $axios({
        'url': '/user/sendMsg',
        'method': 'post',
        data
    })
}
  1. 登入模塊,前端只需要給后端傳loginApi(this.form),這個(gè)form:{phone:‘’“,code:‘’” } 是一個(gè)json,需要把phone和前端的code都傳給后端,后端之前設(shè)置了session:session.setAttribute(phone,code); 進(jìn)行一個(gè)驗(yàn)證就好了。
async btnLogin(){
    if(this.form.phone && this.form.code){
        this.loading = true
        const res = await loginApi(this.form)
        this.loading = false
        if(res.code === 1){
            sessionStorage.setItem("userPhone",this.form.phone)
            window.requestAnimationFrame(()=>{
                window.location.href= '/front/index.html'
            })                           
        }else{
            this.$notify({ type:'warning', message:res.msg});
        }
    }else{
        this.$notify({ type:'warning', message:'請(qǐng)輸入手機(jī)號(hào)碼'});
    }
}

6.2.3 后端代碼分析

整體思路:短信發(fā)送的controller處理完之后,把發(fā)送的驗(yàn)證碼存到session中。之后是登入的controller,把前端提交的短信驗(yàn)證碼和session中的驗(yàn)證碼進(jìn)行比較,如果手機(jī)號(hào)和驗(yàn)證碼都沒(méi)錯(cuò),那就放行(設(shè)置一個(gè)User的session,攔截器就會(huì)放行),同時(shí)查數(shù)據(jù)庫(kù),看看有沒(méi)有對(duì)應(yīng)的手機(jī)號(hào),沒(méi)有的話就插入這條手機(jī)號(hào)的數(shù)據(jù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-438354.html

  1. 發(fā)送短信controller: 前端發(fā)送請(qǐng)求的參數(shù)是sendMsgApi({phone:this.form.phone}),json的格式,后端使用注解@RequestParam接收,可以直接接收到一個(gè)對(duì)象中,屬性含有phone字段
@PostMapping("/sendMsg")
public R<String> sendMsg(@RequestBody User user, HttpSession session){
    //獲取手機(jī)號(hào)
    String phone = user.getPhone();

    if(StringUtils.isNotEmpty(phone)){
        //生成隨機(jī)的4位驗(yàn)證碼
        String code = ValidateCodeUtils.generateValidateCode(4).toString();
        log.info("code={}",code);

        //調(diào)用阿里云提供的短信服務(wù)API完成發(fā)送短信
        //SMSUtils.sendMessage("瑞吉外賣","",phone,code);

        //需要將生成的驗(yàn)證碼保存到Session
        session.setAttribute(phone,code);

        return R.success("手機(jī)驗(yàn)證碼短信發(fā)送成功");
    }

    return R.error("短信發(fā)送失敗");
}
  1. 注意這里不能再使用User接收,主要是User中沒(méi)有code驗(yàn)證碼屬性,解決方法一是使用Dto繼承User,方法二是使用map接收。這里用方法二,因?yàn)閏ode驗(yàn)證碼只需要和session做驗(yàn)證就好了,沒(méi)有存到數(shù)據(jù)庫(kù)里的需求。
/**
     * 登入驗(yàn)證
     * @param map 前端傳過(guò)來(lái)電話和驗(yàn)證碼,User沒(méi)有驗(yàn)證碼的屬性,接不住,所以用map,也可以用Dto
     * @param session 驗(yàn)證成功了,就把user存入session,攔截器那邊放行
     * @return
     */
    @PostMapping("/login")
    public RetObj loginController(@RequestBody Map<String,String> map, HttpSession session){
        String phone = map.get("phone");
        String code = map.get("code");
        String sessionCode = session.getAttribute(phone).toString();
        if (StringUtils.isNotBlank(sessionCode) && code.equals(sessionCode)){
            //用戶名秘密驗(yàn)證成功!
            //先查電話號(hào)碼在不在數(shù)據(jù)庫(kù)里,如果不在,就要保存
            LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(User::getPhone,phone);
            User user = userService.getOne(lambdaQueryWrapper);
            if (user ==  null){
                //存入數(shù)據(jù)庫(kù)
                User user1 = new User();
                user1.setPhone(phone);
                user1.setStatus(1);
                userService.save(user1);
                //session.setAttribute("user",user1.getId());
            }else {
                session.setAttribute(Contants.SESSION_USERID,user.getId());
            }
            return RetObj.success("登入成功!");
        }else {
            return RetObj.error("登入失?。?);
        }
  1. 寫完之后配置攔截器,有兩個(gè)類要配置
package cn.edu.uestc.ruijitakeout.common.interceptor;
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        log.info("當(dāng)前路徑:{}", uri);

        /**
         * HandlerMethod=>Controller中標(biāo)注@RequestMapping的方法
         *  需要配置靜態(tài)資源不攔截時(shí),添加這塊邏輯  => 前后端分離項(xiàng)目
         *
         */
        // 是我們的controller中的方法就攔截,如果不是的話,放行,給加載靜態(tài)資源
        if (!(handler instanceof HandlerMethod)) {
            log.info("是靜態(tài)資源或非controller中的方法,放行");
            return true;
        }

        //1-通過(guò)session判斷是否登入
        if (request.getSession().getAttribute(Contants.SESSIONLOGIN) != null) {
            log.info("用戶已經(jīng)登入,id={}", request.getSession().getAttribute(Contants.SESSIONLOGIN));

            //進(jìn)入攔截器后,給threadLocal綁定session,讓后面需要的公共字段自動(dòng)填充的時(shí)候,填充這個(gè)updateUser
            //每次http請(qǐng)求,會(huì)分配一個(gè)新的線程來(lái)處理
            BaseContext.setThreadLocal((Long) request.getSession().getAttribute(Contants.SESSIONLOGIN));
            log.info("攔截器這里設(shè)置了ThreadLocal,值為:{}",(Long) request.getSession().getAttribute(Contants.SESSIONLOGIN));
            log.info("當(dāng)前線程id={}",Thread.currentThread().getId());
            return true;

        } else if (request.getSession().getAttribute(Contants.SESSION_USERID) != null) {
            log.info("用戶已經(jīng)登入,id={}", request.getSession().getAttribute(Contants.SESSION_USERID));

            //進(jìn)入攔截器后,給threadLocal綁定session,讓后面需要的公共字段自動(dòng)填充的時(shí)候,填充這個(gè)updateUser
            //每次http請(qǐng)求,會(huì)分配一個(gè)新的線程來(lái)處理
            BaseContext.setThreadLocal((Long) request.getSession().getAttribute(Contants.SESSION_USERID));
            log.info("攔截器這里設(shè)置了ThreadLocal,值為:{}",(Long) request.getSession().getAttribute(Contants.SESSION_USERID));
            log.info("當(dāng)前線程id={}",Thread.currentThread().getId());
            return true;
        }
        //這里應(yīng)該跳轉(zhuǎn)到登入頁(yè)面,如何做?
        //5、如果未登錄則返回未登錄結(jié)果,通過(guò)輸出流方式向客戶端頁(yè)面響應(yīng)數(shù)據(jù)
        log.info("用戶未登入,通過(guò)輸出流方式向客戶端頁(yè)面響應(yīng)數(shù)據(jù),打回登入頁(yè)面");
        response.getWriter().write(JSON.toJSONString(RetObj.error("NOTLOGIN")));//與前端request.js中的代碼呼應(yīng)
        return false;
    }

package cn.edu.uestc.ruijitakeout.common.config;
@Slf4j
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 拓展消息轉(zhuǎn)換器
     * @param converters
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("拓展消息轉(zhuǎn)換器成功加載");
        //創(chuàng)建消息轉(zhuǎn)換器對(duì)象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //設(shè)置對(duì)象轉(zhuǎn)換器,底層使用Jackson將Java對(duì)象轉(zhuǎn)為json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        //將上面的消息轉(zhuǎn)換器對(duì)象追加到mvc框架的轉(zhuǎn)換器集合中
        converters.add(0,messageConverter);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //重寫方法,添加攔截器方法
        registry.addInterceptor(loginInterceptor())
                //攔截哪些路徑
                .addPathPatterns("/**")
                //不攔截路徑
                .excludePathPatterns("/employee/backend/page/login/login.do",
                        //"/backend/**",
                        "/employee/backend/page/login/logout.do",
                        //"/front/**",
                        "/error",
                        "/user/**"


                );
    }

    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }

}

到了這里,關(guān)于springboot項(xiàng)目:瑞吉外賣 前后端 代碼、思路 詳細(xì)分析 part5的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【SpringBoot項(xiàng)目實(shí)戰(zhàn)+思維導(dǎo)圖】瑞吉外賣①(項(xiàng)目介紹、開發(fā)環(huán)境搭建、后臺(tái)登陸/退出功能開發(fā))

    【SpringBoot項(xiàng)目實(shí)戰(zhàn)+思維導(dǎo)圖】瑞吉外賣①(項(xiàng)目介紹、開發(fā)環(huán)境搭建、后臺(tái)登陸/退出功能開發(fā))

    全文主體框架來(lái)源于黑馬瑞吉外賣的項(xiàng)目資料,我在文中會(huì)嵌入如下五個(gè)方面的個(gè)人內(nèi)容: 項(xiàng)目中易發(fā)生錯(cuò)誤的地方 項(xiàng)目中涉及的一些難理解知識(shí)點(diǎn) 一些遺忘知識(shí)點(diǎn)的回顧 業(yè)務(wù)的多種實(shí)現(xiàn)方法 我在做項(xiàng)目時(shí)的思考和一些踩坑 作為一名軟件開發(fā)工程師,我們需要了解在軟件開

    2024年02月05日
    瀏覽(36)
  • 瑞吉外賣項(xiàng)目——瑞吉外賣

    瑞吉外賣項(xiàng)目——瑞吉外賣

    需求分析:產(chǎn)品原型、需求規(guī)格說(shuō)明書 設(shè)計(jì):產(chǎn)品文檔、UI界面設(shè)計(jì)、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、數(shù)據(jù)庫(kù)設(shè)計(jì) 編碼:項(xiàng)目代碼、單元測(cè)試 測(cè)試:測(cè)試用例、測(cè)試報(bào)告 上線運(yùn)維:軟件環(huán)境安裝、配置 項(xiàng)目經(jīng)理:對(duì)整個(gè)項(xiàng)目負(fù)責(zé),任務(wù)分配、把控進(jìn)度 產(chǎn)品經(jīng)理:進(jìn)行需求調(diào)研,輸

    2023年04月26日
    瀏覽(21)
  • 基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣(四)

    基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣(四)

    1.1 需求分析與設(shè)計(jì) 1.1.1 產(chǎn)品原型 在員工管理列表頁(yè)面點(diǎn)擊 “編輯” 按鈕,跳轉(zhuǎn)到編輯頁(yè)面,在編輯頁(yè)面回顯員工信息并進(jìn)行修改,最后點(diǎn)擊 “保存” 按鈕完成編輯操作。 修改頁(yè)面原型 : 注:點(diǎn)擊修改時(shí),數(shù)據(jù)應(yīng)該正?;仫@到修改頁(yè)面。 1.1.2 接口設(shè)計(jì) 根據(jù)上述原型圖分

    2024年02月05日
    瀏覽(25)
  • 基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣集成Redis(九)

    基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣集成Redis(九)

    1.1 Redis的Java客戶端 Redis 的 Java 客戶端很多,常用的幾種: Jedis Lettuce Spring Data Redis Spring 對(duì) Redis 客戶端進(jìn)行了整合,提供了 Spring Data Redis,在Spring Boot項(xiàng)目中還提供了對(duì)應(yīng)的Starter,即 spring-boot-starter-data-redis。 1.2 Spring Data Redis使用方式 1.2.1 介紹 Spring Data Redis 是 Spring 的一部分

    2024年02月05日
    瀏覽(31)
  • 項(xiàng)目筆記-瑞吉外賣(全)

    項(xiàng)目筆記-瑞吉外賣(全)

    1.對(duì)后端返回請(qǐng)求值的分析 2.對(duì)不同種請(qǐng)求參數(shù)的分析 3.事務(wù)管理 1.軟件開發(fā)整體介紹 2.項(xiàng)目整體介紹?? 后端:管理菜品和員工信息 前臺(tái):通過(guò)手機(jī)端,可以瀏覽菜品和添加客戶端 開發(fā)項(xiàng)目流程: 實(shí)現(xiàn)基本需求,用戶能在手機(jī)瀏覽器訪問(wèn) 對(duì)移動(dòng)端應(yīng)用改進(jìn),使用微信小程

    2024年02月07日
    瀏覽(24)
  • 瑞吉外賣項(xiàng)目記錄

    瑞吉外賣項(xiàng)目記錄

    本文為個(gè)人學(xué)習(xí)黑馬《瑞吉外賣》項(xiàng)目后進(jìn)行的項(xiàng)目總結(jié),更偏向于對(duì)自己編寫文本能力的鍛煉以及對(duì)項(xiàng)目知識(shí)點(diǎn)的簡(jiǎn)短記錄。因?yàn)閭€(gè)人能力問(wèn)題,其中可行性分析和測(cè)試部分只進(jìn)行了小標(biāo)題的陳列,并沒(méi)有進(jìn)行編輯。對(duì)《瑞吉外賣》項(xiàng)目感興趣的朋友也可以瀏覽本文后再去

    2024年02月05日
    瀏覽(19)
  • 瑞吉外賣項(xiàng)目----(2)緩存優(yōu)化

    瑞吉外賣項(xiàng)目----(2)緩存優(yōu)化

    將項(xiàng)目推送到遠(yuǎn)程倉(cāng)庫(kù)里,教程在git 提交遠(yuǎn)程倉(cāng)庫(kù)前建議取消代碼檢查 創(chuàng)建新的分支v1.0(用于實(shí)現(xiàn)緩存優(yōu)化)并推送到遠(yuǎn)程倉(cāng)庫(kù) 1.1.1 maven坐標(biāo) 導(dǎo)入spring-data-redis的maven坐標(biāo): 1.1.2 配置文件 在application.yml中加入redis相關(guān)配置: 1.1.3 配置類 在項(xiàng)目中加入RedisConfig 1.2.1 實(shí)現(xiàn)思路

    2024年02月14日
    瀏覽(16)
  • 基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣微信小程序端(九)

    基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣微信小程序端(九)

    1.1 入門 在進(jìn)行微信登錄之前我們要先知道HttpClient是什么,它是Apache Jakarta Common 下的子項(xiàng)目,可以用來(lái)提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。 HttpClient作用: 發(fā)送HTTP請(qǐng)求 接收響應(yīng)數(shù)據(jù) HttpClient應(yīng)用場(chǎng)景

    2024年02月03日
    瀏覽(37)
  • 基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣微信小程序端(十一)

    基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣微信小程序端(十一)

    1.1 問(wèn)題說(shuō)明 用戶端小程序展示的菜品數(shù)據(jù)都是通過(guò)查詢數(shù)據(jù)庫(kù)獲得,如果用戶端訪問(wèn)量比較大,數(shù)據(jù)庫(kù)訪問(wèn)壓力隨之增大。 結(jié)果 :系統(tǒng)響應(yīng)慢、用戶體驗(yàn)差 1.2 實(shí)現(xiàn)思路 通過(guò)Redis來(lái)緩存菜品數(shù)據(jù),減少數(shù)據(jù)庫(kù)查詢操作。 緩存邏輯分析: 每個(gè)分類下的菜品保存一份緩存數(shù)據(jù)

    2024年01月24日
    瀏覽(32)
  • 基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣微信小程序端(十三)

    基于SpringBoot+Redis的前后端分離外賣項(xiàng)目-蒼穹外賣微信小程序端(十三)

    地址簿,指的是消費(fèi)者用戶的地址信息,用戶登錄成功后可以維護(hù)自己的地址信息。同一個(gè)用戶可以有多個(gè)地址信息,但是只能有一個(gè) 默認(rèn)地址 。 對(duì)于地址簿管理,有以下幾個(gè)功能: 查詢地址列表 新增地址 修改地址 刪除地址 設(shè)置默認(rèn)地址 查詢默認(rèn)地址 根據(jù)上述原型圖先

    2024年01月21日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包