用户中心项目(登录 + 用户管理功能后端)

news2024/9/24 17:20:51

文章目录

    • 1.登录功能-后端
        • 1.思路分析
        • 2.完成对用户名和密码的校验
          • 1.com/sun/usercenter/service/UserService.java 添加方法
          • 2.com/sun/usercenter/service/impl/UserServiceImpl.java 添加方法
          • 3.com/sun/usercenter/service/impl/UserServiceImpl.java 新增属性
        • 3.记录用户的登录态并配置MyBatisPlus的逻辑删除
          • 1.com/sun/usercenter/service/UserService.java 修改doLogin,增加参数 request
          • 2.com/sun/usercenter/service/impl/UserServiceImpl.java 新增属性
          • 3.com/sun/usercenter/service/impl/UserServiceImpl.java 添加代码
          • doLogin 方法添加代码,记录用户登录态
          • 4.配置MyBatisPlus的逻辑删除
            • 1.application.yml 配置
            • 2.实体类添加注解
    • 2.接口开发及测试
        • 1.com/sun/usercenter/controller/UserController.java 注册和登录接口
        • 2.封装登录和注册请求信息的对象
          • 1.文件目录
          • 2.com/sun/usercenter/model/request/UserLoginRequest.java 用户登录请求体
          • 3.com/sun/usercenter/model/request/UserRegisterRequest.java 用户注册请求体
        • 3.单元测试
          • 1.用户注册接口测试
            • 1.debug模式启动IDEA
            • 2.postman测试
          • 2.用户登录接口测试
            • 1.com/sun/usercenter/service/impl/UserServiceImpl.java的doLogin最后下断点
            • 2.postman测试
            • 3.查看session是否有用户登录状态的信息
            • 4.放行,查看postman的返回结果
          • 3.逻辑删除测试
            • 1.在数据库中把刚才进行登录的用户id改成1
            • 2.重新登录一下
    • 3.用户管理接口
        • 1.com/sun/usercenter/controller/UserController.java 添加方法
        • 2.user表新增字段role表示用户权限
          • 1.新增字段role
          • 2.com/sun/usercenter/model/domain/User.java 实体类新增权限字段
          • 3.Mapper.xml不用修改,因为这个字段本来就与表的字段对应
          • 4.com/sun/usercenter/service/impl/UserServiceImpl.java 用户脱敏里面把role字段加进去
        • 3.com/sun/usercenter/contant/UserConstant.java 存放用户常量的接口
        • 4.com/sun/usercenter/controller/UserController.java 对两个接口进行权限验证
          • 1.添加方法 isAdmin 判断是否为管理员
          • 2.修改两个接口的方法
        • 5.application.yml 设置session超时时间
        • 6.单元测试
          • 1.测试 searchUsers接口
            • 1.登录
            • 2.表中增加两条测试记录
            • 3.进行查询,成功查询!
          • 2.测试deleteUser接口
            • 1.删除id为1的用户
            • 2.查看数据库,成功进行逻辑删除
          • 3.解决 searchUsers接口返回的用户信息没有脱敏的问题
            • 1.com/sun/usercenter/service/UserService.java 添加方法
            • 2.com/sun/usercenter/service/impl/UserServiceImpl.java 实现方法并修改逻辑
            • 3.com/sun/usercenter/controller/UserController.java 修改searchUsers方法对查询到的用户列表进行脱敏
            • 4.再次测试,敏感信息变成null了

1.登录功能-后端

1.思路分析

image-20240321111353462

2.完成对用户名和密码的校验
1.com/sun/usercenter/service/UserService.java 添加方法
    public Long userRegister(String userAccount, String userPassword, String checkPassword);

    /**
     * 用户登录接口
     * @param userAccount 账号
     * @param userPassword 密码
     * @return 成功返回脱敏后的User对象,失败返回null
     */
    public User doLogin(String userAccount, String userPassword);
