登录和注册接口
This commit is contained in:
@ -0,0 +1,19 @@
|
||||
package com.sczx.user.common.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 小程序类型枚举
|
||||
*/
|
||||
@Getter
|
||||
public enum MiniProgramTypeEnum {
|
||||
WECHAT("wechat"),
|
||||
ALIPAY("alipay");
|
||||
|
||||
private final String type;
|
||||
|
||||
MiniProgramTypeEnum(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
}
|
||||
19
src/main/java/com/sczx/user/dto/SimpleUserInfoDTO.java
Normal file
19
src/main/java/com/sczx/user/dto/SimpleUserInfoDTO.java
Normal file
@ -0,0 +1,19 @@
|
||||
package com.sczx.user.dto;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@ApiModel(value = "基本用户信息")
|
||||
@Data
|
||||
public class SimpleUserInfoDTO {
|
||||
|
||||
@ApiModelProperty(value = "用户id")
|
||||
private Integer userId;
|
||||
|
||||
@ApiModelProperty(value = "用户姓名")
|
||||
private String userName;
|
||||
|
||||
@ApiModelProperty(value = "角色id")
|
||||
private Integer roleId;
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
package com.sczx.user.service;
|
||||
|
||||
import com.sczx.user.model.LoginRequest;
|
||||
import com.sczx.user.dto.SimpleUserInfoDTO;
|
||||
|
||||
/**
|
||||
* @Author: 张黎
|
||||
@ -9,20 +9,6 @@ import com.sczx.user.model.LoginRequest;
|
||||
*/
|
||||
public interface IUserService {
|
||||
|
||||
/**
|
||||
* 用户注册
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
String register(LoginRequest request);
|
||||
|
||||
/**
|
||||
* 用户登录
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
String login(LoginRequest request);
|
||||
|
||||
|
||||
/**
|
||||
* 微信小程序登录
|
||||
@ -55,4 +41,12 @@ public interface IUserService {
|
||||
* @return token
|
||||
*/
|
||||
String alipayMiniProgramRegister(String userId, String username, String password);
|
||||
|
||||
/**
|
||||
* 根据小程序ID获取用户信息
|
||||
* @param programId 小程序ID
|
||||
* @param programType 小程序类型
|
||||
* @return 用户信息
|
||||
*/
|
||||
SimpleUserInfoDTO getUserInfoByProgramId(String programId, String programType);
|
||||
}
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
package com.sczx.user.service.impl;
|
||||
|
||||
import com.sczx.user.common.enums.MiniProgramTypeEnum;
|
||||
import com.sczx.user.dto.SimpleUserInfoDTO;
|
||||
import com.sczx.user.exception.BizException;
|
||||
import com.sczx.user.model.LoginRequest;
|
||||
import com.sczx.user.service.IUserService;
|
||||
import com.sczx.user.util.JwtUtil;
|
||||
import com.sczx.user.util.RedisUtil;
|
||||
@ -11,7 +12,6 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @Author: 张黎
|
||||
@ -37,40 +37,6 @@ public class UserServiceImpl implements IUserService {
|
||||
|
||||
@Autowired
|
||||
private RedisUtil redisUtil;
|
||||
@Override
|
||||
public String register(LoginRequest request) {
|
||||
log.info("用户注册信息:{}", request);
|
||||
// TODO: 2025/07/06 用户注册逻辑
|
||||
// if (userRepository.existsByUsername(request.getUsername())) {
|
||||
// throw new RuntimeException("用户名已存在");
|
||||
// }
|
||||
//
|
||||
// User user = new User();
|
||||
// user.setUsername(request.getUsername());
|
||||
// user.setPassword(passwordEncoder.encode(request.getPassword()));
|
||||
// user.setRole("USER");
|
||||
//
|
||||
// userRepository.save(user);
|
||||
return "用户注册成功";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String login(LoginRequest request) {
|
||||
// todo: 2025/07/06 用户登录逻辑
|
||||
// User user = userRepository.findByUsername(request.getUsername())
|
||||
// .orElseThrow(() -> new RuntimeException("用户名或密码错误"));
|
||||
//
|
||||
// if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
|
||||
// throw new RuntimeException("密码错误");
|
||||
// }
|
||||
|
||||
String token = jwtUtil.generateToken(request.getUsername(), "user.role");
|
||||
|
||||
// 存入 Redis
|
||||
redisUtil.set("token:" + request.getUsername(), token, 24, TimeUnit.HOURS);
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@ -79,8 +45,10 @@ public class UserServiceImpl implements IUserService {
|
||||
if (openid == null) {
|
||||
throw new BizException("无效的微信登录code");
|
||||
}
|
||||
// 存入 Redis
|
||||
return jwtUtil.generateToken(openid, "USER");
|
||||
// 模拟登录逻辑
|
||||
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(openid, MiniProgramTypeEnum.WECHAT.getType());
|
||||
|
||||
return jwtUtil.generateToken(simpleUserInfoDTO, simpleUserInfoDTO.getUserName());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -90,8 +58,9 @@ public class UserServiceImpl implements IUserService {
|
||||
throw new BizException("无效的微信登录code");
|
||||
}
|
||||
// 模拟注册逻辑
|
||||
// userRepository.save(new User(openid, username, password));
|
||||
return jwtUtil.generateToken(openid, "USER");
|
||||
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(openid, MiniProgramTypeEnum.WECHAT.getType());
|
||||
|
||||
return jwtUtil.generateToken(simpleUserInfoDTO, simpleUserInfoDTO.getUserName());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -100,7 +69,10 @@ public class UserServiceImpl implements IUserService {
|
||||
if (realUserId == null) {
|
||||
throw new BizException("无效的支付宝用户ID");
|
||||
}
|
||||
return jwtUtil.generateToken(realUserId, "USER");
|
||||
// 模拟登录逻辑
|
||||
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(realUserId, MiniProgramTypeEnum.ALIPAY.getType());
|
||||
|
||||
return jwtUtil.generateToken(simpleUserInfoDTO, simpleUserInfoDTO.getUserName());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -110,7 +82,18 @@ public class UserServiceImpl implements IUserService {
|
||||
throw new BizException("无效的支付宝用户ID");
|
||||
}
|
||||
// 模拟注册逻辑
|
||||
// userRepository.save(new User(realUserId, username, password));
|
||||
return jwtUtil.generateToken(realUserId, "USER");
|
||||
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(realUserId, MiniProgramTypeEnum.ALIPAY.getType());
|
||||
|
||||
return jwtUtil.generateToken(simpleUserInfoDTO, simpleUserInfoDTO.getUserName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public SimpleUserInfoDTO getUserInfoByProgramId(String programId, String programType) {
|
||||
//todo 根据小程序id和类型查询用户信息
|
||||
SimpleUserInfoDTO simpleUserInfoDTO = new SimpleUserInfoDTO();
|
||||
simpleUserInfoDTO.setUserId(1);
|
||||
simpleUserInfoDTO.setUserName("张三");
|
||||
simpleUserInfoDTO.setRoleId(1);
|
||||
return simpleUserInfoDTO;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
package com.sczx.user.util;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.sczx.user.dto.SimpleUserInfoDTO;
|
||||
import io.jsonwebtoken.JwtException;
|
||||
import io.jsonwebtoken.Jwts;
|
||||
import io.jsonwebtoken.SignatureAlgorithm;
|
||||
import io.jsonwebtoken.security.Keys;
|
||||
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@ -13,6 +13,7 @@ import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.crypto.SecretKey;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: 张黎
|
||||
@ -35,15 +36,39 @@ public class JwtUtil {
|
||||
log.info("JWT 密钥:{}", secretKey);
|
||||
}
|
||||
|
||||
public String generateToken(String username, String role) {
|
||||
// 支持自定义 claims 的 generateToken 方法
|
||||
public String generateToken(SimpleUserInfoDTO simpleUserInfoDTO, String subject){
|
||||
Map<String, Object> claims = Maps.newHashMap();
|
||||
claims.put("userInfo", simpleUserInfoDTO.getUserId());
|
||||
return Jwts.builder()
|
||||
.setSubject(username)
|
||||
.claim("role", role)
|
||||
.setClaims(claims) // 设置自定义 claims
|
||||
.setSubject(subject)
|
||||
.setExpiration(new Date(System.currentTimeMillis() + expiration))
|
||||
.signWith(key, SignatureAlgorithm.HS512)
|
||||
.compact();
|
||||
}
|
||||
|
||||
// 从 token 中提取某个字段
|
||||
public <T> T getClaim(String token, String claimKey, Class<T> clazz) {
|
||||
return Jwts.parserBuilder()
|
||||
.setSigningKey(key)
|
||||
.build()
|
||||
.parseClaimsJws(token)
|
||||
.getBody()
|
||||
.get(claimKey, clazz);
|
||||
}
|
||||
|
||||
// 从 token 中提取某个对象类型的字段(支持复杂对象)
|
||||
public <T> T getClaimFromToken(String token, String claimKey, Class<T> targetClass) {
|
||||
return Jwts.parserBuilder()
|
||||
.setSigningKey(key)
|
||||
.build()
|
||||
.parseClaimsJws(token)
|
||||
.getBody()
|
||||
.get(claimKey, targetClass);
|
||||
}
|
||||
|
||||
// 提取用户名
|
||||
public String extractUsername(String token) {
|
||||
return Jwts.parserBuilder()
|
||||
.setSigningKey(key)
|
||||
@ -53,6 +78,7 @@ public class JwtUtil {
|
||||
.getSubject();
|
||||
}
|
||||
|
||||
// 验证 token 是否有效
|
||||
public boolean validateToken(String token) {
|
||||
try {
|
||||
Jwts.parserBuilder()
|
||||
@ -64,4 +90,5 @@ public class JwtUtil {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user