2.登录

登录

1. 需求分析

image-20221124203350490

  • 用户点击开始使用

    登录后的用户权限较大,可以查看,也可以操作(点赞,关注,评论)

  • 用户点击不登录,先看看

​ 游客只有查看的权限

2. 表结构分析

image-20221124203747509

3.用户登录功能实现思路分析

image-20221124203913942

1,用户输入了用户名和密码进行登录,校验成功后返回token(基于当前用户的id生成)

2,用户游客登录,生成token返回(基于默认值0生成)

4. 用户微服务搭建及实现登录功能

4.1 服务结构

image-20221124204132903

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配置中心的地址

posted @ 2022-11-24 20:56  给我手牵你走  阅读(162)  评论(0编辑  收藏  举报