2.com/sun/usercenter/service/impl/UserServiceImpl.java 添加方法
    @Override
    public User doLogin(String userAccount, String userPassword) {
        // 1 检验用户名和密码是否合法,如果不合法就没必要去数据库查询
        // 验证非空
        if (StringUtils.isAnyBlank(userAccount, userPassword)) {
            return null;
        }
        // 账户4到16位,不能包含特殊字符
        if (!userAccount.matches("^[a-zA-Z0-9]{4,16}$")) {
            return null;
        }
        // 密码不小于8位
        if (userPassword.length() < 8) {
            return null;
        }

        // 2 密码加密进行查询
        String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());

        // 编写查询条件
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("userPassword", encryptPassword);
        userQueryWrapper.eq("userAccount", userAccount);
        // 执行查询
        User user = userMapper.selectOne(userQueryWrapper);
        // 判断用户是否存在
        if (user == null) {
            // 输出日志
            log.info("user login faild, userAccount can not match password");
            return null;
        }

        // 3 记录用户的登录态


        return user;
    }
3.com/sun/usercenter/service/impl/UserServiceImpl.java 新增属性

image-20240321114714756

3.记录用户的登录态并配置MyBatisPlus的逻辑删除
1.com/sun/usercenter/service/UserService.java 修改doLogin,增加参数 request
    /**
     * 用户登录接口
     * @param userAccount 账号
     * @param userPassword 密码
     * @return 成功返回脱敏后的User对象,失败返回null
     */
    public User doLogin(String userAccount, String userPassword, HttpServletRequest request);
2.com/sun/usercenter/service/impl/UserServiceImpl.java 新增属性

image-20240321125443877

3.com/sun/usercenter/service/impl/UserServiceImpl.java 添加代码
doLogin 方法添加代码,记录用户登录态
        // 3 如果登录成功,记录用户的登录态

        // 首先进行脱敏
        User cleanUser = new User();
        cleanUser.setId(user.getId());
        cleanUser.setUsername(user.getUsername());
        cleanUser.setUserAccount(user.getUserAccount());
        cleanUser.setAvatarUrl(user.getAvatarUrl());
        cleanUser.setGender(user.getGender());
        cleanUser.setPhone(user.getPhone());
        cleanUser.setEmail(user.getEmail());
        cleanUser.setUserStatus(user.getUserStatus());
        cleanUser.setCreateTime(user.getCreateTime());

        HttpSession session = request.getSession();
        // 然后将脱敏后的用户信息放入session中
        session.setAttribute(USER_LOGIN_SAVE, cleanUser);

        return cleanUser;
4.配置MyBatisPlus的逻辑删除
1.application.yml 配置
global-config:
  db-config:
    logic-delete-field: isDelete # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
    logic-delete-value: 1 # 逻辑已删除值(默认为 1)
    logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

2.实体类添加注解

image-20240321125851499

2.接口开发及测试

1.com/sun/usercenter/controller/UserController.java 注册和登录接口
package com.sun.usercenter.controller;

import com.sun.usercenter.model.domain.User;
import com.sun.usercenter.model.request.UserLoginRequest;
import com.sun.usercenter.model.request.UserRegisterRequest;
import com.sun.usercenter.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/3/21 13:04
 * @Version 1.0
 */
@RestController // 作为一个Controller注入容器,并将返回结果转换为json
@RequestMapping("/user") // restful风格的请求
public class UserController {
    @Resource
    private UserService userService; // 注入针对Service接口的bean对象,可以调用接口的方法

    @PostMapping("/register")
    public Long userRegister(@RequestBody UserRegisterRequest userRegisterRequest) {
        // 首先判断数据是否成功封装
        if (userRegisterRequest == null) {
            return null;
        }

        // 对封装的数据进行校验,如果有一个是空直接返回null
        String userAccount = userRegisterRequest.getUserAccount();
        String userPassword = userRegisterRequest.getUserPassword();
        String checkPassword = userRegisterRequest.getCheckPassword();
        if (StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) {
            return null;
        }

        // 调用Service层的注册方法,如果成功注册,则返回注册成功的用户id, 否则返回-1
        return userService.userRegister(userAccount, userPassword, checkPassword);
    }

    @PostMapping("/login")
    public User userRegister(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) {
        // 首先判断数据是否成功封装
        if (userLoginRequest == null) {
            return null;
        }

        // 对封装的数据进行校验,如果有一个是空直接返回null
        String userAccount = userLoginRequest.getUserAccount();
        String userPassword = userLoginRequest.getUserPassword();
        if (StringUtils.isAnyBlank(userAccount, userPassword)) {
            return null;
        }

        return userService.doLogin(userAccount, userPassword, request);
    }

}

2.封装登录和注册请求信息的对象
1.文件目录

image-20240321140744768

