2.登录
登录
1. 需求分析
-
用户点击开始使用
登录后的用户权限较大,可以查看,也可以操作(点赞,关注,评论)
-
用户点击不登录,先看看
游客只有查看的权限
2. 表结构分析
3.用户登录功能实现思路分析
1,用户输入了用户名和密码进行登录,校验成功后返回token(基于当前用户的id生成)
2,用户游客登录,生成token返回(基于默认值0生成)
4. 用户微服务搭建及实现登录功能
4.1 服务结构
4.2 实体类
package com.heima.model.user.pojos;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* APP用户信息表
* </p>
*
* @author itheima
*/
@Data
@TableName("ap_user")
public class ApUser implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 密码、通信等加密盐
*/
@TableField("salt")
private String salt;
/**
* 用户名
*/
@TableField("name")
private String name;
/**
* 密码,md5加密
*/
@TableField("password")
private String password;
/**
* 手机号
*/
@TableField("phone")
private String phone;
/**
* 头像
*/
@TableField("image")
private String image;
/**
* 0 男
1 女
2 未知
*/
@TableField("sex")
private Boolean sex;
/**
* 0 未
1 是
*/
@TableField("is_certification")
private Boolean certification;
/**
* 是否身份认证
*/
@TableField("is_identity_authentication")
private Boolean identityAuthentication;
/**
* 0正常
1锁定
*/
@TableField("status")
private Boolean status;
/**
* 0 普通用户
1 自媒体人
2 大V
*/
@TableField("flag")
private Short flag;
/**
* 注册时间
*/
@TableField("created_time")
private Date createdTime;
}
4.3 Mapper
package com.heima.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.model.user.pojos.ApUser;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ApUserMapper extends BaseMapper<ApUser> {
}
4.4 Service
package com.heima.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
public interface ApUserService extends IService<ApUser> {
//用户登录
ResponseResult userLogin(LoginDto dto);
}
4.4 ServiceImpl
package com.heima.user.service.serviceimpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.exception.CustomException;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import java.util.HashMap;
import java.util.Map;
@Service
@Transactional
@Slf4j
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {
/**
* 用户登录业务层
* @param dto
* @return
*/
public ResponseResult userLogin(LoginDto dto) {
//1.用户正常登录
if(StringUtils.isNoneBlank(dto.getPhone()) && StringUtils.isNoneBlank(dto.getPassword())){
//1.1根据手机号码查询用户
LambdaQueryWrapper<ApUser> lwq = new LambdaQueryWrapper<>();
lwq.eq(ApUser::getPhone,dto.getPhone());
ApUser apUser = getOne(lwq);
//1.2判断用户是否为空
if(apUser == null){
throw new CustomException(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
}
//1.3校验密码
String password = dto.getPassword();
String salt = apUser.getSalt();
//这个是用户登录传过来的密码,加盐之后,再MD5加密得到的密码
String md5DigestAsHex = DigestUtils.md5DigestAsHex((password + salt).getBytes());
if(!apUser.getPassword().equals(md5DigestAsHex)){
throw new CustomException(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
}
//1.4登录成功颁发token
String token = AppJwtUtil.getToken(apUser.getId().longValue());
//1.5构造返回数据
Map<String,Object> map = new HashMap<>();
apUser.setSalt("");
apUser.setPassword("");
map.put("token", token);
map.put("user",apUser);
return ResponseResult.okResult(map);
}else {
//2.不登录,游客模式
Map<String,Object> map = new HashMap<>();
map.put("token",AppJwtUtil.getToken(0L));
return ResponseResult.okResult(map);
}
}
}
4.4 Controller
package com.heima.user.controller.v1;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.user.dtos.LoginDto;
import com.heima.user.service.ApUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/login")
public class ApUserLoginController {
@Autowired
private ApUserService apUserService;
/**
* 用户登录
* @param dto q请求参数,封装的是手机号和密码
* @return
* @Auth 张大帅哥
*/
@PostMapping("/login_auth")
public ResponseResult userLogin(LoginDto dto){
ResponseResult responseResult = apUserService.userLogin(dto);
return responseResult;
}
}
4.5 项目配置文件bootstrap.yml
server:
port: 41801 #端口
spring:
application:
name: leadnews-user #服务名称
cloud:
nacos:
discovery:
server-addr: 192.168.1.2:8848 #nacos注册中心地址
config:
server-addr: 192.168.1.2:8848 #nacos配置中心地址
file-extension: yml
4.6 nacos配置中心
spring:
redis:
host: 192.168.1.2
# password: leadnews
port: 6379
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.1.2:3306/leadnews_user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: root
password: 1234
# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
# 设置别名包扫描路径,通过该属性可以给包中的类注册别名
type-aliases-package: com.heima.model.user.pojos
服务启动时会优先读取bootstrap.yml,然后根据里面的nacos地址再读取nacos配置中心的地址