feat: 发布2.0版本,针对未来扩展

This commit is contained in:
wangyu 2024-07-01 16:16:46 +08:00
parent 1670aed4cd
commit 274febda39
69 changed files with 236 additions and 222 deletions

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-approval</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -17,8 +17,8 @@ import com.flyfish.framework.domain.po.User;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import javax.validation.Valid;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import java.util.List;
/**

View File

@ -2,8 +2,8 @@ package com.flyfish.framework.approval.domain.submit;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
/**

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.approval.domain.todo;
import com.flyfish.framework.approval.enums.ApproveAction;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
/**
* 审批dto

View File

@ -19,7 +19,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-backup</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
/**
* 备份controller

View File

@ -1,11 +1,11 @@
package com.flyfish.framework.backup.scheduler;
import com.alibaba.fastjson.JSON;
import com.flyfish.framework.backup.domain.Backup;
import com.flyfish.framework.context.DateContext;
import com.flyfish.framework.domain.base.DomainService;
import com.flyfish.framework.query.Query;
import com.flyfish.framework.repository.ReactiveEntityOperations;
import com.flyfish.framework.utils.JacksonUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@ -95,7 +95,7 @@ public class BackupScheduler {
.thenMany(Flux.fromIterable(this.collections))
.flatMap(info -> operations
.findAll(Query.empty(), CastUtils.cast(info)).collectList()
.map(list -> new BackupIndex.BackupContent(info.getJavaType().getSimpleName(), JSON.toJSONBytes(list)))
.map(list -> new BackupIndex.BackupContent(info.getJavaType().getSimpleName(), JacksonUtil.toBytes(list)))
)
.flatMap(content -> writeContents(content, parent))
.collectList()
@ -113,7 +113,7 @@ public class BackupScheduler {
return item;
}).collect(Collectors.toList()));
// 写入备份结果
return write(JSON.toJSONBytes(index), parent + "/meta.json");
return write(JacksonUtil.toBytes(index), parent + "/meta.json");
})
.then(Mono.defer(() -> {
backup.setLog("成功备份");

View File

@ -47,13 +47,17 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>

View File

@ -0,0 +1,11 @@
package com.flyfish.framework.bean;
import java.util.HashMap;
/**
* 对象map
*
* @author wangyu
*/
public class ObjectMap extends HashMap<String, Object> {
}

View File