2.com/sun/usercenter/model/request/UserLoginRequest.java 用户登录请求体
package com.sun.usercenter.model.request;

import lombok.Data;

/**
 * Description: 用户登录请求体
 *
 * @Author sun
 * @Create 2024/3/21 13:39
 * @Version 1.0
 */
@Data
public class UserLoginRequest {
    private String userAccount;
    private String userPassword;
}

3.com/sun/usercenter/model/request/UserRegisterRequest.java 用户注册请求体
package com.sun.usercenter.model.request;


import lombok.Data;

/**
 * Description: 用户注册请求体
 *
 * @Author sun
 * @Create 2024/3/21 13:26
 * @Version 1.0
 */
@Data
public class UserRegisterRequest {
    private String userAccount;
    private String userPassword;
    private String checkPassword;
}

3.单元测试
1.用户注册接口测试
1.debug模式启动IDEA
2.postman测试

image-20240321141238471

2.用户登录接口测试
1.com/sun/usercenter/service/impl/UserServiceImpl.java的doLogin最后下断点

image-20240321141351808

2.postman测试

image-20240321141426988

3.查看session是否有用户登录状态的信息

image-20240321141538940

4.放行,查看postman的返回结果

image-20240321141640952

3.逻辑删除测试
1.在数据库中把刚才进行登录的用户id改成1

image-20240321142052891

2.重新登录一下

image-20240321142150628

3.用户管理接口

1.com/sun/usercenter/controller/UserController.java 添加方法
    /**
     * 根据用户名进行模糊查询
     *
     * @param username
     * @return 成功返回信息,失败返回null
     */
    @GetMapping("/search")
    public List<User> searchUsers(String username) {
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotBlank(username)) {
            userQueryWrapper.like("username", username);
        }
        return userService.list(userQueryWrapper);
    }

    /**
     * 根据id进行逻辑删除(只要配置了MyBatisPlus的逻辑删除即可进行自动逻辑删除)
     *
     * @param id
     * @return 成功返回true,失败返回false
     */
    @PostMapping("/delete")
    public boolean deleteUser(@RequestBody Long id) {
        if (id <= 0) {
            return false;
        }
        return userService.removeById(id); // 这里会自动逻辑删除
    }
2.user表新增字段role表示用户权限
1.新增字段role

image-20240321145517358

2.com/sun/usercenter/model/domain/User.java 实体类新增权限字段

image-20240321151111785

3.Mapper.xml不用修改,因为这个字段本来就与表的字段对应
4.com/sun/usercenter/service/impl/UserServiceImpl.java 用户脱敏里面把role字段加进去

image-20240321152845893

3.com/sun/usercenter/contant/UserConstant.java 存放用户常量的接口
package com.sun.usercenter.contant;

/**
 * Description: 用户常量
 *
 * @Author sun
 * @Create 2024/3/21 15:14
 * @Version 1.0
 */
public interface UserConstant {

    /*
    用户登录状态
     */
    String USER_LOGIN_SAVE = "userLoginState";

    // 用户权限

    /*
    默认权限
     */
    Integer DEFAULT_ROLE = 0;

    /*
    管理员权限
     */
    Integer ADMIN_ROLE = 1;
}

4.com/sun/usercenter/controller/UserController.java 对两个接口进行权限验证
1.添加方法 isAdmin 判断是否为管理员
    /**
     * 判断是否是管理员
     * @param request
     * @return 布尔
     */
    public boolean isAdmin(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute(USER_LOGIN_SAVE);
        return user != null && user.getRole() == ADMIN_ROLE;
    }
2.修改两个接口的方法
    /**
     * 根据用户名进行模糊查询
     *
     * @param username
     * @return 成功返回信息,失败返回null
     */
    @GetMapping("/search")
    public List<User> searchUsers(String username, HttpServletRequest request) {
        // 仅管理员可查询
        if (!isAdmin(request)) {
            return new ArrayList<>();
        }

        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotBlank(username)) {
            userQueryWrapper.like("username", username);
        }
        return userService.list(userQueryWrapper);
    }

    /**
     * 根据id进行逻辑删除(只要配置了MyBatisPlus的逻辑删除即可进行自动逻辑删除)
     *
     * @param id
     * @return 成功返回true,失败返回false
     */
    @PostMapping("/delete")
    public boolean deleteUser(long id, HttpServletRequest request) {
        // 仅管理员可删除
        if (!isAdmin(request)) {
            return false;
        }

        if (id <= 0) {
            return false;
        }
        return userService.removeById(id); // 这里会自动逻辑删除
    }

