Initial commit: backend code

This commit is contained in:
Agent
2026-03-20 04:59:00 +00:00
commit e7c7f3b174
42 changed files with 2855 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
package com.example.building.common;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* JWT工具类
* 用于生成和验证JWT Token
*/
@Component
public class JwtUtil {
@Value("${jwt.secret:building-materials-secret-key-2024}")
private String secret;
@Value("${jwt.expiration:7200000}")
private Long expiration;
@Value("${jwt.refresh-expiration:604800000}")
private Long refreshExpiration;
/**
* 生成JWT Token
*/
public String generateToken(String userId, String username, String role) {
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userId);
claims.put("username", username);
claims.put("role", role);
return createToken(claims, userId);
}
/**
* 创建Token
*/
private String createToken(Map<String, Object> claims, String subject) {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
return Jwts.builder()
.setClaims(claims)
.setSubject(subject)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
/**
* 生成刷新Token
*/
public String generateRefreshToken(String userId) {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
return Jwts.builder()
.setSubject(userId)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + refreshExpiration))
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
/**
* 解析Token
*/
public Claims parseToken(String token) {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody();
}
/**
* 验证Token是否有效
*/
public boolean validateToken(String token) {
try {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 获取用户ID
*/
public String getUserId(String token) {
Claims claims = parseToken(token);
return claims.get("userId", String.class);
}
/**
* 获取用户名
*/
public String getUsername(String token) {
Claims claims = parseToken(token);
return claims.get("username", String.class);
}
/**
* 获取用户角色
*/
public String getRole(String token) {
Claims claims = parseToken(token);
return claims.get("role", String.class);
}
/**
* 判断Token是否过期
*/
public boolean isTokenExpired(String token) {
try {
Claims claims = parseToken(token);
return claims.getExpiration().before(new Date());
} catch (Exception e) {
return true;
}
}
}

View File

@@ -0,0 +1,60 @@
package com.example.building.common;
import lombok.Data;
import java.io.Serializable;
/**
* 统一响应结果类
*/
@Data
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 状态码: 0成功, 非0失败
*/
private Integer code;
/**
* 提示信息
*/
private String message;
/**
* 业务数据
*/
private T data;
public static <T> Result<T> success() {
return success(null);
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(0);
result.setMessage("成功");
result.setData(data);
return result;
}
public static <T> Result<T> success(T data, String message) {
Result<T> result = new Result<>();
result.setCode(0);
result.setMessage(message);
result.setData(data);
return result;
}
public static <T> Result<T> error(String message) {
return error(3000, message);
}
public static <T> Result<T> error(Integer code, String message) {
Result<T> result = new Result<>();
result.setCode(code);
result.setMessage(message);
return result;
}
}