@ -1,20 +1,17 @@
package com.flyfish.framework.utils;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;
/**
* Jackson序列化工具类
@ -59,8 +56,8 @@ public final class JacksonUtil {
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// JsonGenerator.Feature for configuring low-level JSON generation:
// to force escaping of non-ASCII characters:
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
mapper.setLocale(Locale.CHINESE);
mapper.registerModule(new JavaTimeModule());
}
public static <T> T fromJson(final String json) {
@ -119,6 +116,24 @@ public final class JacksonUtil {
return Optional.empty();
}
public static String toPrettyJson(final Object obj) {
try {
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
public static byte[] toBytes(final Object obj) {
try {
return mapper.writeValueAsBytes(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
private static <T> T readValue(String json, TypeReference<T> valueTypeRef) {
if (null == json || "".equals(json)) {
return null;

View File

@ -2,8 +2,8 @@ package com.flyfish.framework.validation.annotations;
import com.flyfish.framework.validation.validators.ContainsBeanValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.validation.annotations;
import com.flyfish.framework.validation.validators.IdCardValidator;
import com.flyfish.framework.validation.validators.MoneyValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import com.flyfish.framework.validation.annotations.IdCard.List;
import java.lang.annotation.Documented;

View File

@ -2,8 +2,8 @@ package com.flyfish.framework.validation.annotations;
import com.flyfish.framework.validation.validators.IsJSONStringValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.validation.annotations;
import com.flyfish.framework.validation.annotations.Money.List;
import com.flyfish.framework.validation.validators.MoneyValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;

View File

@ -4,8 +4,8 @@ import com.flyfish.framework.validation.annotations.Password.List;
import com.flyfish.framework.validation.validators.IdCardValidator;
import com.flyfish.framework.validation.validators.PasswordValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.validation.annotations;
import com.flyfish.framework.validation.enums.PhoneType;
import com.flyfish.framework.validation.validators.PhoneValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.validation.annotations;
import com.flyfish.framework.validation.annotations.UniqueField.List;
import com.flyfish.framework.validation.validators.UniqueFieldValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;

View File

@ -1,6 +1,6 @@
package com.flyfish.framework.validation.spi;
import javax.validation.groups.Default;
import jakarta.validation.groups.Default;
/**
* 条件化的验证分组

View File

@ -4,8 +4,8 @@ import com.flyfish.framework.context.SpringContext;
import com.flyfish.framework.validation.annotations.ContainsBean;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
/**
* 包含在ioc容器的bean

View File

@ -2,8 +2,8 @@ package com.flyfish.framework.validation.validators;
import com.flyfish.framework.validation.annotations.IdCard;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
/**

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.validation.validators;
import com.flyfish.framework.validation.annotations.IsJSONString;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
/**
* 是否是jsonString

View File

@ -2,8 +2,8 @@ package com.flyfish.framework.validation.validators;
import com.flyfish.framework.validation.annotations.Money;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
/**
* 金额验证器

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.validation.validators;
import com.flyfish.framework.constant.Frameworks;
import com.flyfish.framework.validation.annotations.Password;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
/**

View File

@ -3,8 +3,8 @@ package com.flyfish.framework.validation.validators;
import com.flyfish.framework.validation.annotations.Phone;
import com.flyfish.framework.validation.enums.PhoneType;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
/**

View File

@ -6,8 +6,8 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ClassUtils;
import org.springframework.beans.BeanUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-data-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
@ -40,7 +40,7 @@
</dependency>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<groupId>io.springboot.plugin</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
</dependency>
</dependencies>

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-data-domain</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

View File

@ -11,7 +11,7 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.Indexed;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
import java.io.Serializable;
@Getter

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-data-mongodb</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -12,7 +12,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = MongoRepositoryTest.class)

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-data-r2dbc</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -1,12 +1,12 @@
package com.flyfish.framework.r2dbc;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.flyfish.framework.r2dbc.config.R2dbcDataConfig;
import com.flyfish.framework.r2dbc.domain.TestDO;
import com.flyfish.framework.r2dbc.domain.TestQO;
import com.flyfish.framework.r2dbc.repository.TestAssoRepository;
import com.flyfish.framework.r2dbc.repository.TestRepository;
import com.flyfish.framework.utils.JacksonUtil;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
@ -15,7 +15,6 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import javax.annotation.Resource;
import java.util.List;
@ExtendWith(SpringExtension.class)
@ -43,12 +42,12 @@ public class R2DbcRepositoryTest {
test.setOtherId("1");
// 打印插入结果
System.out.println(JSON.toJSONString(testRepository.insert(test).block(), SerializerFeature.PrettyFormat));
System.out.println(JacksonUtil.toPrettyJson(testRepository.insert(test).block()));
List<TestDO> all = testRepository.findAll(qo).collectList().block();
System.out.println(JSON.toJSONString(all, SerializerFeature.PrettyFormat));
System.out.println(JacksonUtil.toPrettyJson(all));
// 修改值并保存测试
all.get(0).getAsso().setName("修改后的值");
System.out.println(JSON.toJSONString(testRepository.saveAll(all).collectList().block(), SerializerFeature.PrettyFormat));
System.out.println(JSON.toJSONString(testAssoRepository.findById("1").block(), SerializerFeature.PrettyFormat));
System.out.println(JacksonUtil.toPrettyJson(testRepository.saveAll(all).collectList().block()));
System.out.println(JacksonUtil.toPrettyJson(testAssoRepository.findById("1").block()));
}
}

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-data-relational</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

View File

@ -13,8 +13,8 @@
<description>字典框架,集成字典解析,注解,服务,可自动注册和利用枚举反向注册</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -8,7 +8,7 @@ import com.flyfish.framework.utils.ReactiveRedisOperations;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
/**
* 字典表服务

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-file</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestPart;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

View File

@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

View File

@ -9,7 +9,7 @@ import org.springframework.http.codec.multipart.FilePart;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
@Service
public class AttachmentService extends BaseReactiveServiceImpl<Attachment> {

View File

@ -8,7 +8,7 @@ import org.springframework.http.codec.multipart.FilePart;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

View File

@ -12,7 +12,7 @@ import org.springframework.http.codec.multipart.FilePart;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.io.IOException;
/**

View File

@ -12,8 +12,8 @@
<artifactId>flyfish-form</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -1,6 +1,6 @@
package com.flyfish.framework.form.domain;
import com.alibaba.fastjson.JSONObject;
import com.flyfish.framework.bean.ObjectMap;
import com.flyfish.framework.domain.base.Domain;
import lombok.Data;
import org.springframework.data.mongodb.core.index.CompoundIndex;
@ -8,7 +8,9 @@ import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.relational.core.mapping.Table;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 在线表单
@ -35,7 +37,7 @@ public class OnlineForm extends Domain {
private Integer width;
// 默认布局
private JSONObject layout = new JSONObject();
private Map<String, Object> layout = new HashMap<>();
@Data
public static class FormItem {
@ -51,25 +53,25 @@ public class OnlineForm extends Domain {
// 栅格偏移布局需要
private Integer offset = 0;
// 栅格布局
private JSONObject grid = new JSONObject();
private ObjectMap grid = new ObjectMap();
// 儿子手动指定儿子们
private String children;
// 条件用于匹配条件以显示与否
private JSONObject condition;
private ObjectMap condition;
// 校验规则允许多个
private List<JSONObject> validation;
private List<ObjectMap> validation;
// 选项用于表单的额外选项支持antd vue的所有逻辑
private JSONObject options = new JSONObject();
private ObjectMap options = new ObjectMap();
// 组件属性支持对象
private JSONObject props;
private ObjectMap props;
// 表单联动key为表单组件的属性包含两种模式condition是激活条件value是激活的值
private JSONObject links;
private ObjectMap links;
// 事件支持
private JSONObject events;
private ObjectMap events;
// 映射支持
private JSONObject mapping;
private ObjectMap mapping;
// 异步的props
private JSONObject delay;
private ObjectMap delay;
// 分组
private String group;
// 新增增加反馈状态

View File

@ -13,8 +13,8 @@
<description>日志模块</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>

View File

@ -1,16 +1,16 @@
package com.flyfish.framework.logging.service;
import com.alibaba.fastjson.JSON;
import com.flyfish.framework.context.DateContext;
import com.flyfish.framework.logging.config.LoggingTextRegistry;
import com.flyfish.framework.logging.domain.Log;
import com.flyfish.framework.logging.domain.LogType;
import com.flyfish.framework.utils.JacksonUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.DisposableBean;
import javax.annotation.Resource;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -41,14 +41,14 @@ public class LogManager implements DisposableBean {
Log log = new Log();
log.setType(LogType.OPERATION);
log.setSuccess(context.isSuccess());
log.setBody(bodyString(context.getArgs()));
bodyString(context.getArgs()).ifPresent(log::setBody);
log.setModule(context.getModule());
log.setBusiness(Optional.ofNullable(context.getBusiness())
.filter(StringUtils::isNotBlank)
.map(registry::text)
.orElse(context.getBusiness()));
log.setError(Optional.ofNullable(context.getError()).map(JSON::toJSONString).orElse(null));
log.setResponse(Optional.ofNullable(context.getResult()).map(JSON::toJSONString).orElse(null));
log.setError(Optional.ofNullable(context.getError()).flatMap(JacksonUtil::toJson).orElse(null));
log.setResponse(Optional.ofNullable(context.getResult()).flatMap(JacksonUtil::toJson).orElse(null));
log.setOperator(context.getUser());
log.setSignature(context.getSignature());
log.setPeriod(context.getEndTime() - context.getStartTime());
@ -61,14 +61,14 @@ public class LogManager implements DisposableBean {
});
}
private String bodyString(Object[] args) {
private Optional<String> bodyString(Object[] args) {
if (ArrayUtils.isEmpty(args)) {
return null;
return Optional.empty();
}
if (args.length == 1) {
return JSON.toJSONString(args[0]);
return JacksonUtil.toJson(args[0]);
}
return JSON.toJSONString(args);
return JacksonUtil.toJson(args);
}
@Override

View File

@ -13,7 +13,7 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Optional;

View File

@ -13,8 +13,8 @@
<description>flyfish用户中心模块提供缺省的用户体系按需添加</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
@ -38,8 +38,8 @@
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.dingxiang-inc</groupId>
<artifactId>ctu-client-sdk</artifactId>
<groupId>io.springboot.plugin</groupId>
<artifactId>spring-boot-starter-captcha</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -13,7 +13,7 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.server.WebFilterExchange;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.time.LocalDateTime;
/**

View File

@ -1,21 +1,21 @@
package com.flyfish.framework.user.config;
import com.flyfish.framework.user.config.captcha.DxCaptchaValidator;
import com.flyfish.framework.user.config.converter.EncryptedAuthenticationConverter;
import com.flyfish.framework.user.config.properties.SecurityProperties;
import com.flyfish.framework.configuration.jwt.JwtProperties;
import com.flyfish.framework.configuration.jwt.JwtSecurityContextRepository;
import com.flyfish.framework.configuration.jwt.TokenProvider;
import com.flyfish.framework.user.domain.UserQo;
import com.flyfish.framework.domain.po.User;
import com.flyfish.framework.enums.UserStatus;
import com.flyfish.framework.enums.UserType;
import com.flyfish.framework.handler.JsonAuthenticationFailureHandler;
import com.flyfish.framework.handler.JsonAuthenticationSuccessHandler;
import com.flyfish.framework.handler.JsonLogoutSuccessHandler;
import com.flyfish.framework.user.initializer.UserInitializer;
import com.flyfish.framework.service.AuthenticationAuditor;
import com.flyfish.framework.service.AuthenticationLogger;
import com.flyfish.framework.user.config.captcha.CaptchaValidator;
import com.flyfish.framework.user.config.converter.EncryptedAuthenticationConverter;
import com.flyfish.framework.user.config.properties.SecurityProperties;
import com.flyfish.framework.user.domain.UserQo;
import com.flyfish.framework.user.initializer.UserInitializer;
import com.flyfish.framework.user.service.UserService;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.ObjectProvider;
@ -158,7 +158,7 @@ public class WebSecurityConfig {
@Bean
public ServerAuthenticationConverter encryptedAuthenticateConverter(SecurityProperties securityProperties,
ObjectProvider<DxCaptchaValidator> validator) {
ObjectProvider<CaptchaValidator> validator) {
return new EncryptedAuthenticationConverter(securityProperties, validator);
}
@ -213,15 +213,4 @@ public class WebSecurityConfig {
authenticationFilter.setSecurityContextRepository(contextRepository());
return authenticationFilter;
}
/**
* 按需启用验证器
*
* @return 结果
*/
@Bean
@ConditionalOnProperty(value = "security.captcha.enable", havingValue = "true")
public DxCaptchaValidator dxCaptchaValidator(SecurityProperties properties) {
return new DxCaptchaValidator(properties);
}
}