5.application.yml 设置session超时时间

image-20240321162627353

6.单元测试
1.测试 searchUsers接口
1.登录

image-20240321160903366

2.表中增加两条测试记录

image-20240321161350566

3.进行查询,成功查询!

image-20240321161505507

2.测试deleteUser接口
1.删除id为1的用户

image-20240321162032694

2.查看数据库,成功进行逻辑删除

image-20240321162120945

3.解决 searchUsers接口返回的用户信息没有脱敏的问题
1.com/sun/usercenter/service/UserService.java 添加方法
    /**
     * 进行用户信息脱敏
     * @param user
     * @return
     */
    User getCleanUser(User user);
2.com/sun/usercenter/service/impl/UserServiceImpl.java 实现方法并修改逻辑

image-20240321165022958

    /**
     * 对得到的user对象,进行用户信息脱敏
     * @param user
     * @return
     */
    @Override
    public User getCleanUser(User user) {
        User cleanUser = new User();
        cleanUser.setId(user.getId());
        cleanUser.setUsername(user.getUsername());
        cleanUser.setUserAccount(user.getUserAccount());
        cleanUser.setAvatarUrl(user.getAvatarUrl());
        cleanUser.setGender(user.getGender());
        cleanUser.setPhone(user.getPhone());
        cleanUser.setEmail(user.getEmail());
        cleanUser.setUserStatus(user.getUserStatus());
        cleanUser.setCreateTime(user.getCreateTime());
        cleanUser.setRole(user.getRole());
        return cleanUser;
    }
3.com/sun/usercenter/controller/UserController.java 修改searchUsers方法对查询到的用户列表进行脱敏
/**
 * 根据用户名进行模糊查询
 *
 * @param username
 * @return 成功返回信息,失败返回null
 */
@GetMapping("/search")
public List<User> searchUsers(String username, HttpServletRequest request) {
    // 仅管理员可查询
    if (!isAdmin(request)) {
        return new ArrayList<>();
    }

    QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
    if (StringUtils.isNotBlank(username)) {
        userQueryWrapper.like("username", username);
    }
    List<User> userList = userService.list(userQueryWrapper);

    // 将查询到的用户数据进行脱敏

    // 这里的逻辑就是把查询到User对象列表使用user来遍历然后对每个user对象进行脱敏最后组合成一个新的list
    return userList.stream().map(user -> {
       return userService.getCleanUser(user);
    }).collect(Collectors.toList());
}
4.再次测试,敏感信息变成null了

image-20240321170006198

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot如何写好单元测试

&#x1f413;序言 Spring中的单元测试非常方便&#xff0c;可以很方便地对Spring Bean进行测试&#xff0c;包括Controller、Service和Repository等Spring Bean进行测试&#xff0c;确保它们的功能正常&#xff0c;并且不会因为应用的其他变化而出现问题。 &#x1f413;单元测…

借教室与差分

原题 题目描述 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。 教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。  面对海量租借教室的信息&…

Wmware安装Linux(centerOS、Ubuntu版本)

目录 1、安装wmware 2、center版本 3、ubuntu版本 1、安装wmware 此处不做展开。 2、center版本 需要提前下载的文件&#xff1a; 无图形化界面https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso 有图形化界面https://mirrors.a…

nacos 更新报错“发布失败。请检查参数是否正确”

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容起因解决方案结果 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华…

Lenze伦茨8400变频器E84A L-force Drives 操作使用说明

Lenze伦茨8400变频器E84A L-force Drives 操作使用说明

深度强化学习03价值学习

Q*类似于先知&#xff0c;知道动作的后果 价值学习是得到一个近似的价值函数

ubuntu20.04搭建rtmp视频服务

1.安装软件 sudo apt-get install ffmpeg sudo apt-get install nginx sudo apt-get install libnginx-mod-rtmp 2.nginx配置 修改/etc/nginx/nginx.conf文件&#xff0c;在末尾添加&#xff1a; rtmp {server {listen 1935;application live {live on;}} } 3.视频测试 本…

Linux系统Docker安装Drupal并配置数据库实现公网远程访问本地站点

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

