登录和注册接口

This commit is contained in:
2025-07-22 00:01:24 +08:00
parent f296da093b
commit 29bca44a7b
7 changed files with 139 additions and 73 deletions

View File

@ -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;
}
}

View 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;
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}