View File

@ -0,0 +1,34 @@
package com.flyfish.framework.user.config.captcha;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import com.flyfish.framework.user.config.properties.SecurityProperties;
import com.flyfish.framework.utils.Assert;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class AnjiCaptchaValidator implements CaptchaValidator {
private final SecurityProperties securityProperties;
private final CaptchaService captchaService;
/**
* 进行验证并抛出异常
*
* @param token 验证码认证token
*/
@Override
public void verify(String token) {
// 未启用不拦截
if (!securityProperties.getCaptcha().isEnable()) {
return;
}
// 进行验证
CaptchaVO captchaVO = new CaptchaVO();
captchaVO.setCaptchaVerification(token);
ResponseModel response = captchaService.verification(captchaVO);
Assert.isTrue(response.isSuccess(), "请完成滑动验证!");
}
}

View File

@ -0,0 +1,16 @@
package com.flyfish.framework.user.config.captcha;
/**
* 验证码验证器
*
* @author wangyu
*/
public interface CaptchaValidator {
/**
* 进行验证并抛出异常
*
* @param token 验证码认证token
*/
void verify(String token);
}

View File

@ -1,45 +0,0 @@
package com.flyfish.framework.user.config.captcha;
import com.dingxianginc.ctu.client.CaptchaClient;
import com.dingxianginc.ctu.client.model.CaptchaResponse;
import com.flyfish.framework.user.config.properties.SecurityProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.security.authentication.BadCredentialsException;
/**
* 顶象验证码验证器
*
* @author wangyu
*/
@Slf4j
public class DxCaptchaValidator {
private final CaptchaClient captchaClient;
public DxCaptchaValidator(SecurityProperties securityProperties) {
SecurityProperties.CaptchaProperties captchaProperties = securityProperties.getCaptcha();
this.captchaClient = new CaptchaClient(captchaProperties.getAppId(), captchaProperties.getAppSecret());
captchaClient.setCaptchaUrl("https://" + captchaProperties.getServer() + "/api/tokenVerify");
}
/**
* 执行验证码验证
*
* @param token 验证码
* @return 结果
*/
public void verify(String token) {
//指定服务器地址saas可在控制台应用管理页面最上方获取
try {
CaptchaResponse response = captchaClient.verifyToken(token);
log.info(response.getCaptchaStatus());
if (BooleanUtils.isNotTrue(response.getResult())) {
throw new BadCredentialsException("验证码不正确!");
}
} catch (Exception e) {
log.error("验证码验证失败!" + e.getMessage());
throw new BadCredentialsException("验证码验证异常!");
}
}
}

