first commit
This commit is contained in:
parent
04ac5d8f68
commit
4b4124df36
java
filesmanagesystem.imlpom.xml
src/main/java/com/yfd/platform
PlatformApplication.javaServletInitializer.java
annotation
AnonymousAccess.javaLog.javaStorageParamItem.javaStorageParamSelect.javaStorageParamSelectOption.java
impl
rest
aspect
component
config
FileProperties.javaGlobalExceptionHandler.javaJobRunner.javaJwtAuthenticationTokenFilter.javaMessageConfig.javaMybatisEnumTypeHandler.javaMybitsPlusConfig.javaQuartzConfig.javaResponseResult.javaSecurityConfig.javaSwaggerConfig.javaWebConfig.javaWebSocketConfig.java
bean
thread
constant
datasource
exception
AccessDeniedHandExcetion.javaAuthenticationException.javaBadConfigurationException.javaBadRequestException.javaChildrenExistException.javaEntityExistException.javaEntityNotFoundException.javaServiceException.javaStorageSourceAutoConfigCorsException.javaStorageSourceException.javaStorageSourceRefreshTokenException.java
file
init
modules
config
event
mapper
model
dto
entity
request
service
readme/model/entity
storage
279
java/filesmanagesystem.iml
Normal file
279
java/filesmanagesystem.iml
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||||
|
<component name="FacetManager">
|
||||||
|
<facet type="Spring" name="Spring">
|
||||||
|
<configuration />
|
||||||
|
</facet>
|
||||||
|
<facet type="web" name="Web">
|
||||||
|
<configuration>
|
||||||
|
<webroots />
|
||||||
|
<sourceRoots>
|
||||||
|
<root url="file://$MODULE_DIR$/src/main/java" />
|
||||||
|
<root url="file://$MODULE_DIR$/src/main/resources" />
|
||||||
|
<root url="file://$MODULE_DIR$/target/generated-sources/annotations" />
|
||||||
|
</sourceRoots>
|
||||||
|
</configuration>
|
||||||
|
</facet>
|
||||||
|
</component>
|
||||||
|
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||||
|
<output url="file://$MODULE_DIR$/target/classes" />
|
||||||
|
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" generated="true" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.11" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.11" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.17.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.17.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.36" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.30" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.zxing:core:3.5.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.zxing:javase:3.5.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.beust:jcommander:1.82" level="project" />
|
||||||
|
<orderEntry type="library" scope="RUNTIME" name="Maven: com.github.jai-imageio:jai-imageio-core:1.4.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.pdfbox:pdfbox:2.0.21" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.pdfbox:fontbox:2.0.21" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-security:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.7.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.7.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.7.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:6.1.9.RELEASE" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-unix-common:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.4.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.4" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-cache:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-webflux:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-reactor-netty:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.projectreactor.netty:reactor-netty-http:1.0.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-codec-http:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-codec-http2:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-resolver-dns:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-codec-dns:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-resolver-dns-native-macos:osx-x86_64:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-resolver-dns-classes-macos:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-transport-native-epoll:linux-x86_64:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-transport-classes-epoll:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.projectreactor.netty:reactor-netty-core:1.0.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-handler-proxy:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.netty:netty-codec-socks:4.1.79.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-webflux:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.7.0" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.4.8" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:2.4.8" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:9.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.22.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.8.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.8.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.8.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.8.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.8.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.8.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:4.5.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.12.13" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.12.13" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.2" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:4.5.1" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.1" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.9.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.guava:guava:30.0-jre" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.5.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.3.4" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
|
||||||
|
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
|
||||||
|
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.65" level="project" />
|
||||||
|
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.65" level="project" />
|
||||||
|
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.65" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-quartz:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.15" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.2.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.9" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.7" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.alibaba:druid:1.2.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.deepoove:poi-tl:1.10.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.36" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.deepoove:poi-ooxml-schemas-extra:4.1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-transcoder:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-anim:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-css:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-ext:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-parser:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-svg-dom:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-awt-util:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:xmlgraphics-commons:2.6" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: commons-io:commons-io:1.3.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-bridge:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-script:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-dom:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: xalan:xalan:2.7.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: xalan:serializer:2.7.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-gvt:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-shared-resources:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-svggen:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-util:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-constants:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-i18n:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-xml:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: xml-apis:xml-apis-ext:1.3.04" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-codec:1.14" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.30" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.xerial:sqlite-jdbc:3.32.3.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.4.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.4.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-generator:3.4.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.4.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.4.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.4.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:3.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.24" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.7.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.8" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:4.1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:4.1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.1.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.06" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.jfree:jfreechart:1.5.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.70" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.29" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-boot-starter:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-oas:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations:2.1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models:2.1.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-core:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.83" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webflux:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" scope="RUNTIME" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-data-rest:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-bean-validators:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:3.0.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-boot-starter:3.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-boot-autoconfigure:3.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring:3.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-annotations:3.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-core:3.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: io.swagger:swagger-core:1.5.22" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-ui:3.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.28" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.jsoup:jsoup:1.11.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.ulisesbocchio:jasypt-spring-boot-starter:1.16" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.ulisesbocchio:jasypt-spring-boot:1.16" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.jasypt:jasypt:1.9.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.lionsoul:ip2region:1.7.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.whvcse:easy-captcha:1.6.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.21" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.upyun:java-sdk:4.2.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: junit:junit:4.13.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:2.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.json:json:20160212" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:4.9.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.squareup.okio:okio:2.8.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.6.21" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.amazonaws:aws-java-sdk-s3:1.12.470" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.amazonaws:aws-java-sdk-kms:1.12.470" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.amazonaws:aws-java-sdk-core:1.12.470" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: software.amazon.ion:ion-java:1.0.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.13.3" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: joda-time:joda-time:2.8.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.amazonaws:jmespath-java:1.12.470" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.qiniu:qiniu-java-sdk:7.12.1" level="project" />
|
||||||
|
<orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.gson:gson:2.9.1" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.jcraft:jsch:0.1.55" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.github.lookfirst:sardine:5.10" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.15" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.6" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:2.3.6" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:3.0.12" level="project" />
|
||||||
|
<orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
|
||||||
|
<orderEntry type="library" name="Maven: commons-chain:commons-chain:1.2" level="project" />
|
||||||
|
</component>
|
||||||
|
</module>
|
371
java/pom.xml
Normal file
371
java/pom.xml
Normal file
@ -0,0 +1,371 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>2.7.3</version>
|
||||||
|
<relativePath/>
|
||||||
|
<!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
<groupId>com.yfd</groupId>
|
||||||
|
<artifactId>filesmanagesystem</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>filesmanagesystem</name>
|
||||||
|
<description>文件管理系统</description>
|
||||||
|
<properties>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<!-- spring-web -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- 生成二维码 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.zxing</groupId>
|
||||||
|
<artifactId>core</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.zxing</groupId>
|
||||||
|
<artifactId>javase</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- 生成pdf文件 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.pdfbox</groupId>
|
||||||
|
<artifactId>pdfbox</artifactId>
|
||||||
|
<version>2.0.21</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- spring-security -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-security</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--Spring boot Redis-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- WebSocket依赖 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--Spring 缓存-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-cache</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-webflux</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 测试 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--Guava是一种基于开源的Java库高性能数据缓存-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>30.0-jre</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- spring-内置Tomcat-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- spring-quartz任务-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-quartz</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- spring-elasticsearch搜素-->
|
||||||
|
<!-- <dependency>-->
|
||||||
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
|
<!-- <artifactId>spring-boot-starter-data-elasticsearch</artifactId>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
|
||||||
|
<!-- spring-Mybatis-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mybatis.spring.boot</groupId>
|
||||||
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
|
<version>2.2.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- druid数据库连接池 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>druid</artifactId>
|
||||||
|
<version>1.2.3</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--数据库连接-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-jdbc</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--poi-tl 生成word -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.deepoove</groupId>
|
||||||
|
<artifactId>poi-tl</artifactId>
|
||||||
|
<version>1.10.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- druid相关 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>druid-spring-boot-starter</artifactId>
|
||||||
|
<version>1.1.22</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- mysql数据库 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- sqlite-jdbc数据库 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.xerial</groupId>
|
||||||
|
<artifactId>sqlite-jdbc</artifactId>
|
||||||
|
<version>3.32.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- mybatis-plus 数据库扩展插件-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baomidou</groupId>
|
||||||
|
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||||
|
<version>3.4.3</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baomidou</groupId>
|
||||||
|
<artifactId>mybatis-plus-generator</artifactId>
|
||||||
|
<version>3.4.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--apache.commons -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--lombok bean注解 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 日志相关 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-aop</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 胡图工具类 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hutool</groupId>
|
||||||
|
<artifactId>hutool-all</artifactId>
|
||||||
|
<version>5.8.8</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- excel工具 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi</artifactId>
|
||||||
|
<version>4.1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.poi</groupId>
|
||||||
|
<artifactId>poi-ooxml</artifactId>
|
||||||
|
<version>4.1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jfree</groupId>
|
||||||
|
<artifactId>jfreechart</artifactId>
|
||||||
|
<version>1.5.3</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- fastjson -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>fastjson</artifactId>
|
||||||
|
<version>1.2.70</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.fastjson2</groupId>
|
||||||
|
<artifactId>fastjson2</artifactId>
|
||||||
|
<version>2.0.29</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.springfox</groupId>
|
||||||
|
<artifactId>springfox-boot-starter</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.xiaoymin</groupId>
|
||||||
|
<artifactId>knife4j-spring-boot-starter</artifactId>
|
||||||
|
<version>3.0.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.freemarker</groupId>
|
||||||
|
<artifactId>freemarker</artifactId>
|
||||||
|
<version>2.3.28</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jsoup</groupId>
|
||||||
|
<artifactId>jsoup</artifactId>
|
||||||
|
<version>1.11.3</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 数据库密码加密 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.ulisesbocchio</groupId>
|
||||||
|
<artifactId>jasypt-spring-boot-starter</artifactId>
|
||||||
|
<version>1.16</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.lionsoul</groupId>
|
||||||
|
<artifactId>ip2region</artifactId>
|
||||||
|
<version>1.7.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Java图形验证码 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.whvcse</groupId>
|
||||||
|
<artifactId>easy-captcha</artifactId>
|
||||||
|
<version>1.6.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 解析客户端操作系统、浏览器信息 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>eu.bitwalker</groupId>
|
||||||
|
<artifactId>UserAgentUtils</artifactId>
|
||||||
|
<version>1.21</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 存储策略相关 API, 对象存储、FTP、 Rest API-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.upyun</groupId>
|
||||||
|
<artifactId>java-sdk</artifactId>
|
||||||
|
<version>4.2.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.amazonaws</groupId>
|
||||||
|
<artifactId>aws-java-sdk-s3</artifactId>
|
||||||
|
<version>1.12.470</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.qiniu</groupId>
|
||||||
|
<artifactId>qiniu-java-sdk</artifactId>
|
||||||
|
<version>7.12.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.jcraft</groupId>
|
||||||
|
<artifactId>jsch</artifactId>
|
||||||
|
<version>0.1.55</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.lookfirst</groupId>
|
||||||
|
<artifactId>sardine</artifactId>
|
||||||
|
<version>5.10</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 过滤器链 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-chain</groupId>
|
||||||
|
<artifactId>commons-chain</artifactId>
|
||||||
|
<version>1.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- <dependency>-->
|
||||||
|
<!-- <groupId>org.mapstruct</groupId>-->
|
||||||
|
<!-- <artifactId>mapstruct</artifactId>-->
|
||||||
|
<!-- <version>1.5.3.Final</version>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<includes>
|
||||||
|
<include>**/*.*</include>
|
||||||
|
</includes>
|
||||||
|
<filtering>false</filtering>
|
||||||
|
</resource>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/java</directory>
|
||||||
|
<includes>
|
||||||
|
<include>**/*.*</include>
|
||||||
|
</includes>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<filtering>false</filtering>
|
||||||
|
</resource>
|
||||||
|
|
||||||
|
</resources>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.asciidoctor</groupId>
|
||||||
|
<artifactId>asciidoctor-maven-plugin</artifactId>
|
||||||
|
<version>1.5.8</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>generate-docs</id>
|
||||||
|
<phase>prepare-package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>process-asciidoc</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<backend>html</backend>
|
||||||
|
<doctype>book</doctype>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</exclude>
|
||||||
|
</excludes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
54
java/src/main/java/com/yfd/platform/PlatformApplication.java
Normal file
54
java/src/main/java/com/yfd/platform/PlatformApplication.java
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package com.yfd.platform;
|
||||||
|
|
||||||
|
import com.yfd.platform.annotation.rest.AnonymousGetMapping;
|
||||||
|
import com.yfd.platform.datasource.DynamicDataSourceConfig;
|
||||||
|
import com.yfd.platform.utils.SpringContextHolder;
|
||||||
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||||
|
import org.springframework.boot.web.servlet.ServletComponentScan;
|
||||||
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Import;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.reactive.function.client.WebClient;
|
||||||
|
|
||||||
|
//@SpringBootApplication
|
||||||
|
@RestController
|
||||||
|
@EnableTransactionManagement
|
||||||
|
@ServletComponentScan("com.yfd.platform.config")
|
||||||
|
@MapperScan(basePackages = "com.yfd.platform.modules.*.convert.impl,com.yfd.platform.modules.*.mapper,com.yfd.platform.*.mapper")
|
||||||
|
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
|
||||||
|
@Import({DynamicDataSourceConfig.class})
|
||||||
|
@EnableCaching
|
||||||
|
@EnableScheduling
|
||||||
|
@EnableAsync
|
||||||
|
public class PlatformApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(PlatformApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SpringContextHolder springContextHolder() {
|
||||||
|
return new SpringContextHolder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public WebClient.Builder webClientBuilder() {
|
||||||
|
return WebClient.builder();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 访问首页提示
|
||||||
|
*
|
||||||
|
* @return /
|
||||||
|
*/
|
||||||
|
@AnonymousGetMapping("/")
|
||||||
|
public String index() {
|
||||||
|
return "Backend service started successfully";
|
||||||
|
}
|
||||||
|
}
|
13
java/src/main/java/com/yfd/platform/ServletInitializer.java
Normal file
13
java/src/main/java/com/yfd/platform/ServletInitializer.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package com.yfd.platform;
|
||||||
|
|
||||||
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
|
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||||
|
|
||||||
|
public class ServletInitializer extends SpringBootServletInitializer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
|
||||||
|
return application.sources(PlatformApplication.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author jacky
|
||||||
|
* 用于标记匿名访问方法
|
||||||
|
*/
|
||||||
|
@Inherited
|
||||||
|
@Documented
|
||||||
|
@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface AnonymousAccess {
|
||||||
|
|
||||||
|
}
|
20
java/src/main/java/com/yfd/platform/annotation/Log.java
Normal file
20
java/src/main/java/com/yfd/platform/annotation/Log.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package com.yfd.platform.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author LiMengNan
|
||||||
|
* @date 2018-11-24
|
||||||
|
*/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Log {
|
||||||
|
|
||||||
|
String value() default "";
|
||||||
|
|
||||||
|
String module() default "";
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
package com.yfd.platform.annotation;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageParamTypeEnum;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标记存储类型参数名称
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface StorageParamItem {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段显示排序值, 值越小, 越靠前. 默认为 99
|
||||||
|
*/
|
||||||
|
int order() default 99;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数键, 如果为空, 则使用字段名称.
|
||||||
|
*/
|
||||||
|
String key() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数名称, 用于网页上显示名称.
|
||||||
|
*/
|
||||||
|
String name();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段类型, 默认为 input, 可选值为: input, select, switch.
|
||||||
|
*/
|
||||||
|
StorageParamTypeEnum type() default StorageParamTypeEnum.INPUT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当 {@link #type} 为 select 时, 选项的值.
|
||||||
|
*/
|
||||||
|
StorageParamSelectOption[] options() default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当 {@link #type} 为 select 时, 选项的值. 通过 {@link StorageParamSelect#getOptions)} 方法获取选项值.
|
||||||
|
*/
|
||||||
|
Class<? extends StorageParamSelect> optionsClass() default StorageParamSelect.class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数值是否可以为空. 如不为空,则抛出异常.
|
||||||
|
*/
|
||||||
|
boolean required() default true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果填写值为空,则给予默认值.
|
||||||
|
* 支持 ${xxx} 变量, 会读取配置文件中的值, 如获取失败, 会默认为空.
|
||||||
|
*/
|
||||||
|
String defaultValue() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数描述信息, 用户在用户填写时, 进行提示.
|
||||||
|
*/
|
||||||
|
String description() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数下方的提示链接, 如果为空, 则不显示.
|
||||||
|
*/
|
||||||
|
String link() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数下方的提示链接文件信息, 如果为空, 则默认为链接地址.
|
||||||
|
*/
|
||||||
|
String linkName() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否忽略参数不传递给前端.
|
||||||
|
*/
|
||||||
|
boolean ignoreInput() default false;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.yfd.platform.annotation;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.storage.model.bo.StorageSourceParamDef;
|
||||||
|
import com.yfd.platform.modules.storage.model.param.IStorageParam;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源参数下拉值接口.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public interface StorageParamSelect {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取存储源参数下拉选项列表.
|
||||||
|
*
|
||||||
|
* @param storageParamItem
|
||||||
|
* 存储源下拉参数定义
|
||||||
|
*
|
||||||
|
* @param targetParam
|
||||||
|
* 存储源参数
|
||||||
|
*
|
||||||
|
* @return 存储源参数下拉选项列表
|
||||||
|
*/
|
||||||
|
List<StorageSourceParamDef.Options> getOptions(StorageParamItem storageParamItem, IStorageParam targetParam);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.yfd.platform.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标记存储类型参数类型为 select 时, 数据的下拉值.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Target(ElementType.ANNOTATION_TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface StorageParamSelectOption {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选项显示值
|
||||||
|
*/
|
||||||
|
String label();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选项存储值
|
||||||
|
*/
|
||||||
|
String value();
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.yfd.platform.annotation.impl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.yfd.platform.annotation.StorageParamItem;
|
||||||
|
import com.yfd.platform.annotation.StorageParamSelect;
|
||||||
|
import com.yfd.platform.modules.storage.model.bo.StorageSourceParamDef;
|
||||||
|
import com.yfd.platform.modules.storage.model.param.IStorageParam;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编码格式动态参数.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public class EncodingStorageParamSelect implements StorageParamSelect {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<StorageSourceParamDef.Options> getOptions(StorageParamItem storageParamItem, IStorageParam targetParam) {
|
||||||
|
List<StorageSourceParamDef.Options> options = new ArrayList<>();
|
||||||
|
|
||||||
|
for (String name : Charset.availableCharsets().keySet()) {
|
||||||
|
StorageSourceParamDef.Options option = new StorageSourceParamDef.Options(name);
|
||||||
|
options.add(option);
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.yfd.platform.annotation.rest;
|
||||||
|
|
||||||
|
import com.yfd.platform.annotation.AnonymousAccess;
|
||||||
|
import org.springframework.core.annotation.AliasFor;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Annotation for mapping HTTP {@code GET} requests onto specific handler
|
||||||
|
* methods.
|
||||||
|
* <p>
|
||||||
|
* 支持匿名访问 GetMapping
|
||||||
|
*
|
||||||
|
* @author liaojinlong
|
||||||
|
* @see RequestMapping
|
||||||
|
*/
|
||||||
|
@AnonymousAccess
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Documented
|
||||||
|
@RequestMapping(method = RequestMethod.GET)
|
||||||
|
public @interface AnonymousGetMapping {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for {@link RequestMapping#name}.
|
||||||
|
*/
|
||||||
|
@AliasFor(annotation = RequestMapping.class)
|
||||||
|
String name() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for {@link RequestMapping#value}.
|
||||||
|
*/
|
||||||
|
@AliasFor(annotation = RequestMapping.class)
|
||||||
|
String[] value() default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for {@link RequestMapping#path}.
|
||||||
|
*/
|
||||||
|
@AliasFor(annotation = RequestMapping.class)
|
||||||
|
String[] path() default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for {@link RequestMapping#params}.
|
||||||
|
*/
|
||||||
|
@AliasFor(annotation = RequestMapping.class)
|
||||||
|
String[] params() default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for {@link RequestMapping#headers}.
|
||||||
|
*/
|
||||||
|
@AliasFor(annotation = RequestMapping.class)
|
||||||
|
String[] headers() default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for {@link RequestMapping#consumes}.
|
||||||
|
*
|
||||||
|
* @since 4.3.5
|
||||||
|
*/
|
||||||
|
@AliasFor(annotation = RequestMapping.class)
|
||||||
|
String[] consumes() default {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for {@link RequestMapping#produces}.
|
||||||
|
*/
|
||||||
|
@AliasFor(annotation = RequestMapping.class)
|
||||||
|
String[] produces() default {};
|
||||||
|
|
||||||
|
}
|
93
java/src/main/java/com/yfd/platform/aspect/LogAspect.java
Normal file
93
java/src/main/java/com/yfd/platform/aspect/LogAspect.java
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.aspect;
|
||||||
|
|
||||||
|
import com.yfd.platform.system.domain.SysLog;
|
||||||
|
import com.yfd.platform.system.mapper.SysUserMapper;
|
||||||
|
import com.yfd.platform.system.service.ISysLogService;
|
||||||
|
import com.yfd.platform.system.service.IUserService;
|
||||||
|
import com.yfd.platform.utils.RequestHolder;
|
||||||
|
import com.yfd.platform.utils.SecurityUtils;
|
||||||
|
import com.yfd.platform.utils.StringUtils;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author
|
||||||
|
* @date 2018-11-24
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Aspect
|
||||||
|
@Slf4j
|
||||||
|
public class LogAspect {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private final ISysLogService sysLogService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IUserService userService;
|
||||||
|
|
||||||
|
ThreadLocal<Long> currentTime = new ThreadLocal<>();
|
||||||
|
|
||||||
|
public LogAspect(ISysLogService sysLogService) {
|
||||||
|
this.sysLogService = sysLogService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置切入点
|
||||||
|
*/
|
||||||
|
@Pointcut("@annotation(com.yfd.platform.annotation.Log)")
|
||||||
|
public void logPointcut() {
|
||||||
|
// 该方法无方法体,主要为了让同类中其他方法使用此切入点
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置环绕通知,使用在方法logPointcut()上注册的切入点
|
||||||
|
*
|
||||||
|
* @param joinPoint join point for advice
|
||||||
|
*/
|
||||||
|
@Around("logPointcut()")
|
||||||
|
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||||
|
Object result;
|
||||||
|
currentTime.set(System.currentTimeMillis());
|
||||||
|
result = joinPoint.proceed();
|
||||||
|
SysLog log = new SysLog("INFO");
|
||||||
|
currentTime.remove();
|
||||||
|
HttpServletRequest request = RequestHolder.getHttpServletRequest();
|
||||||
|
Map<String, String> nameInfo = userService.getNameInfo();
|
||||||
|
String nickname = nameInfo.get("nickname");
|
||||||
|
String username = nameInfo.get("username");
|
||||||
|
sysLogService.save(nickname, username, StringUtils.getBrowser(request),
|
||||||
|
StringUtils.getIp(request), joinPoint, log);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
try {
|
||||||
|
return SecurityUtils.getCurrentUsername();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,147 @@
|
|||||||
|
package com.yfd.platform.component;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Huhailong
|
||||||
|
* SSE Server send Event 服务器推送服务
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class ServerSendEventServer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前连接数
|
||||||
|
*/
|
||||||
|
private static AtomicInteger count = new AtomicInteger(0);
|
||||||
|
|
||||||
|
private static Map<String, SseEmitter> sseEmitterMap =
|
||||||
|
new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public static SseEmitter connect(String userId) {
|
||||||
|
//设置超时时间,0表示不过期,默认是30秒,超过时间未完成会抛出异常
|
||||||
|
SseEmitter sseEmitter = new SseEmitter(0L);
|
||||||
|
//SseEmitter sseEmitter = new SseEmitter();
|
||||||
|
//注册回调
|
||||||
|
sseEmitter.onCompletion(completionCallBack(userId));
|
||||||
|
sseEmitter.onError(errorCallBack(userId));
|
||||||
|
sseEmitter.onTimeout(timeOutCallBack(userId));
|
||||||
|
sseEmitterMap.put(userId, sseEmitter);
|
||||||
|
//数量+1
|
||||||
|
count.getAndIncrement();
|
||||||
|
log.info("create new sse connect ,current user:{}", userId);
|
||||||
|
return sseEmitter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给指定用户发消息
|
||||||
|
*/
|
||||||
|
public static void sendMessage(String userId, String message) {
|
||||||
|
if (sseEmitterMap.containsKey(userId)) {
|
||||||
|
try {
|
||||||
|
sseEmitterMap.get(userId).send(message);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("user id:{}, send message error:{}", userId,
|
||||||
|
e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给所有用户发消息
|
||||||
|
*/
|
||||||
|
public static void sendMessage(String message) {
|
||||||
|
if (sseEmitterMap != null && !sseEmitterMap.isEmpty()) {
|
||||||
|
sseEmitterMap.forEach((k, v) -> {
|
||||||
|
// 发送消息
|
||||||
|
sendMessage(k, message);
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 想多人发送消息,组播
|
||||||
|
*/
|
||||||
|
public static void groupSendMessage(String groupId, String message) {
|
||||||
|
if (sseEmitterMap != null && !sseEmitterMap.isEmpty()) {
|
||||||
|
sseEmitterMap.forEach((k, v) -> {
|
||||||
|
try {
|
||||||
|
if (k.startsWith(groupId)) {
|
||||||
|
v.send(message, MediaType.APPLICATION_JSON);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("user id:{}, send message error:{}", groupId,
|
||||||
|
message);
|
||||||
|
removeUser(k);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void batchSendMessage(String message) {
|
||||||
|
sseEmitterMap.forEach((k, v) -> {
|
||||||
|
try {
|
||||||
|
v.send(message, MediaType.APPLICATION_JSON);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("user id:{}, send message error:{}", k,
|
||||||
|
e.getMessage());
|
||||||
|
removeUser(k);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 群发消息
|
||||||
|
*/
|
||||||
|
public static void batchSendMessage(String message, Set<String> userIds) {
|
||||||
|
userIds.forEach(userId -> sendMessage(userId, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeUser(String userId) {
|
||||||
|
sseEmitterMap.remove(userId);
|
||||||
|
//数量-1
|
||||||
|
count.getAndDecrement();
|
||||||
|
log.info("remove user id:{}", userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<String> getIds() {
|
||||||
|
return new ArrayList<>(sseEmitterMap.keySet());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getUserCount() {
|
||||||
|
return count.intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Runnable completionCallBack(String userId) {
|
||||||
|
return () -> {
|
||||||
|
log.info("结束连接,{}", userId);
|
||||||
|
removeUser(userId);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Runnable timeOutCallBack(String userId) {
|
||||||
|
return () -> {
|
||||||
|
log.info("连接超时,{}", userId);
|
||||||
|
removeUser(userId);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Consumer<Throwable> errorCallBack(String userId) {
|
||||||
|
return throwable -> {
|
||||||
|
log.error("连接异常,{}", userId);
|
||||||
|
removeUser(userId);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package com.yfd.platform.component;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.websocket.*;
|
||||||
|
import javax.websocket.server.PathParam;
|
||||||
|
import javax.websocket.server.ServerEndpoint;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
|
@ServerEndpoint("/websocket/{token}")
|
||||||
|
@Component
|
||||||
|
public class WebSocketServer {
|
||||||
|
private static int onlineCount=0;//在线人数
|
||||||
|
private static CopyOnWriteArrayList<WebSocketServer> webSocketSet=new CopyOnWriteArrayList<WebSocketServer>();//在线用户集合
|
||||||
|
private Session session;//与某个客户端的连接会话
|
||||||
|
private String currentUser;
|
||||||
|
|
||||||
|
@OnOpen
|
||||||
|
public void onOpen(@PathParam("token") String token, Session session){
|
||||||
|
this.currentUser = token;
|
||||||
|
this.session=session;
|
||||||
|
webSocketSet.add(this);//加入set中
|
||||||
|
addOnlineCount();
|
||||||
|
System.out.println("有新连接加入!当前在线人数为"+getOnlineCount());
|
||||||
|
allCurrentOnline();
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClose
|
||||||
|
public void onClose(){
|
||||||
|
webSocketSet.remove(this);
|
||||||
|
subOnlineCount();
|
||||||
|
System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
|
||||||
|
allCurrentOnline();
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnMessage
|
||||||
|
public void onMessage(String message, Session session){
|
||||||
|
System.out.println("来自客户端的消息:"+message);
|
||||||
|
for (WebSocketServer item:webSocketSet){
|
||||||
|
try {
|
||||||
|
item.sendMessage(message);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnError
|
||||||
|
public void onError(Session session, Throwable throwable){
|
||||||
|
System.out.println("发生错误!");
|
||||||
|
throwable.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMessage(String message) throws IOException {
|
||||||
|
this.session.getBasicRemote().sendText(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前所有在线用户名
|
||||||
|
*/
|
||||||
|
public static void allCurrentOnline(){
|
||||||
|
for (WebSocketServer item : webSocketSet) {
|
||||||
|
System.out.println(item.currentUser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送给指定用户
|
||||||
|
*/
|
||||||
|
public static void sendMessageTo(String message,String token) throws IOException {
|
||||||
|
for (WebSocketServer item : webSocketSet) {
|
||||||
|
if(item.currentUser.equals(token)){
|
||||||
|
item.session.getBasicRemote().sendText(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 群发自定义消息
|
||||||
|
*/
|
||||||
|
public static void sendInfo(String message) throws IOException {
|
||||||
|
System.out.println(message);
|
||||||
|
for (WebSocketServer item : webSocketSet) {
|
||||||
|
try {
|
||||||
|
item.sendMessage(message);
|
||||||
|
} catch (IOException e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized int getOnlineCount(){
|
||||||
|
return onlineCount;
|
||||||
|
}
|
||||||
|
public static synchronized void addOnlineCount(){
|
||||||
|
WebSocketServer.onlineCount++;
|
||||||
|
}
|
||||||
|
public static synchronized void subOnlineCount(){
|
||||||
|
WebSocketServer.onlineCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Configuration
|
||||||
|
@ConfigurationProperties(prefix = "file")
|
||||||
|
public class FileProperties {
|
||||||
|
|
||||||
|
/** 文件大小限制 */
|
||||||
|
private Long maxSize;
|
||||||
|
|
||||||
|
/** 头像大小限制 */
|
||||||
|
private Long avatarMaxSize;
|
||||||
|
|
||||||
|
private ElPath mac;
|
||||||
|
|
||||||
|
private ElPath linux;
|
||||||
|
|
||||||
|
private ElPath windows;
|
||||||
|
|
||||||
|
public ElPath getPath(){
|
||||||
|
String os = System.getProperty("os.name");
|
||||||
|
if(os.toLowerCase().startsWith("win")) {
|
||||||
|
return windows;
|
||||||
|
} else if(os.toLowerCase().startsWith("mac")){
|
||||||
|
return mac;
|
||||||
|
}
|
||||||
|
return linux;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class ElPath{
|
||||||
|
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
private String avatar;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author LiMengNan
|
||||||
|
* @Date: 2023/3/27 18:07
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@ControllerAdvice
|
||||||
|
public class GlobalExceptionHandler {
|
||||||
|
|
||||||
|
@ResponseBody
|
||||||
|
@ExceptionHandler(value = Throwable.class)
|
||||||
|
public ResponseResult handleException(Throwable e) {
|
||||||
|
log.error("message:{}", e.getMessage());
|
||||||
|
return ResponseResult.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
56
java/src/main/java/com/yfd/platform/config/JobRunner.java
Normal file
56
java/src/main/java/com/yfd/platform/config/JobRunner.java
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.yfd.platform.system.domain.QuartzJob;
|
||||||
|
import com.yfd.platform.system.mapper.QuartzJobMapper;
|
||||||
|
import com.yfd.platform.utils.QuartzManage;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.boot.ApplicationArguments;
|
||||||
|
import org.springframework.boot.ApplicationRunner;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author
|
||||||
|
* @date 2019-01-07
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class JobRunner implements ApplicationRunner {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(JobRunner.class);
|
||||||
|
private final QuartzJobMapper quartzJobMapper;
|
||||||
|
private final QuartzManage quartzManage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目启动时重新激活启用的定时任务
|
||||||
|
*
|
||||||
|
* @param applicationArguments /
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run(ApplicationArguments applicationArguments) {
|
||||||
|
log.info("--------------------注入定时任务---------------------");
|
||||||
|
List<QuartzJob> quartzJobs =
|
||||||
|
quartzJobMapper.selectList(new LambdaQueryWrapper<QuartzJob>().eq(QuartzJob::getStatus, "1"));
|
||||||
|
quartzJobs.forEach(quartzManage::addJob);
|
||||||
|
log.info("--------------------定时任务注入完成---------------------");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.jwt.JWT;
|
||||||
|
import cn.hutool.jwt.JWTUtil;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.yfd.platform.component.ServerSendEventServer;
|
||||||
|
import com.yfd.platform.constant.Constant;
|
||||||
|
import com.yfd.platform.system.domain.LoginUser;
|
||||||
|
import com.yfd.platform.system.domain.Message;
|
||||||
|
import com.yfd.platform.system.service.IMessageService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.FilterChain;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WebConfig webConfig;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doFilterInternal(HttpServletRequest httpServletRequest,
|
||||||
|
HttpServletResponse httpServletResponse,
|
||||||
|
FilterChain filterChain) throws ServletException, IOException {
|
||||||
|
//获取token
|
||||||
|
String uri = httpServletRequest.getRequestURI();
|
||||||
|
String token = httpServletRequest.getHeader("token");
|
||||||
|
if (StrUtil.isEmpty(token) || "/user/login".equals(uri)) {
|
||||||
|
filterChain.doFilter(httpServletRequest, httpServletResponse);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//解析token
|
||||||
|
boolean isok = JWTUtil.verify(token, "12345678".getBytes());
|
||||||
|
String userid = "";
|
||||||
|
if (isok) {
|
||||||
|
final JWT jwt = JWTUtil.parseToken(token);
|
||||||
|
userid = jwt.getPayload("userid").toString();
|
||||||
|
long expire_time = (Long) jwt.getPayload("expire_time");
|
||||||
|
if (System.currentTimeMillis() > expire_time) {
|
||||||
|
httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Token超过期限!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//从cachekey中获取用户信息
|
||||||
|
String cachekey = "login:" + userid;
|
||||||
|
String jsonstr = webConfig.loginuserCache().get(cachekey);
|
||||||
|
LoginUser loginUser = JSON.parseObject(jsonstr, LoginUser.class);
|
||||||
|
if (ObjectUtil.isEmpty(loginUser)) {
|
||||||
|
httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN,
|
||||||
|
"登录用户已失效!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//存入SecurityContextHolder
|
||||||
|
UsernamePasswordAuthenticationToken authenticationToken =
|
||||||
|
new UsernamePasswordAuthenticationToken(loginUser, null,
|
||||||
|
loginUser.getAuthorities());
|
||||||
|
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
|
||||||
|
webConfig.loginuserCache().put(Constant.TOKEN + userid, token);
|
||||||
|
//放行过滤器
|
||||||
|
filterChain.doFilter(httpServletRequest, httpServletResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import cn.hutool.cache.Cache;
|
||||||
|
import cn.hutool.cache.impl.CacheObj;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.yfd.platform.component.ServerSendEventServer;
|
||||||
|
import com.yfd.platform.constant.Constant;
|
||||||
|
import com.yfd.platform.system.domain.Message;
|
||||||
|
import com.yfd.platform.system.domain.SysUser;
|
||||||
|
import com.yfd.platform.system.service.IMessageService;
|
||||||
|
import com.yfd.platform.system.service.IUserService;
|
||||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author LiMengNan
|
||||||
|
* @Date: 2023/3/24 15:56
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class MessageConfig {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IMessageService messageService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IUserService userService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private WebConfig webConfig;
|
||||||
|
|
||||||
|
public void sendMessage() {
|
||||||
|
long count =
|
||||||
|
messageService.count(new LambdaQueryWrapper<Message>().eq(Message::getStatus, "1"));
|
||||||
|
String userId = userService.getUserInfo().getId();
|
||||||
|
String token = webConfig.loginuserCache().get(Constant.TOKEN + userId);
|
||||||
|
ServerSendEventServer.sendMessage(token, count + "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMessage(Message message) {
|
||||||
|
messageService.save(message);
|
||||||
|
long count =
|
||||||
|
messageService.count(new LambdaQueryWrapper<Message>().eq(Message::getStatus, "1"));
|
||||||
|
ServerSendEventServer.sendMessage(count + "");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2011-2022, baomidou (jobob@qq.com).
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.EnumValue;
|
||||||
|
import com.baomidou.mybatisplus.annotation.IEnum;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||||
|
import com.yfd.platform.utils.TypeUtils;
|
||||||
|
import org.apache.ibatis.reflection.DefaultReflectorFactory;
|
||||||
|
import org.apache.ibatis.reflection.MetaClass;
|
||||||
|
import org.apache.ibatis.reflection.ReflectorFactory;
|
||||||
|
import org.apache.ibatis.reflection.invoker.Invoker;
|
||||||
|
import org.apache.ibatis.type.BaseTypeHandler;
|
||||||
|
import org.apache.ibatis.type.JdbcType;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.sql.CallableStatement;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义枚举属性转换器
|
||||||
|
*
|
||||||
|
* @author hubin
|
||||||
|
* @since 2017-10-11
|
||||||
|
*/
|
||||||
|
public class MybatisEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
|
||||||
|
|
||||||
|
private static final Map<String, String> TABLE_METHOD_OF_ENUM_TYPES = new ConcurrentHashMap<>();
|
||||||
|
private static final ReflectorFactory REFLECTOR_FACTORY = new DefaultReflectorFactory();
|
||||||
|
private final Class<E> enumClassType;
|
||||||
|
private final Class<?> propertyType;
|
||||||
|
private final Invoker getInvoker;
|
||||||
|
|
||||||
|
public MybatisEnumTypeHandler(Class<E> enumClassType) {
|
||||||
|
if (enumClassType == null) {
|
||||||
|
throw new IllegalArgumentException("Type argument cannot be null");
|
||||||
|
}
|
||||||
|
this.enumClassType = enumClassType;
|
||||||
|
MetaClass metaClass = MetaClass.forClass(enumClassType, REFLECTOR_FACTORY);
|
||||||
|
String name = "value";
|
||||||
|
if (!IEnum.class.isAssignableFrom(enumClassType)) {
|
||||||
|
name = findEnumValueFieldName(this.enumClassType).orElseThrow(() -> new IllegalArgumentException(String.format("Could not find @EnumValue in Class: %s.", this.enumClassType.getName())));
|
||||||
|
}
|
||||||
|
this.propertyType = TypeUtils.resolvePrimitiveIfNecessary(metaClass.getGetterType(name));
|
||||||
|
this.getInvoker = metaClass.getGetInvoker(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查找标记标记EnumValue字段
|
||||||
|
*
|
||||||
|
* @param clazz class
|
||||||
|
* @return EnumValue字段
|
||||||
|
* @since 3.3.1
|
||||||
|
*/
|
||||||
|
public static Optional<String> findEnumValueFieldName(Class<?> clazz) {
|
||||||
|
if (clazz != null && clazz.isEnum()) {
|
||||||
|
String className = clazz.getName();
|
||||||
|
return Optional.ofNullable(CollectionUtils.computeIfAbsent(TABLE_METHOD_OF_ENUM_TYPES, className, key -> {
|
||||||
|
Optional<Field> fieldOptional = findEnumValueAnnotationField(clazz);
|
||||||
|
return fieldOptional.map(Field::getName).orElse(null);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Optional<Field> findEnumValueAnnotationField(Class<?> clazz) {
|
||||||
|
return Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.isAnnotationPresent(EnumValue.class)).findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否为MP枚举处理
|
||||||
|
*
|
||||||
|
* @param clazz class
|
||||||
|
* @return 是否为MP枚举处理
|
||||||
|
* @since 3.3.1
|
||||||
|
*/
|
||||||
|
public static boolean isMpEnums(Class<?> clazz) {
|
||||||
|
return clazz != null && clazz.isEnum() && (IEnum.class.isAssignableFrom(clazz) || findEnumValueFieldName(clazz).isPresent());
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("Duplicates")
|
||||||
|
@Override
|
||||||
|
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType)
|
||||||
|
throws SQLException {
|
||||||
|
if (jdbcType == null) {
|
||||||
|
ps.setObject(i, this.getValue(parameter));
|
||||||
|
} else {
|
||||||
|
// see r3589
|
||||||
|
ps.setObject(i, this.getValue(parameter), jdbcType.TYPE_CODE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
|
||||||
|
Object value = rs.getObject(columnName);
|
||||||
|
if (null == value && rs.wasNull()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return this.valueOf(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
|
||||||
|
Object value = rs.getObject(columnIndex, this.propertyType);
|
||||||
|
if (null == value && rs.wasNull()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return this.valueOf(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
|
||||||
|
Object value = cs.getObject(columnIndex, this.propertyType);
|
||||||
|
if (null == value && cs.wasNull()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return this.valueOf(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private E valueOf(Object value) {
|
||||||
|
E[] es = this.enumClassType.getEnumConstants();
|
||||||
|
return Arrays.stream(es).filter((e) -> equalsValue(value, getValue(e))).findAny().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 值比较
|
||||||
|
*
|
||||||
|
* @param sourceValue 数据库字段值
|
||||||
|
* @param targetValue 当前枚举属性值
|
||||||
|
* @return 是否匹配
|
||||||
|
* @since 3.3.0
|
||||||
|
*/
|
||||||
|
protected boolean equalsValue(Object sourceValue, Object targetValue) {
|
||||||
|
String sValue = StringUtils.toStringTrim(sourceValue);
|
||||||
|
String tValue = StringUtils.toStringTrim(targetValue);
|
||||||
|
if (sourceValue instanceof Number && targetValue instanceof Number
|
||||||
|
&& new BigDecimal(sValue).compareTo(new BigDecimal(tValue)) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Objects.equals(sValue, tValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getValue(Object object) {
|
||||||
|
try {
|
||||||
|
return this.getInvoker.invoke(object, new Object[0]);
|
||||||
|
} catch (ReflectiveOperationException e) {
|
||||||
|
throw ExceptionUtils.mpe(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.DbType;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/******************************
|
||||||
|
* 用途说明:
|
||||||
|
* 作者姓名: pcj
|
||||||
|
* 创建时间: 2022/10/24 10:50
|
||||||
|
******************************/
|
||||||
|
@Configuration
|
||||||
|
public class MybitsPlusConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||||
|
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
|
||||||
|
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
|
||||||
|
return mybatisPlusInterceptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
77
java/src/main/java/com/yfd/platform/config/QuartzConfig.java
Normal file
77
java/src/main/java/com/yfd/platform/config/QuartzConfig.java
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import org.quartz.Scheduler;
|
||||||
|
import org.quartz.spi.TriggerFiredBundle;
|
||||||
|
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.scheduling.quartz.AdaptableJobFactory;
|
||||||
|
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务配置
|
||||||
|
*
|
||||||
|
* @author /
|
||||||
|
* @date 2019-01-07
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class QuartzConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解决Job中注入Spring Bean为null的问题
|
||||||
|
*/
|
||||||
|
@Component("quartzJobFactory")
|
||||||
|
public static class QuartzJobFactory extends AdaptableJobFactory {
|
||||||
|
|
||||||
|
private final AutowireCapableBeanFactory capableBeanFactory;
|
||||||
|
|
||||||
|
public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
|
||||||
|
this.capableBeanFactory = capableBeanFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
|
||||||
|
|
||||||
|
//调用父类的方法
|
||||||
|
Object jobInstance = super.createJobInstance(bundle);
|
||||||
|
capableBeanFactory.autowireBean(jobInstance);
|
||||||
|
return jobInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注入scheduler到spring
|
||||||
|
*
|
||||||
|
* @param quartzJobFactory /
|
||||||
|
* @return Scheduler
|
||||||
|
* @throws Exception /
|
||||||
|
*/
|
||||||
|
@Bean(name = "scheduler")
|
||||||
|
public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception {
|
||||||
|
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
|
||||||
|
factoryBean.setJobFactory(quartzJobFactory);
|
||||||
|
factoryBean.afterPropertiesSet();
|
||||||
|
Scheduler scheduler = factoryBean.getScheduler();
|
||||||
|
scheduler.start();
|
||||||
|
return scheduler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class ResponseResult extends HashMap<String, Object> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
// 未登录状态码
|
||||||
|
public static final String CODE_NOT_LOGIN = "401";
|
||||||
|
// 成功状态码
|
||||||
|
public static final String CODE_SUCCESS = "0";
|
||||||
|
// 错误状态码
|
||||||
|
public static final String CODE_ERROR = "1";
|
||||||
|
|
||||||
|
public ResponseResult() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseResult unlogin() {
|
||||||
|
return message(CODE_NOT_LOGIN, "未登录");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseResult error() {
|
||||||
|
return error("操作失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseResult success() {
|
||||||
|
return success("操作成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseResult error(String msg) {
|
||||||
|
ResponseResult json = new ResponseResult();
|
||||||
|
json.put("code", CODE_ERROR);
|
||||||
|
json.put("msg", msg);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseResult message(String code, String msg) {
|
||||||
|
ResponseResult json = new ResponseResult();
|
||||||
|
json.put("code", code);
|
||||||
|
json.put("msg", msg);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseResult success(String msg) {
|
||||||
|
ResponseResult json = new ResponseResult();
|
||||||
|
json.put("code", CODE_SUCCESS);
|
||||||
|
json.put("msg", msg);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseResult successData(Object obj) {
|
||||||
|
ResponseResult json = new ResponseResult();
|
||||||
|
json.put("code", CODE_SUCCESS);
|
||||||
|
json.put("msg", "操作成功");
|
||||||
|
json.put("data", obj);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ResponseResult put(String key, Object value) {
|
||||||
|
super.put(key, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
111
java/src/main/java/com/yfd/platform/config/SecurityConfig.java
Normal file
111
java/src/main/java/com/yfd/platform/config/SecurityConfig.java
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import com.yfd.platform.config.bean.LoginProperties;
|
||||||
|
import com.yfd.platform.exception.AccessDeniedHandExcetion;
|
||||||
|
import com.yfd.platform.exception.AuthenticationException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.security.authentication.AuthenticationManager;
|
||||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||||
|
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class SecurityConfig extends WebSecurityConfigurerAdapter
|
||||||
|
{
|
||||||
|
// 注入了加密算法
|
||||||
|
@Bean
|
||||||
|
public PasswordEncoder passwordEncoder() {
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConfigurationProperties(prefix = "login", ignoreUnknownFields = true)
|
||||||
|
public LoginProperties loginProperties() {
|
||||||
|
return new LoginProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Override
|
||||||
|
public AuthenticationManager authenticationManagerBean() throws Exception{
|
||||||
|
return super.authenticationManagerBean();
|
||||||
|
}
|
||||||
|
@Autowired
|
||||||
|
private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AuthenticationException authenticationException;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AccessDeniedHandExcetion accessDeniedHandExcetion;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure(HttpSecurity httpSecurity) throws Exception {
|
||||||
|
httpSecurity
|
||||||
|
// 关闭 CSRF
|
||||||
|
.csrf().disable()
|
||||||
|
//不通过Session获取SecurityContext
|
||||||
|
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
|
||||||
|
.and()
|
||||||
|
//对于登录接口,允许匿名访问
|
||||||
|
.authorizeRequests()
|
||||||
|
.antMatchers("/user/login").anonymous()
|
||||||
|
.antMatchers("/user/code").permitAll()
|
||||||
|
.antMatchers("/app/app-doctor/*").permitAll()//医生登录
|
||||||
|
.antMatchers("/app/app-user/*").permitAll() //家长登录
|
||||||
|
.and()
|
||||||
|
.authorizeRequests()
|
||||||
|
// 放行静态资源
|
||||||
|
.antMatchers(
|
||||||
|
HttpMethod.GET,
|
||||||
|
"/*.html",
|
||||||
|
"/**/*.html",
|
||||||
|
"/**/*.css",
|
||||||
|
"/**/*.js",
|
||||||
|
"/webSocket/**"
|
||||||
|
).permitAll()
|
||||||
|
// 放行 swagger 文档
|
||||||
|
.antMatchers("/swagger-ui.html").permitAll()
|
||||||
|
.antMatchers("/swagger-resources/**").permitAll()
|
||||||
|
.antMatchers("/webjars/**").permitAll()
|
||||||
|
.antMatchers("/*/api-docs").permitAll()
|
||||||
|
// 放行 图片预览
|
||||||
|
.antMatchers("/report/**").permitAll()
|
||||||
|
.antMatchers("/images/**").permitAll()
|
||||||
|
.antMatchers("/pageimage/**").permitAll()
|
||||||
|
.antMatchers("/avatar/**").permitAll()
|
||||||
|
.antMatchers("/systemurl/**").permitAll()
|
||||||
|
.antMatchers("/api/imageserver/upload").permitAll()
|
||||||
|
.antMatchers("/activity/**").permitAll()
|
||||||
|
.antMatchers("/appnews/**").permitAll()
|
||||||
|
.antMatchers("/QRcode/**").permitAll()
|
||||||
|
.antMatchers("/template/**").permitAll()
|
||||||
|
.antMatchers("/tempword/**").permitAll()
|
||||||
|
.antMatchers("/tempzip/**").permitAll()
|
||||||
|
|
||||||
|
//测试放行所有访问
|
||||||
|
.antMatchers("/**/**").permitAll()
|
||||||
|
//除上面外的所有请求全部需要签权认证
|
||||||
|
.anyRequest().authenticated();
|
||||||
|
|
||||||
|
//允许跨域
|
||||||
|
httpSecurity.cors();
|
||||||
|
|
||||||
|
//将jwt过来器加入到httpSecurity过滤器链中
|
||||||
|
httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
|
||||||
|
|
||||||
|
//配置异常处理器
|
||||||
|
httpSecurity.exceptionHandling()
|
||||||
|
.authenticationEntryPoint(authenticationException)
|
||||||
|
.accessDeniedHandler(accessDeniedHandExcetion);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import io.swagger.models.auth.In;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import springfox.documentation.builders.ApiInfoBuilder;
|
||||||
|
import springfox.documentation.builders.PathSelectors;
|
||||||
|
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||||
|
import springfox.documentation.builders.RequestParameterBuilder;
|
||||||
|
import springfox.documentation.service.ApiInfo;
|
||||||
|
import springfox.documentation.service.Contact;
|
||||||
|
import springfox.documentation.service.RequestParameter;
|
||||||
|
import springfox.documentation.spi.DocumentationType;
|
||||||
|
import springfox.documentation.spring.web.plugins.Docket;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* swagger配置
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class SwaggerConfig {
|
||||||
|
|
||||||
|
Boolean swaggerEnabled = true;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Docket createRestGBApi() {
|
||||||
|
return new Docket(DocumentationType.OAS_30)
|
||||||
|
.apiInfo(apiInfo())
|
||||||
|
// .globalRequestParameters(generateRequestParameters())
|
||||||
|
.groupName("1. 系统管理")
|
||||||
|
.select()
|
||||||
|
.apis(RequestHandlerSelectors.basePackage("com.yfd.platform.system.controller"))
|
||||||
|
.paths(PathSelectors.any())
|
||||||
|
.build()
|
||||||
|
.pathMapping("/")
|
||||||
|
.enable(swaggerEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Docket createRestStorageApi() {
|
||||||
|
return new Docket(DocumentationType.OAS_30)
|
||||||
|
.apiInfo(apiInfo())
|
||||||
|
// .globalRequestParameters(generateRequestParameters())
|
||||||
|
.groupName("2. 文件存储管理")
|
||||||
|
.select()
|
||||||
|
.apis(RequestHandlerSelectors.basePackage("com.yfd.platform.modules.storage.controller"))
|
||||||
|
.paths(PathSelectors.any())
|
||||||
|
.build()
|
||||||
|
.pathMapping("/")
|
||||||
|
.enable(swaggerEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取通用的全局参数
|
||||||
|
*
|
||||||
|
* @return 全局参数列表
|
||||||
|
*/
|
||||||
|
private List<RequestParameter> generateRequestParameters(){
|
||||||
|
RequestParameterBuilder token = new RequestParameterBuilder();
|
||||||
|
List<RequestParameter> parameters = new ArrayList<>();
|
||||||
|
token.name("token").description("token").in(In.HEADER.toValue()).required(true).build();
|
||||||
|
parameters.add(token.build());
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private ApiInfo apiInfo() {
|
||||||
|
return new ApiInfoBuilder()
|
||||||
|
.title("项目API 接口文档")
|
||||||
|
.description("")
|
||||||
|
.contact(new Contact("郑顺利", "郑顺利", "13910913995@163.com"))
|
||||||
|
.version("3.0")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
86
java/src/main/java/com/yfd/platform/config/WebConfig.java
Normal file
86
java/src/main/java/com/yfd/platform/config/WebConfig.java
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import cn.hutool.cache.Cache;
|
||||||
|
import cn.hutool.cache.CacheUtil;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.cors.CorsConfiguration;
|
||||||
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||||
|
import org.springframework.web.filter.CorsFilter;
|
||||||
|
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class WebConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
|
@Value("${file-space.system}")
|
||||||
|
private String systempath;
|
||||||
|
|
||||||
|
private final ServletContext servletContext;
|
||||||
|
|
||||||
|
public WebConfig(ServletContext servletContext) {
|
||||||
|
this.servletContext = servletContext;
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public Cache<String, String> loginuserCache() {
|
||||||
|
return CacheUtil.newLRUCache(200);//用户登录缓存数 缺省200
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CorsFilter corsFilter() {
|
||||||
|
UrlBasedCorsConfigurationSource source =
|
||||||
|
new UrlBasedCorsConfigurationSource();
|
||||||
|
CorsConfiguration config = new CorsConfiguration();
|
||||||
|
config.setAllowCredentials(true);
|
||||||
|
config.addAllowedOriginPattern("*");
|
||||||
|
config.addAllowedHeader("*");
|
||||||
|
config.addAllowedMethod("*");
|
||||||
|
config.setMaxAge(3600L);
|
||||||
|
source.registerCorsConfiguration("/**", config);
|
||||||
|
return new CorsFilter(source);
|
||||||
|
}
|
||||||
|
private boolean isTomcatEnvironment() {
|
||||||
|
// 在此处可以根据不同的条件来判断当前运行环境
|
||||||
|
// 例如可以检查System.getProperty("catalina.home")是否存在
|
||||||
|
// 或者检查是否存在某个特定的系统属性来区分环境
|
||||||
|
// return System.getProperty("catalina.home") != null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
@Override
|
||||||
|
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||||
|
if (isTomcatEnvironment()) {
|
||||||
|
// Tomcat部署环境
|
||||||
|
String appRoot = servletContext.getRealPath("/");
|
||||||
|
String iconPath = appRoot + "WEB-INF/classes/static/icon/";
|
||||||
|
|
||||||
|
registry.addResourceHandler("/menu/**")
|
||||||
|
.addResourceLocations("file:" + iconPath)
|
||||||
|
.setCachePeriod(0);
|
||||||
|
} else {
|
||||||
|
// IDEA开发环境
|
||||||
|
registry.addResourceHandler("/menu/**")
|
||||||
|
.addResourceLocations("classpath:/static/icon/")
|
||||||
|
.setCachePeriod(0);
|
||||||
|
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
|
||||||
|
"classpath:/META-INF/resources/");
|
||||||
|
}
|
||||||
|
|
||||||
|
String menuUrl = "file:" + systempath + "menu/";
|
||||||
|
registry.addResourceHandler("/menu/**").addResourceLocations(menuUrl).setCachePeriod(0);
|
||||||
|
|
||||||
|
|
||||||
|
String systemUrl = "file:" + systempath + "user/";
|
||||||
|
registry.addResourceHandler("/avatar/**").addResourceLocations(systemUrl).setCachePeriod(0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.yfd.platform.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class WebSocketConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ServerEndpointExporter serverEndpointExporter() {
|
||||||
|
|
||||||
|
return new ServerEndpointExporter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config.bean;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录验证码配置信息
|
||||||
|
*
|
||||||
|
* @author: liaojinlong
|
||||||
|
* @date: 2020/6/10 18:53
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LoginCode {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证码配置
|
||||||
|
*/
|
||||||
|
private LoginCodeEnum codeType;
|
||||||
|
/**
|
||||||
|
* 验证码有效期 分钟
|
||||||
|
*/
|
||||||
|
private Long expiration = 2L;
|
||||||
|
/**
|
||||||
|
* 验证码内容长度
|
||||||
|
*/
|
||||||
|
private int length = 2;
|
||||||
|
/**
|
||||||
|
* 验证码宽度
|
||||||
|
*/
|
||||||
|
private int width = 111;
|
||||||
|
/**
|
||||||
|
* 验证码高度
|
||||||
|
*/
|
||||||
|
private int height = 36;
|
||||||
|
/**
|
||||||
|
* 验证码字体
|
||||||
|
*/
|
||||||
|
private String fontName;
|
||||||
|
/**
|
||||||
|
* 字体大小
|
||||||
|
*/
|
||||||
|
private int fontSize = 25;
|
||||||
|
|
||||||
|
public LoginCodeEnum getCodeType() {
|
||||||
|
return codeType;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config.bean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证码配置枚举
|
||||||
|
*
|
||||||
|
* @author: liaojinlong
|
||||||
|
* @date: 2020/6/10 17:40
|
||||||
|
*/
|
||||||
|
|
||||||
|
public enum LoginCodeEnum {
|
||||||
|
/**
|
||||||
|
* 算数
|
||||||
|
*/
|
||||||
|
arithmetic,
|
||||||
|
/**
|
||||||
|
* 中文
|
||||||
|
*/
|
||||||
|
chinese,
|
||||||
|
/**
|
||||||
|
* 中文闪图
|
||||||
|
*/
|
||||||
|
chinese_gif,
|
||||||
|
/**
|
||||||
|
* 闪图
|
||||||
|
*/
|
||||||
|
gif,
|
||||||
|
spec
|
||||||
|
}
|
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version loginCode.length.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-loginCode.length.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config.bean;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.wf.captcha.*;
|
||||||
|
import com.wf.captcha.base.Captcha;
|
||||||
|
import com.yfd.platform.exception.BadConfigurationException;
|
||||||
|
import lombok.Data;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置文件读取
|
||||||
|
*
|
||||||
|
* @author liaojinlong
|
||||||
|
* @date loginCode.length0loginCode.length0/6/10 17:loginCode.length6
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class LoginProperties {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账号单用户 登录
|
||||||
|
*/
|
||||||
|
private boolean singleLogin = false;
|
||||||
|
|
||||||
|
private LoginCode loginCode;
|
||||||
|
/**
|
||||||
|
* 用户登录信息缓存
|
||||||
|
*/
|
||||||
|
private boolean cacheEnable;
|
||||||
|
|
||||||
|
public boolean isSingleLogin() {
|
||||||
|
return singleLogin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCacheEnable() {
|
||||||
|
return cacheEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取验证码生产类
|
||||||
|
*
|
||||||
|
* @return /
|
||||||
|
*/
|
||||||
|
public Captcha getCaptcha() {
|
||||||
|
if (Objects.isNull(loginCode)) {
|
||||||
|
loginCode = new LoginCode();
|
||||||
|
if (Objects.isNull(loginCode.getCodeType())) {
|
||||||
|
loginCode.setCodeType(LoginCodeEnum.arithmetic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return switchCaptcha(loginCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 依据配置信息生产验证码
|
||||||
|
*
|
||||||
|
* @param loginCode 验证码配置信息
|
||||||
|
* @return /
|
||||||
|
*/
|
||||||
|
private Captcha switchCaptcha(LoginCode loginCode) {
|
||||||
|
Captcha captcha;
|
||||||
|
synchronized (this) {
|
||||||
|
switch (loginCode.getCodeType()) {
|
||||||
|
case arithmetic:
|
||||||
|
// 算术类型 https://gitee.com/whvse/EasyCaptcha
|
||||||
|
captcha = new ArithmeticCaptcha(loginCode.getWidth(), loginCode.getHeight());
|
||||||
|
// 几位数运算,默认是两位
|
||||||
|
captcha.setLen(loginCode.getLength());
|
||||||
|
break;
|
||||||
|
case chinese:
|
||||||
|
captcha = new ChineseCaptcha(loginCode.getWidth(), loginCode.getHeight());
|
||||||
|
captcha.setLen(loginCode.getLength());
|
||||||
|
break;
|
||||||
|
case chinese_gif:
|
||||||
|
captcha = new ChineseGifCaptcha(loginCode.getWidth(), loginCode.getHeight());
|
||||||
|
captcha.setLen(loginCode.getLength());
|
||||||
|
break;
|
||||||
|
case gif:
|
||||||
|
captcha = new GifCaptcha(loginCode.getWidth(), loginCode.getHeight());
|
||||||
|
captcha.setLen(loginCode.getLength());
|
||||||
|
break;
|
||||||
|
case spec:
|
||||||
|
captcha = new SpecCaptcha(loginCode.getWidth(), loginCode.getHeight());
|
||||||
|
captcha.setLen(loginCode.getLength());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new BadConfigurationException("验证码配置信息错误!正确配置查看 LoginCodeEnum ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(StrUtil.isNotBlank(loginCode.getFontName())){
|
||||||
|
captcha.setFont(new Font(loginCode.getFontName(), Font.PLAIN, loginCode.getFontSize()));
|
||||||
|
}
|
||||||
|
return captcha;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package com.yfd.platform.config.thread;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableAsync
|
||||||
|
public class AsyncConfig {
|
||||||
|
|
||||||
|
@Bean(name = "asyncExecutor")
|
||||||
|
public Executor asyncExecutor() {
|
||||||
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||||
|
// 核心线程数(处理器数量)
|
||||||
|
executor.setCorePoolSize(16);
|
||||||
|
// 最大线程数
|
||||||
|
executor.setMaxPoolSize(64);
|
||||||
|
// 队列容量
|
||||||
|
executor.setQueueCapacity(100);
|
||||||
|
// 线程名前缀
|
||||||
|
executor.setThreadNamePrefix("AsyncThread-");
|
||||||
|
// 线程池任务拒绝策略
|
||||||
|
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
|
||||||
|
executor.initialize();
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config.thread;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.scheduling.annotation.AsyncConfigurer;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步任务线程池装配类
|
||||||
|
* @author https://juejin.im/entry/5abb8f6951882555677e9da2
|
||||||
|
* @date 2019年10月31日15:06:18
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Configuration
|
||||||
|
public class AsyncTaskExecutePool implements AsyncConfigurer {
|
||||||
|
|
||||||
|
/** 注入配置类 */
|
||||||
|
private final AsyncTaskProperties config;
|
||||||
|
|
||||||
|
public AsyncTaskExecutePool(AsyncTaskProperties config) {
|
||||||
|
this.config = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Executor getAsyncExecutor() {
|
||||||
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||||
|
//核心线程池大小
|
||||||
|
executor.setCorePoolSize(config.getCorePoolSize());
|
||||||
|
//最大线程数
|
||||||
|
executor.setMaxPoolSize(config.getMaxPoolSize());
|
||||||
|
//队列容量
|
||||||
|
executor.setQueueCapacity(config.getQueueCapacity());
|
||||||
|
//活跃时间
|
||||||
|
executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
|
||||||
|
//线程名字前缀
|
||||||
|
executor.setThreadNamePrefix("el-async-");
|
||||||
|
// setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务
|
||||||
|
// CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
|
||||||
|
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
|
||||||
|
executor.initialize();
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
|
||||||
|
return (throwable, method, objects) -> {
|
||||||
|
log.error("===="+throwable.getMessage()+"====", throwable);
|
||||||
|
log.error("exception method:"+method.getName());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config.thread;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 线程池配置属性类
|
||||||
|
* @author https://juejin.im/entry/5abb8f6951882555677e9da2
|
||||||
|
* @date 2019年10月31日14:58:18
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties(prefix = "task.pool")
|
||||||
|
public class AsyncTaskProperties {
|
||||||
|
|
||||||
|
private int corePoolSize;
|
||||||
|
|
||||||
|
private int maxPoolSize;
|
||||||
|
|
||||||
|
private int keepAliveSeconds;
|
||||||
|
|
||||||
|
private int queueCapacity;
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config.thread;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadFactory;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义线程名称
|
||||||
|
* @author
|
||||||
|
* @date 2019年10月31日17:49:55
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class TheadFactoryName implements ThreadFactory {
|
||||||
|
|
||||||
|
private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
|
||||||
|
private final ThreadGroup group;
|
||||||
|
private final AtomicInteger threadNumber = new AtomicInteger(1);
|
||||||
|
private final String namePrefix;
|
||||||
|
|
||||||
|
public TheadFactoryName() {
|
||||||
|
this("el-pool");
|
||||||
|
}
|
||||||
|
|
||||||
|
private TheadFactoryName(String name){
|
||||||
|
SecurityManager s = System.getSecurityManager();
|
||||||
|
group = (s != null) ? s.getThreadGroup() :
|
||||||
|
Thread.currentThread().getThreadGroup();
|
||||||
|
//此时namePrefix就是 name + 第几个用这个工厂创建线程池的
|
||||||
|
this.namePrefix = name +
|
||||||
|
POOL_NUMBER.getAndIncrement();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Thread newThread(Runnable r) {
|
||||||
|
//此时线程的名字 就是 namePrefix + -thread- + 这个线程池中第几个执行的线程
|
||||||
|
Thread t = new Thread(group, r,
|
||||||
|
namePrefix + "-thread-"+threadNumber.getAndIncrement(),
|
||||||
|
0);
|
||||||
|
if (t.isDaemon()) {
|
||||||
|
t.setDaemon(false);
|
||||||
|
}
|
||||||
|
if (t.getPriority() != Thread.NORM_PRIORITY) {
|
||||||
|
t.setPriority(Thread.NORM_PRIORITY);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.config.thread;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.yfd.platform.utils.SpringContextHolder;
|
||||||
|
|
||||||
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于获取自定义线程池
|
||||||
|
* @author
|
||||||
|
* @date 2019年10月31日18:16:47
|
||||||
|
*/
|
||||||
|
public class ThreadPoolExecutorUtil {
|
||||||
|
|
||||||
|
public static ThreadPoolExecutor getPoll(){
|
||||||
|
AsyncTaskProperties properties = SpringContextHolder.getBean(AsyncTaskProperties.class);
|
||||||
|
return new ThreadPoolExecutor(
|
||||||
|
properties.getCorePoolSize(),
|
||||||
|
properties.getMaxPoolSize(),
|
||||||
|
properties.getKeepAliveSeconds(),
|
||||||
|
TimeUnit.SECONDS,
|
||||||
|
new ArrayBlockingQueue<>(properties.getQueueCapacity()),
|
||||||
|
new TheadFactoryName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
48
java/src/main/java/com/yfd/platform/constant/Constant.java
Normal file
48
java/src/main/java/com/yfd/platform/constant/Constant.java
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package com.yfd.platform.constant;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author LiMengNan
|
||||||
|
* @Date: 2023/3/3 17:40
|
||||||
|
* @Description: 常量类
|
||||||
|
*/
|
||||||
|
public class Constant {
|
||||||
|
|
||||||
|
public static final String LOGIN = "login:";
|
||||||
|
public static final String TOKEN = "token:";
|
||||||
|
public static final String USER_ID = "userid";
|
||||||
|
public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
|
||||||
|
public static final String CODE_KEY = "code-key-";
|
||||||
|
public static final long CODE_EXPIRATION_TIME = 1000 * 60;
|
||||||
|
/**
|
||||||
|
* 用于IP定位转换
|
||||||
|
*/
|
||||||
|
public static final String REGION = "内网IP|内网IP";
|
||||||
|
/**
|
||||||
|
* win 系统
|
||||||
|
*/
|
||||||
|
public static final String WIN = "win";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mac 系统
|
||||||
|
*/
|
||||||
|
public static final String MAC = "mac";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 常用接口
|
||||||
|
*/
|
||||||
|
public static class Url {
|
||||||
|
|
||||||
|
// IP归属地查询
|
||||||
|
// public static final String IP_URL = "http://whois.pconline.com
|
||||||
|
// .cn/ipJson.jsp?ip=%s&json=true";
|
||||||
|
public static final String IP_URL = "http://whois.pconline.com" +
|
||||||
|
".cn/ipJson.jsp?ip=%s&json=true";
|
||||||
|
}
|
||||||
|
public final static List<String> GRADE_NAMES = Arrays.asList("小班", "中班", "大班", "大大班", "小学一年级", "小学二年级", "小学三年级", "小学四年级", "小学五年级", "小学六年级",
|
||||||
|
"初中一年级", "初中二年级", "初中三年级", "初中四年级",
|
||||||
|
"高中一年级", "高中二年级", "高中三年级", "高中四年级", "高中五年级", "高中六年级", "高中七年级");
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.yfd.platform.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Slf4j mdc 常量
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public class MdcConstant {
|
||||||
|
|
||||||
|
public static final String TRACE_ID = "traceId";
|
||||||
|
|
||||||
|
public static final String IP = "ip";
|
||||||
|
|
||||||
|
public static final String USER = "user";
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.yfd.platform.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置字段常量.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public class SystemConfigConstant {
|
||||||
|
|
||||||
|
public static final String RSA_HEX_KEY = "rsaHexKey";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.yfd.platform.constant;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ZFile 常量
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class ZFileConstant {
|
||||||
|
|
||||||
|
public static final Character PATH_SEPARATOR_CHAR = '/';
|
||||||
|
|
||||||
|
public static final String PATH_SEPARATOR = "/";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最大支持文本文件大小为 ? KB 的文件内容.
|
||||||
|
*/
|
||||||
|
public static Long TEXT_MAX_FILE_SIZE_KB = 100L;
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setTextMaxFileSizeMb(@Value("${file-system.preview.text.maxFileSizeKb}") Long maxFileSizeKb) {
|
||||||
|
ZFileConstant.TEXT_MAX_FILE_SIZE_KB = maxFileSizeKb;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.yfd.platform.datasource;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
/******************************
|
||||||
|
* 用途说明:
|
||||||
|
* 作者姓名: wxy
|
||||||
|
* 创建时间: 2022/9/23 17:48
|
||||||
|
******************************/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Documented
|
||||||
|
public @interface DataSource {
|
||||||
|
|
||||||
|
String name() default "";
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
package com.yfd.platform.datasource;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
/******************************
|
||||||
|
* 用途说明:
|
||||||
|
* 作者姓名: wxy
|
||||||
|
* 创建时间: 2022/9/23 17:50
|
||||||
|
******************************/
|
||||||
|
@Aspect
|
||||||
|
@Component
|
||||||
|
public class DataSourceAspect {
|
||||||
|
|
||||||
|
@Pointcut("@annotation(com.yfd.platform.datasource.DataSource)")
|
||||||
|
public void dataSourcePointCut() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String DataBaseName;
|
||||||
|
|
||||||
|
@Around("dataSourcePointCut()")
|
||||||
|
public Object around(ProceedingJoinPoint point) throws Throwable {
|
||||||
|
MethodSignature signature = (MethodSignature) point.getSignature();
|
||||||
|
Method method = signature.getMethod();
|
||||||
|
if (StrUtil.isNotBlank(DataBaseName)){
|
||||||
|
DynamicDataSource.setDataSource(DataBaseName);
|
||||||
|
}else {
|
||||||
|
DynamicDataSource.setDataSource("master");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return point.proceed();
|
||||||
|
} finally {
|
||||||
|
DynamicDataSource.clearDataSource();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDataBase(Integer type){
|
||||||
|
if (type == 1){
|
||||||
|
DataBaseName="master";
|
||||||
|
}else {
|
||||||
|
DataBaseName="slave";
|
||||||
|
}
|
||||||
|
return DataBaseName;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.yfd.platform.datasource;
|
||||||
|
|
||||||
|
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/******************************
|
||||||
|
* 用途说明:
|
||||||
|
* 作者姓名: wxy
|
||||||
|
* 创建时间: 2022/9/23 17:47
|
||||||
|
******************************/
|
||||||
|
public class DynamicDataSource extends AbstractRoutingDataSource {
|
||||||
|
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
|
||||||
|
|
||||||
|
public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
|
||||||
|
super.setDefaultTargetDataSource(defaultTargetDataSource);
|
||||||
|
super.setTargetDataSources(targetDataSources);
|
||||||
|
super.afterPropertiesSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object determineCurrentLookupKey() {
|
||||||
|
return getDataSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDataSource(String dataSource) {
|
||||||
|
contextHolder.set(dataSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDataSource() {
|
||||||
|
return contextHolder.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clearDataSource() {
|
||||||
|
contextHolder.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.yfd.platform.datasource;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Primary;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/******************************
|
||||||
|
* 用途说明:
|
||||||
|
* 作者姓名: wxy
|
||||||
|
* 创建时间: 2022/9/23 17:45
|
||||||
|
******************************/
|
||||||
|
@Configuration
|
||||||
|
@Component
|
||||||
|
public class DynamicDataSourceConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConfigurationProperties("spring.datasource.druid.master")
|
||||||
|
public DataSource wglMasterDataSource(){
|
||||||
|
return DruidDataSourceBuilder.create().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@Primary
|
||||||
|
public DynamicDataSource dataSource(DataSource wglMasterDataSource, DataSource wglSlaveDataSource) {
|
||||||
|
Map<Object, Object> targetDataSources = new HashMap<>();
|
||||||
|
targetDataSources.put("master",wglMasterDataSource);
|
||||||
|
return new DynamicDataSource(wglMasterDataSource, targetDataSources);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.access.AccessDeniedException;
|
||||||
|
import org.springframework.security.web.access.AccessDeniedHandler;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
@Component
|
||||||
|
public class AccessDeniedHandExcetion implements AccessDeniedHandler {
|
||||||
|
@Override
|
||||||
|
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
|
||||||
|
JSONObject jobj=new JSONObject();
|
||||||
|
jobj.putOnce("status","403");
|
||||||
|
jobj.putOnce("msg","用户权限不足,不能访问");
|
||||||
|
response.setStatus(200);
|
||||||
|
response.setContentType("application/json");
|
||||||
|
response.setCharacterEncoding("utf-8");
|
||||||
|
response.getWriter().println(JSONUtil.toJsonStr(jobj));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.yfd.platform.config.ResponseResult;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.web.AuthenticationEntryPoint;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
@Component
|
||||||
|
public class AuthenticationException implements AuthenticationEntryPoint {
|
||||||
|
@Override
|
||||||
|
public void commence(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.AuthenticationException authException) throws IOException, ServletException {
|
||||||
|
JSONObject jobj=new JSONObject();
|
||||||
|
if(authException.getMessage().equals("用户账号不存在!")){
|
||||||
|
jobj.putOnce("code","401");
|
||||||
|
jobj.putOnce("msg","用户账号不存在/密码错误,登录失败!");
|
||||||
|
}else{
|
||||||
|
jobj.putOnce("code","401");
|
||||||
|
jobj.putOnce("msg","用户Token失效,请重新登录!");
|
||||||
|
}
|
||||||
|
response.setStatus(200);
|
||||||
|
response.setContentType("application/json");
|
||||||
|
response.setCharacterEncoding("utf-8");
|
||||||
|
response.getWriter().println(JSONUtil.toJsonStr(jobj));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统一关于错误配置信息 异常
|
||||||
|
*
|
||||||
|
* @author: liaojinlong
|
||||||
|
* @date: 2020/6/10 18:06
|
||||||
|
*/
|
||||||
|
public class BadConfigurationException extends RuntimeException {
|
||||||
|
/**
|
||||||
|
* Constructs a new runtime exception with {@code null} as its
|
||||||
|
* detail message. The cause is not initialized, and may subsequently be
|
||||||
|
* initialized by a call to {@link #initCause}.
|
||||||
|
*/
|
||||||
|
public BadConfigurationException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new runtime exception with the specified detail message.
|
||||||
|
* The cause is not initialized, and may subsequently be initialized by a
|
||||||
|
* call to {@link #initCause}.
|
||||||
|
*
|
||||||
|
* @param message the detail message. The detail message is saved for
|
||||||
|
* later retrieval by the {@link #getMessage()} method.
|
||||||
|
*/
|
||||||
|
public BadConfigurationException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new runtime exception with the specified detail message and
|
||||||
|
* cause. <p>Note that the detail message associated with
|
||||||
|
* {@code cause} is <i>not</i> automatically incorporated in
|
||||||
|
* this runtime exception's detail message.
|
||||||
|
*
|
||||||
|
* @param message the detail message (which is saved for later retrieval
|
||||||
|
* by the {@link #getMessage()} method).
|
||||||
|
* @param cause the cause (which is saved for later retrieval by the
|
||||||
|
* {@link #getCause()} method). (A {@code null} value is
|
||||||
|
* permitted, and indicates that the cause is nonexistent or
|
||||||
|
* unknown.)
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
public BadConfigurationException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new runtime exception with the specified cause and a
|
||||||
|
* detail message of {@code (cause==null ? null : cause.toString())}
|
||||||
|
* (which typically contains the class and detail message of
|
||||||
|
* {@code cause}). This constructor is useful for runtime exceptions
|
||||||
|
* that are little more than wrappers for other throwables.
|
||||||
|
*
|
||||||
|
* @param cause the cause (which is saved for later retrieval by the
|
||||||
|
* {@link #getCause()} method). (A {@code null} value is
|
||||||
|
* permitted, and indicates that the cause is nonexistent or
|
||||||
|
* unknown.)
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
public BadConfigurationException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new runtime exception with the specified detail
|
||||||
|
* message, cause, suppression enabled or disabled, and writable
|
||||||
|
* stack trace enabled or disabled.
|
||||||
|
*
|
||||||
|
* @param message the detail message.
|
||||||
|
* @param cause the cause. (A {@code null} value is permitted,
|
||||||
|
* and indicates that the cause is nonexistent or unknown.)
|
||||||
|
* @param enableSuppression whether or not suppression is enabled
|
||||||
|
* or disabled
|
||||||
|
* @param writableStackTrace whether or not the stack trace should
|
||||||
|
* be writable
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
protected BadConfigurationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||||
|
super(message, cause, enableSuppression, writableStackTrace);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
|
import static org.springframework.http.HttpStatus.BAD_REQUEST;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author
|
||||||
|
* @date 2018-11-23
|
||||||
|
* 统一异常处理
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public class BadRequestException extends RuntimeException{
|
||||||
|
|
||||||
|
private Integer status = BAD_REQUEST.value();
|
||||||
|
|
||||||
|
public BadRequestException(String msg){
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BadRequestException(HttpStatus status, String msg){
|
||||||
|
super(msg);
|
||||||
|
this.status = status.value();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author pcj
|
||||||
|
* @Date 2021/1/26 9:07
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
public class ChildrenExistException extends RuntimeException{
|
||||||
|
|
||||||
|
public ChildrenExistException(Class clazz, String field, String val) {
|
||||||
|
super(ChildrenExistException.generateMessage(clazz.getSimpleName(), field, val));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String generateMessage(String entity, String field, String val) {
|
||||||
|
return StringUtils.capitalize(entity)
|
||||||
|
+ " with " + field + " "+ val + " Children Exist";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author
|
||||||
|
* @date 2018-11-23
|
||||||
|
*/
|
||||||
|
public class EntityExistException extends RuntimeException {
|
||||||
|
|
||||||
|
public EntityExistException(Class clazz, String field, String val) {
|
||||||
|
super(EntityExistException.generateMessage(clazz.getSimpleName(), field, val));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String generateMessage(String entity, String field, String val) {
|
||||||
|
return StringUtils.capitalize(entity)
|
||||||
|
+ " with " + field + " "+ val + " existed";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author
|
||||||
|
* @date 2018-11-23
|
||||||
|
*/
|
||||||
|
public class EntityNotFoundException extends RuntimeException {
|
||||||
|
|
||||||
|
public EntityNotFoundException(Class clazz, String field, String val) {
|
||||||
|
super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), field, val));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String generateMessage(String entity, String field, String val) {
|
||||||
|
return StringUtils.capitalize(entity)
|
||||||
|
+ " with " + field + " "+ val + " does not exist";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import com.yfd.platform.utils.CodeMsg;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service 层异常
|
||||||
|
* 所有 message 均为系统日志打印输出, CodeMsg 中的消息才是返回给客户端的消息.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class ServiceException extends RuntimeException {
|
||||||
|
|
||||||
|
private CodeMsg codeMsg;
|
||||||
|
|
||||||
|
public ServiceException(CodeMsg codeMsg) {
|
||||||
|
this.codeMsg = codeMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(String message, CodeMsg codeMsg) {
|
||||||
|
super(message);
|
||||||
|
this.codeMsg = codeMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(String message, Throwable cause, CodeMsg codeMsg) {
|
||||||
|
super(message, cause);
|
||||||
|
this.codeMsg = codeMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(Throwable cause, CodeMsg codeMsg) {
|
||||||
|
super(cause);
|
||||||
|
this.codeMsg = codeMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, CodeMsg codeMsg) {
|
||||||
|
super(message, cause, enableSuppression, writableStackTrace);
|
||||||
|
this.codeMsg = codeMsg;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.storage.model.param.IStorageParam;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源自动设置 cors 异常
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public class StorageSourceAutoConfigCorsException extends RuntimeException {
|
||||||
|
|
||||||
|
private final IStorageParam iStorageParam;
|
||||||
|
|
||||||
|
public StorageSourceAutoConfigCorsException(String message, Throwable cause, IStorageParam iStorageParam) {
|
||||||
|
super(message, cause);
|
||||||
|
this.iStorageParam = iStorageParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import com.yfd.platform.utils.CodeMsg;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源异常
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Getter
|
||||||
|
public class StorageSourceException extends ServiceException {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否使用异常消息进行接口返回,如果是则取异常的 message, 否则取 CodeMsg 中的 message
|
||||||
|
*/
|
||||||
|
private boolean responseExceptionMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源 ID
|
||||||
|
*/
|
||||||
|
private final Integer storageId;
|
||||||
|
|
||||||
|
public StorageSourceException(CodeMsg codeMsg, Integer storageId, String message) {
|
||||||
|
super(message, codeMsg);
|
||||||
|
this.storageId = storageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageSourceException(CodeMsg codeMsg, Integer storageId, String message, Throwable cause) {
|
||||||
|
super(message, cause, codeMsg);
|
||||||
|
this.storageId = storageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据 responseExceptionMessage 判断使用异常消息进行接口返回,如果是则取异常的 message, 否则取 CodeMsg 中的 message
|
||||||
|
*
|
||||||
|
* @return 异常消息
|
||||||
|
*/
|
||||||
|
public String getResultMessage() {
|
||||||
|
return responseExceptionMessage ? super.getMessage() : super.getCodeMsg().getMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置值是否使用异常消息进行接口返回
|
||||||
|
*
|
||||||
|
* @param responseExceptionMessage
|
||||||
|
* 是否使用异常消息进行接口返回
|
||||||
|
*
|
||||||
|
* @return 当前对象
|
||||||
|
*/
|
||||||
|
public StorageSourceException setResponseExceptionMessage(boolean responseExceptionMessage) {
|
||||||
|
this.responseExceptionMessage = responseExceptionMessage;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.yfd.platform.exception;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public class StorageSourceRefreshTokenException extends RuntimeException {
|
||||||
|
|
||||||
|
private final Integer storageId;
|
||||||
|
|
||||||
|
public StorageSourceRefreshTokenException(String message, Integer storageId) {
|
||||||
|
super(message);
|
||||||
|
this.storageId = storageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageSourceRefreshTokenException(String message, Throwable cause, Integer storageId) {
|
||||||
|
super(message, cause);
|
||||||
|
this.storageId = storageId;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.yfd.platform.exception.file;
|
||||||
|
|
||||||
|
import com.yfd.platform.exception.StorageSourceException;
|
||||||
|
import com.yfd.platform.utils.CodeMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 无效的存储源异常
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public class InvalidStorageSourceException extends StorageSourceException {
|
||||||
|
|
||||||
|
public InvalidStorageSourceException(String message) {
|
||||||
|
super(CodeMsg.STORAGE_SOURCE_NOT_FOUND, null, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InvalidStorageSourceException(Integer storageId) {
|
||||||
|
super(CodeMsg.STORAGE_SOURCE_NOT_FOUND, storageId, CodeMsg.STORAGE_SOURCE_NOT_FOUND.getMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
public InvalidStorageSourceException(Integer storageId, String message) {
|
||||||
|
super(CodeMsg.STORAGE_SOURCE_NOT_FOUND, storageId, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.yfd.platform.exception.init;
|
||||||
|
|
||||||
|
import com.yfd.platform.exception.StorageSourceException;
|
||||||
|
import com.yfd.platform.utils.CodeMsg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源初始化异常
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public class InitializeStorageSourceException extends StorageSourceException {
|
||||||
|
|
||||||
|
public InitializeStorageSourceException(CodeMsg codeMsg, Integer storageId, String message) {
|
||||||
|
super(codeMsg, storageId, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InitializeStorageSourceException(CodeMsg codeMsg, Integer storageId, String message, Throwable cause) {
|
||||||
|
super(codeMsg, storageId, message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.yfd.platform.modules.config.event;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.config.model.entity.SystemConfig;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class DirectLinkPrefixModifyHandler implements ISystemConfigModifyHandler {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(String name) {
|
||||||
|
return SystemConfig.DIRECT_LINK_PREFIX_NAME.equals(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.yfd.platform.modules.config.event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置修改事件
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public interface ISystemConfigModifyHandler {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否匹配当前处理器
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* 配置项名称
|
||||||
|
*
|
||||||
|
* @return 是否匹配
|
||||||
|
*/
|
||||||
|
boolean matches(String name);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.yfd.platform.modules.config.event;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SystemConfigModifyHandler implements ISystemConfigModifyHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private List<ISystemConfigModifyHandler> handlers;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(String name) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package com.yfd.platform.modules.config.mapper;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.yfd.platform.modules.config.model.entity.SystemConfig;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统配置 Mapper 接口
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface SystemConfigMapper extends BaseMapper<SystemConfig> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有系统设置
|
||||||
|
*
|
||||||
|
* @return 系统设置列表
|
||||||
|
*/
|
||||||
|
List<SystemConfig> findAll();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据系统设置名称获取设置信息
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* 系统设置名称
|
||||||
|
*
|
||||||
|
* @return 系统设置信息
|
||||||
|
*/
|
||||||
|
SystemConfig findByName(@Param("name") String name);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量保存系统设置
|
||||||
|
*
|
||||||
|
* @param list
|
||||||
|
* 系统设置列表
|
||||||
|
*
|
||||||
|
* @return 保存记录数
|
||||||
|
*/
|
||||||
|
int saveAll(@Param("list") List<SystemConfig> list);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,167 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.dto;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置传输类
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "系统设置类")
|
||||||
|
public class SystemConfigDTO {
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
@ApiModelProperty(value = "ID", required = true, example = "1")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点名称", example = "ZFile Site Name")
|
||||||
|
private String siteName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户名", example = "admin")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "头像地址", example = "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png")
|
||||||
|
private String avatar;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "备案号", example = "冀ICP备12345678号-1")
|
||||||
|
private String icp;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点域名", example = "https://zfile.vip")
|
||||||
|
private String domain;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义 JS")
|
||||||
|
private String customJs;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义 CSS")
|
||||||
|
private String customCss;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "列表尺寸", notes = "large:大,default:中,small:小", example = "default")
|
||||||
|
private String tableSize;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否显示文档区", example = "true")
|
||||||
|
private Boolean showDocument;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "网站公告", example = "ZFile 网站公告")
|
||||||
|
private String announcement;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否显示网站公告", example = "true")
|
||||||
|
private Boolean showAnnouncement;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "页面布局", notes = "full:全屏,center:居中", example = "full")
|
||||||
|
private String layout;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否显示生成直链功能(含直链和路径短链)", example = "true")
|
||||||
|
private Boolean showLinkBtn;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否显示生成短链功能", example = "true")
|
||||||
|
private Boolean showShortLink;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否显示生成路径链接功能", example = "true")
|
||||||
|
private Boolean showPathLink;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否已初始化", example = "true")
|
||||||
|
private Boolean installed;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义视频文件后缀格式")
|
||||||
|
private String customVideoSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义图像文件后缀格式")
|
||||||
|
private String customImageSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义音频文件后缀格式")
|
||||||
|
private String customAudioSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义文本文件后缀格式")
|
||||||
|
private String customTextSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "直链地址前缀")
|
||||||
|
private String directLinkPrefix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "直链 Referer 防盗链类型")
|
||||||
|
private String refererType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否记录下载日志", example = "true")
|
||||||
|
private Boolean recordDownloadLog;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "直链 Referer 是否允许为空")
|
||||||
|
private Boolean refererAllowEmpty;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "直链 Referer 值")
|
||||||
|
private String refererValue;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "登陆验证方式,支持验证码和 2FA 认证")
|
||||||
|
private String loginVerifyMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "登陆验证 Secret")
|
||||||
|
private String loginVerifySecret;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "根目录是否显示所有存储源", notes = "根目录是否显示所有存储源, 如果为 true, 则根目录显示所有存储源列表, 如果为 false, 则会自动跳转到第一个存储源.", example = "true", required = true)
|
||||||
|
private Boolean rootShowStorage;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "前端域名", notes = "前端域名,前后端分离情况下需要配置.", example = "http://xxx.example.com")
|
||||||
|
private String frontDomain;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否在前台显示登陆按钮", example = "true")
|
||||||
|
private Boolean showLogin;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "RAS Hex Key", example = "r2HKbzc1DfvOs5uHhLn7pA==")
|
||||||
|
private String rsaHexKey;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认文件点击习惯", example = "click")
|
||||||
|
private String fileClickMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "最大同时上传文件数", example = "5")
|
||||||
|
private Integer maxFileUploads;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "onlyOffice 在线预览地址", example = "http://office.zfile.vip")
|
||||||
|
private String onlyOfficeUrl;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否允许路径直链可直接访问", example = "true", required = true)
|
||||||
|
private Boolean allowPathLinkAnonAccess;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认最大显示文件数", example = "1000")
|
||||||
|
private Integer maxShowSize;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "每次加载更多文件数", example = "50")
|
||||||
|
private Integer loadMoreSize;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认排序字段", example = "name")
|
||||||
|
private String defaultSortField;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认排序方向", example = "asc")
|
||||||
|
private String defaultSortOrder;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Home 名称", example = "xxx 的小站")
|
||||||
|
private String siteHomeName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Home Logo", example = "true")
|
||||||
|
private String siteHomeLogo;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Logo 点击后链接", example = "https://www.zfile.vip")
|
||||||
|
private String siteHomeLogoLink;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Logo 链接打开方式", example = "_blank")
|
||||||
|
private String siteHomeLogoTargetMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "限制直链下载秒数", example = "_blank")
|
||||||
|
private Integer linkLimitSecond;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "限制直链下载次数", example = "_blank")
|
||||||
|
private Integer linkDownloadLimit;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "网站 favicon 图标地址", example = "https://www.example.com/favicon.ico")
|
||||||
|
private String faviconUrl;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "短链过期时间设置", example = "[{value: 1, unit: \"day\"}, {value: 1, unit: \"week\"}, {value: 1, unit: \"month\"}, {value: 1, unit: \"year\"}]")
|
||||||
|
private String linkExpireTimes;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否默认记住密码", example = "true")
|
||||||
|
private Boolean defaultSavePwd;
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置 entity
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "系统设置")
|
||||||
|
@TableName(value = "fi_system_config")
|
||||||
|
public class SystemConfig implements Serializable {
|
||||||
|
|
||||||
|
public static final String DIRECT_LINK_PREFIX_NAME = "directLinkPrefix";
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
@ApiModelProperty(value = "ID, 新增无需填写", example = "1")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "name")
|
||||||
|
@ApiModelProperty(value = "系统设置名称", example = "siteName")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`value`")
|
||||||
|
@ApiModelProperty(value = "系统设置值", example = "ZFile 演示站")
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "title")
|
||||||
|
@ApiModelProperty(value = "系统设置描述", example = "站点名称")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制存储源请求参数
|
||||||
|
*
|
||||||
|
* @author zhaojun
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "复制存储源请求请求类")
|
||||||
|
public class CopyStorageSourceRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源 ID", required = true, example = "1")
|
||||||
|
@NotNull(message = "存储源 id 不能为空")
|
||||||
|
private Integer fromId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "复制后存储源名称", required = true, example = "1")
|
||||||
|
@NotBlank(message = "复制后存储源名称不能为空")
|
||||||
|
private String toName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "复制后存储源别名", required = true, example = "1")
|
||||||
|
@NotBlank(message = "复制后存储源别名不能为空")
|
||||||
|
private String toKey;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.yfd.platform.utils.StringUtils;
|
||||||
|
import com.yfd.platform.validation.StringListValue;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件夹下文件列表请求参数
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "获取文件夹下文件列表请求类")
|
||||||
|
public class FileListRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源 key", required = true, example = "local")
|
||||||
|
@NotBlank(message = "存储源 key 不能为空")
|
||||||
|
private String storageKey;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "请求路径", example = "/")
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "文件夹密码, 如果文件夹需要密码才能访问,则支持请求密码", example = "123456")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@StringListValue(message = "排序字段参数异常,只能是 name、size、time", vals = {"name", "size", "time"})
|
||||||
|
private String orderBy;
|
||||||
|
|
||||||
|
@StringListValue(message = "排序顺序参数异常,只能是 asc 或 desc", vals = {"asc", "desc"})
|
||||||
|
private String orderDirection;
|
||||||
|
|
||||||
|
public void handleDefaultValue() {
|
||||||
|
if (StrUtil.isEmpty(path)) {
|
||||||
|
path = "/";
|
||||||
|
}
|
||||||
|
if (StrUtil.isEmpty(orderBy)) {
|
||||||
|
orderBy = "name";
|
||||||
|
}
|
||||||
|
if (StrUtil.isEmpty(orderDirection)) {
|
||||||
|
orderDirection = "asc";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自动补全路径, 如 a 补全为 /a/
|
||||||
|
path = StringUtils.concat(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统初始化请求参数
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "系统初始化请求类")
|
||||||
|
public class InstallSystemRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点名称", example = "ZFile Site Name")
|
||||||
|
private String siteName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户名", example = "admin")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "密码", example = "123456")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点域名", example = "https://zfile.vip")
|
||||||
|
private String domain;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.yfd.platform.modules.storage.model.dto.StorageSourceAllParamDTO;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.SearchModeEnum;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageTypeEnum;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存存储源信息请求类
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "存储源基本参数")
|
||||||
|
public class SaveStorageSourceRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "ID, 新增无需填写", example = "1")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源名称", example = "阿里云 OSS 存储")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源别名", example = "存储源别名,用于 URL 中展示, 如 http://ip:port/{存储源别名}")
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源备注", example = "这是一个备注信息, 用于管理员区分不同的存储源, 此字段仅管理员可见")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源类型", example = "ftp")
|
||||||
|
private StorageTypeEnum type;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否启用", example = "true")
|
||||||
|
private Boolean enable;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否启用文件操作功能", example = "true", notes = "是否启用文件上传,编辑,删除等操作.")
|
||||||
|
private Boolean enableFileOperator;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否允许匿名进行文件操作", example = "true", notes = "是否允许匿名进行文件上传,编辑,删除等操作.")
|
||||||
|
private Boolean enableFileAnnoOperator;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启缓存", example = "true")
|
||||||
|
private boolean enableCache;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启缓存自动刷新", example = "true")
|
||||||
|
private boolean autoRefreshCache;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启搜索", example = "true")
|
||||||
|
private boolean searchEnable;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "搜索是否忽略大小写", example = "true")
|
||||||
|
private boolean searchIgnoreCase;
|
||||||
|
|
||||||
|
@TableField(value = "`search_mode`")
|
||||||
|
@ApiModelProperty(value = "搜索模式", example = "SEARCH_CACHE", notes = "仅从缓存中搜索或直接全量搜索")
|
||||||
|
private SearchModeEnum searchMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "排序值", example = "1")
|
||||||
|
private Integer orderNum;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源拓展属性")
|
||||||
|
private StorageSourceAllParamDTO storageSourceAllParam;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否默认开启图片模式", example = "true")
|
||||||
|
private boolean defaultSwitchToImgMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "兼容 readme 模式", example = "true", notes = "兼容模式, 目录文档读取 readme.md 文件")
|
||||||
|
private boolean compatibilityReadme;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class TestAntPathMatcherRequest {
|
||||||
|
|
||||||
|
private String antPath;
|
||||||
|
|
||||||
|
private String testPath;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 站点设置请求参数类
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "站点设置请求参数类")
|
||||||
|
public class UpdateSiteSettingRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点名称", required = true, example = "ZFile Site Name")
|
||||||
|
@NotBlank(message = "站点名称不能为空")
|
||||||
|
private String siteName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点域名", required = true, example = "https://zfile.vip")
|
||||||
|
@NotBlank(message = "站点域名不能为空")
|
||||||
|
private String domain;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "前端域名", notes = "前端域名,前后端分离情况下需要配置.", example = "http://xxx.example.com")
|
||||||
|
private String frontDomain;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "头像地址", example = "https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png")
|
||||||
|
private String avatar;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "备案号", example = "冀ICP备12345678号-1")
|
||||||
|
private String icp;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "最大同时上传文件数", example = "5")
|
||||||
|
private Integer maxFileUploads;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Home 名称", example = "xxx 的小站")
|
||||||
|
private String siteHomeName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Home Logo", example = "true")
|
||||||
|
private String siteHomeLogo;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Logo 点击后链接", example = "https://www.zfile.vip")
|
||||||
|
private String siteHomeLogoLink;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点 Logo 链接打开方式", example = "_blank")
|
||||||
|
private String siteHomeLogoTargetMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "网站 favicon 图标地址", example = "https://www.example.com/favicon.ico")
|
||||||
|
private String faviconUrl;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新存储源排序值请求参数
|
||||||
|
*
|
||||||
|
* @author zhaojun
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "更新存储源排序值请求类")
|
||||||
|
public class UpdateStorageSortRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源 ID", required = true, example = "1")
|
||||||
|
@NotBlank(message = "存储源 id 不能为空")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "排序值,值越小越靠前", required = true, example = "5")
|
||||||
|
@NotBlank(message = "排序值不能为空")
|
||||||
|
private Integer orderNum;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 用户修改密码请求参数类
*
* @author zhengsl
*/
@Data
@ApiModel(description = "用户修改密码请求参数类")
public class UpdateUserNameAndPasswordRequest {
@ApiModelProperty(value = "用户名", required = true, example = "admin")
@NotBlank(message = "用户名不能为空")
private String username;
@ApiModelProperty(value = "密码", required = true, example = "123456")
@NotBlank(message = "密码不能为空")
private String password;
}
|
@ -0,0 +1,73 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示设置请求参数类
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "显示设置请求参数类")
|
||||||
|
public class UpdateViewSettingRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "根目录是否显示所有存储源", notes = "根目录是否显示所有存储源, 如果为 true, 则根目录显示所有存储源列表, 如果为 false, 则会自动跳转到第一个存储源.", example = "true", required = true)
|
||||||
|
private Boolean rootShowStorage;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "页面布局", notes = "full:全屏,center:居中", example = "full", required = true)
|
||||||
|
private String layout;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "列表尺寸", notes = "large:大,default:中,small:小", example = "default", required = true)
|
||||||
|
private String tableSize;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义视频文件后缀格式")
|
||||||
|
private String customVideoSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义图像文件后缀格式")
|
||||||
|
private String customImageSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义音频文件后缀格式")
|
||||||
|
private String customAudioSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义文本文件后缀格式")
|
||||||
|
private String customTextSuffix;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否显示文档区", example = "true", required = true)
|
||||||
|
private Boolean showDocument;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否显示网站公告", example = "true", required = true)
|
||||||
|
private Boolean showAnnouncement;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "网站公告", example = "ZFile 网站公告")
|
||||||
|
private String announcement;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义 CSS")
|
||||||
|
private String customCss;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自定义 JS")
|
||||||
|
private String customJs;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认文件点击习惯", example = "click")
|
||||||
|
private String fileClickMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "onlyOffice 在线预览地址", example = "http://office.zfile.vip")
|
||||||
|
private String onlyOfficeUrl;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认最大显示文件数", example = "1000")
|
||||||
|
private Integer maxShowSize;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "每次加载更多文件数", example = "50")
|
||||||
|
private Integer loadMoreSize;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认排序字段", example = "name")
|
||||||
|
private String defaultSortField;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "默认排序方向", example = "asc")
|
||||||
|
private String defaultSortOrder;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否默认记住密码", example = "true")
|
||||||
|
private Boolean defaultSavePwd;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.yfd.platform.modules.config.model.request;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "WebDAV 设置请求参数类")
|
||||||
|
public class UpdateWebDAVRequest {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "启用 WebDAV", example = "true")
|
||||||
|
private Boolean webdavEnable;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "WebDAV 服务器中转下载", example = "true")
|
||||||
|
private Boolean webdavProxy;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "WebDAV 账号", example = "admin")
|
||||||
|
private String webdavUsername;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "WebDAV 密码", example = "123456")
|
||||||
|
private String webdavPassword;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,173 @@
|
|||||||
|
package com.yfd.platform.modules.config.service;
|
||||||
|
|
||||||
|
import cn.hutool.core.convert.Convert;
|
||||||
|
import cn.hutool.core.convert.ConvertException;
|
||||||
|
import cn.hutool.core.util.EnumUtil;
|
||||||
|
import cn.hutool.core.util.HexUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.crypto.SecureUtil;
|
||||||
|
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
|
||||||
|
import com.yfd.platform.constant.SystemConfigConstant;
|
||||||
|
import com.yfd.platform.modules.config.event.ISystemConfigModifyHandler;
|
||||||
|
import com.yfd.platform.modules.config.mapper.SystemConfigMapper;
|
||||||
|
import com.yfd.platform.modules.config.model.dto.SystemConfigDTO;
|
||||||
|
import com.yfd.platform.modules.config.model.entity.SystemConfig;
|
||||||
|
import com.yfd.platform.utils.EnumConvertUtils;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.cache.Cache;
|
||||||
|
import org.springframework.cache.CacheManager;
|
||||||
|
import org.springframework.cache.annotation.CacheConfig;
|
||||||
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统设置 Service
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@CacheConfig(cacheNames = "systemConfig")
|
||||||
|
public class SystemConfigService {
|
||||||
|
|
||||||
|
public static final String CACHE_NAME = "systemConfig";
|
||||||
|
|
||||||
|
private static final String DEFAULT_USERNAME = "admin";
|
||||||
|
|
||||||
|
private static final String DEFAULT_PASSWORD = "123456";
|
||||||
|
// private static final String CACHE_NAME = "systemConfig";
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SystemConfigMapper systemConfigMapper;
|
||||||
|
|
||||||
|
// @Resource
|
||||||
|
// private SystemConfigService systemConfigService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CacheManager cacheManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ISystemConfigModifyHandler systemConfigModifyHandler;
|
||||||
|
|
||||||
|
private final Class<SystemConfigDTO> systemConfigClazz = SystemConfigDTO.class;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取系统设置, 如果缓存中有, 则去缓存取, 没有则查询数据库并写入到缓存中.
|
||||||
|
*
|
||||||
|
* @return 系统设置
|
||||||
|
*/
|
||||||
|
@Cacheable(key = "'dto'")
|
||||||
|
public SystemConfigDTO getSystemConfig() {
|
||||||
|
SystemConfigDTO systemConfigDTO = new SystemConfigDTO();
|
||||||
|
List<SystemConfig> systemConfigList = systemConfigMapper.findAll();
|
||||||
|
|
||||||
|
for (SystemConfig systemConfig : systemConfigList) {
|
||||||
|
String key = systemConfig.getName();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Field field = systemConfigClazz.getDeclaredField(key);
|
||||||
|
field.setAccessible(true);
|
||||||
|
String strVal = systemConfig.getValue();
|
||||||
|
Class<?> fieldType = field.getType();
|
||||||
|
|
||||||
|
Object convertVal;
|
||||||
|
if (EnumUtil.isEnum(fieldType)) {
|
||||||
|
convertVal = EnumConvertUtils.convertStrToEnum(fieldType, strVal);
|
||||||
|
} else {
|
||||||
|
convertVal = Convert.convert(fieldType, strVal);
|
||||||
|
}
|
||||||
|
field.set(systemConfigDTO, convertVal);
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException | ConvertException e) {
|
||||||
|
log.error("通过反射, 将字段 {} 注入 SystemConfigDTO 时出现异常:", key, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return systemConfigDTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 RSA Hex 格式密钥
|
||||||
|
*
|
||||||
|
* @return RSA Hex 格式密钥
|
||||||
|
*/
|
||||||
|
public synchronized String getRsaHexKeyOrGenerate() {
|
||||||
|
SystemConfigDTO systemConfigDTO = this.getSystemConfig();
|
||||||
|
String rsaHexKey = systemConfigDTO.getRsaHexKey();
|
||||||
|
if (StrUtil.isEmpty(rsaHexKey)) {
|
||||||
|
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
|
||||||
|
rsaHexKey = HexUtil.encodeHexStr(key);
|
||||||
|
|
||||||
|
SystemConfig loginVerifyModeConfig = systemConfigMapper.findByName(SystemConfigConstant.RSA_HEX_KEY);
|
||||||
|
loginVerifyModeConfig.setValue(rsaHexKey);
|
||||||
|
systemConfigMapper.updateById(loginVerifyModeConfig);
|
||||||
|
systemConfigDTO.setRsaHexKey(rsaHexKey);
|
||||||
|
|
||||||
|
Cache cache = cacheManager.getCache(CACHE_NAME);
|
||||||
|
Optional.ofNullable(cache).ifPresent(cache1 -> cache1.put("dto", systemConfigDTO));
|
||||||
|
}
|
||||||
|
return rsaHexKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取系统是否已初始化
|
||||||
|
*
|
||||||
|
* @return 管理员名称
|
||||||
|
*/
|
||||||
|
public Boolean getSystemIsInstalled() {
|
||||||
|
return this.getSystemConfig().getInstalled();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取后端站点域名
|
||||||
|
*
|
||||||
|
* @return 后端站点域名
|
||||||
|
*/
|
||||||
|
public String getDomain() {
|
||||||
|
SystemConfigDTO systemConfigDTO = this.getSystemConfig();
|
||||||
|
return systemConfigDTO.getDomain();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前端站点域名
|
||||||
|
*
|
||||||
|
* @return 前端站点域名
|
||||||
|
*/
|
||||||
|
public String getFrontDomain() {
|
||||||
|
SystemConfigDTO systemConfigDTO = this.getSystemConfig();
|
||||||
|
return systemConfigDTO.getFrontDomain();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取实际的前端站点域名
|
||||||
|
*
|
||||||
|
* @return 实际的前端站点域名
|
||||||
|
*/
|
||||||
|
public String getRealFrontDomain() {
|
||||||
|
SystemConfigDTO systemConfigDTO = this.getSystemConfig();
|
||||||
|
return StrUtil.firstNonNull(systemConfigDTO.getFrontDomain(), systemConfigDTO.getDomain());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前端地址下的 403 页面地址.
|
||||||
|
*
|
||||||
|
* @return 前端地址下的 403 页面地址.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getForbiddenUrl() {
|
||||||
|
return getRealFrontDomain() + "/403";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package com.yfd.platform.modules.readme.model.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* readme 文档配置 entity
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(value="readme 文档配置")
|
||||||
|
@TableName(value = "`fi_readme_config`")
|
||||||
|
public class ReadmeConfig implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.INPUT)
|
||||||
|
@ApiModelProperty(value = "ID, 新增无需填写", example = "1")
|
||||||
|
@JsonIgnore
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`storage_id`")
|
||||||
|
@ApiModelProperty(value="存储源 ID")
|
||||||
|
private Integer storageId;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`description`")
|
||||||
|
@ApiModelProperty(value = "表达式描述", required = true, example = "用来辅助记忆表达式")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`expression`")
|
||||||
|
@ApiModelProperty(value="路径表达式")
|
||||||
|
private String expression;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`readme_text`")
|
||||||
|
@ApiModelProperty(value="readme 文本内容, 支持 md 语法.")
|
||||||
|
private String readmeText;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`display_mode`")
|
||||||
|
@ApiModelProperty(value = "显示模式", required = true, example = "readme 显示模式,支持顶部显示: top, 底部显示:bottom, 弹窗显示: dialog")
|
||||||
|
private String displayMode;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package com.yfd.platform.modules.storage.chain;
|
||||||
|
import com.yfd.platform.modules.storage.chain.command.*;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.chain.impl.ChainBase;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件处理责任链定义
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class FileChain extends ChainBase {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private FileAccessPermissionVerifyCommand fileAccessPermissionVerifyCommand;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private FolderPasswordVerifyCommand folderPasswordVerifyCommand;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private FileHiddenCommand fileHiddenCommand;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private FileSortCommand fileSortCommand;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private FileUrlAddVersionCommand fileUrlAddVersionCommand;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化责任链
|
||||||
|
*/
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
this.addCommand(fileAccessPermissionVerifyCommand);
|
||||||
|
this.addCommand(folderPasswordVerifyCommand);
|
||||||
|
this.addCommand(fileHiddenCommand);
|
||||||
|
this.addCommand(fileSortCommand);
|
||||||
|
this.addCommand(fileUrlAddVersionCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行文件处理责任链
|
||||||
|
*
|
||||||
|
* @param content
|
||||||
|
* 文件上下文
|
||||||
|
*
|
||||||
|
* @return 是否执行成功
|
||||||
|
*/
|
||||||
|
public FileContext execute(FileContext content) throws Exception {
|
||||||
|
super.execute(content);
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.yfd.platform.modules.storage.chain;
|
||||||
|
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.config.model.request.FileListRequest;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.FileItemResult;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.apache.commons.chain.impl.ContextBase;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件处理责任链上下文
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class FileContext extends ContextBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源 id
|
||||||
|
*/
|
||||||
|
private Integer storageId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源请求
|
||||||
|
*/
|
||||||
|
private FileListRequest fileListRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源请求获取到的文件列表
|
||||||
|
*/
|
||||||
|
private List<FileItemResult> fileItemList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前目录密码路径表达式
|
||||||
|
*/
|
||||||
|
private String passwordPattern;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.yfd.platform.modules.storage.chain.command;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.yfd.platform.exception.StorageSourceException;
|
||||||
|
import com.yfd.platform.modules.config.model.request.FileListRequest;
|
||||||
|
import com.yfd.platform.modules.storage.chain.FileContext;
|
||||||
|
import com.yfd.platform.utils.CodeMsg;
|
||||||
|
import org.apache.commons.chain.Command;
|
||||||
|
import org.apache.commons.chain.Context;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 目录访问权限责任链 command 命令
|
||||||
|
* 检查请求的目录是否有访问权限
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class FileAccessPermissionVerifyCommand implements Command {
|
||||||
|
|
||||||
|
// @Resource
|
||||||
|
// private FilterConfigService filterConfigService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验是否有权限访问此目录
|
||||||
|
*
|
||||||
|
* @param context 文件处理责任链上下文
|
||||||
|
* @return 是否停止执行责任链, true: 停止执行责任链, false: 继续执行责任链
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean execute(Context context) throws Exception {
|
||||||
|
FileContext fileContext = (FileContext) context;
|
||||||
|
Integer storageId = fileContext.getStorageId();
|
||||||
|
FileListRequest fileListRequest = fileContext.getFileListRequest();
|
||||||
|
|
||||||
|
// 检查文件目录是否是不可访问的, 如果是则抛出异常
|
||||||
|
// boolean isInaccessible = filterConfigService.checkFileIsInaccessible(storageId, fileListRequest
|
||||||
|
// .getPath());
|
||||||
|
boolean isInaccessible = false;
|
||||||
|
if (isInaccessible) {
|
||||||
|
String errorMsg = StrUtil.format("文件目录 [{}] 无访问权限", fileListRequest.getPath());
|
||||||
|
throw new StorageSourceException(CodeMsg.STORAGE_SOURCE_FILE_FORBIDDEN, storageId, errorMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package com.yfd.platform.modules.storage.chain.command;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import com.yfd.platform.modules.storage.chain.FileContext;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.FileItemResult;
|
||||||
|
import org.apache.commons.chain.Command;
|
||||||
|
import org.apache.commons.chain.Context;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件隐藏责任链 command 命令
|
||||||
|
* 过滤此存储源通过规则隐藏的文件.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class FileHiddenCommand implements Command {
|
||||||
|
|
||||||
|
// @Resource
|
||||||
|
// private FilterConfigService filterConfigService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 隐藏存储源规律规则匹配到的文件.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* 文件处理责任链上下文
|
||||||
|
*
|
||||||
|
* @return 是否停止执行责任链, true: 停止执行责任链, false: 继续执行责任链
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean execute(Context context) throws Exception {
|
||||||
|
FileContext fileContext = (FileContext) context;
|
||||||
|
Integer storageId = fileContext.getStorageId();
|
||||||
|
|
||||||
|
List<FileItemResult> fileItemList = fileContext.getFileItemList();
|
||||||
|
if (CollUtil.isEmpty(fileItemList)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// List<FileItemResult> result = fileItemList.stream()
|
||||||
|
// .filter(fileItem -> !filterConfigService.checkFileIsHidden(storageId, fileItem.getFullPath()))
|
||||||
|
// .collect(Collectors.toList());
|
||||||
|
//
|
||||||
|
// fileContext.setFileItemList(result);
|
||||||
|
fileContext.setFileItemList(fileItemList);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.yfd.platform.modules.storage.chain.command;
|
||||||
|
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.config.model.request.FileListRequest;
|
||||||
|
import com.yfd.platform.modules.storage.chain.FileContext;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.FileItemResult;
|
||||||
|
import com.yfd.platform.utils.FileComparator;
|
||||||
|
import org.apache.commons.chain.Command;
|
||||||
|
import org.apache.commons.chain.Context;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件排序责任链 command 命令
|
||||||
|
* 根据请求类中的排序参数,进行文件排序.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class FileSortCommand implements Command {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按照请求的排序字段和方向进行文件排序.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* 文件处理责任链上下文
|
||||||
|
*
|
||||||
|
* @return 是否停止执行责任链, true: 停止执行责任链, false: 继续执行责任链
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean execute(Context context) throws Exception {
|
||||||
|
FileContext fileContext = (FileContext) context;
|
||||||
|
|
||||||
|
List<FileItemResult> fileItemList = fileContext.getFileItemList();
|
||||||
|
FileListRequest fileListRequest = fileContext.getFileListRequest();
|
||||||
|
|
||||||
|
if (fileListRequest.getOrderBy() == null || fileListRequest.getOrderDirection() == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建副本, 防止排序和过滤对原数据产生影响
|
||||||
|
List<FileItemResult> copyList = new ArrayList<>(fileItemList);
|
||||||
|
|
||||||
|
// 按照自然排序
|
||||||
|
copyList.sort(new FileComparator(fileListRequest.getOrderBy(), fileListRequest.getOrderDirection()));
|
||||||
|
fileContext.setFileItemList(copyList);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.yfd.platform.modules.storage.chain.command;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import com.yfd.platform.modules.storage.chain.FileContext;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.FileItemResult;
|
||||||
|
import org.apache.commons.chain.Command;
|
||||||
|
import org.apache.commons.chain.Context;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理文件 url, 给直链增加版本号(原始链接不添加),防止浏览器缓存.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class FileUrlAddVersionCommand implements Command {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理文件 url, 给直链增加版本号,防止浏览器缓存.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* 文件处理责任链上下文
|
||||||
|
*
|
||||||
|
* @return 是否停止执行责任链, true: 停止执行责任链, false: 继续执行责任链
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean execute(Context context) throws Exception {
|
||||||
|
FileContext fileContext = (FileContext) context;
|
||||||
|
List<FileItemResult> fileItemList = fileContext.getFileItemList();
|
||||||
|
|
||||||
|
long version = DateUtil.currentSeconds();
|
||||||
|
|
||||||
|
// fileItemList.forEach((item) -> {
|
||||||
|
// // url 中不包含 ? 才添加此参数,否则可能会影响正常下载.
|
||||||
|
// if (!StrUtil.contains(item.getUrl(), '?')) {
|
||||||
|
// item.setUrl(item.getUrl() + "?v=" + version);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.yfd.platform.modules.storage.chain.command;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.config.model.request.FileListRequest;
|
||||||
|
import com.yfd.platform.modules.storage.chain.FileContext;
|
||||||
|
import org.apache.commons.chain.Command;
|
||||||
|
import org.apache.commons.chain.Context;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验文件夹密码责任链 command 命令
|
||||||
|
* 校验当前请求的文件夹是否需要密码校验,如果需求则校验密码,密码不正确则抛出异常
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class FolderPasswordVerifyCommand implements Command {
|
||||||
|
|
||||||
|
// @Resource
|
||||||
|
// private PasswordConfigService passwordConfigService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验当前文件是否需要密码.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* 文件处理责任链上下文
|
||||||
|
*
|
||||||
|
* @return 是否停止执行责任链, true: 停止执行责任链, false: 继续执行责任链
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean execute(Context context) throws Exception {
|
||||||
|
FileContext fileContext = (FileContext) context;
|
||||||
|
Integer storageId = fileContext.getStorageId();
|
||||||
|
|
||||||
|
FileListRequest fileListRequest = fileContext.getFileListRequest();
|
||||||
|
String path = fileListRequest.getPath();
|
||||||
|
String password = fileListRequest.getPassword();
|
||||||
|
|
||||||
|
// 校验密码, 如果校验不通过, 则返回错误消息
|
||||||
|
// VerifyResultDTO verifyResultDTO = passwordConfigService.verifyPassword(storageId, path, password);
|
||||||
|
// if (!verifyResultDTO.isPassed()) {
|
||||||
|
// throw new PasswordVerifyException(verifyResultDTO.getCode(), verifyResultDTO.getMsg());
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 设置当前文件夹所对应的文件夹路径表达式.
|
||||||
|
// fileContext.setPasswordPattern(verifyResultDTO.getPattern());;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,275 @@
|
|||||||
|
package com.yfd.platform.modules.storage.context;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ReflectUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
|
import com.yfd.platform.annotation.StorageParamItem;
|
||||||
|
import com.yfd.platform.exception.file.InvalidStorageSourceException;
|
||||||
|
import com.yfd.platform.exception.init.InitializeStorageSourceException;
|
||||||
|
import com.yfd.platform.modules.storage.mapper.StorageSourceConfigMapper;
|
||||||
|
import com.yfd.platform.modules.storage.mapper.StorageSourceMapper;
|
||||||
|
import com.yfd.platform.modules.storage.model.bo.StorageSourceParamDef;
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSource;
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSourceConfig;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageTypeEnum;
|
||||||
|
import com.yfd.platform.modules.storage.model.param.IStorageParam;
|
||||||
|
import com.yfd.platform.modules.storage.service.base.AbstractBaseFileService;
|
||||||
|
import com.yfd.platform.modules.storage.support.StorageSourceSupport;
|
||||||
|
import com.yfd.platform.utils.ClassUtils;
|
||||||
|
import com.yfd.platform.utils.CodeMsg;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.aop.support.AopUtils;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每个存储源对应一个 Service, 其中初始化好了与对象存储的配置信息.
|
||||||
|
* 此存储源上下文环境用户缓存每个 Service, 避免重复初始化.
|
||||||
|
* <br>
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Order(0)
|
||||||
|
@Slf4j
|
||||||
|
public class StorageSourceContext {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map<Integer, AbstractBaseFileService>
|
||||||
|
* Map<存储源 ID, 存储源 Service>
|
||||||
|
*/
|
||||||
|
private static final Map<Integer, AbstractBaseFileService<IStorageParam>> DRIVES_SERVICE_MAP = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map<存储源类型, 存储源 Service>
|
||||||
|
*/
|
||||||
|
private static Map<String, AbstractBaseFileService> storageTypeEnumFileServiceMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存每个存储源参数的字段列表.
|
||||||
|
*/
|
||||||
|
private final Map<Class<?>, Map<String, Field>> PARAM_CLASS_FIELD_NAME_MAP_CACHE = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceMapper storageSourceMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceConfigMapper storageSourceConfigMapper;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目启动时, 自动调用数据库已存储的所有存储源进行初始化.
|
||||||
|
*/
|
||||||
|
// @Override
|
||||||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||||
|
storageTypeEnumFileServiceMap = applicationContext.getBeansOfType(AbstractBaseFileService.class);
|
||||||
|
|
||||||
|
List<StorageSource> list = storageSourceMapper.findAllOrderByOrderNum();
|
||||||
|
for (StorageSource storageSource : list) {
|
||||||
|
try {
|
||||||
|
init(storageSource);
|
||||||
|
log.info("启动时初始化存储源成功, 存储源 id: [{}], 存储源类型: [{}], 存储源名称: [{}]",
|
||||||
|
storageSource.getId(), storageSource.getType().getDescription(), storageSource.getName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("启动时初始化存储源失败, 存储源 id: {}, 存储源类型: {}, 存储源名称: {}",
|
||||||
|
storageSource.getId(), storageSource.getType().getDescription(), storageSource.getName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 id 获取对应的 Service.
|
||||||
|
*
|
||||||
|
* @param storageId
|
||||||
|
* 存储源 ID
|
||||||
|
*
|
||||||
|
* @return 存储源对应的 Service
|
||||||
|
*/
|
||||||
|
public AbstractBaseFileService<IStorageParam> getByStorageId(Integer storageId) {
|
||||||
|
AbstractBaseFileService<IStorageParam> abstractBaseFileService = DRIVES_SERVICE_MAP.get(storageId);
|
||||||
|
if (abstractBaseFileService == null) {
|
||||||
|
throw new InvalidStorageSourceException(storageId);
|
||||||
|
}
|
||||||
|
return abstractBaseFileService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 key 获取对应的 Service.
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* 存储源 key
|
||||||
|
*
|
||||||
|
* @return 存储源对应的 Service
|
||||||
|
*/
|
||||||
|
public AbstractBaseFileService<?> getByStorageKey(String key) {
|
||||||
|
Integer storageId = storageSourceMapper.findIdByStorageKey(key);
|
||||||
|
if (storageId == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getByStorageId(storageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储类型获取对应的存储源的参数列表.
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* 存储类型: {@link StorageTypeEnum}
|
||||||
|
*
|
||||||
|
* @return 指定类型存储源的参数列表. {@link StorageSourceSupport#getStorageSourceParamList(AbstractBaseFileService)} )}}
|
||||||
|
*/
|
||||||
|
public static List<StorageSourceParamDef> getStorageSourceParamListByType(StorageTypeEnum type) {
|
||||||
|
return storageTypeEnumFileServiceMap.values().stream()
|
||||||
|
// 根据存储源类型找到第一个匹配的 Service
|
||||||
|
.filter(fileService -> fileService.getStorageTypeEnum() == type)
|
||||||
|
.findFirst()
|
||||||
|
// 获取该 Service 的参数列表
|
||||||
|
.map(StorageSourceSupport::getStorageSourceParamList)
|
||||||
|
// 如果没有找到, 则返回空列表
|
||||||
|
.orElse(Collections.emptyList());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化指定存储源的 Service, 添加到上下文环境中.
|
||||||
|
*
|
||||||
|
* @param storageSource
|
||||||
|
* 存储源对象
|
||||||
|
*/
|
||||||
|
public void init(StorageSource storageSource) {
|
||||||
|
Integer storageId = storageSource.getId();
|
||||||
|
String storageName = storageSource.getName();
|
||||||
|
|
||||||
|
AbstractBaseFileService<IStorageParam> baseFileService = getInitStorageBeanByStorageId(storageId);
|
||||||
|
if (baseFileService == null) {
|
||||||
|
throw new InvalidStorageSourceException(storageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 填充初始化参数
|
||||||
|
IStorageParam initParam = getInitParam(storageId, baseFileService);
|
||||||
|
|
||||||
|
// 进行初始化并测试连接
|
||||||
|
baseFileService.init(storageName, storageId, initParam);
|
||||||
|
baseFileService.testConnection();
|
||||||
|
|
||||||
|
DRIVES_SERVICE_MAP.put(storageId, baseFileService);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定存储源初始状态的 Service.
|
||||||
|
*
|
||||||
|
* @param storageId
|
||||||
|
* 存储源 ID
|
||||||
|
*
|
||||||
|
* @return 存储源对应未初始化的 Service
|
||||||
|
*/
|
||||||
|
private AbstractBaseFileService<IStorageParam> getInitStorageBeanByStorageId(Integer storageId) {
|
||||||
|
String keyById = storageSourceMapper.findKeyById(storageId);
|
||||||
|
StorageTypeEnum storageTypeEnum = Optional.ofNullable(storageSourceMapper.findByStorageKey(keyById)).map(StorageSource::getType).orElse(null);
|
||||||
|
for (AbstractBaseFileService<?> value : storageTypeEnumFileServiceMap.values()) {
|
||||||
|
if (Objects.equals(value.getStorageTypeEnum(), storageTypeEnum)) {
|
||||||
|
return SpringUtil.getBean(value.getClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定存储源的初始化参数.
|
||||||
|
*
|
||||||
|
* @param storageId
|
||||||
|
* 存储源 ID
|
||||||
|
*
|
||||||
|
* @return 存储源初始化参数
|
||||||
|
*/
|
||||||
|
private IStorageParam getInitParam(Integer storageId, AbstractBaseFileService<?> baseFileService) {
|
||||||
|
// 获取存储源实现类的实际 Class
|
||||||
|
Class<?> beanTargetClass = AopUtils.getTargetClass(baseFileService);
|
||||||
|
// 获取存储源实现类的实际 Class 的泛型参数类型
|
||||||
|
Class<?> paramClass = ClassUtils.getClassFirstGenericsParam(beanTargetClass);
|
||||||
|
|
||||||
|
// 获取存储器参数 key -> 存储器 field 对照关系,如果缓存中有,则从缓存中取.
|
||||||
|
Map<String, Field> fieldMap = new HashMap<>();
|
||||||
|
if (PARAM_CLASS_FIELD_NAME_MAP_CACHE.containsKey(paramClass)) {
|
||||||
|
fieldMap = PARAM_CLASS_FIELD_NAME_MAP_CACHE.get(paramClass);
|
||||||
|
} else {
|
||||||
|
Field[] fields = ReflectUtil.getFieldsDirectly(paramClass, true);
|
||||||
|
List<String> ignoreFieldNameList = new ArrayList<>();
|
||||||
|
for (Field field : fields) {
|
||||||
|
String key;
|
||||||
|
|
||||||
|
StorageParamItem storageParamItem = field.getDeclaredAnnotation(StorageParamItem.class);
|
||||||
|
// 没有注解或注解中没有配置 key 则使用字段名.
|
||||||
|
if (storageParamItem == null || StrUtil.isEmpty(storageParamItem.key())) {
|
||||||
|
key = field.getName();
|
||||||
|
} else {
|
||||||
|
key = storageParamItem.key();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (storageParamItem.ignoreInput()) {
|
||||||
|
ignoreFieldNameList.add(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果 map 中包含此 key, 则是父类的, 跳过.
|
||||||
|
if (fieldMap.containsKey(key)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ignoreFieldNameList.contains(key)) {
|
||||||
|
fieldMap.put(key, field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PARAM_CLASS_FIELD_NAME_MAP_CACHE.put(paramClass, fieldMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 实例化参数对象
|
||||||
|
IStorageParam iStorageParam = ReflectUtil.newInstance(paramClass.getName());
|
||||||
|
|
||||||
|
// 给所有字段填充值
|
||||||
|
List<StorageSourceConfig> storageSourceConfigList = storageSourceConfigMapper.findByStorageIdOrderById(storageId);
|
||||||
|
for (StorageSourceConfig storageSourceConfig : storageSourceConfigList) {
|
||||||
|
String name = storageSourceConfig.getName();
|
||||||
|
String value = storageSourceConfig.getValue();
|
||||||
|
try {
|
||||||
|
Field field = fieldMap.get(name);
|
||||||
|
ReflectUtil.setFieldValue(iStorageParam, field, value);
|
||||||
|
} catch (Exception e) {
|
||||||
|
String errMsg = StrUtil.format("为字段 {} 初始化值 {} 失败", name, value);
|
||||||
|
throw new InitializeStorageSourceException(CodeMsg.STORAGE_SOURCE_INIT_STORAGE_PARAM_FIELD_FAIL, storageId, errMsg, e).setResponseExceptionMessage(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return iStorageParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 销毁指定存储源的 Service.
|
||||||
|
*
|
||||||
|
* @param storageId
|
||||||
|
* 存储源 ID
|
||||||
|
*/
|
||||||
|
public void destroy(Integer storageId) {
|
||||||
|
log.info("清理存储源上下文对象, storageId: {}", storageId);
|
||||||
|
DRIVES_SERVICE_MAP.remove(storageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,138 @@
|
|||||||
|
package com.yfd.platform.modules.storage.controller.base;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiSort;
|
||||||
|
import com.yfd.platform.config.ResponseResult;
|
||||||
|
import com.yfd.platform.modules.config.model.request.SaveStorageSourceRequest;
|
||||||
|
import com.yfd.platform.modules.config.model.request.UpdateStorageSortRequest;
|
||||||
|
import com.yfd.platform.modules.storage.convert.StorageSourceConvert;
|
||||||
|
import com.yfd.platform.modules.storage.model.dto.StorageSourceDTO;
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSource;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.StorageSourceAdminResult;
|
||||||
|
import com.yfd.platform.modules.storage.service.StorageSourceService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiImplicitParams;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源基础设置模块接口
|
||||||
|
*
|
||||||
|
* @author zhaojun
|
||||||
|
*/
|
||||||
|
@Api(tags = "存储源模块-基础")
|
||||||
|
@ApiSort(3)
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/admin")
|
||||||
|
public class StorageSourceController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceService storageSourceService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceConvert storageSourceConvert;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 1)
|
||||||
|
@ApiOperation(value = "获取所有存储源列表", notes = "获取所有添加的存储源列表,按照排序值由小到大排序")
|
||||||
|
@GetMapping("/storages")
|
||||||
|
public ResponseResult storageList() {
|
||||||
|
List<StorageSource> list = storageSourceService.findAllOrderByOrderNum();
|
||||||
|
List<StorageSourceAdminResult> storageSourceAdminResults = storageSourceConvert.entityToAdminResultList(list);
|
||||||
|
return ResponseResult.successData(storageSourceAdminResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 2)
|
||||||
|
@ApiOperation(value = "获取指定存储源参数", notes = "获取指定存储源基本信息及其参数")
|
||||||
|
@ApiImplicitParam(paramType = "path", name = "storageId", value = "存储源 id", required = true, dataTypeClass = Integer.class)
|
||||||
|
@GetMapping("/storage/{storageId}")
|
||||||
|
public ResponseResult storageItem(@PathVariable Integer storageId) {
|
||||||
|
StorageSourceDTO storageSourceDTO = storageSourceService.findDTOById(storageId);
|
||||||
|
return ResponseResult.successData(storageSourceDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 3)
|
||||||
|
@ApiOperation(value = "保存存储源参数", notes = "保存存储源的所有参数")
|
||||||
|
@PostMapping("/storage")
|
||||||
|
public ResponseResult saveStorageItem(@RequestBody SaveStorageSourceRequest saveStorageSourceRequest) {
|
||||||
|
Integer id = storageSourceService.saveStorageSource(saveStorageSourceRequest);
|
||||||
|
return ResponseResult.successData(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 4)
|
||||||
|
@ApiOperation(value = "删除存储源", notes = "删除存储源基本设置和拓展设置")
|
||||||
|
@ApiImplicitParam(paramType = "path", name = "storageId", value = "存储源 id", required = true, dataTypeClass = Integer.class)
|
||||||
|
@DeleteMapping("/storage/{storageId}")
|
||||||
|
public ResponseResult deleteStorageItem(@PathVariable Integer storageId) {
|
||||||
|
storageSourceService.deleteById(storageId);
|
||||||
|
return ResponseResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 5)
|
||||||
|
@ApiOperation(value = "启用存储源", notes = "开启存储源后可在前台显示")
|
||||||
|
@ApiImplicitParam(paramType = "path", name = "storageId", value = "存储源 id", required = true, dataTypeClass = Integer.class)
|
||||||
|
@PostMapping("/storage/{storageId}/enable")
|
||||||
|
public ResponseResult enable(@PathVariable Integer storageId) {
|
||||||
|
StorageSource storageSource = storageSourceService.findById(storageId);
|
||||||
|
storageSource.setEnable(true);
|
||||||
|
storageSourceService.updateById(storageSource);
|
||||||
|
return ResponseResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 6)
|
||||||
|
@ApiOperation(value = "停止存储源", notes = "停用存储源后不在前台显示")
|
||||||
|
@ApiImplicitParam(paramType = "path", name = "storageId", value = "存储源 id", required = true, dataTypeClass = Integer.class)
|
||||||
|
@PostMapping("/storage/{storageId}/disable")
|
||||||
|
public ResponseResult disable(@PathVariable Integer storageId) {
|
||||||
|
StorageSource storageSource = storageSourceService.findById(storageId);
|
||||||
|
storageSource.setEnable(false);
|
||||||
|
storageSourceService.updateById(storageSource);
|
||||||
|
return ResponseResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 7)
|
||||||
|
@ApiOperation(value = "更新存储源顺序")
|
||||||
|
@PostMapping("/storage/sort")
|
||||||
|
public ResponseResult updateStorageSort(@RequestBody List<UpdateStorageSortRequest> updateStorageSortRequestList) {
|
||||||
|
storageSourceService.updateStorageSort(updateStorageSortRequestList);
|
||||||
|
return ResponseResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 8)
|
||||||
|
@ApiOperation(value = "校验存储源 key 是否重复")
|
||||||
|
@ApiImplicitParam(paramType = "query", name = "storageKey", value = "存储源 key", required = true, dataTypeClass = String.class)
|
||||||
|
@GetMapping("/storage/exist/key")
|
||||||
|
public ResponseResult existKey(String storageKey) {
|
||||||
|
boolean exist = storageSourceService.existByStorageKey(storageKey);
|
||||||
|
return ResponseResult.successData(exist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 9)
|
||||||
|
@ApiOperation(value = "修改 readme 兼容模式", notes = "修改 readme 兼容模式是否启用")
|
||||||
|
@ApiImplicitParams({
|
||||||
|
@ApiImplicitParam(paramType = "path", name = "storageId", value = "存储源 id", required = true, dataTypeClass = Integer.class),
|
||||||
|
@ApiImplicitParam(paramType = "path", name = "status", value = "存储源兼容模式状态", required = true, dataTypeClass = Boolean.class)
|
||||||
|
})
|
||||||
|
@PostMapping("/storage/{storageId}/compatibility_readme/{status}")
|
||||||
|
public ResponseResult changeCompatibilityReadme(@PathVariable Integer storageId, @PathVariable Boolean status) {
|
||||||
|
StorageSource storageSource = storageSourceService.findById(storageId);
|
||||||
|
storageSource.setCompatibilityReadme(status);
|
||||||
|
storageSourceService.updateById(storageSource);
|
||||||
|
return ResponseResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
package com.yfd.platform.modules.storage.controller.file;
import cn.hutool.core.bean.BeanUtil;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.exception.file.InvalidStorageSourceException;
import com.yfd.platform.modules.config.model.request.FileListRequest;
import com.yfd.platform.modules.storage.chain.FileChain;
import com.yfd.platform.modules.storage.chain.FileContext;
import com.yfd.platform.modules.storage.context.StorageSourceContext;
import com.yfd.platform.modules.storage.convert.StorageSourceConvert;
import com.yfd.platform.modules.storage.model.entity.StorageSource;
import com.yfd.platform.modules.storage.model.result.FileInfoResult;
import com.yfd.platform.modules.storage.model.result.FileItemResult;
import com.yfd.platform.modules.storage.model.result.StorageSourceResult;
import com.yfd.platform.modules.storage.service.StorageSourceService;
import com.yfd.platform.modules.storage.service.base.AbstractBaseFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;
/**
* 文件列表相关接口, 如展示存储源列表, 展示文件列表, 搜索文件列表等.
*
* @author zhengsl
*/
@Api(tags = "文件列表模块")
@ApiSort(2)
@Slf4j
@RequestMapping("/api/storage")
@RestController
public class FileController {
@Resource
private StorageSourceContext storageSourceContext;
@Resource
private StorageSourceService storageSourceService;
@Resource
private FileChain fileChain;
@Resource
private StorageSourceConvert storageSourceConvert;
@ApiOperationSupport(order = 1)
@ApiOperation(value = "获取存储源列表", notes = "获取所有已启用的存储源, 并且按照后台顺序排序")
@GetMapping("/list")
public ResponseResult storageList() {
List<StorageSource> storageList = storageSourceService.findAllEnableOrderByOrderNum();
List<StorageSourceResult> storageSourceResultList = storageSourceConvert.entityToResultList
(storageList);
return ResponseResult.successData(storageSourceResultList);
}
@ApiOperationSupport(order = 2)
@ApiOperation(value = "获取文件列表", notes = "获取某个存储源下, 指定路径的文件&文件夹列表")
@PostMapping("/files")
public ResponseResult list(@Valid @RequestBody FileListRequest fileListRequest) throws Exception {
String storageKey = fileListRequest.getStorageKey();
Integer storageId = storageSourceService.findIdByKey(storageKey);
if (storageId == null) {
throw new InvalidStorageSourceException("通过存储源 key 未找到存储源, key: " + storageKey);
}
// 处理请求参数默认值
fileListRequest.handleDefaultValue();
// 获取文件列表
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageId(storageId);
List<FileItemResult> fileItemList = fileService.fileList(fileListRequest.getPath());
// 执行责任链
FileContext fileContext = FileContext.builder()
.storageId(storageId)
.fileListRequest(fileListRequest)
.fileItemList(fileItemList).build();
fileChain.execute(fileContext);
return ResponseResult.successData(new FileInfoResult(fileContext.getFileItemList(),
fileContext.getPasswordPattern()));
}
}
|
@ -0,0 +1,190 @@
|
|||||||
|
package com.yfd.platform.modules.storage.controller.file;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiSort;
|
||||||
|
import com.yfd.platform.config.ResponseResult;
|
||||||
|
import com.yfd.platform.modules.storage.context.StorageSourceContext;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.FileTypeEnum;
|
||||||
|
import com.yfd.platform.modules.storage.model.request.*;
|
||||||
|
import com.yfd.platform.modules.storage.service.base.AbstractBaseFileService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件操作相关接口, 如新建文件夹, 上传文件, 删除文件, 移动文件等.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Api(tags = "文件操作模块")
|
||||||
|
@ApiSort(3)
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/file/operator")
|
||||||
|
public class FileOperatorController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceContext storageSourceContext;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 1)
|
||||||
|
@ApiOperation(value = "创建文件夹")
|
||||||
|
@PostMapping("/mkdir")
|
||||||
|
public ResponseResult mkdir(@Valid @RequestBody NewFolderRequest newFolderRequest) {
|
||||||
|
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(newFolderRequest.getStorageKey());
|
||||||
|
boolean flag = fileService.newFolder(newFolderRequest.getPath(), newFolderRequest.getName());
|
||||||
|
if (flag) {
|
||||||
|
return ResponseResult.success("创建成功");
|
||||||
|
} else {
|
||||||
|
return ResponseResult.error("创建失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 2)
|
||||||
|
@ApiOperation(value = "批量删除文件/文件夹")
|
||||||
|
@PostMapping("/delete/batch")
|
||||||
|
public ResponseResult deleteFile(@Valid @RequestBody BatchDeleteRequest batchDeleteRequest) {
|
||||||
|
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(batchDeleteRequest.getStorageKey());
|
||||||
|
List<BatchDeleteRequest.DeleteItem> deleteItems = batchDeleteRequest.getDeleteItems();
|
||||||
|
|
||||||
|
int deleteSuccessCount = 0, deleteFailCount = 0, totalCount = CollUtil.size(deleteItems);
|
||||||
|
for (BatchDeleteRequest.DeleteItem deleteItem : deleteItems) {
|
||||||
|
|
||||||
|
boolean flag = false;
|
||||||
|
try {
|
||||||
|
if (deleteItem.getType() == FileTypeEnum.FILE) {
|
||||||
|
flag = fileService.deleteFile(deleteItem.getPath(), deleteItem.getName());
|
||||||
|
} else if (deleteItem.getType() == FileTypeEnum.FOLDER) {
|
||||||
|
flag = fileService.deleteFolder(deleteItem.getPath(), deleteItem.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag) {
|
||||||
|
deleteSuccessCount++;
|
||||||
|
} else {
|
||||||
|
deleteFailCount++;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("删除文件/文件夹失败, 文件路径: {}, 文件名称: {}", deleteItem.getPath(), deleteItem.getName(), e);
|
||||||
|
deleteFailCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalCount > 1) {
|
||||||
|
return ResponseResult.success("批量删除 " + totalCount + " 个, 删除成功 " + deleteSuccessCount + " 个, 失败 " + deleteFailCount + " 个.");
|
||||||
|
} else {
|
||||||
|
return totalCount == deleteSuccessCount ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 3)
|
||||||
|
@ApiOperation(value = "重命名文件")
|
||||||
|
@PostMapping("/rename/file")
|
||||||
|
public ResponseResult rename(@Valid @RequestBody RenameFileRequest renameFileRequest) {
|
||||||
|
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(renameFileRequest.getStorageKey());
|
||||||
|
boolean flag = fileService.renameFile(renameFileRequest.getPath(), renameFileRequest.getName(), renameFileRequest.getNewName());
|
||||||
|
if (flag) {
|
||||||
|
return ResponseResult.success("重命名成功");
|
||||||
|
} else {
|
||||||
|
return ResponseResult.error("重命名失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 4)
|
||||||
|
@ApiOperation(value = "重命名文件夹")
|
||||||
|
@PostMapping("/rename/folder")
|
||||||
|
public ResponseResult deleteFile(@Valid @RequestBody RenameFolderRequest renameFolderRequest) {
|
||||||
|
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(renameFolderRequest.getStorageKey());
|
||||||
|
boolean flag = fileService.renameFolder(renameFolderRequest.getPath(), renameFolderRequest.getName(), renameFolderRequest.getNewName());
|
||||||
|
if (flag) {
|
||||||
|
return ResponseResult.success("重命名成功");
|
||||||
|
} else {
|
||||||
|
return ResponseResult.error("重命名失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperationSupport(order = 5)
|
||||||
|
@ApiOperation(value = "上传文件")
|
||||||
|
@PostMapping("/upload/file")
|
||||||
|
public ResponseResult getUploadFileUrl(@Valid @RequestBody UploadFileRequest uploadFileRequest) {
|
||||||
|
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(uploadFileRequest.getStorageKey());
|
||||||
|
String uploadUrl = fileService.getUploadUrl(uploadFileRequest.getPath(),
|
||||||
|
uploadFileRequest.getName(), uploadFileRequest.getSize());
|
||||||
|
return ResponseResult.successData(uploadUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
//@ApiOperationSupport(order = 6)
|
||||||
|
//@ApiOperation(value = "移动文件")
|
||||||
|
//@PostMapping("/move/file")
|
||||||
|
//@CheckPassword(storageKeyFieldExpression = "[0].storageKey",
|
||||||
|
// pathFieldExpression = "[0].path",
|
||||||
|
// passwordFieldExpression = "[0].password")
|
||||||
|
//public AjaxJson<?> moveFile(@Valid @RequestBody MoveFileRequest moveFileRequest) {
|
||||||
|
// AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(moveFileRequest.getStorageKey());
|
||||||
|
// boolean flag = fileService.moveFile(moveFileRequest.getPath(), moveFileRequest.getName(), moveFileRequest.getTargetPath(), moveFileRequest.getTargetName());
|
||||||
|
// if (flag) {
|
||||||
|
// return AjaxJson.getSuccess("移动成功");
|
||||||
|
// } else {
|
||||||
|
// return AjaxJson.getError("移动失败");
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//@ApiOperationSupport(order = 7)
|
||||||
|
//@ApiOperation(value = "移动文件夹")
|
||||||
|
//@PostMapping("/move/folder")
|
||||||
|
//@CheckPassword(storageKeyFieldExpression = "[0].storageKey",
|
||||||
|
// pathFieldExpression = "[0].path",
|
||||||
|
// passwordFieldExpression = "[0].password")
|
||||||
|
//public AjaxJson<?> moveFolder(@Valid @RequestBody MoveFolderRequest moveFolderRequest) {
|
||||||
|
// AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(moveFolderRequest.getStorageKey());
|
||||||
|
// boolean flag = fileService.moveFolder(moveFolderRequest.getPath(), moveFolderRequest.getName(), moveFolderRequest.getTargetPath(), moveFolderRequest.getTargetName());
|
||||||
|
// if (flag) {
|
||||||
|
// return AjaxJson.getSuccess("移动成功");
|
||||||
|
// } else {
|
||||||
|
// return AjaxJson.getError("移动失败");
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//@ApiOperationSupport(order = 8)
|
||||||
|
//@ApiOperation(value = "复制文件")
|
||||||
|
//@PostMapping("/copy/file")
|
||||||
|
//@CheckPassword(storageKeyFieldExpression = "[0].storageKey",
|
||||||
|
// pathFieldExpression = "[0].path",
|
||||||
|
// passwordFieldExpression = "[0].password")
|
||||||
|
//public AjaxJson<?> copyFile(@Valid @RequestBody CopyFileRequest copyFileRequest) {
|
||||||
|
// AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(copyFileRequest.getStorageKey());
|
||||||
|
// boolean flag = fileService.copyFile(copyFileRequest.getPath(), copyFileRequest.getName(), copyFileRequest.getTargetPath(), copyFileRequest.getTargetName());
|
||||||
|
// if (flag) {
|
||||||
|
// return AjaxJson.getSuccess("复制成功");
|
||||||
|
// } else {
|
||||||
|
// return AjaxJson.getError("复制失败");
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//@ApiOperationSupport(order = 9)
|
||||||
|
//@ApiOperation(value = "复制文件夹")
|
||||||
|
//@PostMapping("/copy/folder")
|
||||||
|
//@CheckPassword(storageKeyFieldExpression = "[0].storageKey",
|
||||||
|
// pathFieldExpression = "[0].path",
|
||||||
|
// passwordFieldExpression = "[0].password")
|
||||||
|
//public AjaxJson<?> copyFolder(@Valid @RequestBody CopyFolderRequest copyFolderRequest) {
|
||||||
|
// AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageKey(copyFolderRequest.getStorageKey());
|
||||||
|
// boolean flag = fileService.copyFolder(copyFolderRequest.getPath(), copyFolderRequest.getName(), copyFolderRequest.getTargetPath(), copyFolderRequest.getTargetName());
|
||||||
|
// if (flag) {
|
||||||
|
// return AjaxJson.getSuccess("复制成功");
|
||||||
|
// } else {
|
||||||
|
// return AjaxJson.getError("复制失败");
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
package com.yfd.platform.modules.storage.controller.proxy;
|
||||||
|
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiSort;
|
||||||
|
import com.yfd.platform.modules.storage.context.StorageSourceContext;
|
||||||
|
import com.yfd.platform.modules.storage.service.base.AbstractBaseFileService;
|
||||||
|
import com.yfd.platform.modules.storage.service.base.AbstractProxyTransferService;
|
||||||
|
import com.yfd.platform.utils.ProxyDownloadUrlUtils;
|
||||||
|
import com.yfd.platform.utils.SpringMvcUtils;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiImplicitParams;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.beans.Beans;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 服务端代理下载 Controller
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Api(tags = "服务端代理下载")
|
||||||
|
@ApiSort(6)
|
||||||
|
@Controller
|
||||||
|
public class ProxyDownloadController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceContext storageSourceContext;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private HttpServletRequest httpServletRequest;
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/pd/{storageKey}/**")
|
||||||
|
@ApiOperationSupport(order = 1)
|
||||||
|
@ApiOperation(value = "下载本地存储源的文件", notes = "因第三方存储源都有下载地址,本接口提供本地存储的下载地址的处理, 返回文件流进行下载.")
|
||||||
|
@ApiImplicitParams({
|
||||||
|
@ApiImplicitParam(paramType = "path", name = "storageKey", value = "存储源 key", dataTypeClass = String.class),
|
||||||
|
@ApiImplicitParam(paramType = "query", name = "type",
|
||||||
|
value = "下载类型: download(不论什么格式的文件都进行下载操作), " +
|
||||||
|
"default(使用浏览器默认处理,浏览器支持预览的格式,则进行预览,不支持的则进行下载)",
|
||||||
|
example = "download", dataTypeClass = String.class)
|
||||||
|
})
|
||||||
|
@ResponseBody
|
||||||
|
public ResponseEntity<org.springframework.core.io.Resource> downAttachment(@PathVariable("storageKey") String storageKey, String signature) throws IOException {
|
||||||
|
// 获取下载文件路径
|
||||||
|
String filePath = SpringMvcUtils.getExtractPathWithinPattern();
|
||||||
|
|
||||||
|
AbstractBaseFileService<?> storageServiceByKey = storageSourceContext.getByStorageKey(storageKey);
|
||||||
|
|
||||||
|
// 如果不是 ProxyTransferService, 则返回错误信息.
|
||||||
|
if (!Beans.isInstanceOf(storageServiceByKey, AbstractProxyTransferService.class)) {
|
||||||
|
throw new RuntimeException("存储类型异常,不支持上传.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 进行上传.
|
||||||
|
AbstractProxyTransferService<?> proxyDownloadService = (AbstractProxyTransferService<?>) storageServiceByKey;
|
||||||
|
|
||||||
|
// 如果是私有空间才校验签名.
|
||||||
|
boolean privateStorage = proxyDownloadService.getParam().isPrivate();
|
||||||
|
if (privateStorage) {
|
||||||
|
Integer storageId = proxyDownloadService.getStorageId();
|
||||||
|
boolean valid = ProxyDownloadUrlUtils.validSignatureExpired(storageId, filePath, signature);
|
||||||
|
if (!valid) {
|
||||||
|
throw new IllegalArgumentException("签名无效或下载地址已过期.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return proxyDownloadService.downloadToStream(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
package com.yfd.platform.modules.storage.controller.proxy;
|
||||||
|
|
||||||
|
import com.yfd.platform.config.ResponseResult;
|
||||||
|
import com.yfd.platform.modules.storage.context.StorageSourceContext;
|
||||||
|
import com.yfd.platform.modules.storage.service.base.AbstractBaseFileService;
|
||||||
|
import com.yfd.platform.modules.storage.service.base.AbstractProxyTransferService;
|
||||||
|
import com.yfd.platform.utils.SpringMvcUtils;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.beans.Beans;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 服务端代理上传 Controller
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Api(tags = "服务端代理上传")
|
||||||
|
@RestController
|
||||||
|
public class ProxyUploadController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceContext storageSourceContext;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private HttpServletRequest httpServletRequest;
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/file/upload/{storageKey}/**")
|
||||||
|
@ResponseBody
|
||||||
|
public ResponseResult upload(@RequestParam MultipartFile file, @PathVariable("storageKey") String storageKey) throws IOException {
|
||||||
|
if (file == null) {
|
||||||
|
throw new RuntimeException("空文件不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取上传路径
|
||||||
|
String filePath = SpringMvcUtils.getExtractPathWithinPattern();
|
||||||
|
|
||||||
|
AbstractBaseFileService<?> storageServiceByKey = storageSourceContext.getByStorageKey(storageKey);
|
||||||
|
|
||||||
|
// 如果不是 ProxyTransferService, 则返回错误信息.
|
||||||
|
if (!Beans.isInstanceOf(storageServiceByKey, AbstractProxyTransferService.class)) {
|
||||||
|
return ResponseResult.error("存储类型异常,不支持上传.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 进行上传.
|
||||||
|
AbstractProxyTransferService<?> proxyUploadService = (AbstractProxyTransferService<?>) storageServiceByKey;
|
||||||
|
proxyUploadService.uploadFile(filePath, file.getInputStream());
|
||||||
|
return ResponseResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package com.yfd.platform.modules.storage.convert;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.config.model.request.SaveStorageSourceRequest;
|
||||||
|
import com.yfd.platform.modules.readme.model.entity.ReadmeConfig;
|
||||||
|
import com.yfd.platform.modules.storage.model.dto.StorageSourceAllParamDTO;
|
||||||
|
import com.yfd.platform.modules.storage.model.dto.StorageSourceDTO;
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSource;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.StorageSourceAdminResult;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.StorageSourceConfigResult;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.StorageSourceResult;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StorageSource 转换器
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
public interface StorageSourceConvert {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 StorageSource 转换为 StorageSourceResult
|
||||||
|
*
|
||||||
|
* @param list
|
||||||
|
* StorageSource 列表
|
||||||
|
*
|
||||||
|
* @return StorageSourceResult 列表
|
||||||
|
*/
|
||||||
|
List<StorageSourceResult> entityToResultList(List<StorageSource> list);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 StorageSource 转换为 StorageSourceConfigResult
|
||||||
|
*
|
||||||
|
* @param storageSource
|
||||||
|
* StorageSource 实体
|
||||||
|
*
|
||||||
|
* @return StorageSourceConfigResult 实体
|
||||||
|
*/
|
||||||
|
// @Mapping(source = "readmeConfig.displayMode", target = "readmeDisplayMode")
|
||||||
|
// @Mapping(source = "storageSource.allowOperator", target = "enableFileOperator")
|
||||||
|
StorageSourceConfigResult entityToConfigResult(StorageSource storageSource, ReadmeConfig readmeConfig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 StorageSource 转换为 StorageSourceAdminResult
|
||||||
|
*
|
||||||
|
* @param list
|
||||||
|
* StorageSource 列表
|
||||||
|
*
|
||||||
|
* @return StorageSourceAdminResult 列表
|
||||||
|
*/
|
||||||
|
List<StorageSourceAdminResult> entityToAdminResultList(List<StorageSource> list);
|
||||||
|
|
||||||
|
|
||||||
|
StorageSourceDTO entityToDTO(StorageSource storageSource, StorageSourceAllParamDTO storageSourceAllParam);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将 SaveStorageSourceRequest 转换为 StorageSource
|
||||||
|
*
|
||||||
|
* @param saveStorageSourceRequest
|
||||||
|
* SaveStorageSourceRequest 实体
|
||||||
|
*
|
||||||
|
* @return StorageSource 实体
|
||||||
|
*/
|
||||||
|
StorageSource saveRequestToEntity(SaveStorageSourceRequest saveStorageSourceRequest);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,184 @@
|
|||||||
|
package com.yfd.platform.modules.storage.convert.impl;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.config.model.request.SaveStorageSourceRequest;
|
||||||
|
import com.yfd.platform.modules.readme.model.entity.ReadmeConfig;
|
||||||
|
import com.yfd.platform.modules.storage.convert.StorageSourceConvert;
|
||||||
|
import com.yfd.platform.modules.storage.model.dto.StorageSourceAllParamDTO;
|
||||||
|
import com.yfd.platform.modules.storage.model.dto.StorageSourceDTO;
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSource;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.StorageSourceAdminResult;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.StorageSourceConfigResult;
|
||||||
|
import com.yfd.platform.modules.storage.model.result.StorageSourceResult;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Date: 2025/1/10 12:44
|
||||||
|
* @Description:
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class StorageSourceConvertImpl implements StorageSourceConvert {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<StorageSourceResult> entityToResultList(List<StorageSource> list) {
|
||||||
|
if ( list == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<StorageSourceResult> list1 = new ArrayList<StorageSourceResult>( list.size() );
|
||||||
|
for ( StorageSource storageSource : list ) {
|
||||||
|
list1.add( storageSourceToStorageSourceResult( storageSource ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return list1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StorageSourceConfigResult entityToConfigResult(StorageSource storageSource, ReadmeConfig readmeConfig) {
|
||||||
|
if ( storageSource == null && readmeConfig == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageSourceConfigResult storageSourceConfigResult = new StorageSourceConfigResult();
|
||||||
|
|
||||||
|
if ( storageSource != null ) {
|
||||||
|
storageSourceConfigResult.setEnableFileOperator( storageSource.getEnableFileOperator() );
|
||||||
|
storageSourceConfigResult.setDefaultSwitchToImgMode( storageSource.getDefaultSwitchToImgMode() );
|
||||||
|
}
|
||||||
|
if ( readmeConfig != null ) {
|
||||||
|
storageSourceConfigResult.setReadmeDisplayMode( readmeConfig.getDisplayMode() );
|
||||||
|
storageSourceConfigResult.setReadmeText( readmeConfig.getReadmeText() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return storageSourceConfigResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<StorageSourceAdminResult> entityToAdminResultList(List<StorageSource> list) {
|
||||||
|
if ( list == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<StorageSourceAdminResult> list1 = new ArrayList<StorageSourceAdminResult>( list.size() );
|
||||||
|
for ( StorageSource storageSource : list ) {
|
||||||
|
list1.add( storageSourceToStorageSourceAdminResult( storageSource ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return list1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StorageSourceDTO entityToDTO(StorageSource storageSource, StorageSourceAllParamDTO storageSourceAllParam) {
|
||||||
|
if ( storageSource == null && storageSourceAllParam == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageSourceDTO storageSourceDTO = new StorageSourceDTO();
|
||||||
|
|
||||||
|
if ( storageSource != null ) {
|
||||||
|
storageSourceDTO.setId( storageSource.getId() );
|
||||||
|
storageSourceDTO.setName( storageSource.getName() );
|
||||||
|
storageSourceDTO.setKey( storageSource.getKey() );
|
||||||
|
storageSourceDTO.setRemark( storageSource.getRemark() );
|
||||||
|
storageSourceDTO.setType( storageSource.getType() );
|
||||||
|
if ( storageSource.getEnable() != null ) {
|
||||||
|
storageSourceDTO.setEnable( storageSource.getEnable() );
|
||||||
|
}
|
||||||
|
storageSourceDTO.setEnableFileOperator( storageSource.getEnableFileOperator() );
|
||||||
|
storageSourceDTO.setEnableFileAnnoOperator( storageSource.getEnableFileAnnoOperator() );
|
||||||
|
if ( storageSource.getEnableCache() != null ) {
|
||||||
|
storageSourceDTO.setEnableCache( storageSource.getEnableCache() );
|
||||||
|
}
|
||||||
|
if ( storageSource.getAutoRefreshCache() != null ) {
|
||||||
|
storageSourceDTO.setAutoRefreshCache( storageSource.getAutoRefreshCache() );
|
||||||
|
}
|
||||||
|
if ( storageSource.getSearchEnable() != null ) {
|
||||||
|
storageSourceDTO.setSearchEnable( storageSource.getSearchEnable() );
|
||||||
|
}
|
||||||
|
if ( storageSource.getSearchIgnoreCase() != null ) {
|
||||||
|
storageSourceDTO.setSearchIgnoreCase( storageSource.getSearchIgnoreCase() );
|
||||||
|
}
|
||||||
|
storageSourceDTO.setOrderNum( storageSource.getOrderNum() );
|
||||||
|
if ( storageSource.getDefaultSwitchToImgMode() != null ) {
|
||||||
|
storageSourceDTO.setDefaultSwitchToImgMode( storageSource.getDefaultSwitchToImgMode() );
|
||||||
|
}
|
||||||
|
storageSourceDTO.setCompatibilityReadme( storageSource.getCompatibilityReadme() );
|
||||||
|
}
|
||||||
|
storageSourceDTO.setStorageSourceAllParam( storageSourceAllParam );
|
||||||
|
|
||||||
|
return storageSourceDTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StorageSource saveRequestToEntity(SaveStorageSourceRequest saveStorageSourceRequest) {
|
||||||
|
if ( saveStorageSourceRequest == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageSource storageSource = new StorageSource();
|
||||||
|
|
||||||
|
storageSource.setId( saveStorageSourceRequest.getId() );
|
||||||
|
storageSource.setEnable( saveStorageSourceRequest.getEnable() );
|
||||||
|
storageSource.setEnableFileOperator( saveStorageSourceRequest.getEnableFileOperator() );
|
||||||
|
storageSource.setEnableFileAnnoOperator( saveStorageSourceRequest.getEnableFileAnnoOperator() );
|
||||||
|
storageSource.setEnableCache( saveStorageSourceRequest.isEnableCache() );
|
||||||
|
storageSource.setName( saveStorageSourceRequest.getName() );
|
||||||
|
storageSource.setKey( saveStorageSourceRequest.getKey() );
|
||||||
|
storageSource.setRemark( saveStorageSourceRequest.getRemark() );
|
||||||
|
storageSource.setAutoRefreshCache( saveStorageSourceRequest.isAutoRefreshCache() );
|
||||||
|
storageSource.setType( saveStorageSourceRequest.getType() );
|
||||||
|
storageSource.setSearchEnable( saveStorageSourceRequest.isSearchEnable() );
|
||||||
|
storageSource.setSearchIgnoreCase( saveStorageSourceRequest.isSearchIgnoreCase() );
|
||||||
|
storageSource.setSearchMode( saveStorageSourceRequest.getSearchMode() );
|
||||||
|
storageSource.setOrderNum( saveStorageSourceRequest.getOrderNum() );
|
||||||
|
storageSource.setDefaultSwitchToImgMode( saveStorageSourceRequest.isDefaultSwitchToImgMode() );
|
||||||
|
storageSource.setCompatibilityReadme( saveStorageSourceRequest.isCompatibilityReadme() );
|
||||||
|
|
||||||
|
return storageSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected StorageSourceResult storageSourceToStorageSourceResult(StorageSource storageSource) {
|
||||||
|
if ( storageSource == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageSourceResult storageSourceResult = new StorageSourceResult();
|
||||||
|
|
||||||
|
storageSourceResult.setName( storageSource.getName() );
|
||||||
|
storageSourceResult.setKey( storageSource.getKey() );
|
||||||
|
storageSourceResult.setType( storageSource.getType() );
|
||||||
|
storageSourceResult.setSearchEnable( storageSource.getSearchEnable() );
|
||||||
|
storageSourceResult.setDefaultSwitchToImgMode( storageSource.getDefaultSwitchToImgMode() );
|
||||||
|
|
||||||
|
return storageSourceResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected StorageSourceAdminResult storageSourceToStorageSourceAdminResult(StorageSource storageSource) {
|
||||||
|
if ( storageSource == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageSourceAdminResult storageSourceAdminResult = new StorageSourceAdminResult();
|
||||||
|
|
||||||
|
storageSourceAdminResult.setId( storageSource.getId() );
|
||||||
|
storageSourceAdminResult.setEnable( storageSource.getEnable() );
|
||||||
|
storageSourceAdminResult.setEnableFileOperator( storageSource.getEnableFileOperator() );
|
||||||
|
storageSourceAdminResult.setEnableFileAnnoOperator( storageSource.getEnableFileAnnoOperator() );
|
||||||
|
storageSourceAdminResult.setEnableCache( storageSource.getEnableCache() );
|
||||||
|
storageSourceAdminResult.setName( storageSource.getName() );
|
||||||
|
storageSourceAdminResult.setKey( storageSource.getKey() );
|
||||||
|
storageSourceAdminResult.setRemark( storageSource.getRemark() );
|
||||||
|
storageSourceAdminResult.setAutoRefreshCache( storageSource.getAutoRefreshCache() );
|
||||||
|
storageSourceAdminResult.setType( storageSource.getType() );
|
||||||
|
storageSourceAdminResult.setSearchEnable( storageSource.getSearchEnable() );
|
||||||
|
storageSourceAdminResult.setSearchIgnoreCase( storageSource.getSearchIgnoreCase() );
|
||||||
|
storageSourceAdminResult.setSearchMode( storageSource.getSearchMode() );
|
||||||
|
storageSourceAdminResult.setOrderNum( storageSource.getOrderNum() );
|
||||||
|
storageSourceAdminResult.setDefaultSwitchToImgMode( storageSource.getDefaultSwitchToImgMode() );
|
||||||
|
storageSourceAdminResult.setCompatibilityReadme( storageSource.getCompatibilityReadme() );
|
||||||
|
|
||||||
|
return storageSourceAdminResult;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.yfd.platform.modules.storage.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSourceConfig;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源拓展设置 Mapper 接口
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface StorageSourceConfigMapper extends BaseMapper<StorageSourceConfig> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 ID 查询存储源拓展配置, 并按照存储源 id 排序
|
||||||
|
*
|
||||||
|
* @param storageId
|
||||||
|
* 存储源 ID
|
||||||
|
*
|
||||||
|
* @return 存储源拓展配置列表
|
||||||
|
*/
|
||||||
|
List<StorageSourceConfig> findByStorageIdOrderById(@Param("storageId") Integer storageId);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 ID 删除存储源拓展配置
|
||||||
|
*
|
||||||
|
* @param storageId
|
||||||
|
* 存储源 ID
|
||||||
|
*
|
||||||
|
* @return 删除记录数
|
||||||
|
*/
|
||||||
|
int deleteByStorageId(@Param("storageId") Integer storageId);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量插入存储源拓展配置
|
||||||
|
*
|
||||||
|
* @param list
|
||||||
|
* 存储源拓展配置列表
|
||||||
|
*
|
||||||
|
* @return 插入记录数
|
||||||
|
*/
|
||||||
|
int insertList(@Param("list") List<StorageSourceConfig> list);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,99 @@
|
|||||||
|
package com.yfd.platform.modules.storage.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSource;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageTypeEnum;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源基本配置 Mapper 接口
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface StorageSourceMapper extends BaseMapper<StorageSource> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有已启用的存储源, 并按照存储源排序值排序
|
||||||
|
*
|
||||||
|
* @return 存储源列表
|
||||||
|
*/
|
||||||
|
List<StorageSource> findListByEnableOrderByOrderNum();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有存储源, 并按照存储源排序值排序
|
||||||
|
*
|
||||||
|
* @return 存储源列表
|
||||||
|
*/
|
||||||
|
List<StorageSource> findAllOrderByOrderNum();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取存储源 ID 最大值
|
||||||
|
*
|
||||||
|
* @return 存储源 ID 最大值
|
||||||
|
*/
|
||||||
|
Integer selectMaxId();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源类型获取存储源列表
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* 存储源类型
|
||||||
|
*
|
||||||
|
* @return 存储源列表
|
||||||
|
*/
|
||||||
|
List<StorageSource> findByType(@Param("type") StorageTypeEnum type);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 ID 设置排序值
|
||||||
|
*
|
||||||
|
* @param orderNum
|
||||||
|
* 排序值
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* 存储源 ID
|
||||||
|
*/
|
||||||
|
void updateSetOrderNumById(@Param("orderNum") int orderNum, @Param("id") Integer id);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 key 获取存储源
|
||||||
|
*
|
||||||
|
* @param storageKey
|
||||||
|
* 存储源 key
|
||||||
|
*
|
||||||
|
* @return 存储源信息
|
||||||
|
*/
|
||||||
|
StorageSource findByStorageKey(@Param("storageKey") String storageKey);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 key 获取存储源 id
|
||||||
|
*
|
||||||
|
* @param storageKey
|
||||||
|
* 存储源 key
|
||||||
|
*
|
||||||
|
* @return 存储源 id
|
||||||
|
*/
|
||||||
|
Integer findIdByStorageKey(@Param("storageKey") String storageKey);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据存储源 id 获取存储源 key
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* 存储源 id
|
||||||
|
*
|
||||||
|
* @return 存储源 key
|
||||||
|
*/
|
||||||
|
String findKeyById(@Param("id") Integer id);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.bo;
|
||||||
|
|
||||||
|
import com.yfd.platform.annotation.StorageParamSelectOption;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageParamTypeEnum;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源参数定义, 包含参数名称、描述、必填、默认值等信息.
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
|
public class StorageSourceParamDef {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段显示排序值, 值越小, 越靠前.
|
||||||
|
*/
|
||||||
|
private int order;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数 key
|
||||||
|
*/
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数描述
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否必填
|
||||||
|
*/
|
||||||
|
private boolean required;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认值
|
||||||
|
*/
|
||||||
|
private String defaultValue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 链接地址
|
||||||
|
*/
|
||||||
|
private String link;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 链接名称
|
||||||
|
*/
|
||||||
|
private String linkName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段类型, 默认为 input, 可选值为: input, select, switch.
|
||||||
|
*/
|
||||||
|
private StorageParamTypeEnum type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当 {@link #type} 为 select 时, 选项的值.
|
||||||
|
*/
|
||||||
|
private List<Options> options;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public static class Options {
|
||||||
|
|
||||||
|
private final String label;
|
||||||
|
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
public Options(String value) {
|
||||||
|
this.label = value;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Options(String label, String value) {
|
||||||
|
this.label = label;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
public Options(StorageParamSelectOption storageParamSelectOption) {
|
||||||
|
this.label = storageParamSelectOption.label();
|
||||||
|
this.value = storageParamSelectOption.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有存储源的全部参数
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "存储源所有拓展参数")
|
||||||
|
public class StorageSourceAllParamDTO implements Serializable {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "Endpoint 接入点", example = "oss-cn-beijing.aliyuncs.com")
|
||||||
|
private String endPoint;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "路径风格", example = "path-style")
|
||||||
|
private String pathStyle;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否是私有空间", example = "true")
|
||||||
|
private Boolean isPrivate;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "accessKey", example = "LTAI4FjfXqXxQZQZ")
|
||||||
|
private String accessKey;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "secretKey", example = "QJIO19ASJIKL10ZL")
|
||||||
|
private String secretKey;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "bucket 名称", example = "zfile-test")
|
||||||
|
private String bucketName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "原 bucket 名称", example = "zfile-test")
|
||||||
|
private String originBucketName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "域名或 IP", example = "127.0.0.1")
|
||||||
|
private String host;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "端口", example = "8080")
|
||||||
|
private String port;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "访问令牌", example = "2.a6b7dbd428f731035f771b8d15063f61.86400.12929220")
|
||||||
|
private String accessToken;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "刷新令牌", example = "15063f61.86400.1292922000-2346678-1243281asd-1asa")
|
||||||
|
private String refreshToken;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "secretId", example = "LTAI4FjfXqXxQZQZ")
|
||||||
|
private String secretId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "文件路径", example = "/root/")
|
||||||
|
private String filePath;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "用户名", example = "admin")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "密码", example = "123456")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "域名", example = "http://zfile-test.oss-cn-beijing.aliyuncs.com")
|
||||||
|
private String domain;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "基路径", example = "/root/")
|
||||||
|
private String basePath;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "token", example = "12e34awsde12")
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "token 有效期", example = "1800")
|
||||||
|
private Integer tokenTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "siteId", example = "ltzx124yu54z")
|
||||||
|
private String siteId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "listId", example = "nbmyuoya12sz")
|
||||||
|
private String listId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点名称", example = "test")
|
||||||
|
private String siteName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "站点类型", example = "sites")
|
||||||
|
private String siteType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "下载反代域名", example = "http://zfile-oroxy.zfile.vip")
|
||||||
|
private String proxyDomain;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "下载链接类型", example = "basic")
|
||||||
|
private String downloadLinkType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "clientId", example = "4a72d927-1917-418d-9eb2-1b365c53c1c5")
|
||||||
|
private String clientId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "clientSecret", example = "l:zI-_yrW75lV8M61K@z.I2K@B/On6Q1a")
|
||||||
|
private String clientSecret;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "回调地址", example = "https://zfile.jun6.net/onedrive/callback")
|
||||||
|
private String redirectUri;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "区域", example = "cn-beijing")
|
||||||
|
private String region;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "url", example = "url 链接")
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否自动配置 cors 规则", example = "true")
|
||||||
|
private Boolean autoConfigCors;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "编码格式", example = "UTF-8")
|
||||||
|
private String encoding;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源 ID", example = "0AGrY0xF1D7PEUk9PV2")
|
||||||
|
private String driveId;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.dto;
|
||||||
|
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageTypeEnum;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "存储源基本参数")
|
||||||
|
public class StorageSourceDTO implements Serializable {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "ID, 新增无需填写", example = "1")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源名称", example = "阿里云 OSS 存储")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源别名", example = "存储源别名,用于 URL 中展示, 如 http://ip:port/{存储源别名}")
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源备注", example = "这是一个备注信息, 用于管理员区分不同的存储源, 此字段仅管理员可见")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源类型", example = "ftp")
|
||||||
|
private StorageTypeEnum type;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否启用", example = "true")
|
||||||
|
private boolean enable;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否启用文件操作功能", example = "true", notes = "是否启用文件上传,编辑,删除等操作.")
|
||||||
|
private Boolean enableFileOperator;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否允许匿名进行文件操作", example = "true", notes = "是否允许匿名进行文件上传,编辑,删除等操作.")
|
||||||
|
private Boolean enableFileAnnoOperator;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启缓存", example = "true")
|
||||||
|
private boolean enableCache;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启缓存自动刷新", example = "true")
|
||||||
|
private boolean autoRefreshCache;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启搜索", example = "true")
|
||||||
|
private boolean searchEnable;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "搜索是否忽略大小写", example = "true")
|
||||||
|
private boolean searchIgnoreCase;
|
||||||
|
|
||||||
|
// @TableField(value = "`search_mode`")
|
||||||
|
// @ApiModelProperty(value = "搜索模式", example = "SEARCH_CACHE", notes = "仅从缓存中搜索或直接全量搜索")
|
||||||
|
// private SearchModeEnum searchMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "排序值", example = "1")
|
||||||
|
private Integer orderNum;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源拓展属性")
|
||||||
|
private StorageSourceAllParamDTO storageSourceAllParam;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否默认开启图片模式", example = "true")
|
||||||
|
private boolean defaultSwitchToImgMode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "兼容 readme 模式", example = "true", notes = "兼容模式, 目录文档读取 readme.md 文件")
|
||||||
|
private Boolean compatibilityReadme;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.SearchModeEnum;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageTypeEnum;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源基本属性 entity
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "存储源基本属性")
|
||||||
|
@TableName(value = "fi_storage_source")
|
||||||
|
public class StorageSource implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
@ApiModelProperty(value = "ID, 新增无需填写", example = "1")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`enable`")
|
||||||
|
@ApiModelProperty(value = "是否启用", example = "true")
|
||||||
|
private Boolean enable;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`enable_file_operator`")
|
||||||
|
@ApiModelProperty(value = "是否启用文件操作功能", example = "true", notes = "是否启用文件上传,编辑,删除等操作.")
|
||||||
|
private Boolean enableFileOperator;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`enable_file_anno_operator`")
|
||||||
|
@ApiModelProperty(value = "是否允许匿名进行文件操作", example = "true", notes = "是否允许匿名进行文件上传,编辑,删除等操作.")
|
||||||
|
private Boolean enableFileAnnoOperator;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`enable_cache`")
|
||||||
|
@ApiModelProperty(value = "是否开启缓存", example = "true")
|
||||||
|
private Boolean enableCache;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`name`")
|
||||||
|
@ApiModelProperty(value = "存储源名称", example = "阿里云 OSS 存储")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`key`")
|
||||||
|
@ApiModelProperty(value = "存储源别名", example = "存储源别名,用于 URL 中展示, 如 http://ip:port/{存储源别名}")
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`remark`")
|
||||||
|
@ApiModelProperty(value = "存储源备注", example = "这是一个备注信息, 用于管理员区分不同的存储源, 此字段仅管理员可见")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "auto_refresh_cache")
|
||||||
|
@ApiModelProperty(value = "是否开启缓存自动刷新", example = "true")
|
||||||
|
private Boolean autoRefreshCache;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`type`")
|
||||||
|
@ApiModelProperty(value = "存储源类型")
|
||||||
|
private StorageTypeEnum type;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "search_enable")
|
||||||
|
@ApiModelProperty(value = "是否开启搜索", example = "true")
|
||||||
|
private Boolean searchEnable;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "search_ignore_case")
|
||||||
|
@ApiModelProperty(value = "搜索是否忽略大小写", example = "true")
|
||||||
|
private Boolean searchIgnoreCase;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`search_mode`")
|
||||||
|
@ApiModelProperty(value = "搜索模式", example = "SEARCH_CACHE", notes = "仅从缓存中搜索或直接全量搜索")
|
||||||
|
private SearchModeEnum searchMode;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "order_num")
|
||||||
|
@ApiModelProperty(value = "排序值", example = "1")
|
||||||
|
private Integer orderNum;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "default_switch_to_img_mode")
|
||||||
|
@ApiModelProperty(value = "是否默认开启图片模式", example = "true")
|
||||||
|
private Boolean defaultSwitchToImgMode;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "compatibility_readme")
|
||||||
|
@ApiModelProperty(value = "兼容 readme 模式", example = "true", notes = "兼容模式, 目录文档读取 readme.md 文件")
|
||||||
|
private Boolean compatibilityReadme;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.yfd.platform.modules.storage.model.enums.StorageTypeEnum;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源拓展属性 entity
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(description = "存储源拓展属性")
|
||||||
|
@TableName(value = "fi_storage_source_config")
|
||||||
|
public class StorageSourceConfig implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
@ApiModelProperty(value = "ID, 新增无需填写", example = "1")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`name`")
|
||||||
|
@ApiModelProperty(value = "存储源属性名称 name", example = "bucketName")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`type`")
|
||||||
|
@ApiModelProperty(value = "存储源类型")
|
||||||
|
private StorageTypeEnum type;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "title")
|
||||||
|
@ApiModelProperty(value = "存储源属性名称", example = "Bucket 名称")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "storage_id")
|
||||||
|
@ApiModelProperty(value = "存储源 id", example = "1")
|
||||||
|
private Integer storageId;
|
||||||
|
|
||||||
|
|
||||||
|
@TableField(value = "`value`")
|
||||||
|
@ApiModelProperty(value = "存储源对应的值", example = "my-bucket")
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.enums;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.EnumValue;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件类型枚举
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum FileTypeEnum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件
|
||||||
|
*/
|
||||||
|
FILE("FILE"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件夹
|
||||||
|
*/
|
||||||
|
FOLDER("FOLDER");
|
||||||
|
|
||||||
|
@EnumValue
|
||||||
|
@JsonValue
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.enums;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.EnumValue;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件搜索模式枚举
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum SearchModeEnum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 仅搜索缓存
|
||||||
|
*/
|
||||||
|
SEARCH_CACHE_MODE("SEARCH_CACHE"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索全部
|
||||||
|
*/
|
||||||
|
SEARCH_ALL_MODE("SEARCH_ALL");
|
||||||
|
|
||||||
|
@EnumValue
|
||||||
|
@JsonValue
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.enums;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.EnumValue;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源参数类型枚举
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum StorageParamTypeEnum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 输入框
|
||||||
|
*/
|
||||||
|
INPUT("input"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉框
|
||||||
|
*/
|
||||||
|
SELECT("select"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开关
|
||||||
|
*/
|
||||||
|
SWITCH("switch");
|
||||||
|
|
||||||
|
@EnumValue
|
||||||
|
@JsonValue
|
||||||
|
private final String value;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
package com.yfd.platform.modules.storage.model.enums;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.EnumValue;
|
||||||
|
import com.baomidou.mybatisplus.annotation.IEnum;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储源类型枚举
|
||||||
|
*
|
||||||
|
* @author zhengsl
|
||||||
|
*/
|
||||||
|
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
|
||||||
|
public enum StorageTypeEnum implements IEnum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前系统支持的所有存储源类型
|
||||||
|
*/
|
||||||
|
LOCAL("local", "本地存储"),
|
||||||
|
ALIYUN("aliyun", "阿里云 OSS"),
|
||||||
|
WEBDAV("webdav", "WebDAV"),
|
||||||
|
TENCENT("tencent", "腾讯云 COS"),
|
||||||
|
UPYUN("upyun", "又拍云 USS"),
|
||||||
|
FTP("ftp", "FTP"),
|
||||||
|
SFTP("sftp", "SFTP"),
|
||||||
|
HUAWEI("huawei", "华为云 OBS"),
|
||||||
|
MINIO("minio", "MINIO"),
|
||||||
|
S3("s3", "S3通用协议"),
|
||||||
|
ONE_DRIVE("onedrive", "OneDrive"),
|
||||||
|
ONE_DRIVE_CHINA("onedrive-china", "OneDrive 世纪互联"),
|
||||||
|
SHAREPOINT_DRIVE("sharepoint", "SharePoint"),
|
||||||
|
SHAREPOINT_DRIVE_CHINA("sharepoint-china", "SharePoint 世纪互联"),
|
||||||
|
GOOGLE_DRIVE("google-drive", "Google Drive"),
|
||||||
|
QINIU("qiniu", "七牛云 KODO"),
|
||||||
|
DOGE_CLOUD("doge-cloud", "多吉云");
|
||||||
|
|
||||||
|
private static final Map<String, StorageTypeEnum> ENUM_MAP = new HashMap<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (StorageTypeEnum type : StorageTypeEnum.values()) {
|
||||||
|
ENUM_MAP.put(type.getKey(), type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源类型枚举 Key", example = "aliyun")
|
||||||
|
@EnumValue
|
||||||
|
private final String key;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "存储源类型枚举描述", example = "阿里云 OSS")
|
||||||
|
private final String description;
|
||||||
|
|
||||||
|
StorageTypeEnum(String key, String description) {
|
||||||
|
this.key = key;
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
public String getValue() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user