Spring MVC(二)-过滤器与拦截器

过滤器和拦截器在职责和使用场景上存在一些差异。 过滤器 拦截器 作用 对请求进行预处理和后处理。例如过滤请求参数、设置字符编码。 拦截用户请求并进行相应处理。例如权限验证、用户登陆检查等。 工作级别 Servlet容器级别&#xff0c;是Tomcat服务器创建的对象。可以…

Cannot run program “C:\Program Files\Java\jdk-17\bin\java.exe“

错误提示&#xff1a;Cannot run program “C:\Program Files\Java\jdk-17\bin\java.exe” 解决办法&#xff1a; 检查环境变量是否配置是否正确检查项目环境是否正确&#xff0c;可能会出现多个JDK版本&#xff0c;将不需要的删除

Flume入门概述及安装部署

目录 一、Flume概述1.1 Flume定义1.2 Flume基础架构 二、Flume安装部署 一、Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础…

Nebula Graph-03-NebulaGraph Studio-可视化web工具安装和使用

前言 如果未安装NebulaGraph&#xff0c;可以去看Nebula Graph-01-Nebula Graph简介和安装以及客户端连接 NebulaGraph Studio-可视化web工具安装 1&#xff1a;什么是 NebulaGraph Studio NebulaGraph Studio&#xff08;简称 Studio&#xff09;是一款可以通过 Web 访问的…

一篇文章教会你如何用 Axure 画原型图

原型图对于做出更好的 UI 设计决策非常重要。然而&#xff0c;选择合适的原型工具并不容易。我们需要仔细考虑成本、功能、与其他设计工具的集成、学习曲线、协作功能和用户测试方法&#xff0c;本文将分析 Axure 的原型设计工具。 1、为何使用 Axure 绘制原型图&#xff1f; …

【喜讯】同邦集团正式成为广州数据交易所会员!高效开展数据管理。

近日&#xff0c;同邦信息科技顺利通过广州数据交易所数商会员资格审查&#xff0c;正式加入广州数据交易所数商生态。 据悉&#xff0c;2022年9月&#xff0c;广州数据交易所正式挂牌成立。广州数据交易所采用“一所多基地多平台”的体系架构进行运营&#xff0c;探索在条件成…

CSA发布| 科技创新和云计算趋势中的网络安全因素

关注国际云安全联盟公众号&#xff0c;回复关键词 “云安全”&#xff0c;即可获取报告完整版 随着云计算的高速发展&#xff0c;如何在云环境中保障数据和应用的安全性日益成为企业共同的关注点&#xff0c;企业也正在考虑多云和混合云策略。云原生技术如容器、微服务和无服务…

Docker 中 Nginx 反向代理

本文主角&#xff1a;Nginx Proxy Manager 。 使用docker安装Nginx Proxy Manager。 1、找到C:\Windows\System32\drivers\etc下的hosts文件&#xff0c;添加 “域名 IP"即可。 使用vscode编辑文件&#xff0c;保存时会提示用管理员权限保存即可。 2、Nginx Proxy Mana…

jupyter | jupyter C++开发环境构建

搭建环境 按照 https://root.cern.ch/cling-build-instructions 官网的提示&#xff0c;手动编译Cling编译器,分别检查llvm&#xff0c;clang和cling&#xff1a; mkdir /path/to/cling cd /path/to/cling git clone http://root.cern.ch/git/llvm.gitcd llvm git checkout c…

金蝶云星空——单据附件上传

文章目录 概要技术要点代码实现小结 概要 单据附件上传 技术要点 单据附件上传金蝶是有提供标准的上传接口&#xff1a; http://[IP]/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.AttachmentUpLoad.common.kdsvc 参数说明 参数类型必填说明FileName字符是…

spring boot 输出日志保存到文件

spring boot 和 spring cloud 的模块,都已经引入了Logback作为其日志框架. 只需要配置 logback.xml 文件就可以实现保存日志到文件 文件内容为 <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"6…

关于javascript数字精度丢失的解决办法

分析原因 众所周知&#xff0c;在JavaScript中计算两个十进制数的和&#xff0c;有时候会出现令人惊讶的结果&#xff0c;主要原因是计算机将数据存储为二进制所引起的&#xff0c;所以这并不是javascript存在的缺陷&#xff0c;而在其他语言中也有类似的问题。 例如下面的例子…