View File

@ -1,9 +1,9 @@
package com.flyfish.framework.user.config.converter;
import com.flyfish.framework.user.config.RSAKeys;
import com.flyfish.framework.user.utils.RSAUtils;
import com.flyfish.framework.user.config.captcha.DxCaptchaValidator;
import com.flyfish.framework.user.config.captcha.CaptchaValidator;
import com.flyfish.framework.user.config.properties.SecurityProperties;
import com.flyfish.framework.user.utils.RSAUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
@ -38,7 +38,7 @@ public class EncryptedAuthenticationConverter implements ServerAuthenticationCon
private final SecurityProperties securityProperties;
private final ObjectProvider<DxCaptchaValidator> validator;
private final ObjectProvider<CaptchaValidator> validator;
@Override
public Mono<Authentication> convert(ServerWebExchange exchange) {

View File

@ -23,6 +23,7 @@ public class SecurityProperties {
/**
* 验证码属性
*
* @author wangyu
*/
@Data
@ -30,14 +31,5 @@ public class SecurityProperties {
// 启用验证码
private boolean enable;
// 顶象appid
private String appId;
// 顶象appSecret
private String appSecret;
// 服务器地址
private String server;
}
}

View File

@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
/**
* 登录controller

View File

@ -19,8 +19,8 @@ import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import javax.validation.Valid;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import java.util.Optional;
@RestController

View File

@ -4,7 +4,7 @@ import com.flyfish.framework.validation.annotations.Password;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
/**
* 修改密码dto

View File

@ -7,6 +7,7 @@ import com.flyfish.framework.enums.UserStatus;
import com.flyfish.framework.service.FlyfishUserDetailsService;
import com.flyfish.framework.utils.Assert;
import com.flyfish.framework.utils.ReactiveRedisOperations;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.security.authentication.*;
@ -22,8 +23,7 @@ import org.springframework.stereotype.Service;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

View File

@ -15,7 +15,7 @@ import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;

View File

@ -13,7 +13,7 @@ import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;

View File

@ -17,7 +17,7 @@ import org.hibernate.validator.constraints.URL;
import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations;
import javax.validation.constraints.*;
import jakarta.validation.constraints.*;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.List;

View File

@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

View File

@ -1,6 +1,6 @@
package com.flyfish.framework.beans.meta;
import javax.validation.Valid;
import jakarta.validation.Valid;
import java.lang.annotation.*;
/**

View File

@ -7,6 +7,7 @@ import com.flyfish.framework.configuration.resolver.RequestContextBodyArgumentRe
import com.flyfish.framework.configuration.resolver.UserArgumentResolver;
import com.flyfish.framework.configuration.resolver.ValidRequestBodyMethodArgumentResolver;
import com.flyfish.framework.context.SpringContext;
import jakarta.annotation.Resource;
import org.springframework.boot.autoconfigure.jackson.JacksonProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
@ -21,7 +22,6 @@ import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.reactive.result.method.annotation.ArgumentResolverConfigurer;
import javax.annotation.Resource;
import java.util.Optional;
import java.util.TimeZone;

View File

@ -11,7 +11,7 @@ import org.springframework.security.web.server.context.ServerSecurityContextRepo
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.net.URI;
@Slf4j

View File

@ -20,7 +20,7 @@ import org.springframework.security.core.userdetails.User;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import javax.crypto.SecretKey;
import java.time.Duration;
import java.util.Arrays;

View File

@ -34,6 +34,7 @@ import reactor.core.publisher.Mono;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 私有校验逻辑支持的body
@ -44,7 +45,7 @@ import java.util.stream.Collectors;
public class ValidRequestBodyMethodArgumentResolver extends AbstractMessageReaderArgumentResolver {
private static final Set<HttpMethod> SUPPORTED_METHODS =
EnumSet.of(HttpMethod.POST, HttpMethod.PUT, HttpMethod.PATCH);
Stream.of(HttpMethod.POST, HttpMethod.PUT, HttpMethod.PATCH).collect(Collectors.toSet());
private final List<MediaType> supportedMediaTypes;

36
pom.xml
View File

@ -12,23 +12,23 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<version>3.3.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<revision>1.0.0-SNAPSHOT</revision>
<revision>2.0.0-SNAPSHOT</revision>
<docker.image.prefix>flyfish</docker.image.prefix>
<docker.plugin.version>0.27.2</docker.plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<jasypt.version>3.0.3</jasypt.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
<java.version>17</java.version>
<jasypt.version>3.1.0</jasypt.version>
<jjwt.version>0.12.6</jjwt.version>
<reflection.version>0.10.2</reflection.version>
<r2dbc-mysql.version>0.9.7</r2dbc-mysql.version>
<r2dbc-mysql.version>1.1.3</r2dbc-mysql.version>
<flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
<captcha.version>1.3.0</captcha.version>
</properties>
<developers>
@ -77,11 +77,7 @@
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.51</version>
</dependency>
</dependencies>
<dependencyManagement>
@ -109,12 +105,12 @@
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
<version>4.5.0-M2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
<version>2.16.1</version>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
@ -122,21 +118,21 @@
<version>${reflection.version}</version>
</dependency>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<groupId>io.springboot.plugin</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>${jasypt.version}</version>
</dependency>
<dependency>
<groupId>com.dingxiang-inc</groupId>
<artifactId>ctu-client-sdk</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>io.asyncer</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>${r2dbc-mysql.version}</version>
</dependency>
<dependency>
<groupId>io.springboot.plugin</groupId>
<artifactId>spring-boot-starter-captcha</artifactId>
<version>${captcha.version}</version>
</dependency>
</dependencies>
</dependencyManagement>