提交 7d3b75d3 作者: 方治民

feat: 新增 BasicEntity、抽离 JacksonConfig 与 DateTimeConfig、优化 Swagger 日志输出时机、封装 Auths 公共类等

上级 674dce47
......@@ -3,6 +3,7 @@ package com.yiring.auth.domain.permission;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;
......@@ -10,10 +11,9 @@ import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.snowflake.SnowflakeId;
/**
* 权限
......@@ -25,7 +25,7 @@ import org.hibernate.snowflake.SnowflakeId;
@Getter
@Setter
@ToString
@Builder
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
......@@ -41,17 +41,11 @@ import org.hibernate.snowflake.SnowflakeId;
@Index(columnList = "uid", unique = true),
}
)
public class Permission implements Serializable {
public class Permission extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = -2001221843529000953L;
@Comment("主键")
@Id
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
Long id;
@Comment("类型(MENU: 菜单, BUTTON: 按钮)")
@Enumerated(EnumType.STRING)
Type type;
......@@ -140,7 +134,7 @@ public class Permission implements Serializable {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Permission that = (Permission) o;
return id != null && Objects.equals(id, that.id);
return this.getId() != null && Objects.equals(this.getId(), that.getId());
}
@Override
......
......@@ -4,6 +4,7 @@ package com.yiring.auth.domain.role;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.user.User;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashSet;
......@@ -13,10 +14,9 @@ import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.snowflake.SnowflakeId;
/**
* 角色
......@@ -28,7 +28,7 @@ import org.hibernate.snowflake.SnowflakeId;
@Getter
@Setter
@ToString
@Builder
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
......@@ -36,17 +36,11 @@ import org.hibernate.snowflake.SnowflakeId;
@Entity
@Comment("系统角色")
@Table(name = "SYS_ROLE", indexes = { @Index(columnList = "uid", unique = true) })
public class Role implements Serializable {
public class Role extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 910404402503275957L;
@Comment("主键")
@Id
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
Long id;
@Comment("标识")
@Column(unique = true, nullable = false)
String uid;
......@@ -59,7 +53,7 @@ public class Role implements Serializable {
@Comment("权限集合")
@ManyToMany
@ToString.Exclude
private Set<Permission> permissions = new HashSet<>();
Set<Permission> permissions = new HashSet<>();
@JsonIgnore
@EqualsAndHashCode.Exclude
......@@ -72,14 +66,14 @@ public class Role implements Serializable {
joinColumns = { @JoinColumn(name = "role_id") },
inverseJoinColumns = { @JoinColumn(name = "user_id") }
)
private Set<User> users = new HashSet<>();
Set<User> users = new HashSet<>();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Role role = (Role) o;
return id != null && Objects.equals(id, role.id);
return this.getId() != null && Objects.equals(this.getId(), role.getId());
}
@Override
......
......@@ -3,6 +3,7 @@ package com.yiring.auth.domain.user;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yiring.auth.domain.role.Role;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
......@@ -13,10 +14,9 @@ import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.snowflake.SnowflakeId;
/**
* 用户
......@@ -28,7 +28,7 @@ import org.hibernate.snowflake.SnowflakeId;
@Getter
@Setter
@ToString
@Builder
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
......@@ -45,17 +45,11 @@ import org.hibernate.snowflake.SnowflakeId;
}
)
@Comment("系统用户")
public class User implements Serializable {
public class User extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = -5787847701210907511L;
@Comment("主键")
@Id
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
Long id;
@Comment("真实姓名")
String realName;
......@@ -103,15 +97,12 @@ public class User implements Serializable {
@Comment("最后登录时间")
LocalDateTime lastLoginTime;
@Comment("创建时间")
LocalDateTime createTime;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
User user = (User) o;
return id != null && Objects.equals(id, user.id);
return this.getId() != null && Objects.equals(this.getId(), user.getId());
}
@Override
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.util;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.common.core.Status;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Resource;
import lombok.NonNull;
import org.springframework.stereotype.Component;
/**
* 认证工具类
*
* @author Jim
* @version 0.1
* 2022/4/8 17:34
*/
@SuppressWarnings("unused")
@Component
public class Auths {
@Resource
UserRepository userRepository;
/**
* 根据 Token 获取用户信息
* 如果用户未登录或校验失败会抛出 NotLoginException {@link Status#UNAUTHORIZED}
* @param token token
* @return 用户信息
*/
public User getUserByToken(@NonNull String token) {
Object id = StpUtil.getLoginIdByToken(token);
if (id == null) {
StpUtil.logoutByTokenValue(token);
throw NotLoginException.newInstance(StpUtil.TYPE, null);
}
Optional<User> optional = userRepository.findById(Long.valueOf(Objects.toString(id)));
if (optional.isEmpty()) {
StpUtil.logout(id);
throw NotLoginException.newInstance(StpUtil.TYPE, NotLoginException.INVALID_TOKEN);
}
return optional.get();
}
/**
* 获取当前登录用户
* 如果用户未登录会抛出 NotLoginException {@link Status#UNAUTHORIZED}
*/
public User getLoginUser() {
String token = StpUtil.getTokenValue();
if (token == null) {
throw NotLoginException.newInstance(StpUtil.TYPE, null);
}
return getUserByToken(token);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.user;
import cn.dev33.satoken.stp.StpUtil;
import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.role.Role;
import com.yiring.auth.domain.role.RoleRepository;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.auth.param.IdsParam;
import com.yiring.auth.util.Auths;
import com.yiring.auth.util.Permissions;
import com.yiring.auth.vo.permission.MenuVo;
import com.yiring.auth.vo.user.UserInfoVo;
import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.exception.FailStatusException;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
......@@ -52,6 +51,9 @@ import org.springframework.web.bind.annotation.RestController;
public class UserController {
@Resource
Auths auths;
@Resource
UserRepository userRepository;
@Resource
......@@ -60,7 +62,7 @@ public class UserController {
@ApiOperation(value = "获取登录用户信息")
@GetMapping("getUserInfo")
public Result<UserInfoVo> getUserInfo() {
User user = getLoginUser();
User user = auths.getLoginUser();
UserInfoVo userInfoVo = UserInfoVo
.builder()
.userId(user.getId())
......@@ -76,7 +78,7 @@ public class UserController {
@ApiOperation(value = "获取用户菜单")
@GetMapping("getMenuList")
public Result<ArrayList<MenuVo>> getMenuList() {
User user = getLoginUser();
User user = auths.getLoginUser();
List<Permission> permissions = Permissions
.toPermissions(user.getRoles())
.stream()
......@@ -89,7 +91,7 @@ public class UserController {
@ApiOperation(value = "获取用户权限")
@GetMapping("getPermCode")
public Result<ArrayList<String>> getPermCode() {
User user = getLoginUser();
User user = auths.getLoginUser();
List<Permission> permissions = Permissions.toPermissions(user.getRoles());
List<String> codes = permissions.stream().map(Permission::getUid).collect(Collectors.toList());
return Result.ok((ArrayList<String>) codes);
......@@ -132,19 +134,4 @@ public class UserController {
PageVo<UserVo> vo = PageVo.build(data, page.getTotalElements());
return Result.ok(vo);
}
/**
* 获取登录用户信息
* @return 用户信息
*/
private User getLoginUser() {
Long id = StpUtil.getLoginIdAsLong();
Optional<User> optional = userRepository.findById(id);
if (optional.isPresent()) {
return optional.get();
}
StpUtil.logout(id);
throw new FailStatusException(Status.UNAUTHORIZED);
}
}
......@@ -6,6 +6,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// 本地依赖
implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar'])
// swagger annotations
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
......@@ -28,8 +26,8 @@ import org.springframework.core.convert.converter.Converter;
@Configuration
public class DateTimeConfig {
@Bean(name = "mapperObject")
public ObjectMapper getObjectMapper() {
@Bean
public JavaTimeModule javaTimeModule() {
JavaTimeModule timeModule = new JavaTimeModule();
timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateFormatter.DATE_TIME));
timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateFormatter.DATE));
......@@ -37,9 +35,7 @@ public class DateTimeConfig {
timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateFormatter.DATE_TIME));
timeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateFormatter.DATE));
timeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateFormatter.TIME));
// feat: add AdminServerModule
// .setSerializationInclusion(JsonInclude.Include.NON_NULL)
return new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL).registerModules(timeModule);
return timeModule;
}
@Bean
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import javax.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Jackson Config
*
* @author Jim
* @version 0.1
* 2022/4/17 16:54
*/
@Configuration
public class JacksonConfig {
@Resource
JavaTimeModule javaTimeModule;
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.registerModule(javaTimeModule);
// feat: add AdminServerModule
return mapper;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.domain;
import java.time.LocalDateTime;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.UpdateTimestamp;
import org.hibernate.snowflake.SnowflakeId;
/**
* 基础表抽象类
*
* @author Jim
* @version 0.1
* 2022/4/17 12:11
*/
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE)
@SuperBuilder(toBuilder = true)
@MappedSuperclass
public abstract class BasicEntity {
@Comment("主键")
@Id
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
Long id;
@Comment("创建时间")
@Column(nullable = false)
@CreationTimestamp
LocalDateTime createTime;
@Comment("最后修改时间")
@Column(nullable = false)
@UpdateTimestamp
LocalDateTime updateTime;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
BasicEntity that = (BasicEntity) o;
return id != null && Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return getClass().hashCode();
}
}
......@@ -11,6 +11,7 @@ import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
......@@ -41,7 +42,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
@EnableSwagger2WebMvc
@Configuration
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {
public class SwaggerConfig implements CommandLineRunner {
@Value("${spring.application.name}")
String applicationName;
......@@ -61,8 +62,6 @@ public class SwaggerConfig {
}
private Docket api(Predicate<String> paths) {
log.info("API Doc: http://localhost:{}{}/doc.html", port, path);
String group = "default";
return new Docket(DocumentationType.SWAGGER_2)
.groupName(group)
......@@ -99,4 +98,9 @@ public class SwaggerConfig {
.map(status -> new ResponseMessageBuilder().code(status.value()).message(status.getReasonPhrase()).build())
.collect(Collectors.toList());
}
@Override
public void run(String... args) {
log.info("API Doc: http://localhost:{}{}/doc.html", port, path);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论