前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >作为一名初级程序员,用户中心总得会设计与实现吧

作为一名初级程序员,用户中心总得会设计与实现吧

原创
作者头像
不惑
发布2024-11-05 08:52:17
230
发布2024-11-05 08:52:17
举报
文章被收录于专栏:Goboy

引言

用户中心作为一个重要的功能模块,承担着用户身份验证、信息管理和权限控制等多重角色。随着互联网技术的快速发展和用户需求的不断变化,构建一个高效、灵活且安全的用户中心显得尤为重要。本文将深入探讨一个基于 Spring Boot 框架的用户中心实现,涵盖用户信息更新、密码重置、角色管理、用户权限控制以及用户活动日志等功能模块,帮助读者全面了解用户中心的设计与实现过程。

1. 项目准备

1.1 环境搭建

在开始之前,我们需要搭建一个合适的开发环境。以下是项目所需的基本环境和工具:

  • Java 11:Spring Boot 2.5及以上版本支持Java 11。
  • Spring Boot:使用 Spring Initializr 创建项目,添加以下依赖:
    • Spring Web
    • Spring Data JPA
    • MySQL Driver(或其他数据库驱动)
    • Spring Security
    • Lombok
    • Thymeleaf(用于前端模板)
  • 数据库:可以使用 MySQL 或者 H2 数据库来存储用户信息。
1.2 项目结构

我们将项目结构规划为以下几个模块:

代码语言:txt
复制
src
 └── main
     ├── java
     │   └── com.example.usercenter
     │       ├── config
     │       ├── controller
     │       ├── entity
     │       ├── repository
     │       ├── service
     │       └── UserCenterApplication.java
     └── resources
         ├── application.properties
         ├── templates
         └── static

2. 数据库设计

在实现用户中心之前,我们需要设计数据库表来存储用户信息、角色和活动日志。以下是一个简单的数据库设计示例:

