目录
[1.1 导航栏](#1.1 导航栏)
[1.2 正文部分](#1.2 正文部分)
[1.3 页脚部分](#1.3 页脚部分)
[2.1 获取用户信息](#2.1 获取用户信息)
[2. 参数要求编辑](#2. 参数要求编辑)
[4.1 Mapper.xml](#4.1 Mapper.xml)
[4.2 Mapper.java(dao层)](#4.2 Mapper.java(dao层))
[4.3 Service接口](#4.3 Service接口)
[4.4 Service实现](#4.4 Service实现)
[4.5 单元测试](#4.5 单元测试)
[4.6 Controller](#4.6 Controller)
[4.7 API测试](#4.7 API测试)
[4.8 修复返回值存在的缺陷](#4.8 修复返回值存在的缺陷)
[4.9 前端](#4.9 前端)
1.主页结构
1.1 导航栏

1.2 正文部分

1.3 页脚部分

2.个人中心
2.1 获取用户信息
两种情况

1.实现逻辑

2. 参数要求
3.接口规范

4.实现流程
4.1 Mapper.xml
4.2 Mapper.java(dao层)

4.3 Service接口

4.4 Service实现
java
/**
* 根据Id查询用户信息
*
* @param id 用户Id
* @return User对象
*/
@Override
public User selectById(Long id) {
// 1.非空校验
if(id == null) {
// 打印日志
log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());
// 抛出异常, 统一抛出 ApplicationException
throw new ApplicationException(AppResult.failed(ResultCode.FAILED_LOGIN));
}
// 调用 DAO 查询数据库获取对象
User user = userMapper.selectByPrimaryKey(id);
return user;
}
4.5 单元测试
java
@Test
void selectById() {
System.out.println(userService.selectById(1L));
}
4.6 Controller
java
@ApiOperation("获取用户信息")
@GetMapping("/info")
public AppResult<User> getUserInfo (HttpServletRequest request,
@ApiParam("用户ID") @RequestParam(value = "id", required = false) Long id) {
User user = null;
// 根据id的值来判断User对象的获取方式
if(id == null) {
// 1.如果id为空, 从session中获取当前登录的用户信息
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute(AppConfig.USER_SESSION) == null) {
return AppResult.failed(ResultCode.FAILED_FORBIDDEN);
}
// 从session中获取当前登录的用户信息
user = (User)session.getAttribute(AppConfig.USER_SESSION);
}else {
// 2.如果id不为空, 从数据库中按Id查询出用户登录信息
user = userService.selectById(id);
}
if (user == null) {
return AppResult.failed(ResultCode.FAILED_USER_NOT_EXISTS);
}
// 返回正常结果
return AppResult.success(user);
}
4.7 API测试

4.8 修复返回值存在的缺陷

4.9 前端

5.退出登录



6.登录拦截器
创建登录拦截器

java
package com.example.forum.interceptor;
import com.example.forum.config.AppConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Created with IntelliJ IDEA
* Description 登录拦截器
* User: 王杰
* Date: 2025-06-15
* Time: 13:08
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Value("{forum.login.url}")
private String defaultURL;
/**
* 前置处理(对请求的预处理)
* @param request
* @param response
* @param handler
* @return true: 继续流程 <br/> false : 流程中断
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取 session 对象
HttpSession session = request.getSession(false);
// 判断session是否有效
if (session != null && session.getAttribute(AppConfig.USER_SESSION) != null) {
// 用户为已登陆状态 校验通过
return true;
}
// 校验URL是否正确
if(!defaultURL.startsWith("/")) {
defaultURL = "/" + defaultURL;
}
// 校验不通过 跳转到登录页面
response.sendRedirect(defaultURL);
// 中断流程
return false;
}
}
注册拦截器:
java
package com.example.forum.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
/**
* Created with IntelliJ IDEA
* Description
* User: 王杰
* Date: 2025-06-15
* Time: 14:34
*/
// 表示一个配置类
@Configuration
public class AppInterceptorConfigurer implements WebMvcConfigurer {
// 注入自定义的登录拦截器
@Resource
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加登录拦截器
registry.addInterceptor(loginInterceptor) // 添加用户登录拦截器
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/sign-in.html") // 排除登录HTML
.excludePathPatterns("/sign-up.html") // 排除注册HTML
.excludePathPatterns("/user/login") // 排除登录api接口
.excludePathPatterns("/user/register") // 排除注册api接口
.excludePathPatterns("/user/logout") // 排除退出api接口
.excludePathPatterns("/swagger*/**") // 排除登录swagger下所有
.excludePathPatterns("/v3*/**") // 排除登录v3下所有, 与swagger相关
.excludePathPatterns("/dist/**") // 排除所有静态方法
.excludePathPatterns("/image/**") //
.excludePathPatterns("/js/**")
.excludePathPatterns("/**.ico");
}
}
这下就可以达成 访问需要登陆的页面,如果没有登录就会返回登录页面。如果登录了就正常执行
,同时可以删除业务代码中相同逻辑代码,避免冗余代码。