迷新白的博客 迷新白的博客
首页
随笔
  • Vuepress
  • Springboot
  • 开发工具
  • 系统工具
读吧
  • 智能浇花系统 (opens new window)
  • 用户中心系统 (opens new window)
  • 关于
  • 友情链接
GitHub (opens new window)

迷新白

愿你平安
首页
随笔
  • Vuepress
  • Springboot
  • 开发工具
  • 系统工具
读吧
  • 智能浇花系统 (opens new window)
  • 用户中心系统 (opens new window)
  • 关于
  • 友情链接
GitHub (opens new window)
  • 用户中心系统

    • 前端初始化
    • 用户中心后端-1
    • 用户中心后端-2
    • 注册模块(后端)
    • 登录模块(后端)
    • 管理模块(后端)
    • Ant Design Pro前端初始化
    • 登录+注册模块(前端)
    • 管理模块+登录状态(前端)
    • 注销模块+校验模块(前后端)
      • 用户注销
        • 后端开发
        • 前端开发
      • 用户校验
      • 后端代码优化
        • 通用返回对象
    • 异常处理器(后端优化)
    • 请求响应处理器(前端)
  • 仿Deepseek官网AI聊天网站

  • 尤克里里音月-Flutter(需求分析阶段)

  • 项目
  • 用户中心系统
迷新白
2025-04-11
目录

注销模块+校验模块(前后端)

# 11.注销模块+校验模块(后端)

用户中心的注销模块和校验模块,每个模块有两个部分,前端和后端一起o( ̄▽ ̄)ブ

# 用户注销

# 后端开发

  1. 业务逻辑层

    • UserServic中写userLogout方法image-20250411210236482


      UserServiceImpl中实现方法image-20250411210340662 image-20250411210653806

    • 修改一下代码,获取 session 中的数据,鼠标指示在 removeAttribute 上,发现返回值是 void,修改一下返回值【后续注销失败抛出异常即可,不需要定义一个返回值】,UserService中也修改一下image-20250411210943211

  2. UserController中编写接口

    •     @PostMapping("/logout")
          public Integer logout(HttpServletRequest request) {
              if (request == null){
                  return null;
              }
              return userService.userLogout(request);
          }
      
      1
      2
      3
      4
      5
      6
      7
    • 将Service和UserServiceImpl的返回类型再改回去,改为int。注销成功返回为1,将Impl的返回值改为1

          @Override
          public int userLogout(HttpServletRequest request) {
              //移除用户登录态
              request.getSession().removeAttribute(USER_LOGIN_STATE);
              return 1;
          }
      
      1
      2
      3
      4
      5
      6
  3. 文件中修改代码

    • UserService

          /**
           * 用户注销
           * 
           * @param request
           * @return
           */
          int userLogout(HttpServletRequest request);
      
      1
      2
      3
      4
      5
      6
      7
    • UserServiceImpl

          /**
           * 用户注销
           * @param request
           * @return
           */
          @Override
          public int userLogout(HttpServletRequest request) {
              //移除用户登录态
              request.getSession().removeAttribute(USER_LOGIN_STATE);
              return 1;
          }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
    • UserController

          @PostMapping("/logout")
          public Integer logout(HttpServletRequest request) {
              if (request == null){
                  return null;
              }
              return userService.userLogout(request);
          }
      
      1
      2
      3
      4
      5
      6
      7

# 前端开发

  1. 启动前后端代码(后端:debug、前端:star-dev),登陆一个管理员账号

  2. 修改代码实现用户注销

    退出登录按钮在导航条上,导航条是所有页面都有的组件(components),页面触发注销的位置是头像的下拉菜单(AvatarDropdown),所以我们定位到 src/components/RightContent/AvatarDropdown.tsx 文件

    • 搜索 logout,找到并进入 loginOut 方法image-20250411212337809
    • 进入 outLogin 方法 image-20250411212453419
    • 就进入了到 api.ts 文件,修改 outLogin 的接口,保持名称和后端一致image-20250411212818313
      • 测试一下,返回的响应值已经是1了 image-20250411213013771

# 用户校验

用户校验是给使用这个系统的用户增加一个属性,planetcode,表示使用者需要凭借知识星球的编号方可注册使用,暂时用不上,跳过这个功能

# 后端代码优化