代码语言:sql
复制
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE roles (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE user_roles (
    user_id BIGINT NOT NULL,
    role_id BIGINT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    PRIMARY KEY (user_id, role_id)
);

DROP TABLE IF EXISTS `activity_logs`;
CREATE TABLE `activity_logs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `activity` varchar(255) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;

3. 实体类设计

entity 包中创建以下实体类:

3.1 User 实体类
代码语言:java
复制
package com.example.usercenter.entity;

import lombok.Data;

import javax.persistence.*;
import java.util.Set;

@Data
@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false, unique = true)
    private String email;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
        name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id")
    )
    private Set<Role> roles;

    // 其他字段和方法...
}
3.2 Role 实体类
代码语言:java
复制
package com.example.usercenter.entity;

import lombok.Data;

import javax.persistence.*;
import java.util.Set;

@Data
@Entity
@Table(name = "roles")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String name;

    @ManyToMany(mappedBy = "roles")
    private Set<User> users;
}
3.3 ActivityLog 实体类
代码语言:java
复制
package com.example.usercenter.entity;

import lombok.Data;

import javax.persistence.*;
import java.time.LocalDateTime;

@Data
@Entity
@Table(name = "activity_logs")
public class ActivityLog {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String userId;

    private String activity;

    private LocalDateTime timestamp;
}

4. 数据库操作层

repository 包中创建以下接口:

4.1 UserRepository
代码语言:java
复制
package com.example.usercenter.repository;

import com.example.usercenter.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
}
4.2 RoleRepository
代码语言:java
复制
package com.example.usercenter.repository;

import com.example.usercenter.entity.Role;
import org.springframework.data.jpa.repository.JpaRepository;

public interface RoleRepository extends JpaRepository<Role, Long> {
    Role findByName(String name);
}
4.3 ActivityLogRepository
代码语言:java
复制
package com.example.usercenter.repository;

import com.example.usercenter.entity.ActivityLog;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ActivityLogRepository extends JpaRepository<ActivityLog, Long> {
    List<ActivityLog> findByUserId(Long userId);
}

5. 服务层

service 包中创建以下服务类:

5.1 UserService
代码语言:java
复制
package com.example.usercenter.service;

import com.example.usercenter.entity.User;
import com.example.usercenter.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    private BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    public User register(User user) {
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        return userRepository.save(user);
    }

    public User findByUsername(String username) {
        return userRepository.findByUsername(username).get();
    }

    public User updateUser(User user) {
        return userRepository.save(user);
    }

    public void resetPassword(User user, String newPassword) {
        user.setPassword(passwordEncoder.encode(newPassword));
        userRepository.save(user);
    }

    public User findById(Long id) {
        return userRepository.findById(id).get();
    }

    // 新增查询所有用户的方法
    public List<User> findAll() {
        return userRepository.findAll();
    }
}
5.2 RoleService
代码语言:java
复制
package com.example.usercenter.service;

import com.example.usercenter.entity.Role;
import com.example.usercenter.repository.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RoleService {

    @Autowired
    private RoleRepository roleRepository;

    public Role findByName(String name) {
        return roleRepository.findByName(name);
    }

    public Role saveRole(Role role) {
        return roleRepository.save(role);
    }
}
5.3 ActivityLogService
代码语言:java
复制
package com.example.usercenter.service;

import com.example.usercenter.entity.ActivityLog;
import com.example.usercenter.entity.User;
import com.example.usercenter.repository.ActivityLogRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class ActivityLogService {

    @Autowired
    private ActivityLogRepository activityLogRepository;

    public void logActivity(UserDetails userDetails, String activity) {
        ActivityLog log = new ActivityLog();
        log.setUserId(userDetails.getUsername());
        log.setActivity(activity);
        log.setTimestamp(LocalDateTime.now());
        activityLogRepository.save(log);
    }

    public List<ActivityLog> findAllActivityLogs() {
        return activityLogRepository.findAll();
    }
}

6. 安全配置

config 包中创建 WebSecurityConfig 类,配置 Spring Security:

代码语言:java
复制
package com.example.usercenter.config;

import com.example.usercenter.entity.User;
import com.example.usercenter.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(username -> {
            User user = userService.findByUsername(username);
            if (user != null) {
                return org.springframework.security.core.userdetails.User
                        .withUsername(user.getUsername())
                        .password(user.getPassword())
                        .roles("USER")
                        .build();
            } else {
                throw new UsernameNotFoundException("User not found");
            }
        }).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/register", "/login").permitAll() // 允许所有用户访问注册和登录
                .anyRequest().authenticated() // 其他请求需要认证
                .and()
                .formLogin()
                .loginPage("/login") // 自定义登录页面
                .defaultSuccessUrl("/users", true) // 登录成功后重定向到 /users
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }
}

7. 控制层

controller 包中创建用户控制器,处理用户请求。

7.1 UserController
代码语言:java
复制
package com.example.usercenter.controller;

import com.example.usercenter.entity.ActivityLog;
import com.example.usercenter.entity.User;
import com.example.usercenter.service.ActivityLogService;
import com.example.usercenter.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private ActivityLogService activityLogService;

    @GetMapping("/register")
    public String showRegisterForm(Model model) {
        model.addAttribute("user", new User());
        return "register";
    }

    @PostMapping("/register")
    public String registerUser(@ModelAttribute User user) {
        userService.register(user);
        return "redirect:/login";
    }

    @GetMapping("/login")
    public String showLoginForm() {
        return "login";
    }

    @GetMapping("/update")
    public String showUpdateForm(@RequestParam Long id, Model model) {
        User user = userService.findById(id);
        model.addAttribute("user", user);
        return "update";
    }

    @PostMapping("/update")
    public String updateUser(@ModelAttribute User user, @AuthenticationPrincipal UserDetails userDetails) {
        userService.updateUser(user);
        activityLogService.logActivity(userDetails, "Updated user information");
        return "redirect:/profile";
    }

    @GetMapping("/reset-password")
    public String showResetPasswordForm() {
        return "reset-password";
    }

    @PostMapping("/reset-password")
    public String resetPassword(@RequestParam Long id, @RequestParam String newPassword, @AuthenticationPrincipal UserDetails userDetails) {
        User user = userService.findById(id);
        userService.resetPassword(user, newPassword);
        activityLogService.logActivity(userDetails, "Reset password");
        return "redirect:/login";
    }

    @GetMapping("/profile")
    public String userProfile(Model model) {
        // 获取当前用户信息并展示
        return "profile";
    }

    // 新增用户列表方法
    @GetMapping("/users")
    public String listUsers(Model model, @AuthenticationPrincipal UserDetails userDetails) {
        // 记录用户登录活动
        activityLogService.logActivity(userDetails, "LOGIN");
        // 获取用户列表
        List<User> users = userService.findAll();
        model.addAttribute("users", users);
        return "user-list";
    }

    @PostMapping("/logout")
    public String logout(@AuthenticationPrincipal UserDetails userDetails) {
        // 记录用户注销活动
        activityLogService.logActivity(userDetails, "LOGOUT");
        return "redirect:/login"; // 注销后重定向到登录页面
    }

    @GetMapping("/activity-logs")
    public String listActivityLogs(Model model) {
        List<ActivityLog> logs = activityLogService.findAllActivityLogs();
        model.addAttribute("logs", logs);
        return "activity-log-list"; // 返回活动日志列表页面
    }

}

启动成功

8. 前端页面

resources/templates 目录下创建相应的 Thymeleaf 模板页面:

8.1 register.html
代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Register</title>
</head>
<body>
    <h1>Register</h1>
    <form action="#" th:action="@{/register}" th:object="${user}" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" th:field="*{username}" required />
        <label for="password">Password:</label>
        <input type="password" id="password" th:field="*{password}" required />
        <label for="email">Email:</label>
        <input type="email" id="email" th:field="*{email}" required />
        <button type="submit">Register</button>
    </form>
</body>
</html>
8.2 login.html
代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form action="#" th:action="@{/login}" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required />
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required />
        <button type="submit">Login</button>
    </form>
</body>
</html>
8.3 update.html
代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Update User</title>
</head>
<body>
    <h1>Update User</h1>
    <form action="#" th:action="@{/update}" th:object="${user}" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" th:field="*{username}" required />
        <label for="email">Email:</label>
        <input type="email" id="email" th:field="*{email}" required />
        <button type="submit">Update</button>
    </form>
</body>
</html>
8.4 reset-password.html
代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Reset Password</title>
</head>
<body>
    <h1>Reset Password</h1>
    <form action="#" th:action="@{/reset-password}" method="post">
        <label for="newPassword">New Password:</label>
        <input type="password" id="newPassword" name="newPassword" required />
        <button type="submit">Reset Password</button>
    </form>
</body>
</html>

访问一下 : http://localhost:8080/login; 一个简单且丑陋的登录界面就此完成了,让我们继续丰富一些UI的样式。

为了美化用户中心的UI界面,我们可以考虑引入一些流行的第三方UI库。以下是一些推荐的UI库及其集成步骤:

9.引入第三方UI库

以下是几个推荐的UI库:

  • Bootstrap:一个强大的前端框架,用于快速开发响应式网站。
  • Materialize CSS:基于Material Design风格的CSS框架。
  • Bulma:一个现代的CSS框架,采用Flexbox布局。
  • Ant Design:一个企业级的UI设计语言和React组件库。

下面我们以Bootstrap为例,展示如何将其集成到我们的Spring Boot项目中。

10. 集成Bootstrap

10.1 添加Bootstrap依赖

src/main/resources/templates 目录下的 HTML 模板文件中,我们可以通过CDN链接引入Bootstrap。打开 register.htmllogin.htmlupdate.htmlreset-password.html 文件,添加以下代码到 <head> 部分:

代码语言:html
复制
<!-- Bootstrap CSS -->
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
10.2 修改HTML模板

下面是美化后的HTML模板示例,使用Bootstrap的样式类来增强界面。

register.html

代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Register</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <h1>Register</h1>
        <form action="#" th:action="@{/register}" th:object="${user}" method="post" class="mt-4">
            <div class="form-group">
                <label for="username">Username:</label>
                <input type="text" class="form-control" id="username" th:field="*{username}" required />
            </div>
            <div class="form-group">
                <label for="password">Password:</label>
                <input type="password" class="form-control" id="password" th:field="*{password}" required />
            </div>
            <div class="form-group">
                <label for="email">Email:</label>
                <input type="email" class="form-control" id="email" th:field="*{email}" required />
            </div>
            <button type="submit" class="btn btn-primary">Register</button>
        </form>
    </div>
</body>
</html>

login.html

代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
    <h1>Login</h1>
    <form action="#" th:action="@{/login}" method="post" class="mt-4">
        <div class="form-group">
            <label for="username">Username:</label>
            <input type="text" class="form-control" id="username" name="username" required />
        </div>
        <div class="form-group">
            <label for="password">Password:</label>
            <input type="password" class="form-control" id="password" name="password" required />
        </div>
        <button type="submit" class="btn btn-primary">Login</button>
    </form>
    <div class="mt-3">
        <span>Don't have an account? </span>
        <a class="btn btn-link" th:href="@{/register}">Register here</a>
    </div>
</div>
</body>
</html>

update.html

代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Update User</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <h1>Update User</h1>
        <form action="#" th:action="@{/update}" th:object="${user}" method="post" class="mt-4">
            <div class="form-group">
                <label for="username">Username:</label>
                <input type="text" class="form-control" id="username" th:field="*{username}" required />
            </div>
            <div class="form-group">
                <label for="email">Email:</label>
                <input type="email" class="form-control" id="email" th:field="*{email}" required />
            </div>
            <button type="submit" class="btn btn-primary">Update</button>
        </form>
    </div>
</body>
</html>

reset-password.html

代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Reset Password</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <h1>Reset Password</h1>
        <form action="#" th:action="@{/reset-password}" method="post" class="mt-4">
            <div class="form-group">
                <label for="newPassword">New Password:</label>
                <input type="password" class="form-control" id="newPassword" name="newPassword" required />
            </div>
            <button type="submit" class="btn btn-primary">Reset Password</button>
        </form>
    </div>
</body>
</html>

增加登录成功后的用户列表查询功能,并相应修改 WebSecurityConfig 的跳转配置:

11.创建用户列表模板

resources/templates 目录下创建 user-list.html 文件,用于展示用户列表。

11.1user-list.html
代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>User List</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
    <h1>User List</h1>
    <table class="table table-bordered mt-4">
        <thead>
        <tr>
            <th>ID</th>
            <th>Username</th>
            <th>Email</th>
            <th>Actions</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="user : ${users}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.username}"></td>
            <td th:text="${user.email}"></td>
            <td>
                <a class="btn btn-info btn-sm" th:href="@{/update/{id}(id=${user.id})}">Edit</a>
                <a class="btn btn-danger btn-sm" th:href="@{/delete/{id}(id=${user.id})}">Delete</a>
            </td>
        </tr>
        </tbody>
    </table>
    <a class="btn btn-info btn-sm" th:href="@{/activity-logs}">日志列表</a>
    <a class="btn btn-primary" th:href="@{/logout}">Logout</a>
</div>
</body>
</html>
11.2 补充代码概览

以下是修改后的代码片段概览:

  • UserController.java(更新后的控制器):
代码语言:java
复制
// 新增用户列表方法
@GetMapping("/users")
public String listUsers(Model model) {
    List<User> users = userService.findAll();
    model.addAttribute("users", users);
    return "user-list";
}
  • UserService.java(增加用户查询方法):
代码语言:java
复制
// 新增查询所有用户的方法
public List<User> findAll() {
    return userRepository.findAll();
}
  • WebSecurityConfig.java(更新跳转逻辑):
代码语言:java
复制
    http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/register", "/login").permitAll() // 允许所有用户访问注册和登录
            .anyRequest().authenticated() // 其他请求需要认证
            .and()
            .formLogin()
            .loginPage("/login") // 自定义登录页面
            .defaultSuccessUrl("/users", true) // 登录成功后重定向到 /users
            .permitAll()
            .and()
            .logout()
            .permitAll();

12. 用户活动日志

为了记录用户的活动,我们在 ActivityLogService 中已经添加了记录日志的方法。通过将每个用户的关键操作记录到数据库中,管理员可以跟踪用户的活动。这不仅有助于安全审计,还可以用于分析用户行为。

12.1 更新控制器

在用户登录、注销和其他关键操作的控制器中调用 ActivityLogServicelogActivity 方法,以记录用户的活动。例如,在 UserController 中更新相应的方法:

代码语言:java
复制
package com.example.usercenter.controller;

import com.example.usercenter.service.ActivityLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class UserController {

    @Autowired
    private ActivityLogService activityLogService;

    // 登录成功后的重定向
    @GetMapping("/users")
    public String listUsers(Model model, @AuthenticationPrincipal User user) {
        // 记录用户登录活动
        activityLogService.logActivity(user.getUsername(), "LOGIN");
        // 获取用户列表
        List<User> users = userService.findAllUsers();
        model.addAttribute("users", users);
        return "user-list";
    }

    @PostMapping("/logout")
    public String logout(@AuthenticationPrincipal User user) {
        // 记录用户注销活动
        activityLogService.logActivity(user.getUsername(), "LOGOUT");
        return "redirect:/login"; // 注销后重定向到登录页面
    }

    // 其他方法...
}
12.2 创建活动日志查询功能

为了方便管理员查看活动日志,我们可以添加一个新的控制器方法来显示活动日志列表。

代码语言:java
复制
@GetMapping("/activity-logs")
public String listActivityLogs(Model model) {
    List<ActivityLog> logs = activityLogService.findAllActivityLogs();
    model.addAttribute("logs", logs);
    return "activity-log-list"; // 返回活动日志列表页面
}

同时,更新 ActivityLogService 添加 findAllActivityLogs 方法:

代码语言:java
复制
public List<ActivityLog> findAllActivityLogs() {
    return activityLogRepository.findAll();
}
12.3 创建活动日志列表模板

resources/templates 目录下创建 activity-log-list.html 文件,用于展示活动日志。

activity-log-list.html
代码语言:html
复制
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>用户活动日志</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1>用户活动日志</h1>
    <table class="table table-bordered mt-4">
        <thead>
        <tr>
            <th>用户名</th>
            <th>操作</th>
            <th>时间</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="log : ${logs}">
            <td th:text="${log.userId}"></td>
            <td th:text="${log.activity}"></td>
            <td th:text="${log.timestamp}"></td>
        </tr>
        </tbody>
    </table>
    <a class="btn btn-info btn-sm" th:href="@{/users}">返回用户列表</a>
</div>
</body>
</html>

13. 运行与测试

完成以上修改后,启动应用程序并执行一些用户操作(如登录、注销等),然后访问活动日志页面,验证是否能够正确显示。

14. 权限控制

用户的权限控制是用户中心的重要组成部分。在我们的示例中,我们使用了 Spring Security 的角色管理功能来实现这一点。用户的权限可以基于其角色进行控制,从而限制他们对特定资源的访问。

结论

本文详细探讨了如何设计和实现一个功能完善的用户中心,涵盖了用户信息更新、密码重置、角色管理、用户权限控制和用户活动日志等关键功能。通过使用 Spring Boot 框架,我们能够快速构建一个高效、安全的用户中心,为后续的开发过程打下坚实的基础。希望本文能够为您在实现用户中心时提供有价值的参考和指导。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 1. 项目准备
    • 1.1 环境搭建
      • 1.2 项目结构
      • 2. 数据库设计
      • 3. 实体类设计
        • 3.1 User 实体类
          • 3.2 Role 实体类
            • 3.3 ActivityLog 实体类
            • 4. 数据库操作层
              • 4.1 UserRepository
                • 4.2 RoleRepository
                  • 4.3 ActivityLogRepository
                  • 5. 服务层
                    • 5.1 UserService
                      • 5.2 RoleService
                        • 5.3 ActivityLogService
                        • 6. 安全配置
                        • 7. 控制层
                          • 7.1 UserController
                          • 8. 前端页面
                            • 8.1 register.html
                              • 8.2 login.html
                                • 8.3 update.html
                                  • 8.4 reset-password.html
                                  • 9.引入第三方UI库
                                  • 10. 集成Bootstrap
                                    • 10.1 添加Bootstrap依赖
                                      • 10.2 修改HTML模板
                                      • 11.创建用户列表模板
                                        • 11.1user-list.html
                                          • 11.2 补充代码概览
                                          • 12. 用户活动日志
                                            • 12.1 更新控制器
                                              • 12.2 创建活动日志查询功能
                                                • 12.3 创建活动日志列表模板
                                                  • activity-log-list.html
                                              • 13. 运行与测试
                                              • 14. 权限控制
                                              • 结论
                                              相关产品与服务
                                              云数据库 MySQL
                                              腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                                              领券
                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档