尚籌網(wǎng)2-5.前端工程(3).登陸功能

1.登錄功能

①流程分析

②抽取接口

被抽取接口的類:member-manager工程的com.rgh.crowd.controller.MemberController

抽取得到的接口:common工程的com.rgh.crowd.api.MemberOperationRemoteService

@FeignClient("member-manager")
public interface MemberOperationRemoteService {
    @RequestMapping("/retrieve/member/launch/info/by/member/token")
    public ResultEntity<MemberLaunchInfoPO> retrieveMemberLaunchInfoByMemberToken(@RequestParam("token") String token);

    @RequestMapping("/member/manager/logout")
    public ResultEntity<String> logout(@RequestParam("token") String token);

    @RequestMapping("/member/manager/login")
    public ResultEntity<MemberSignSuccessVO> login(
            @RequestParam("loginAcct") String loginAcct,
            @RequestParam("userPswd") String userPswd);

    @RequestMapping("/member/manager/register")
    public ResultEntity<String> register(@RequestBody MemberVO memberVO);

    @RequestMapping("/member/manager/send/code")
    public ResultEntity<String> sendCode(@RequestParam("phoneNum") String phoneNum);
}

③確認(rèn)在Eureka注冊中心注冊member-manager

3.登錄功能具體實現(xiàn)

①SpringBoot環(huán)境下SpringMVC詳細(xì)配置

創(chuàng)建配置類,實現(xiàn)org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口

所在工程: distribution-crowd-7-webui

所在類: com.rgh.crowd.config.SpringMVCConfig

@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 相當(dāng)于:<mvc:view-controller path="/to/login/page.html" view-name="member-login" />
        // 跳轉(zhuǎn)到登錄頁面
        String urlPath = "/member/to/login/page.html";
        String viewName = "member-login";
        registry.addViewController(urlPath).setViewName(viewName);
        // 跳轉(zhuǎn)到個人中心頁面
        urlPath = "/member/to/member/center/page.html";
        viewName = "member-center";
        registry.addViewController(urlPath).setViewName(viewName);
    }
}

②實體類序列化問題

member-manager調(diào)用database-provider和redis-provider時并沒有要求實體類序列化。但是webui調(diào)用member-manager時要求序列化。所以需要給實體類附加序列化支持。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MemberSignSuccessVO implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private String username;
    private String email;
    private String token;

}

③webui工程的Controller方法

@RequestMapping("/member/do/login.html")
public String doLogin(MemberVO memberVO, Model model, HttpSession session) {
    String loginAcct = memberVO.getLoginacct();
    String userPswd = memberVO.getUserpswd();
    // 調(diào)用遠(yuǎn)程方法執(zhí)行登錄操作
    ResultEntity<MemberSignSuccessVO> resultEntity = memberManagerRemoteService.login(loginAcct, userPswd);
    // 檢查遠(yuǎn)程方法調(diào)用結(jié)果
    String result = resultEntity.getResult();
    if(ResultEntity.FAILED.equals(result)) {
        String message = resultEntity.getMessage();
        model.addAttribute(CrowdConstant.ATTR_NAME_MESSAGE, message);
        return "member-login";
    }
    // 如果登錄成功,則獲取MemberSignSuccessVO對象
    MemberSignSuccessVO memberSignSuccessVO = resultEntity.getData();
    // 將MemberSignSuccessVO對象存入Session域
    session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_MEMBER, memberSignSuccessVO);
    return "redirect:/member/to/member/center/page.html";
}

④個人中心頁面訪問Session域顯示用戶昵稱

[[${session['LOGIN-MEMBER'].username}]]

2.退出登錄

@RequestMapping("/member/logout.html")
public String logout(HttpSession session) {
    
    // 1.從現(xiàn)有Session中獲取已登錄的Member
    MemberSignSuccessVO memberSignSuccessVO = (MemberSignSuccessVO) session.getAttribute(CrowdConstant.ATTR_NAME_LOGIN_MEMBER);
    
    // 2.如果memberSignSuccessVO為null,則已經(jīng)退出,不必繼續(xù)執(zhí)行
    if(memberSignSuccessVO  == null) {
        return "redirect:/";
    }
    
    // 3.獲取token值
    String token = memberSignSuccessVO.getToken();
    
    // 4.調(diào)用遠(yuǎn)程方法刪除Redis中存儲的token
    ResultEntity<String> resultEntity = memberManagerRemoteService.logout(token);
    
    // 5.如果調(diào)用遠(yuǎn)程方法失敗,拋出異常
    String result = resultEntity.getResult();
    
    if(ResultEntity.FAILED.equals(result)) {
        throw new RuntimeException(resultEntity.getMessage());
    }
    
    // 6.釋放當(dāng)前Session
    session.invalidate();
    
    return "redirect:/index.html";
}

⑤登錄頁面

文件路徑:/distribution-crowd-7-webui/src/main/resources/templates/member_login.html

⑥個人中心頁面

文件路徑:/distribution-crowd-7-webui/src/main/resources/templates/member_center.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容