# 通用返回对象

  • 目的是给对象补充一些信息,告诉这个请求再业务层面是成功还是失败

    后端直接返回对象给前端,如果数据出现问题、后端报错、查询不到数据,前端不知道是为什么报错,之前我们在后端有设计这种报错码

    例如:

    {
      "name": "yupi"
    }
    
    1
    2
    3

    代码块(成功):

    {
      "code": 0 //业务状态码
      "data": {
        "name": "yupi"
      }
      "message": "ok"
    }
    
    1
    2
    3
    4
    5
    6
    7

    代码块(失败):

    {
      "code": 50001 //业务状态码
      "data": null
      "message": "用户异常操作、xxxx"
    }
    
    1
    2
    3
    4
    5

    之前异常返回的是-1,按以上设计错误码回更清晰

  • 设计

    • 自定义错误码
    • 返回类支持返回正常和错误
  1. 后端项目中的com.msingbai.usercenter 下新建 common 包,在 common 包下新建 BaseResponse.java,编写代码

    package com.msingbai.usercenter.common;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    @Data
    public class BaseResponse <T> implements Serializable {
    
        private int code;
    
        private T data;
    
        private String message;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    在Java中,<T> 是一种泛型(Generics)的用法。

    泛型允许在类、接口或方法中使用类型参数,这样可以提高代码的复用性和类型安全性。

    例如,如果有一个 BaseResponse 类,可以这样使用它:

    BaseResponse<String> response1 = new BaseResponse<>();
    BaseResponse<Integer> response2 = new BaseResponse<>();
    
    1
    2

    response1 用于存储字符串类型的数据,而 response2 用于存储整数类型的数据。这样,你就可以在 BaseResponse 类中编写通用的代码,而不需要为每种数据类型编写特定的代码。

    点击BaseResponse,按住Alt+Insert构造方法 image-20250411215602380

    构造完,再补充一段代码如下

        public BaseResponse(int code, T data, String message) {
            this.code = code;
            this.data = data;
            this.message = message;
        }
        
        public BaseResponse(int code, T data) {
            this(code, data, "");
        }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  2. 将之前所有的请求使用 BaseResponse 封装一下

    对于应用程序中所有的网络请求或数据处理请求,使用 BaseResponse 类就能够统一处理和返回结果。

    请求的数据(如用户信息等)被封装在 BaseResponse 的 data 字段中,这样可以保护数据不被外部直接访问,同时也可以在未来轻松地添加或修改响应中包含的数据字段。

    register image-20250411220829930


    login image-20250411220954655

    这样重复的部分工作量不小,我们可以编写一个工具类以及定制快捷键帮助我们自动化封装工作

    • common包下新建ResultUtils.java,编写代码image-20250412001502845

    • 定制一个快捷键File => Settings => Editor => Live Templates(实时模板)image-20250412002004091 image-20250412002039754


      新建快捷键详细信息image-20250412002437115

      测试一下效果

      image-20250412002654181


      image-20250412002705684

    • 将UserController进行封装

          @PostMapping("/register")
          public BaseResponse<Long> userRegister(@RequestBody UserRegisterRequest userRegisterRequest) {
              if (userRegisterRequest == null) {
                  return null;
              }
              System.out.println("Received request: " + userRegisterRequest);
              String userAccount = userRegisterRequest.getUserAccount();
              String userPassword = userRegisterRequest.getUserPassword();
              String checkPassword = userRegisterRequest.getCheckPassword();
              if (StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) {
                  return null;
              }
              long result = userService.userRegister(userAccount, userPassword, checkPassword);
              return ResultUtils.success(result);
          }
      
          @PostMapping("/login")
          public BaseResponse<User> userLogin(@RequestBody UserLoginRequest userLoginRequest,HttpServletRequest request) {
              if (userLoginRequest == null) {
                  return null;
              }
              //System.out.println("Login request: " + userLoginRequest);
              String userAccount = userLoginRequest.getUserAccount();
              String userPassword = userLoginRequest.getUserPassword();
              if (StringUtils.isAnyBlank(userAccount, userPassword)) {
                  return null;
              }
              User user = userService.userLogin(userAccount,userPassword,request);
              return ResultUtils.success(user);
      
          }
      
          @GetMapping("/current")
          public BaseResponse<User> getCurrentUser(HttpServletRequest request) {
              //System.out.println("USER_LOGIN_STATE: " + request.getSession().getAttribute(USER_LOGIN_STATE));
              Object userObj = request.getSession().getAttribute(USER_LOGIN_STATE);
              User currentUser = (User) userObj;
              if (currentUser == null) {
                  System.out.println("用户未登录");
                  return null;
              }
              long userId = currentUser.getId();
              //todo校验用户是否合法
              User user = userService.getById(userId);
              User safetyUser = userService.getSafetyUser(user);
              return ResultUtils.success(safetyUser);
          }
      
          @GetMapping("/search")
          public BaseResponse<List<User>> searchUsers(String username,HttpServletRequest request) {
              if (!isAdmin(request)) {
                  System.out.println("【搜索】非管理员权限");
                  return null;
              }
              QueryWrapper<User> queryWrapper = new QueryWrapper<>();
              if (StringUtils.isNotBlank(username)) {
                  queryWrapper.like("username", username);
              }
              System.out.println("【搜索】查询成功");
              List<User> userlist = userService.list(queryWrapper);
              List<User> list = userlist.stream().map(user -> userService.getSafetyUser(user)).collect(Collectors.toList());
              return ResultUtils.success(list);
          }
      
          @PostMapping("/delete")
          public BaseResponse<Boolean> deleteUser(@RequestBody long id, HttpServletRequest request) {
              if(!isAdmin(request)) {
                  System.out.println("非管理员权限");
                  return null;
              }
              if (id <= 0) {
                  System.out.println("数据库中无人员");
                  return null;
              }
              System.out.println("返回成功");
              boolean b = userService.removeById(id);
              return ResultUtils.success(b);
          }
      
          @PostMapping("/logout")
          public BaseResponse<Integer> logout(HttpServletRequest request) {
              if (request == null){
                  return null;
              }
              int result = userService.userLogout(request);
              return ResultUtils.success(result);
          }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87

文字写于:广东

#用户中心系统
更新时间: 2025/4/25 20:22:48
管理模块+登录状态(前端)
异常处理器(后端优化)

← 管理模块+登录状态(前端) 异常处理器(后端优化)→

最近更新
01
第一次对话完善
04-27
02
保留上下文对话
04-27
03
首页完善(后端)
04-27
更多文章>
Theme by Vdoing | Copyright © 2022-2025 迷新白 | 的博客
sitemap icon by Icons8
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式