LoginUserUtil 是一个用于在web端商户平台(alien-store-platform)中获取当前登录用户信息的工具类。它封装了从JWT Token中提取用户信息以及从数据库查询完整用户信息的常用方法。
@Autowired自动注入StoreUserMapper@Slf4j
@Component
public class LoginUserUtil {
// 核心方法
public static Integer getCurrentUserId() // 获取用户ID
public static String getCurrentUserPhone() // 获取手机号
public static String getCurrentUserType() // 获取用户类型
public static JSONObject getCurrentUserInfo() // 获取Token中的用户信息
public static StoreUser getCurrentStoreUser() // 获取完整用户信息(数据库)
public static StoreUser getCurrentStoreUserByPhone() // 根据手机号获取用户信息
// 辅助方法
public static boolean isCurrentUser(Integer userId) // 验证是否为当前用户
public static boolean isLogin() // 验证是否已登录
public static boolean isStorePlatformUser() // 验证是否为商户平台用户
// 便捷方法
public static Integer getCurrentStoreId() // 获取门店ID
public static String getCurrentNickName() // 获取昵称
public static String getCurrentName() // 获取真实姓名
}
获取当前登录用户的ID(从Token中获取,无需查询数据库)
/**
* 获取当前登录用户的ID
* @return 用户ID,如果未登录返回null
*/
public static Integer getCurrentUserId()
使用示例:
Integer userId = LoginUserUtil.getCurrentUserId();
if (userId != null) {
System.out.println("当前用户ID: " + userId);
} else {
System.out.println("用户未登录");
}
返回值:
null性能: ⚡ 快速(只解析Token,不查询数据库)
获取当前登录用户的手机号(从Token中获取)
/**
* 获取当前登录用户的手机号
* @return 手机号,如果未登录返回null
*/
public static String getCurrentUserPhone()
使用示例:
String phone = LoginUserUtil.getCurrentUserPhone();
if (phone != null) {
System.out.println("当前用户手机号: " + phone);
}
返回值:
null性能: ⚡ 快速(只解析Token)
获取当前登录用户的用户类型(从Token中获取)
/**
* 获取当前登录用户的用户类型
* @return 用户类型,如果未登录返回null
*/
public static String getCurrentUserType()
使用示例:
String userType = LoginUserUtil.getCurrentUserType();
if ("storePlatform".equals(userType)) {
System.out.println("商户平台用户");
}
返回值:
"storePlatform"null性能: ⚡ 快速(只解析Token)
获取当前登录用户的Token信息(JSONObject格式)
/**
* 获取当前登录用户的Token信息(JSONObject格式)
* @return 用户信息JSONObject,包含userId、phone、userType等字段
*/
public static JSONObject getCurrentUserInfo()
使用示例:
JSONObject userInfo = LoginUserUtil.getCurrentUserInfo();
if (userInfo != null) {
Integer userId = userInfo.getInteger("userId");
String phone = userInfo.getString("phone");
String userType = userInfo.getString("userType");
System.out.println("用户ID: " + userId);
System.out.println("手机号: " + phone);
System.out.println("用户类型: " + userType);
}
返回值:
JSONObjectnull包含字段:
userId: 用户IDphone: 手机号userType: 用户类型性能: ⚡ 快速(只解析Token)
获取当前登录用户的完整商户用户信息(从数据库查询)
/**
* 获取当前登录用户的完整商户用户信息(从数据库查询)
* @return StoreUser对象,如果未登录或查询失败返回null
*/
public static StoreUser getCurrentStoreUser()
使用示例:
StoreUser storeUser = LoginUserUtil.getCurrentStoreUser();
if (storeUser != null) {
System.out.println("用户ID: " + storeUser.getId());
System.out.println("手机号: " + storeUser.getPhone());
System.out.println("昵称: " + storeUser.getNickName());
System.out.println("真实姓名: " + storeUser.getName());
System.out.println("门店ID: " + storeUser.getStoreId());
System.out.println("账户余额: " + storeUser.getMoney());
}
返回值:
StoreUser对象(包含所有字段)nullnull性能: 🐢 较慢(需要查询数据库)
注意:
根据手机号获取商户用户信息(从数据库查询)
/**
* 根据手机号获取商户用户信息
* @return StoreUser对象,如果未登录或查询失败返回null
*/
public static StoreUser getCurrentStoreUserByPhone()
使用示例:
StoreUser storeUser = LoginUserUtil.getCurrentStoreUserByPhone();
if (storeUser != null) {
System.out.println("用户信息: " + storeUser);
}
返回值:
StoreUser对象nullnull性能: 🐢 较慢(需要查询数据库)
与 getCurrentStoreUser() 的区别:
getCurrentStoreUser(): 根据用户ID查询(主键查询,更快)getCurrentStoreUserByPhone(): 根据手机号查询(索引查询,稍慢)验证当前登录用户是否为指定用户
/**
* 验证当前登录用户是否为指定用户
* @param userId 要验证的用户ID
* @return true-是当前用户, false-不是当前用户
*/
public static boolean isCurrentUser(Integer userId)
使用示例:
Integer targetUserId = 12345;
if (LoginUserUtil.isCurrentUser(targetUserId)) {
System.out.println("是当前用户,允许操作");
} else {
System.out.println("不是当前用户,拒绝操作");
}
使用场景:
返回值:
true: 是当前登录用户false: 不是当前登录用户或未登录验证当前用户是否已登录
/**
* 验证当前用户是否已登录
* @return true-已登录, false-未登录
*/
public static boolean isLogin()
使用示例:
if (LoginUserUtil.isLogin()) {
System.out.println("用户已登录");
} else {
System.out.println("用户未登录");
}
返回值:
true: 已登录false: 未登录验证当前用户类型是否为web端商户平台
/**
* 验证当前用户类型是否为web端商户平台
* @return true-是商户平台用户, false-不是
*/
public static boolean isStorePlatformUser()
使用示例:
if (LoginUserUtil.isStorePlatformUser()) {
System.out.println("商户平台用户,允许访问");
} else {
System.out.println("非商户平台用户,拒绝访问");
}
返回值:
true: 用户类型为 storePlatformfalse: 用户类型不是 storePlatform 或未登录获取当前登录用户的门店ID
/**
* 获取当前登录用户的门店ID
* @return 门店ID,如果未登录或用户无门店返回null
*/
public static Integer getCurrentStoreId()
使用示例:
Integer storeId = LoginUserUtil.getCurrentStoreId();
if (storeId != null) {
System.out.println("当前用户的门店ID: " + storeId);
}
返回值:
nullnull性能: 🐢 较慢(需要查询数据库)
获取当前登录用户的昵称
/**
* 获取当前登录用户的昵称
* @return 昵称,如果未登录返回null
*/
public static String getCurrentNickName()
使用示例:
String nickName = LoginUserUtil.getCurrentNickName();
if (nickName != null) {
System.out.println("欢迎," + nickName);
}
返回值:
null性能: 🐢 较慢(需要查询数据库)
获取当前登录用户的真实姓名
/**
* 获取当前登录用户的真实姓名
* @return 真实姓名,如果未登录返回null
*/
public static String getCurrentName()
使用示例:
String name = LoginUserUtil.getCurrentName();
if (name != null) {
System.out.println("真实姓名: " + name);
}
返回值:
null性能: 🐢 较慢(需要查询数据库)
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/profile")
public R<StoreUser> getUserProfile() {
// 获取当前登录用户的完整信息
StoreUser storeUser = LoginUserUtil.getCurrentStoreUser();
if (storeUser == null) {
return R.fail("请先登录");
}
return R.data(storeUser);
}
}
@Service
public class StoreServiceImpl implements StoreService {
@Override
public boolean updateStore(Integer storeId, StoreInfo storeInfo) {
// 获取当前用户的门店ID
Integer currentStoreId = LoginUserUtil.getCurrentStoreId();
// 验证用户只能修改自己的门店信息
if (!storeId.equals(currentStoreId)) {
throw new RuntimeException("您只能修改自己的门店信息");
}
// 执行更新操作
return updateStoreInfo(storeInfo);
}
}
@Service
public class OrderServiceImpl implements OrderService {
@Override
public boolean createOrder(Order order) {
// 自动填充当前用户信息
Integer userId = LoginUserUtil.getCurrentUserId();
Integer storeId = LoginUserUtil.getCurrentStoreId();
order.setUserId(userId);
order.setStoreId(storeId);
order.setCreateTime(new Date());
return orderMapper.insert(order) > 0;
}
}
@Service
public class DashboardServiceImpl implements DashboardService {
@Override
public JSONObject getDashboardData() {
JSONObject result = new JSONObject();
// 验证用户类型
if (!LoginUserUtil.isStorePlatformUser()) {
throw new RuntimeException("只有商户平台用户可以访问");
}
// 获取用户信息
Integer storeId = LoginUserUtil.getCurrentStoreId();
// 查询仪表盘数据
result.put("todayIncome", getTodayIncome(storeId));
result.put("todayOrderCount", getTodayOrderCount(storeId));
return result;
}
}
@Service
public class AuditLogServiceImpl implements AuditLogService {
@Override
public void logOperation(String action, String details) {
AuditLog log = new AuditLog();
// 记录操作人信息
log.setUserId(LoginUserUtil.getCurrentUserId());
log.setUserPhone(LoginUserUtil.getCurrentUserPhone());
log.setUserName(LoginUserUtil.getCurrentName());
log.setAction(action);
log.setDetails(details);
log.setOperateTime(new Date());
auditLogMapper.insert(log);
}
}
@Service
public class OrderServiceImpl implements OrderService {
@Override
public List<Order> getMyOrders(Integer page, Integer size) {
// 获取当前用户ID
Integer userId = LoginUserUtil.getCurrentUserId();
if (userId == null) {
throw new RuntimeException("请先登录");
}
// 查询当前用户的订单
LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Order::getUserId, userId)
.orderByDesc(Order::getCreateTime);
return orderMapper.selectPage(new Page<>(page, size), wrapper).getRecords();
}
}
之前的写法:
@PostMapping("/updateProfile")
public R<Boolean> updateProfile(@RequestBody StoreUser storeUser) {
// 需要手动获取用户信息
JSONObject userInfo = JwtUtil.getCurrentUserInfo();
if (userInfo == null) {
return R.fail("请先登录");
}
Integer userId = userInfo.getInteger("userId");
storeUser.setId(userId);
boolean success = storeUserService.updateById(storeUser);
return success ? R.success("修改成功") : R.fail("修改失败");
}
使用工具类后:
@PostMapping("/updateProfile")
public R<Boolean> updateProfile(@RequestBody StoreUser storeUser) {
// 直接获取用户ID
Integer userId = LoginUserUtil.getCurrentUserId();
if (userId == null) {
return R.fail("请先登录");
}
storeUser.setId(userId);
boolean success = storeUserService.updateById(storeUser);
return success ? R.success("修改成功") : R.fail("修改失败");
}
| 方法 | 性能 | 是否查询数据库 | 适用场景 |
|---|---|---|---|
getCurrentUserId() |
⚡⚡⚡ 极快 | ❌ 否 | 只需要用户ID |
getCurrentUserPhone() |
⚡⚡⚡ 极快 | ❌ 否 | 只需要手机号 |
getCurrentUserType() |
⚡⚡⚡ 极快 | ❌ 否 | 验证用户类型 |
getCurrentUserInfo() |
⚡⚡⚡ 极快 | ❌ 否 | 需要Token中的多个字段 |
getCurrentStoreUser() |
🐢 较慢 | ✅ 是 | 需要完整用户信息 |
getCurrentStoreUserByPhone() |
🐢 较慢 | ✅ 是 | 根据手机号查询 |
getCurrentStoreId() |
🐢 较慢 | ✅ 是 | 只需要门店ID |
getCurrentNickName() |
🐢 较慢 | ✅ 是 | 只需要昵称 |
getCurrentName() |
🐢 较慢 | ✅ 是 | 只需要真实姓名 |
优化建议:
getCurrentUserId()、getCurrentUserPhone()等)getCurrentStoreUser()一次性获取,避免多次查询所有方法在获取失败时都返回null,使用时需要判空:
Integer userId = LoginUserUtil.getCurrentUserId();
if (userId != null) {
// 处理业务逻辑
} else {
// 处理未登录情况
}
工具类内部已处理所有异常,不会向外抛出异常,确保调用安全。
由于使用静态方法,需要通过@Autowired注入StoreUserMapper到静态字段。这是通过@Component和setter方法实现的。
工具类是线程安全的,可以在多线程环境下使用。
LoginUserUtil 与 @LoginRequired 注解配合使用效果更佳:
@RestController
@RequestMapping("/store")
public class StoreController {
@LoginRequired // AOP切面验证登录
@GetMapping("/myStore")
public R<StoreInfo> getMyStore() {
// 登录验证已通过,直接获取门店ID
Integer storeId = LoginUserUtil.getCurrentStoreId();
StoreInfo storeInfo = storeService.getById(storeId);
return R.data(storeInfo);
}
}
工具类使用@Component注解,需要被Spring扫描到:
@Component // 必须
public class LoginUserUtil {
// ...
}
确保LoginUserUtil所在的包被Spring Boot扫描:
@SpringBootApplication
@ComponentScan(basePackages = {"shop.alien.storeplatform"})
public class Application {
// ...
}
确保StoreUserMapper已注册为Spring Bean:
@Mapper
public interface StoreUserMapper extends BaseMapper<StoreUser> {
}
原因:
解决方案:
LoginUserUtil.isLogin()答案: 工具类可以在任何Spring管理的Bean中使用:
@Service
public class MyService {
public void someMethod() {
Integer userId = LoginUserUtil.getCurrentUserId();
// 使用userId
}
}
答案:
getCurrentUserId())性能很高,可以频繁调用getCurrentStoreUser())性能较低,建议缓存结果建议方案:
@Service
public class MyService {
private StoreUser currentUser;
public void processOrder() {
// 第一次获取
if (currentUser == null) {
currentUser = LoginUserUtil.getCurrentStoreUser();
}
// 后续使用缓存的数据
Integer storeId = currentUser.getStoreId();
// ...
}
}
或使用ThreadLocal缓存(适用于同一次请求)。
新增工具类:
LoginUserUtil工具类核心功能:
技术特点:
开发人员: ssk
文档版本: v1.0
最后更新: 2025-11-17
维护人员: ssk