diff --git a/Dockerfile.buildagent b/Dockerfile.buildagent new file mode 100644 index 0000000..f893f6c --- /dev/null +++ b/Dockerfile.buildagent @@ -0,0 +1,15 @@ +# 使用 JDK 8 作为构建环境 +FROM openjdk:8-jdk + +# 使用阿里云的 apt 镜像源(Debian 11 bullseye) +RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \ + sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list + +# 更新包列表并安装 Maven 和 Git +RUN apt update && \ + apt install -y maven git && \ + mvn --version && \ + git --version + +# 设置工作目录 +WORKDIR /home/jenkins/workspace \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index bca0c77..56b81a9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,8 +1,8 @@ pipeline { agent any - tools { - maven 'M3' // 必须在 Jenkins → Manage Jenkins → Global Tool Configuration 中配置过 - } +// tools { +// maven 'M3' // 必须在 Jenkins → Manage Jenkins → Global Tool Configuration 中配置过 +// } environment { APP_NAME = "sczx_user" DOCKER_IMAGE = "${APP_NAME}:latest" @@ -10,14 +10,19 @@ pipeline { } stages { - stage('Checkout') { - steps { - echo "📦 正在拉取代码..." - git branch: 'main', url: 'http://115.190.8.52:3000/sczx_group/sczx_user.git' - } - } +// stage('Checkout') { +// steps { +// echo "📦 正在拉取代码..." +// git branch: 'main', url: 'http://115.190.8.52:3000/sczx_group/sczx_user.git' +// } +// } - stage('Build with Maven') { + stage('Build with Maven in JDK 8') { + agent { + dockerfile { + filename "Dockerfile.buildagent" + } + } steps { echo "🛠️ 正在使用 Maven 构建..." sh 'mvn clean package -s settings.xml' @@ -25,12 +30,14 @@ pipeline { } stage('Check Jar File') { + agent any steps { sh 'ls -la target/' // 确保 jar 文件存在 } } stage('Build Docker Image') { + agent any steps { echo "🐋 正在构建 Docker 镜像..." sh """ @@ -40,6 +47,7 @@ pipeline { } stage('Stop Old Container') { + agent any steps { echo "🛑 正在停止旧的容器(如果存在)..." sh ''' @@ -52,6 +60,7 @@ pipeline { } stage('Run New Container') { + agent any steps { echo "🟢 正在运行新的容器..." sh """ diff --git a/src/main/java/com/sczx/user/common/enums/MiniProgramTypeEnum.java b/src/main/java/com/sczx/user/common/enums/MiniProgramTypeEnum.java new file mode 100644 index 0000000..96b7b10 --- /dev/null +++ b/src/main/java/com/sczx/user/common/enums/MiniProgramTypeEnum.java @@ -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; + } + +} diff --git a/src/main/java/com/sczx/user/dto/SimpleUserInfoDTO.java b/src/main/java/com/sczx/user/dto/SimpleUserInfoDTO.java new file mode 100644 index 0000000..7a8c25b --- /dev/null +++ b/src/main/java/com/sczx/user/dto/SimpleUserInfoDTO.java @@ -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; +} diff --git a/src/main/java/com/sczx/user/service/IUserService.java b/src/main/java/com/sczx/user/service/IUserService.java index e4e9e43..d440a41 100644 --- a/src/main/java/com/sczx/user/service/IUserService.java +++ b/src/main/java/com/sczx/user/service/IUserService.java @@ -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); } diff --git a/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java b/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java index f48af25..79dc6db 100644 --- a/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java @@ -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; } } diff --git a/src/main/java/com/sczx/user/util/JwtUtil.java b/src/main/java/com/sczx/user/util/JwtUtil.java index 2db4e26..ed0aba5 100644 --- a/src/main/java/com/sczx/user/util/JwtUtil.java +++ b/src/main/java/com/sczx/user/util/JwtUtil.java @@ -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 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 getClaim(String token, String claimKey, Class clazz) { + return Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token) + .getBody() + .get(claimKey, clazz); + } + + // 从 token 中提取某个对象类型的字段(支持复杂对象) + public T getClaimFromToken(String token, String claimKey, Class 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; } } + }