✅P219_商城业务-认证服务-账号密码登录完成
2024/2/14大约 2 分钟
编写Vo
UserLoginVo
cfmall-auth-server/src/main/java/com/gyz/cfmall/vo/UserLoginVo.java
package com.gyz.cfmall.vo;
import lombok.Data;
@Data
public class UserLoginVo {
/**
* 登录账户。用户名或手机号
*/
private String loginacct;
/**
* 密码
*/
private String password;
}
MemberUserLoginVo
cfmall-member/src/main/java/com/gyz/cfmall/member/vo/MemberUserLoginVo.java
package com.gyz.cfmall.member.vo;
import lombok.Data;
@Data
public class MemberUserLoginVo {
private String loginacct;
private String password;
}
数据绑定
cfmall-auth-server/src/main/resources/templates/login.html
<form action="/login" method="post">
<!-- 错误信息提示-->
<div style="color: red"
th:text="${errors != null ? (#maps.containsKey(errors, 'msg') ? errors.msg : '') : ''}"></div>
<ul>
<li class="top_1">
<img src="/static/login/JD_img/user_03.png" class="err_img1"/>
<!-- loginacct要和vo定义的一致-->
<input name="loginacct" type="text" placeholder=" 邮箱/用户名/已验证手机" class="user"/>
</li>
<li>
<img src="/static/login/JD_img/user_06.png" class="err_img2"/>
<input name="password" type="password" placeholder=" 密码" class="password"/>
</li>
<li class="bri">
<a href="/static/login/">忘记密码</a>
</li>
<li class="ent">
<!-- 此处注意把原先的 calss="a" 去掉,要不然会跳转到百度首页-->
<button class="btn2" type="submit">登 录</a></button>
</li>
</ul>
</form>
登录接口
cfmall-auth-server/src/main/java/com/gyz/cfmall/controller/LoginController.java
注意:不能加@RequestBody注解,这里是页面提交表单数据,数据类型是map并非json
@PostMapping("/login")
public String login(UserLoginVo userLoginVo, RedirectAttributes attributes) {
R r = memberFeignService.login(userLoginVo);
if (r.getCode() == 0) {
log.info("账号密码登录成功");
return "redirect:http://cfmall.com";
} else {
Map<String, String> errors = new HashMap<>();
errors.put("msg", r.getData("msg", new TypeReference<String>() {
}));
attributes.addFlashAttribute("errors", errors);
return "redirect:http://auth.cfmall.com/login.html";
}
}
Feign
cfmall-auth-server/src/main/java/com/gyz/cfmall/feign/MemberFeignService.java
/**
* 远程调用用户登录
* @param userLoginVo
* @return
*/
@PostMapping(value = "/member/member/login")
R login(@RequestBody UserLoginVo userLoginVo);
会员服务接口
cfmall-member/src/main/java/com/gyz/cfmall/member/controller/MemberController.java
@PostMapping(value = "/login")
public R login(@RequestBody MemberUserLoginVo userLoginVo) {
MemberEntity memberEntity = memberService.login(userLoginVo);
if (memberEntity != null) {
return R.ok();
} else {
return R.error(BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getCode(), BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getMessage());
}
}
枚举类编写cfmall-common/src/main/java/com/gyz/common/exception/BizCodeEnum.java
LOGINACCT_PASSWORD_EXCEPTION(15003,"账号或密码错误"),
登录逻辑cfmall-member/src/main/java/com/gyz/cfmall/member/service/impl/MemberServiceImpl.java
@Override
public MemberEntity login(MemberUserLoginVo userLoginVo) {
String loginacct = userLoginVo.getLoginacct();
String password = userLoginVo.getPassword();
MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper<MemberEntity>().eq("username", loginacct).or().eq("mobile", loginacct));
if (memberEntity == null) {
return null;
} else {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
boolean matches = bCryptPasswordEncoder.matches(password, memberEntity.getPassword());
if (matches) {
return memberEntity;
}
}
return null;
}
测试
POST:http://localhost:8600/login