Commit fd58d2d0 by Lizh

feat: P0 Step 1.5+1.6 — SysMenuEntity添加delFlag + 新建 5 个 VO

parent ad0b1390
package com.jomalls.custom.app.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.util.Set;
/**
* 登录用户信息 VO
*
* @author Lizh
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LoginUserInfoVO {
private SysUserVO user;
private Set<String> roles;
private Set<String> permissions;
}
package com.jomalls.custom.app.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
/**
* 路由元数据 VO
*
* @author Lizh
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MetaVO {
private String title;
private String icon;
private Boolean isCache;
private Boolean isFrame;
}
package com.jomalls.custom.app.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.util.List;
/**
* 前端路由 VO
*
* @author Lizh
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RouterVO {
private String name;
private String path;
private Boolean hidden;
private String redirect;
private String component;
private Boolean alwaysShow;
private MetaVO meta;
private List<RouterVO> children;
}
package com.jomalls.custom.app.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 部门 VO
*
* @author Lizh
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SysDeptVO {
@JsonProperty("deptId")
private Long deptId;
@JsonProperty("deptName")
private String deptName;
}
package com.jomalls.custom.app.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 系统用户 VO
*
* @author Lizh
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SysUserVO {
@JsonProperty("userId")
private Long userId;
@JsonProperty("deptId")
private Long deptId;
@JsonProperty("userName")
private String userName;
@JsonProperty("nickName")
private String nickName;
@JsonProperty("email")
private String email;
@JsonProperty("phonenumber")
private String phonenumber;
@JsonProperty("sex")
private String sex;
@JsonProperty("avatar")
private String avatar;
@JsonProperty("status")
private String status;
@JsonProperty("loginIp")
private String loginIp;
@JsonProperty("loginDate")
private String loginDate;
@JsonProperty("pwdUpdateDate")
private String pwdUpdateDate;
@JsonProperty("createTime")
private String createTime;
@JsonProperty("remark")
private String remark;
private SysDeptVO dept;
}
......@@ -4,6 +4,8 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -12,6 +14,7 @@ import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
......@@ -52,6 +55,9 @@ public class TokenHandle {
@Value("${token.secret:custom}")
private String secret;
@Value("${token.expireTime:720}")
private int expireTime; // 分钟
private static final String SPACE = "\\s+";
/**
......@@ -222,6 +228,45 @@ public class TokenHandle {
}
/**
* 创建令牌(JJWT 0.12.x 标准格式)
*
* @param loginUser 登录用户信息
* @return JWT token 字符串
*/
public String createToken(LoginUser loginUser) {
String token = java.util.UUID.randomUUID().toString();
loginUser.setToken(token);
loginUser.setLoginTime(System.currentTimeMillis());
loginUser.setExpireTime(System.currentTimeMillis() + expireTime * 60 * 1000L);
// 存入 Redis(custom-back 兼容路径)
if (stringRedisTemplate != null) {
String redisKey = REDIS_TOKEN_PREFIX + token;
stringRedisTemplate.opsForValue().set(
redisKey,
JSON.toJSONString(loginUser),
expireTime * 60,
java.util.concurrent.TimeUnit.SECONDS
);
}
// 生成 JWT
byte[] keyBytes = secret.getBytes(java.nio.charset.StandardCharsets.UTF_8);
Keys.hmacShaKeyFor(keyBytes);
SecretKey signingKey = Keys.hmacShaKeyFor(keyBytes);
return Jwts.builder()
.claim("login_user_key", token)
.claim("id", loginUser.getUserId())
.claim("account", loginUser.getUsername())
.claim("deptId", loginUser.getDeptId())
.claim("permissions", loginUser.getPermissions())
.expiration(new java.util.Date(loginUser.getExpireTime()))
.signWith(signingKey)
.compact();
}
/**
* 从请求头获取令牌
*/
public String getToken(HttpServletRequest request) {
......
......@@ -140,5 +140,11 @@ public class SysMenuEntity implements Serializable {
*/
@TableField("remark")
private String remark;
/**
* 删除标记(0正常 1删除)
*/
@TableField("del_flag")
private String delFlag;
}
......@@ -74,6 +74,11 @@
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- Spring Security Crypto:BCrypt 密码编码器 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
......
package com.jomalls.custom.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* 安全配置
*
* @author Lizh
*/
@Configuration
public class SecurityConfig {
/**
* BCrypt 密码编码器
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment