迷新白的博客 迷新白的博客
首页
随笔
  • 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-05
目录

管理模块(后端)

# 07.管理模块(后端)

用户中心系统的管理功能

需求设计

  • 1.查询用户(根据用户名查询)
  • 2.删除用户

# 后端开发

1.UserController里编写查询用户请求

    @GetMapping("/search")
    public List<User> searchUsers(String username) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isAnyBlank(username)) {
            queryWrapper.like("username", username);
        }
        return userService.list(queryWrapper);
    }
1
2
3
4
5
6
7
8

2.UserController里编写删除用户请求

    @PostMapping("delete")
    public boolean deleteUser(@RequestBody long id) {
        if (id <= 0) {
            return false;
        }
        return userService.removeById(id);
    }
1
2
3
4
5
6
7

3.我们还需要一个管理人员的检验,使得接口需要获得权限后方可调用

在UserServiceImpl中的用户脱敏加入一行

safetyUser.setUserRole(user.getUserRole());
1

我们需要实现调用的方法,在UserService文件里加入Impl写过的用户登录态键

image-20250405224544692

在UserController里写判断角色权限的方法

    /**
     *
     * 是否为管理员
     */
    private boolean isAdmin(HttpServletRequest request) {
        //仅管理员可查询
        Object userObj = request.getSession().getAttribute(UserService.USER_LOGIN_STATE);
        User user = (User) userObj;
        return user != null && user.getUserRole() == 1;
    }
1
2
3
4
5
6
7
8
9
10

在delete和search接口中调用isAdmin

    @GetMapping("/search")
    public List<User> searchUsers(String username,HttpServletRequest request) {
        if (!isAdmin(request)) {
            return null;
        }
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isAnyBlank(username)) {
            queryWrapper.like("username", username);
        }
        return userService.list(queryWrapper);
    }

    @PostMapping("/delete")
    public boolean deleteUser(@RequestBody long id, HttpServletRequest request) {
        if(!isAdmin(request)) {
            return false;
        }
        if (id <= 0) {
            return false;
        }
        return userService.removeById(id);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

4.在application.yml配置文件里增加session的失效时间

image-20250405232415991

5.测试

在UserController中创建一个新的HTTP Client执行GET请求image-20250405232557102

发现什么也没有返回

设计方法进行测试

image-20250407113641488

提示没有管理员权限,于是先进行登录管理员账户,以管理员账户的权限去发送search请求

### 登录请求
POST http://localhost:8080/api/user/login
Content-Type: application/json

{
  "userAccount": "yupi",
  "userPassword": "12345678"
}

### 提取会话 ID 或 JWT
@sessionId = {{response-headers.JSESSIONID}}
@jwtToken = {{response-body.token}}

### 全部搜索(带会话 ID)
GET http://localhost:8080/api/user/search
Cookie: JSESSIONID={{sessionId}}

### 精确搜索(带会话 ID)
GET http://localhost:8080/api/user/search?username=yupi
Cookie: JSESSIONID={{sessionId}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

但返回的还是空白,咋回事?

原来是代码逻辑问题= = (本教程是根据做过的人写的教程复刻的,对方运行成功了,而我发现已有两处是写了相反逻辑的步骤) 无妨,这锻炼了自己debug的能力

最后执行结果

image-20250407120457789

完整代码

    @GetMapping("/search")
    public 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("查询成功");
        return userService.list(queryWrapper);
    }

    @PostMapping("/delete")
    public boolean deleteUser(@RequestBody long id, HttpServletRequest request) {
        if(!isAdmin(request)) {
            System.out.println("非管理员权限");
            return false;
        }
        if (id <= 0) {
            System.out.println("数据库中无人员");
            return false;
        }
        System.out.println("返回成功");
        return userService.removeById(id);
    }

    /**
     *
     * 是否为管理员
     */
    private boolean isAdmin(HttpServletRequest request) {
        //仅管理员可查询
        Object userObj = request.getSession().getAttribute(UserConstant.USER_LOGIN_STATE);
        User user = (User) userObj;
        return user != null && user.getUserRole() == UserConstant.ADMIN_ROLE;
    }
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

我把USER_LOGIN_STATE和ADMIN_ROLE放到了新的包constant的UserConstant接口类里,方便调用

package com.msingbai.usercenter.constant;

public interface UserConstant {

    /**
     * 用户态登录键
     */
    String USER_LOGIN_STATE = "userLoginState";
    Integer ADMIN_ROLE = 1;

}
1
2
3
4
5
6
7
8
9
10
11

# 用户脱敏

在UserServicImpl中新建一个getSafetyUser方法,将原来用户脱敏的代码复制进去。将原来用户脱敏的位置改成调用该方法。在方法前加上@Override标签,在UserService引入该方法

image-20250407145220208

image-20250407145237191image-20250407145250885

文字写于:广东

#用户中心系统
更新时间: 2025/4/25 20:22:48
登录模块(后端)
Ant Design Pro前端初始化

← 登录模块(后端) Ant Design Pro前端初始化→

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