diff --git a/pom.xml b/pom.xml
index 6a59a5e1..75caac32 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,11 +61,20 @@
groovy
4.0.14
-
+
+ org.apache.tika
+ tika-core
+ 2.9.0
+
org.flywaydb
flyway-core
+
+ com.huaweicloud
+ esdk-obs-java-bundle
+ 3.23.5
+
org.springframework.boot
spring-boot-starter-actuator
diff --git a/src/main/java/cn/lihongjie/coal/CoalApplication.java b/src/main/java/cn/lihongjie/coal/CoalApplication.java
index 791d109a..4ccde5ed 100644
--- a/src/main/java/cn/lihongjie/coal/CoalApplication.java
+++ b/src/main/java/cn/lihongjie/coal/CoalApplication.java
@@ -8,7 +8,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@EnableJpaRepositories
public class CoalApplication {
- public static void main(String[] args) {
- SpringApplication.run(CoalApplication.class, args);
- }
+ public static void main(String[] args) {
+ SpringApplication.run(CoalApplication.class, args);
+ }
}
diff --git a/src/main/java/cn/lihongjie/coal/Codegen.java b/src/main/java/cn/lihongjie/coal/Codegen.java
index 555d5dab..3a484de9 100644
--- a/src/main/java/cn/lihongjie/coal/Codegen.java
+++ b/src/main/java/cn/lihongjie/coal/Codegen.java
@@ -12,16 +12,16 @@ import cn.lihongjie.coal.base.entity.OrgCommonEntity;
import cn.lihongjie.coal.base.mapper.BaseMapper;
import cn.lihongjie.coal.base.mapper.CommonMapper;
import cn.lihongjie.coal.base.service.BaseService;
+
import com.google.common.base.CaseFormat;
import com.squareup.javapoet.*;
+
import jakarta.persistence.Entity;
-import java.nio.file.Path;
-import java.util.Objects;
-import java.util.Scanner;
-import javax.lang.model.element.Modifier;
+
import lombok.Data;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
+
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Mapper;
import org.mapstruct.control.DeepClone;
@@ -37,159 +37,175 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import java.nio.file.Path;
+import java.util.Objects;
+import java.util.Scanner;
+
+import javax.lang.model.element.Modifier;
+
public class Codegen {
- public static final Path DIRECTORY = Path.of("src/main/java/");
+ public static final Path DIRECTORY = Path.of("src/main/java/");
- @SneakyThrows
- public static void main(String[] args) {
- System.out.print("请输入模块名:");
- String moduleName = new Scanner(System.in).nextLine();
+ @SneakyThrows
+ public static void main(String[] args) {
+ System.out.print("请输入模块名:");
+ String moduleName = new Scanner(System.in).nextLine();
- System.out.print("请输入模块中文名:");
- String moduleCNName = new Scanner(System.in).nextLine();
+ System.out.print("请输入模块中文名:");
+ String moduleCNName = new Scanner(System.in).nextLine();
- System.out.print("机构数据[Y]:");
- boolean orgMode =
- Objects.equals(StringUtils.defaultIfBlank(new Scanner(System.in).nextLine(), "Y"), "Y");
+ System.out.print("机构数据[Y]:");
+ boolean orgMode =
+ Objects.equals(
+ StringUtils.defaultIfBlank(new Scanner(System.in).nextLine(), "Y"), "Y");
- String lModuleName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, moduleName);
- String prefix = Codegen.class.getPackage().getName() + "." + lModuleName;
- String entityPackage = prefix + ".entity";
- String dtoPackage = prefix + ".dto";
- String repoPackage = prefix + ".repository";
- String mapperPackage = prefix + ".mapper";
- String servicePackage = prefix + ".service";
- String controllerPackage = prefix + ".controller";
+ String lModuleName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, moduleName);
+ String prefix = Codegen.class.getPackage().getName() + "." + lModuleName;
+ String entityPackage = prefix + ".entity";
+ String dtoPackage = prefix + ".dto";
+ String repoPackage = prefix + ".repository";
+ String mapperPackage = prefix + ".mapper";
+ String servicePackage = prefix + ".service";
+ String controllerPackage = prefix + ".controller";
- // 生成entity
+ // 生成entity
- TypeSpec entity =
- TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Entity")
- .addModifiers(Modifier.PUBLIC)
- .superclass(orgMode ? OrgCommonEntity.class : CommonEntity.class)
- .addAnnotation(Data.class)
- .addAnnotation(Entity.class)
- .build();
+ TypeSpec entity =
+ TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Entity")
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(orgMode ? OrgCommonEntity.class : CommonEntity.class)
+ .addAnnotation(Data.class)
+ .addAnnotation(Entity.class)
+ .build();
- JavaFile.builder(entityPackage, entity).build().writeTo(DIRECTORY);
+ JavaFile.builder(entityPackage, entity).build().writeTo(DIRECTORY);
- // 生成dto
- TypeSpec dto =
- TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Dto")
- .addModifiers(Modifier.PUBLIC)
- .superclass(orgMode ? OrgCommonDto.class : CommonDto.class)
- .addAnnotation(Data.class)
- .build();
+ // 生成dto
+ TypeSpec dto =
+ TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Dto")
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(orgMode ? OrgCommonDto.class : CommonDto.class)
+ .addAnnotation(Data.class)
+ .build();
- JavaFile.builder(dtoPackage, dto).build().writeTo(DIRECTORY);
+ JavaFile.builder(dtoPackage, dto).build().writeTo(DIRECTORY);
- // 生成createDto
- TypeSpec createDto =
- TypeSpec.classBuilder("Create" + StringUtils.capitalize(moduleName) + "Dto")
- .addModifiers(Modifier.PUBLIC)
- .superclass(orgMode ? OrgCommonDto.class : CommonDto.class)
- .addAnnotation(Data.class)
- .build();
+ // 生成createDto
+ TypeSpec createDto =
+ TypeSpec.classBuilder("Create" + StringUtils.capitalize(moduleName) + "Dto")
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(orgMode ? OrgCommonDto.class : CommonDto.class)
+ .addAnnotation(Data.class)
+ .build();
- JavaFile.builder(dtoPackage, createDto).build().writeTo(DIRECTORY);
+ JavaFile.builder(dtoPackage, createDto).build().writeTo(DIRECTORY);
- // 生成updateDto
- TypeSpec updateDto =
- TypeSpec.classBuilder("Update" + StringUtils.capitalize(moduleName) + "Dto")
- .addModifiers(Modifier.PUBLIC)
- .superclass(orgMode ? OrgCommonDto.class : CommonDto.class)
- .addAnnotation(Data.class)
- .build();
+ // 生成updateDto
+ TypeSpec updateDto =
+ TypeSpec.classBuilder("Update" + StringUtils.capitalize(moduleName) + "Dto")
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(orgMode ? OrgCommonDto.class : CommonDto.class)
+ .addAnnotation(Data.class)
+ .build();
- JavaFile.builder(dtoPackage, updateDto).build().writeTo(DIRECTORY);
+ JavaFile.builder(dtoPackage, updateDto).build().writeTo(DIRECTORY);
- // 生成repository
- TypeSpec repository =
- TypeSpec.interfaceBuilder(StringUtils.capitalize(moduleName) + "Repository")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Repository.class)
- .addSuperinterface(
- ParameterizedTypeName.get(
- ClassName.get(BaseRepository.class), ClassName.get(entityPackage, entity.name)))
- .build();
+ // 生成repository
+ TypeSpec repository =
+ TypeSpec.interfaceBuilder(StringUtils.capitalize(moduleName) + "Repository")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Repository.class)
+ .addSuperinterface(
+ ParameterizedTypeName.get(
+ ClassName.get(BaseRepository.class),
+ ClassName.get(entityPackage, entity.name)))
+ .build();
- JavaFile.builder(repoPackage, repository).build().writeTo(DIRECTORY);
+ JavaFile.builder(repoPackage, repository).build().writeTo(DIRECTORY);
- // 生成mapper
- TypeSpec mapper =
- TypeSpec.interfaceBuilder(StringUtils.capitalize(moduleName) + "Mapper")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(
- AnnotationSpec.builder(Mapper.class)
- .addMember(
- "componentModel",
- "org.mapstruct.MappingConstants.ComponentModel.SPRING",
- "")
- .addMember("uses", "{$T.class}", CommonMapper.class)
- .addMember("mappingControl", "$T.class", DeepClone.class)
- .build())
- .addSuperinterface(
- ParameterizedTypeName.get(
- ClassName.get(BaseMapper.class),
- ClassName.get(entityPackage, entity.name),
- ClassName.get(dtoPackage, dto.name),
- ClassName.get(dtoPackage, createDto.name),
- ClassName.get(dtoPackage, updateDto.name)))
- .build();
+ // 生成mapper
+ TypeSpec mapper =
+ TypeSpec.interfaceBuilder(StringUtils.capitalize(moduleName) + "Mapper")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(
+ AnnotationSpec.builder(Mapper.class)
+ .addMember(
+ "componentModel",
+ "org.mapstruct.MappingConstants.ComponentModel.SPRING",
+ "")
+ .addMember("uses", "{$T.class}", CommonMapper.class)
+ .addMember("mappingControl", "$T.class", DeepClone.class)
+ .build())
+ .addSuperinterface(
+ ParameterizedTypeName.get(
+ ClassName.get(BaseMapper.class),
+ ClassName.get(entityPackage, entity.name),
+ ClassName.get(dtoPackage, dto.name),
+ ClassName.get(dtoPackage, createDto.name),
+ ClassName.get(dtoPackage, updateDto.name)))
+ .build();
- JavaFile.builder(mapperPackage, mapper).build().writeTo(DIRECTORY);
+ JavaFile.builder(mapperPackage, mapper).build().writeTo(DIRECTORY);
- // 生成service
- TypeSpec service =
- TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Service")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Service.class)
- .addAnnotation(Slf4j.class)
- .superclass(
- ParameterizedTypeName.get(
- ClassName.get(BaseService.class),
- ClassName.get(entityPackage, entity.name),
- ClassName.get(repoPackage, repository.name)))
- .addField(
- FieldSpec.builder(
- ClassName.get(repoPackage, repository.name), "repository", Modifier.PRIVATE)
- .addAnnotation(Autowired.class)
- .build())
- .addField(
- FieldSpec.builder(
- ClassName.get(mapperPackage, mapper.name), "mapper", Modifier.PRIVATE)
- .addAnnotation(Autowired.class)
- .build())
- .addField(
- FieldSpec.builder(
- ClassName.get(ConversionService.class),
- "conversionService",
- Modifier.PRIVATE)
- .addAnnotation(Autowired.class)
- .build())
- .addMethod(
- MethodSpec.methodBuilder("create")
- .addModifiers(Modifier.PUBLIC)
- .returns(ClassName.get(dtoPackage, dto.name))
- .addParameter(ClassName.get(dtoPackage, createDto.name), "request")
- .addStatement(
- """
+ // 生成service
+ TypeSpec service =
+ TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Service")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Service.class)
+ .addAnnotation(Slf4j.class)
+ .superclass(
+ ParameterizedTypeName.get(
+ ClassName.get(BaseService.class),
+ ClassName.get(entityPackage, entity.name),
+ ClassName.get(repoPackage, repository.name)))
+ .addField(
+ FieldSpec.builder(
+ ClassName.get(repoPackage, repository.name),
+ "repository",
+ Modifier.PRIVATE)
+ .addAnnotation(Autowired.class)
+ .build())
+ .addField(
+ FieldSpec.builder(
+ ClassName.get(mapperPackage, mapper.name),
+ "mapper",
+ Modifier.PRIVATE)
+ .addAnnotation(Autowired.class)
+ .build())
+ .addField(
+ FieldSpec.builder(
+ ClassName.get(ConversionService.class),
+ "conversionService",
+ Modifier.PRIVATE)
+ .addAnnotation(Autowired.class)
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("create")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get(dtoPackage, dto.name))
+ .addParameter(
+ ClassName.get(dtoPackage, createDto.name),
+ "request")
+ .addStatement(
+ """
$T entity = mapper.toEntity(request);
this.repository.save(entity);
return getById(entity.getId())
""",
- ClassName.get(entityPackage, entity.name))
- .build())
- .addMethod(
- MethodSpec.methodBuilder("update")
- .addModifiers(Modifier.PUBLIC)
- .returns(ClassName.get(dtoPackage, dto.name))
- .addParameter(ClassName.get(dtoPackage, updateDto.name), "request")
- .addStatement(
- """
+ ClassName.get(entityPackage, entity.name))
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("update")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get(dtoPackage, dto.name))
+ .addParameter(
+ ClassName.get(dtoPackage, updateDto.name),
+ "request")
+ .addStatement(
+ """
$T entity = this.repository.get(request.getId());
this.mapper.updateEntity(entity, request);
@@ -197,172 +213,186 @@ public class Codegen {
return getById(entity.getId())
""",
- ClassName.get(entityPackage, entity.name))
- .build())
- .addMethod(
- MethodSpec.methodBuilder("delete")
- .addModifiers(Modifier.PUBLIC)
- .returns(void.class)
- .addParameter(ClassName.get(IdRequest.class), "request")
- .addStatement(
- """
+ ClassName.get(entityPackage, entity.name))
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("delete")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(void.class)
+ .addParameter(ClassName.get(IdRequest.class), "request")
+ .addStatement(
+ """
this.repository.deleteAllById(request.getIds())
""")
- .build())
- .addMethod(
- MethodSpec.methodBuilder("getById")
- .addModifiers(Modifier.PUBLIC)
- .returns(ClassName.get(dtoPackage, dto.name))
- .addParameter(ClassName.get(String.class), "id")
- .addStatement(
- """
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("getById")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get(dtoPackage, dto.name))
+ .addParameter(ClassName.get(String.class), "id")
+ .addStatement(
+ """
$T entity = repository.get(id);
return mapper.toDto(entity)
""",
- ClassName.get(entityPackage, entity.name))
- .build())
- .addMethod(
- MethodSpec.methodBuilder("list")
- .addModifiers(Modifier.PUBLIC)
- .returns(
- ParameterizedTypeName.get(
- ClassName.get(Page.class), ClassName.get(dtoPackage, dto.name)))
- .addParameter(ClassName.get(CommonQuery.class), "query")
- .addStatement(
- """
+ ClassName.get(entityPackage, entity.name))
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("list")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(
+ ParameterizedTypeName.get(
+ ClassName.get(Page.class),
+ ClassName.get(dtoPackage, dto.name)))
+ .addParameter(ClassName.get(CommonQuery.class), "query")
+ .addStatement(
+ """
$T<$T> page = repository.findAll(query.specification(conversionService), $T.of(query.getPageNo(), query.getPageSize(), $T.by(query.getOrders())));
return page.map(this.mapper::toDto)
""",
- ClassName.get(Page.class),
- ClassName.get(entityPackage, entity.name),
- ClassName.get(PageRequest.class),
- ClassName.get(Sort.class))
- .build())
- .build();
+ ClassName.get(Page.class),
+ ClassName.get(entityPackage, entity.name),
+ ClassName.get(PageRequest.class),
+ ClassName.get(Sort.class))
+ .build())
+ .build();
- JavaFile.builder(servicePackage, service).build().writeTo(DIRECTORY);
+ JavaFile.builder(servicePackage, service).build().writeTo(DIRECTORY);
- // 生成controller
- TypeSpec.Builder controllerBuilder =
- TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Controller")
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(RestController.class)
- .addAnnotation(
- AnnotationSpec.builder(RequestMapping.class)
- .addMember("value", "$S", "/" + lModuleName)
- .build())
- .addAnnotation(
- AnnotationSpec.builder(SysLog.class)
- .addMember("module", "$S", StringUtils.defaultIfBlank(moduleCNName, ""))
- .build())
- .addAnnotation(Slf4j.class);
+ // 生成controller
+ TypeSpec.Builder controllerBuilder =
+ TypeSpec.classBuilder(StringUtils.capitalize(moduleName) + "Controller")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(RestController.class)
+ .addAnnotation(
+ AnnotationSpec.builder(RequestMapping.class)
+ .addMember("value", "$S", "/" + lModuleName)
+ .build())
+ .addAnnotation(
+ AnnotationSpec.builder(SysLog.class)
+ .addMember(
+ "module",
+ "$S",
+ StringUtils.defaultIfBlank(moduleCNName, ""))
+ .build())
+ .addAnnotation(Slf4j.class);
- if (orgMode) {
- controllerBuilder.addAnnotation(OrgScope.class);
- }
- controllerBuilder
- .addField(
- FieldSpec.builder(
- ClassName.get(servicePackage, service.name), "service", Modifier.PRIVATE)
- .addAnnotation(Autowired.class)
- .build())
- .addMethod(
- MethodSpec.methodBuilder("create")
- .addModifiers(Modifier.PUBLIC)
- .returns(ClassName.get(dtoPackage, dto.name))
- .addAnnotation(
- AnnotationSpec.builder(PostMapping.class)
- .addMember("value", "$S", "/create")
- .build())
- .addParameter(
- ParameterSpec.builder(ClassName.get(dtoPackage, createDto.name), "request")
- .addAnnotation(RequestBody.class)
- .build())
- .addStatement(
- """
+ if (orgMode) {
+ controllerBuilder.addAnnotation(OrgScope.class);
+ }
+ controllerBuilder
+ .addField(
+ FieldSpec.builder(
+ ClassName.get(servicePackage, service.name),
+ "service",
+ Modifier.PRIVATE)
+ .addAnnotation(Autowired.class)
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("create")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get(dtoPackage, dto.name))
+ .addAnnotation(
+ AnnotationSpec.builder(PostMapping.class)
+ .addMember("value", "$S", "/create")
+ .build())
+ .addParameter(
+ ParameterSpec.builder(
+ ClassName.get(dtoPackage, createDto.name),
+ "request")
+ .addAnnotation(RequestBody.class)
+ .build())
+ .addStatement(
+ """
return this.service.create(request)
""")
- .build())
- .addMethod(
- MethodSpec.methodBuilder("update")
- .addModifiers(Modifier.PUBLIC)
- .returns(ClassName.get(dtoPackage, dto.name))
- .addAnnotation(
- AnnotationSpec.builder(PostMapping.class)
- .addMember("value", "$S", "/update")
- .build())
- .addParameter(
- ParameterSpec.builder(ClassName.get(dtoPackage, updateDto.name), "request")
- .addAnnotation(RequestBody.class)
- .build())
- .addStatement(
- """
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("update")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get(dtoPackage, dto.name))
+ .addAnnotation(
+ AnnotationSpec.builder(PostMapping.class)
+ .addMember("value", "$S", "/update")
+ .build())
+ .addParameter(
+ ParameterSpec.builder(
+ ClassName.get(dtoPackage, updateDto.name),
+ "request")
+ .addAnnotation(RequestBody.class)
+ .build())
+ .addStatement(
+ """
return this.service.update(request)
""")
- .build())
- .addMethod(
- MethodSpec.methodBuilder("delete")
- .addModifiers(Modifier.PUBLIC)
- .returns(Object.class)
- .addAnnotation(
- AnnotationSpec.builder(PostMapping.class)
- .addMember("value", "$S", "/delete")
- .build())
- .addParameter(
- ParameterSpec.builder(ClassName.get(IdRequest.class), "request")
- .addAnnotation(RequestBody.class)
- .build())
- .addStatement(
- """
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("delete")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(Object.class)
+ .addAnnotation(
+ AnnotationSpec.builder(PostMapping.class)
+ .addMember("value", "$S", "/delete")
+ .build())
+ .addParameter(
+ ParameterSpec.builder(
+ ClassName.get(IdRequest.class), "request")
+ .addAnnotation(RequestBody.class)
+ .build())
+ .addStatement(
+ """
this.service.delete(request);
return true
""")
- .build())
- .addMethod(
- MethodSpec.methodBuilder("getById")
- .addModifiers(Modifier.PUBLIC)
- .returns(ClassName.get(dtoPackage, dto.name))
- .addAnnotation(
- AnnotationSpec.builder(PostMapping.class)
- .addMember("value", "$S", "/getById")
- .build())
- .addParameter(
- ParameterSpec.builder(ClassName.get(String.class), "request")
- .addAnnotation(RequestBody.class)
- .build())
- .addStatement(
- """
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("getById")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ClassName.get(dtoPackage, dto.name))
+ .addAnnotation(
+ AnnotationSpec.builder(PostMapping.class)
+ .addMember("value", "$S", "/getById")
+ .build())
+ .addParameter(
+ ParameterSpec.builder(
+ ClassName.get(String.class), "request")
+ .addAnnotation(RequestBody.class)
+ .build())
+ .addStatement(
+ """
return this.service.getById(request)
""")
- .build())
- .addMethod(
- MethodSpec.methodBuilder("list")
- .addModifiers(Modifier.PUBLIC)
- .returns(
- ParameterizedTypeName.get(
- ClassName.get(Page.class), ClassName.get(dtoPackage, dto.name)))
- .addAnnotation(
- AnnotationSpec.builder(PostMapping.class)
- .addMember("value", "$S", "/list")
- .build())
- .addParameter(
- ParameterSpec.builder(ClassName.get(CommonQuery.class), "request")
- .addAnnotation(RequestBody.class)
- .build())
- .addStatement(
- """
+ .build())
+ .addMethod(
+ MethodSpec.methodBuilder("list")
+ .addModifiers(Modifier.PUBLIC)
+ .returns(
+ ParameterizedTypeName.get(
+ ClassName.get(Page.class),
+ ClassName.get(dtoPackage, dto.name)))
+ .addAnnotation(
+ AnnotationSpec.builder(PostMapping.class)
+ .addMember("value", "$S", "/list")
+ .build())
+ .addParameter(
+ ParameterSpec.builder(
+ ClassName.get(CommonQuery.class), "request")
+ .addAnnotation(RequestBody.class)
+ .build())
+ .addStatement(
+ """
return this.service.list(request)
""",
- ClassName.get(Page.class),
- ClassName.get(entityPackage, entity.name),
- ClassName.get(PageRequest.class),
- ClassName.get(Sort.class))
- .build());
+ ClassName.get(Page.class),
+ ClassName.get(entityPackage, entity.name),
+ ClassName.get(PageRequest.class),
+ ClassName.get(Sort.class))
+ .build());
- JavaFile.builder(controllerPackage, controllerBuilder.build()).build().writeTo(DIRECTORY);
- }
+ JavaFile.builder(controllerPackage, controllerBuilder.build()).build().writeTo(DIRECTORY);
+ }
}
diff --git a/src/main/java/cn/lihongjie/coal/annotation/Anonymous.java b/src/main/java/cn/lihongjie/coal/annotation/Anonymous.java
index 3f9b2d35..50d5099e 100644
--- a/src/main/java/cn/lihongjie/coal/annotation/Anonymous.java
+++ b/src/main/java/cn/lihongjie/coal/annotation/Anonymous.java
@@ -9,5 +9,5 @@ import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Anonymous {
- boolean value() default true;
+ boolean value() default true;
}
diff --git a/src/main/java/cn/lihongjie/coal/annotation/OrgAdmin.java b/src/main/java/cn/lihongjie/coal/annotation/OrgAdmin.java
index 0971d0d6..830dc07f 100644
--- a/src/main/java/cn/lihongjie/coal/annotation/OrgAdmin.java
+++ b/src/main/java/cn/lihongjie/coal/annotation/OrgAdmin.java
@@ -9,5 +9,5 @@ import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface OrgAdmin {
- boolean value() default true;
+ boolean value() default true;
}
diff --git a/src/main/java/cn/lihongjie/coal/annotation/OrgScope.java b/src/main/java/cn/lihongjie/coal/annotation/OrgScope.java
index 345ff0dd..04547be8 100644
--- a/src/main/java/cn/lihongjie/coal/annotation/OrgScope.java
+++ b/src/main/java/cn/lihongjie/coal/annotation/OrgScope.java
@@ -9,5 +9,5 @@ import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface OrgScope {
- boolean value() default true;
+ boolean value() default true;
}
diff --git a/src/main/java/cn/lihongjie/coal/annotation/SysAdmin.java b/src/main/java/cn/lihongjie/coal/annotation/SysAdmin.java
index 78f2b67e..7d34340a 100644
--- a/src/main/java/cn/lihongjie/coal/annotation/SysAdmin.java
+++ b/src/main/java/cn/lihongjie/coal/annotation/SysAdmin.java
@@ -9,5 +9,5 @@ import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface SysAdmin {
- boolean value() default true;
+ boolean value() default true;
}
diff --git a/src/main/java/cn/lihongjie/coal/annotation/SysLog.java b/src/main/java/cn/lihongjie/coal/annotation/SysLog.java
index c7018438..5eb4562a 100644
--- a/src/main/java/cn/lihongjie/coal/annotation/SysLog.java
+++ b/src/main/java/cn/lihongjie/coal/annotation/SysLog.java
@@ -9,9 +9,9 @@ import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface SysLog {
- String module() default "";
+ String module() default "";
- String action() default "";
+ String action() default "";
- String message() default "";
+ String message() default "";
}
diff --git a/src/main/java/cn/lihongjie/coal/aop/ControllerAop.java b/src/main/java/cn/lihongjie/coal/aop/ControllerAop.java
index 518f823b..e1142315 100644
--- a/src/main/java/cn/lihongjie/coal/aop/ControllerAop.java
+++ b/src/main/java/cn/lihongjie/coal/aop/ControllerAop.java
@@ -6,11 +6,12 @@ import cn.lihongjie.coal.ip.IpQueryService;
import cn.lihongjie.coal.session.SessionService;
import cn.lihongjie.coal.syslog.entity.SysLogEntity;
import cn.lihongjie.coal.syslog.service.SysLogService;
+
import jakarta.servlet.http.HttpServletRequest;
-import java.lang.reflect.Method;
-import java.util.Arrays;
+
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
@@ -24,109 +25,113 @@ import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
@Aspect
@Component
@Slf4j
public class ControllerAop {
- @Pointcut("execution (* cn.lihongjie.coal.*.controller.*.*(..))")
- public void controllerMethods() {}
+ @Autowired SessionService sessionService;
+ @Autowired IpQueryService ipQueryService;
+ @Autowired SysLogService sysLogService;
- @Autowired SessionService sessionService;
-
- @SneakyThrows
- @Around("controllerMethods()")
- public Object call(ProceedingJoinPoint proceedingJoinPoint) {
-
- Method method = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod();
- HttpServletRequest request =
- ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-
- long start = System.currentTimeMillis();
- SysLogEntity sysLogEntity = createSysLog(method, request);
- try {
-
- return proceedingJoinPoint.proceed();
-
- } catch (Throwable e) {
-
- logException(e, proceedingJoinPoint);
-
- updateSysLog(e, sysLogEntity);
-
- throw e;
-
- } finally {
-
- saveSysLog(sysLogEntity, System.currentTimeMillis(), start);
- }
- }
-
- private void saveSysLog(SysLogEntity sysLogEntity, long end, long start) {
- if (sysLogEntity != null) {
- sysLogEntity.setTimeCost((int) (end - start));
-
- sysLogService.save(sysLogEntity);
- }
- }
-
- private static void updateSysLog(Throwable e, SysLogEntity sysLogEntity) {
- if (sysLogEntity != null) {
- sysLogEntity.setOptStatus("1");
- sysLogEntity.setStacktrace(ExceptionUtils.getStackTrace(e));
- }
- }
-
- @Autowired IpQueryService ipQueryService;
-
- private SysLogEntity createSysLog(Method method, HttpServletRequest request) {
- SysLog sysLog = AnnotationUtils.findAnnotation(method, SysLog.class);
-
- SysLogEntity sysLogEntity = null;
- String module = "";
- if (sysLog != null) {
-
- module = sysLog.module();
- if (StringUtils.isEmpty(module)) {
- SysLog classLog = AnnotationUtils.findAnnotation(method.getDeclaringClass(), SysLog.class);
- if (classLog != null) {
-
- module = classLog.module();
+ private static void updateSysLog(Throwable e, SysLogEntity sysLogEntity) {
+ if (sysLogEntity != null) {
+ sysLogEntity.setOptStatus("1");
+ sysLogEntity.setStacktrace(ExceptionUtils.getStackTrace(e));
}
- }
-
- sysLogEntity = new SysLogEntity();
- sysLogEntity.setModule(module);
- sysLogEntity.setMessage(sysLog.message());
- sysLogEntity.setAction(sysLog.action());
- sysLogEntity.setIp(RequestUtils.getIp(request));
- sysLogEntity.setIpLocation(ipQueryService.query(sysLogEntity.getIp()));
- sysLogEntity.setUrl(request.getRequestURI());
- sysLogEntity.setOptStatus("0");
- sysLogEntity.setTimeCost(0);
- sysLogEntity.setUserAgent(RequestUtils.getUa(request));
}
- return sysLogEntity;
- }
- @Autowired SysLogService sysLogService;
+ @Pointcut("execution (* cn.lihongjie.coal.*.controller.*.*(..))")
+ public void controllerMethods() {}
- private void logException(Throwable ex, ProceedingJoinPoint proceedingJoinPoint) {
- HttpServletRequest request =
- ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ @SneakyThrows
+ @Around("controllerMethods()")
+ public Object call(ProceedingJoinPoint proceedingJoinPoint) {
- Object[] args = proceedingJoinPoint.getArgs();
- Method method = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod();
+ Method method = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod();
+ HttpServletRequest request =
+ ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
+ .getRequest();
- log.info(
- "接口调用异常: {}\nurl:{} {}\nmethod: {}\nargs: {}",
- ex.getMessage() == null ? "no message" : ex.getMessage(),
- request.getMethod(),
- request.getRequestURL(),
- method,
- Arrays.toString(args),
- ex);
+ long start = System.currentTimeMillis();
+ SysLogEntity sysLogEntity = createSysLog(method, request);
+ try {
- request.setAttribute("__logged", true);
- }
+ return proceedingJoinPoint.proceed();
+
+ } catch (Throwable e) {
+
+ logException(e, proceedingJoinPoint);
+
+ updateSysLog(e, sysLogEntity);
+
+ throw e;
+
+ } finally {
+
+ saveSysLog(sysLogEntity, System.currentTimeMillis(), start);
+ }
+ }
+
+ private void saveSysLog(SysLogEntity sysLogEntity, long end, long start) {
+ if (sysLogEntity != null) {
+ sysLogEntity.setTimeCost((int) (end - start));
+
+ sysLogService.save(sysLogEntity);
+ }
+ }
+
+ private SysLogEntity createSysLog(Method method, HttpServletRequest request) {
+ SysLog sysLog = AnnotationUtils.findAnnotation(method, SysLog.class);
+
+ SysLogEntity sysLogEntity = null;
+ String module = "";
+ if (sysLog != null) {
+
+ module = sysLog.module();
+ if (StringUtils.isEmpty(module)) {
+ SysLog classLog =
+ AnnotationUtils.findAnnotation(method.getDeclaringClass(), SysLog.class);
+ if (classLog != null) {
+
+ module = classLog.module();
+ }
+ }
+
+ sysLogEntity = new SysLogEntity();
+ sysLogEntity.setModule(module);
+ sysLogEntity.setMessage(sysLog.message());
+ sysLogEntity.setAction(sysLog.action());
+ sysLogEntity.setIp(RequestUtils.getIp(request));
+ sysLogEntity.setIpLocation(ipQueryService.query(sysLogEntity.getIp()));
+ sysLogEntity.setUrl(request.getRequestURI());
+ sysLogEntity.setOptStatus("0");
+ sysLogEntity.setTimeCost(0);
+ sysLogEntity.setUserAgent(RequestUtils.getUa(request));
+ }
+ return sysLogEntity;
+ }
+
+ private void logException(Throwable ex, ProceedingJoinPoint proceedingJoinPoint) {
+ HttpServletRequest request =
+ ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
+ .getRequest();
+
+ Object[] args = proceedingJoinPoint.getArgs();
+ Method method = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod();
+
+ log.info(
+ "接口调用异常: {}\nurl:{} {}\nmethod: {}\nargs: {}",
+ ex.getMessage() == null ? "no message" : ex.getMessage(),
+ request.getMethod(),
+ request.getRequestURL(),
+ method,
+ Arrays.toString(args),
+ ex);
+
+ request.setAttribute("__logged", true);
+ }
}
diff --git a/src/main/java/cn/lihongjie/coal/aop/OrgScopeAop.java b/src/main/java/cn/lihongjie/coal/aop/OrgScopeAop.java
index 60523ec5..da948c71 100644
--- a/src/main/java/cn/lihongjie/coal/aop/OrgScopeAop.java
+++ b/src/main/java/cn/lihongjie/coal/aop/OrgScopeAop.java
@@ -3,11 +3,13 @@ package cn.lihongjie.coal.aop;
import cn.lihongjie.coal.annotation.OrgScope;
import cn.lihongjie.coal.common.Ctx;
import cn.lihongjie.coal.exception.BizException;
+
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
-import java.lang.reflect.Method;
+
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
+
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -19,68 +21,69 @@ import org.hibernate.Session;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
+import java.lang.reflect.Method;
+
@Aspect
@Component
@Slf4j
@Order
public class OrgScopeAop {
- @PersistenceContext EntityManager entityManager;
+ private static final ThreadLocal orgScope = new ThreadLocal<>();
+ @PersistenceContext EntityManager entityManager;
- private static ThreadLocal orgScope = new ThreadLocal<>();
+ @SneakyThrows
+ @Around(
+ value =
+ "@annotation(cn.lihongjie.coal.annotation.OrgScope) || @within(cn.lihongjie.coal.annotation.OrgScope)")
+ public Object beforeOrgScope(ProceedingJoinPoint pjp) {
- @SneakyThrows
- @Around(
- value =
- "@annotation(cn.lihongjie.coal.annotation.OrgScope) || @within(cn.lihongjie.coal.annotation.OrgScope)")
- public Object beforeOrgScope(ProceedingJoinPoint pjp) {
+ Method method = ((MethodSignature) pjp.getSignature()).getMethod();
+ OrgScope annotation = method.getAnnotation(OrgScope.class);
- Method method = ((MethodSignature) pjp.getSignature()).getMethod();
- OrgScope annotation = method.getAnnotation(OrgScope.class);
-
- if (annotation == null) {
- annotation = method.getDeclaringClass().getAnnotation(OrgScope.class);
- }
-
- if (annotation != null) {
- boolean enabled = annotation.value();
-
- Session session = entityManager.unwrap(Session.class);
-
- if (enabled) {
-
- if (StringUtils.isEmpty(Ctx.currentUser().getOrganizationId())) {
- throw new BizException("当前用户未绑定机构, 无法进行机构数据过滤");
+ if (annotation == null) {
+ annotation = method.getDeclaringClass().getAnnotation(OrgScope.class);
}
- if (session.getEnabledFilter("orgFilter") == null) {
+ if (annotation != null) {
+ boolean enabled = annotation.value();
- Filter orgFilter = session.enableFilter("orgFilter");
+ Session session = entityManager.unwrap(Session.class);
- orgFilter.setParameter("organizationId", Ctx.currentUser().getOrganizationId());
- } else {
- log.debug("当前session {} orgFilter已经启用, 忽略....", session.toString());
+ if (enabled) {
+
+ if (StringUtils.isEmpty(Ctx.currentUser().getOrganizationId())) {
+ throw new BizException("当前用户未绑定机构, 无法进行机构数据过滤");
+ }
+
+ if (session.getEnabledFilter("orgFilter") == null) {
+
+ Filter orgFilter = session.enableFilter("orgFilter");
+
+ orgFilter.setParameter("organizationId", Ctx.currentUser().getOrganizationId());
+ } else {
+ log.debug("当前session {} orgFilter已经启用, 忽略....", session);
+ }
+ } else {
+
+ if (session.getEnabledFilter("orgFilter") != null) {
+
+ session.disableFilter("orgFilter");
+
+ } else {
+ log.debug("当前session {} orgFilter已经禁用, 忽略....", session);
+ }
+ }
}
- } else {
+ return pjp.proceed();
+ }
- if (session.getEnabledFilter("orgFilter") != null) {
+ @Before(value = "@annotation(org.springframework.transaction.annotation.Transactional))")
+ public void beforeTransactionMethod() {
- session.disableFilter("orgFilter");
+ if (orgScope.get() != null) {
- } else {
- log.debug("当前session {} orgFilter已经禁用, 忽略....", session.toString());
+ Session session = entityManager.unwrap(Session.class);
}
- }
}
- return pjp.proceed();
- }
-
- @Before(value = "@annotation(org.springframework.transaction.annotation.Transactional))")
- public void beforeTransactionMethod() {
-
- if (orgScope.get() != null) {
-
- Session session = entityManager.unwrap(Session.class);
- }
- }
}
diff --git a/src/main/java/cn/lihongjie/coal/base/controller/BaseController.java b/src/main/java/cn/lihongjie/coal/base/controller/BaseController.java
index 7e7991f8..6925eee3 100644
--- a/src/main/java/cn/lihongjie/coal/base/controller/BaseController.java
+++ b/src/main/java/cn/lihongjie/coal/base/controller/BaseController.java
@@ -1,6 +1,7 @@
package cn.lihongjie.coal.base.controller;
import cn.lihongjie.coal.annotation.OrgScope;
+
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RestController;
diff --git a/src/main/java/cn/lihongjie/coal/base/dao/BaseRepository.java b/src/main/java/cn/lihongjie/coal/base/dao/BaseRepository.java
index 574da9a3..36c4bc2c 100644
--- a/src/main/java/cn/lihongjie/coal/base/dao/BaseRepository.java
+++ b/src/main/java/cn/lihongjie/coal/base/dao/BaseRepository.java
@@ -1,30 +1,31 @@
package cn.lihongjie.coal.base.dao;
import jakarta.persistence.criteria.Path;
-import java.util.List;
+
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;
+import java.util.List;
+
@NoRepositoryBean
public interface BaseRepository extends JpaRepository, JpaSpecificationExecutor {
- public default T get(String id) {
+ default T get(String id) {
- return findById(id).orElseThrow(() -> new RuntimeException("数据不存在: " + id));
- }
+ return findById(id).orElseThrow(() -> new RuntimeException("数据不存在: " + id));
+ }
- public default List findByOrganizationId(String organizationId) {
- return findAll(
- (root, query, cb) -> {
- try {
+ default List findByOrganizationId(String organizationId) {
+ return findAll(
+ (root, query, cb) -> {
+ try {
- Path