登录和注册接口
This commit is contained in:
15
Dockerfile.buildagent
Normal file
15
Dockerfile.buildagent
Normal file
@ -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
|
||||||
29
Jenkinsfile
vendored
29
Jenkinsfile
vendored
@ -1,8 +1,8 @@
|
|||||||
pipeline {
|
pipeline {
|
||||||
agent any
|
agent any
|
||||||
tools {
|
// tools {
|
||||||
maven 'M3' // 必须在 Jenkins → Manage Jenkins → Global Tool Configuration 中配置过
|
// maven 'M3' // 必须在 Jenkins → Manage Jenkins → Global Tool Configuration 中配置过
|
||||||
}
|
// }
|
||||||
environment {
|
environment {
|
||||||
APP_NAME = "sczx_user"
|
APP_NAME = "sczx_user"
|
||||||
DOCKER_IMAGE = "${APP_NAME}:latest"
|
DOCKER_IMAGE = "${APP_NAME}:latest"
|
||||||
@ -10,14 +10,19 @@ pipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stages {
|
stages {
|
||||||
stage('Checkout') {
|
// stage('Checkout') {
|
||||||
steps {
|
// steps {
|
||||||
echo "📦 正在拉取代码..."
|
// echo "📦 正在拉取代码..."
|
||||||
git branch: 'main', url: 'http://115.190.8.52:3000/sczx_group/sczx_user.git'
|
// 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 {
|
steps {
|
||||||
echo "🛠️ 正在使用 Maven 构建..."
|
echo "🛠️ 正在使用 Maven 构建..."
|
||||||
sh 'mvn clean package -s settings.xml'
|
sh 'mvn clean package -s settings.xml'
|
||||||
@ -25,12 +30,14 @@ pipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stage('Check Jar File') {
|
stage('Check Jar File') {
|
||||||
|
agent any
|
||||||
steps {
|
steps {
|
||||||
sh 'ls -la target/' // 确保 jar 文件存在
|
sh 'ls -la target/' // 确保 jar 文件存在
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage('Build Docker Image') {
|
stage('Build Docker Image') {
|
||||||
|
agent any
|
||||||
steps {
|
steps {
|
||||||
echo "🐋 正在构建 Docker 镜像..."
|
echo "🐋 正在构建 Docker 镜像..."
|
||||||
sh """
|
sh """
|
||||||
@ -40,6 +47,7 @@ pipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stage('Stop Old Container') {
|
stage('Stop Old Container') {
|
||||||
|
agent any
|
||||||
steps {
|
steps {
|
||||||
echo "🛑 正在停止旧的容器(如果存在)..."
|
echo "🛑 正在停止旧的容器(如果存在)..."
|
||||||
sh '''
|
sh '''
|
||||||
@ -52,6 +60,7 @@ pipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stage('Run New Container') {
|
stage('Run New Container') {
|
||||||
|
agent any
|
||||||
steps {
|
steps {
|
||||||
echo "🟢 正在运行新的容器..."
|
echo "🟢 正在运行新的容器..."
|
||||||
sh """
|
sh """
|
||||||
|
|||||||
@ -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;
|
package com.sczx.user.service;
|
||||||
|
|
||||||
import com.sczx.user.model.LoginRequest;
|
import com.sczx.user.dto.SimpleUserInfoDTO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: 张黎
|
* @Author: 张黎
|
||||||
@ -9,20 +9,6 @@ import com.sczx.user.model.LoginRequest;
|
|||||||
*/
|
*/
|
||||||
public interface IUserService {
|
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
|
* @return token
|
||||||
*/
|
*/
|
||||||
String alipayMiniProgramRegister(String userId, String username, String password);
|
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;
|
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.exception.BizException;
|
||||||
import com.sczx.user.model.LoginRequest;
|
|
||||||
import com.sczx.user.service.IUserService;
|
import com.sczx.user.service.IUserService;
|
||||||
import com.sczx.user.util.JwtUtil;
|
import com.sczx.user.util.JwtUtil;
|
||||||
import com.sczx.user.util.RedisUtil;
|
import com.sczx.user.util.RedisUtil;
|
||||||
@ -11,7 +12,6 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: 张黎
|
* @Author: 张黎
|
||||||
@ -37,40 +37,6 @@ public class UserServiceImpl implements IUserService {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RedisUtil redisUtil;
|
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
|
@Override
|
||||||
@ -79,8 +45,10 @@ public class UserServiceImpl implements IUserService {
|
|||||||
if (openid == null) {
|
if (openid == null) {
|
||||||
throw new BizException("无效的微信登录code");
|
throw new BizException("无效的微信登录code");
|
||||||
}
|
}
|
||||||
// 存入 Redis
|
// 模拟登录逻辑
|
||||||
return jwtUtil.generateToken(openid, "USER");
|
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(openid, MiniProgramTypeEnum.WECHAT.getType());
|
||||||
|
|
||||||
|
return jwtUtil.generateToken(simpleUserInfoDTO, simpleUserInfoDTO.getUserName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -90,8 +58,9 @@ public class UserServiceImpl implements IUserService {
|
|||||||
throw new BizException("无效的微信登录code");
|
throw new BizException("无效的微信登录code");
|
||||||
}
|
}
|
||||||
// 模拟注册逻辑
|
// 模拟注册逻辑
|
||||||
// userRepository.save(new User(openid, username, password));
|
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(openid, MiniProgramTypeEnum.WECHAT.getType());
|
||||||
return jwtUtil.generateToken(openid, "USER");
|
|
||||||
|
return jwtUtil.generateToken(simpleUserInfoDTO, simpleUserInfoDTO.getUserName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -100,7 +69,10 @@ public class UserServiceImpl implements IUserService {
|
|||||||
if (realUserId == null) {
|
if (realUserId == null) {
|
||||||
throw new BizException("无效的支付宝用户ID");
|
throw new BizException("无效的支付宝用户ID");
|
||||||
}
|
}
|
||||||
return jwtUtil.generateToken(realUserId, "USER");
|
// 模拟登录逻辑
|
||||||
|
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(realUserId, MiniProgramTypeEnum.ALIPAY.getType());
|
||||||
|
|
||||||
|
return jwtUtil.generateToken(simpleUserInfoDTO, simpleUserInfoDTO.getUserName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -110,7 +82,18 @@ public class UserServiceImpl implements IUserService {
|
|||||||
throw new BizException("无效的支付宝用户ID");
|
throw new BizException("无效的支付宝用户ID");
|
||||||
}
|
}
|
||||||
// 模拟注册逻辑
|
// 模拟注册逻辑
|
||||||
// userRepository.save(new User(realUserId, username, password));
|
SimpleUserInfoDTO simpleUserInfoDTO = getUserInfoByProgramId(realUserId, MiniProgramTypeEnum.ALIPAY.getType());
|
||||||
return jwtUtil.generateToken(realUserId, "USER");
|
|
||||||
|
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;
|
package com.sczx.user.util;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.sczx.user.dto.SimpleUserInfoDTO;
|
||||||
import io.jsonwebtoken.JwtException;
|
import io.jsonwebtoken.JwtException;
|
||||||
import io.jsonwebtoken.Jwts;
|
import io.jsonwebtoken.Jwts;
|
||||||
import io.jsonwebtoken.SignatureAlgorithm;
|
import io.jsonwebtoken.SignatureAlgorithm;
|
||||||
import io.jsonwebtoken.security.Keys;
|
import io.jsonwebtoken.security.Keys;
|
||||||
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
@ -13,6 +13,7 @@ import org.springframework.stereotype.Component;
|
|||||||
|
|
||||||
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKey;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: 张黎
|
* @Author: 张黎
|
||||||
@ -35,15 +36,39 @@ public class JwtUtil {
|
|||||||
log.info("JWT 密钥:{}", secretKey);
|
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()
|
return Jwts.builder()
|
||||||
.setSubject(username)
|
.setClaims(claims) // 设置自定义 claims
|
||||||
.claim("role", role)
|
.setSubject(subject)
|
||||||
.setExpiration(new Date(System.currentTimeMillis() + expiration))
|
.setExpiration(new Date(System.currentTimeMillis() + expiration))
|
||||||
.signWith(key, SignatureAlgorithm.HS512)
|
.signWith(key, SignatureAlgorithm.HS512)
|
||||||
.compact();
|
.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) {
|
public String extractUsername(String token) {
|
||||||
return Jwts.parserBuilder()
|
return Jwts.parserBuilder()
|
||||||
.setSigningKey(key)
|
.setSigningKey(key)
|
||||||
@ -53,6 +78,7 @@ public class JwtUtil {
|
|||||||
.getSubject();
|
.getSubject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 验证 token 是否有效
|
||||||
public boolean validateToken(String token) {
|
public boolean validateToken(String token) {
|
||||||
try {
|
try {
|
||||||
Jwts.parserBuilder()
|
Jwts.parserBuilder()
|
||||||
@ -64,4 +90,5 @@ public class JwtUtil {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user