Java案例如何实现用户管理?

wen python案例 2

本文目录导读:

Java案例如何实现用户管理?

  1. 整体架构概览
  2. 数据库设计
  3. 核心代码实现
  4. 前端页面示意(Thymeleaf)
  5. 重要的安全与规范补充

实现用户管理是 Java Web 开发中最常见的任务之一,一个完整的用户管理系统通常包括注册、登录、信息管理(CRUD)、权限控制等功能。

下面我会为你拆解一个标准的 Java 用户管理案例实现思路,并提供核心代码片段,这里我们假设使用目前最主流的Spring Boot + MyBatis-Plus + MySQL + Thymeleaf(模板引擎) 技术栈。

整体架构概览

  1. 表现层(Controller):处理HTTP请求,返回视图或JSON数据。
  2. 业务层(Service):处理核心业务逻辑(如密码加密、校验)。
  3. 持久层(Mapper/DAO):与数据库交互,执行SQL。
  4. 模型层(Entity/Model):对应数据库中的“用户表”。

数据库设计

创建一张最基础的用户表。

CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '加密后的密码',
  `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `status` tinyint(4) DEFAULT '1' COMMENT '状态:1启用,0禁用',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

核心代码实现

实体类

// User.java
@Data  // Lombok 注解,自动生成getter/setter/toString等
@TableName("sys_user") // MyBatis-Plus 注解
public class User {
    @TableId(type = IdType.AUTO) // 主键自增
    private Long id;
    private String username;
    private String password; // 存储加密后的密码
    private String realName;
    private String email;
    private String phone;
    private Integer status;
    private Date createTime;
    private Date updateTime;
}

持久层 Mapper

使用 MyBatis-Plus,代码非常简洁:

// UserMapper.java
@Mapper // 标记为MyBatis的映射器
public interface UserMapper extends BaseMapper<User> {
    // 基础CRUD方法由 BaseMapper 提供,无需自己写SQL
    // userMapper.selectById(1L),userMapper.insert(user)
    // 如果有复杂查询,可以在此自定义方法
}

业务层 Service

关键点:密码存储必须使用哈希加密(如 BCrypt),绝不能存明文。

// UserService.java
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    // 密码编码器,由 Spring Security 或 Spring 提供
    @Autowired
    private PasswordEncoder passwordEncoder;
    // 用户注册
    public void register(User user) {
        // 1. 检查用户名是否已存在
        User existingUser = userMapper.selectOne(
            new LambdaQueryWrapper<User>()
                .eq(User::getUsername, user.getUsername())
        );
        if (existingUser != null) {
            throw new RuntimeException("用户名已存在");
        }
        // 2. 密码加密(核心安全步骤)
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        // 3. 设置默认状态和创建时间
        user.setStatus(1);
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        // 4. 执行插入
        userMapper.insert(user);
    }
    // 用户登录校验
    public User login(String username, String rawPassword) {
        // 1. 根据用户名查找用户
        User user = userMapper.selectOne(
            new LambdaQueryWrapper<User>()
                .eq(User::getUsername, username)
        );
        if (user == null) {
            throw new RuntimeException("用户不存在");
        }
        // 2. 校验密码(用加密后的密文和输入的明文比对)
        boolean matches = passwordEncoder.matches(rawPassword, user.getPassword());
        if (!matches) {
            throw new RuntimeException("密码错误");
        }
        // 3. 检查状态
        if (user.getStatus() == 0) {
            throw new RuntimeException("账户已被禁用");
        }
        return user; // 登录成功,返回用户信息(一般不放密码)
    }
    // 分页查询用户列表(管理功能)
    public Page<User> listUsers(int pageNum, int pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        return userMapper.selectPage(page, null);
    }
    // 更新用户信息
    public void updateUser(User user) {
        user.setUpdateTime(new Date());
        // 注意:更新时通常不更新密码(有专门改密码接口)
        userMapper.updateById(user);
    }
    // 删除/禁用用户
    public void deleteUser(Long id) {
        userMapper.deleteById(id); // 物理删除
        // 或 逻辑删除:update user set status = 0 where id = ?
    }
}

控制器 Controller

// UserController.java
@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    // 跳转用户列表页
    @GetMapping("/list")
    public String list(Model model,
                       @RequestParam(defaultValue = "1") int page,
                       @RequestParam(defaultValue = "10") int size) {
        Page<User> userPage = userService.listUsers(page, size);
        model.addAttribute("page", userPage);
        return "user/list"; // 模板引擎视图
    }
    // 跳转添加用户页面
    @GetMapping("/add")
    public String addUserPage() {
        return "user/add";
    }
    // 处理添加用户的 POST 请求
    @PostMapping("/add")
    public String addUser(User user) {
        userService.register(user);
        return "redirect:/user/list"; // 重定向到列表页
    }
    // 处理登录请求
    @PostMapping("/login")
    public String login(String username, String password, HttpSession session) {
        try {
            User user = userService.login(username, password);
            // 将用户信息存入 Session(表明已登录)
            session.setAttribute("loginUser", user);
            return "redirect:/index"; // 登录成功跳转首页
        } catch (Exception e) {
            // 失败后携带错误信息返回登录页
            return "redirect:/login?error=" + e.getMessage();
        }
    }
    // 退出登录
    @GetMapping("/logout")
    public String logout(HttpSession session) {
        session.invalidate(); // 销毁 Session
        return "redirect:/login";
    }
}

前端页面示意(Thymeleaf)

src/main/resources/templates/user/list.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>用户管理</title></head>
<body>
    <h2>用户列表</h2>
    <a th:href="@{/user/add}">新增用户</a>
    <table border="1">
        <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>姓名</th>
            <th>邮箱</th>
            <th>状态</th>
            <th>操作</th>
        </tr>
        <tr th:each="user : ${page.records}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.username}"></td>
            <td th:text="${user.realName}"></td>
            <td th:text="${user.email}"></td>
            <td th:text="${user.status == 1 ? '启用' : '禁用'}"></td>
            <td>
                <a th:href="@{/user/edit(id=${user.id})}">编辑</a>
                <a th:href="@{/user/delete(id=${user.id})}" onclick="return confirm('确认删除?')">删除</a>
            </td>
        </tr>
    </table>
</body>
</html>

重要的安全与规范补充

  1. 密码加密:务必使用 BCryptPasswordEncoder(Spring Security 提供),不要用 MD5,BCrypt 自动加盐,抗暴力破解能力强,配置如下:

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
  2. Session 管理:登录后将用户信息存入 Session,后续请求需要校验 Session 中的用户是否存在(拦截器或过滤器实现)。

  3. 拦截器(验证登录状态)

    public class LoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, 
                                 HttpServletResponse response, 
                                 Object handler) throws Exception {
            HttpSession session = request.getSession();
            if (session.getAttribute("loginUser") == null) {
                response.sendRedirect("/login");
                return false;
            }
            return true;
        }
    }

    然后在配置类中注册,排除 /login/user/register 等路径。

  4. 统一异常处理(@ControllerAdvice): 捕获 RuntimeException 并返回友好的错误页面或 JSON。

这个案例覆盖了用户管理的核心链路数据库表设计 → 实体映射 → Mapper(CRUD) → Service(业务+加密+校验) → Controller(请求分发) → 前端页面展示

对于生产级系统,还可以往上叠加:

  • 角色与权限:添加 role 表和中间表,使用 Spring Security 或 Shiro。
  • JWT/Token 登录:适用于前后端分离架构(Vue + Java API)。

如果你用的是纯 Servlet/JSP 年代的老项目,原理一样,只是把 Spring 那层换成手动 JDBC 和 HttpServlet,不过对于新项目,强烈建议用 Spring Boot 开始,效率高很多。

抱歉,评论功能暂时关闭!