| @@ -0,0 +1,8 @@ | |||
| # Default ignored files | |||
| /shelf/ | |||
| /workspace.xml | |||
| # Datasource local storage ignored files | |||
| /dataSources/ | |||
| /dataSources.local.xml | |||
| # Editor-based HTTP Client requests | |||
| /httpRequests/ | |||
| @@ -0,0 +1 @@ | |||
| mallink | |||
| @@ -0,0 +1,37 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
| <component name="CompilerConfiguration"> | |||
| <annotationProcessing> | |||
| <profile name="Maven default annotation processors profile" enabled="true"> | |||
| <sourceOutputDir name="target/generated-sources/annotations" /> | |||
| <sourceTestOutputDir name="target/generated-test-sources/test-annotations" /> | |||
| <outputRelativeToContentRoot value="true" /> | |||
| <module name="suimangOcr" /> | |||
| <module name="suimangSchedule" /> | |||
| <module name="suimangService" /> | |||
| <module name="mallinkBApi" /> | |||
| <module name="mallinkAdmin" /> | |||
| <module name="mallinkService" /> | |||
| <module name="suimangCApi" /> | |||
| <module name="suimangAdmin" /> | |||
| <module name="suimangMQConsumer" /> | |||
| <module name="suimangCallback" /> | |||
| <module name="suimangVideo" /> | |||
| <module name="mallinkCApi" /> | |||
| <module name="suimang-mybatis" /> | |||
| </profile> | |||
| </annotationProcessing> | |||
| </component> | |||
| <component name="JavacSettings"> | |||
| <option name="ADDITIONAL_OPTIONS_OVERRIDE"> | |||
| <module name="suimangAdmin" options="-parameters" /> | |||
| <module name="suimangCApi" options="-parameters" /> | |||
| <module name="suimangCallback" options="-parameters" /> | |||
| <module name="suimangMQConsumer" options="-parameters" /> | |||
| <module name="suimangOcr" options="-parameters" /> | |||
| <module name="suimangSchedule" options="-parameters" /> | |||
| <module name="suimangService" options="-parameters" /> | |||
| <module name="suimangVideo" options="-parameters" /> | |||
| </option> | |||
| </component> | |||
| </project> | |||
| @@ -0,0 +1,14 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
| <component name="Encoding"> | |||
| <file url="file://$PROJECT_DIR$" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangAdmin/src/main/java" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangCApi/src/main/java" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangCallback/src/main/java" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangMQConsumer/src/main/java" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangOcr/src/main/java" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangSchedule/src/main/java" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangService/src/main/java" charset="UTF-8" /> | |||
| <file url="file://$PROJECT_DIR$/suimangVideo/src/main/java" charset="UTF-8" /> | |||
| </component> | |||
| </project> | |||
| @@ -0,0 +1,35 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
| <component name="RemoteRepositoriesConfiguration"> | |||
| <remote-repository> | |||
| <option name="id" value="aliyun-spring" /> | |||
| <option name="name" value="aliyun-spring" /> | |||
| <option name="url" value="https://maven.aliyun.com/repository/public" /> | |||
| </remote-repository> | |||
| <remote-repository> | |||
| <option name="id" value="aliyun-public" /> | |||
| <option name="name" value="aliyun-public" /> | |||
| <option name="url" value="https://maven.aliyun.com/repository/public" /> | |||
| </remote-repository> | |||
| <remote-repository> | |||
| <option name="id" value="central" /> | |||
| <option name="name" value="Maven Central repository" /> | |||
| <option name="url" value="https://repo1.maven.org/maven2" /> | |||
| </remote-repository> | |||
| <remote-repository> | |||
| <option name="id" value="jboss.community" /> | |||
| <option name="name" value="JBoss Community repository" /> | |||
| <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> | |||
| </remote-repository> | |||
| <remote-repository> | |||
| <option name="id" value="central" /> | |||
| <option name="name" value="Central Repository" /> | |||
| <option name="url" value="https://maven.aliyun.com/repository/public" /> | |||
| </remote-repository> | |||
| <remote-repository> | |||
| <option name="id" value="sonatype-nexus-staging" /> | |||
| <option name="name" value="Sonatype Nexus Staging" /> | |||
| <option name="url" value="https://maven.aliyun.com/repository/public" /> | |||
| </remote-repository> | |||
| </component> | |||
| </project> | |||
| @@ -0,0 +1,17 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
| <component name="ExternalStorageConfigurationManager" enabled="true" /> | |||
| <component name="JavaScriptSettings"> | |||
| <option name="languageLevel" value="ES6" /> | |||
| </component> | |||
| <component name="MavenProjectsManager"> | |||
| <option name="originalFiles"> | |||
| <list> | |||
| <option value="$PROJECT_DIR$/pom.xml" /> | |||
| </list> | |||
| </option> | |||
| </component> | |||
| <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="jdk1.8.0_144" project-jdk-type="JavaSDK"> | |||
| <output url="file://$PROJECT_DIR$/out" /> | |||
| </component> | |||
| </project> | |||
| @@ -0,0 +1,7 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
| <component name="VcsDirectoryMappings"> | |||
| <mapping directory="" vcs="Git" /> | |||
| <mapping directory="$PROJECT_DIR$" vcs="Git" /> | |||
| </component> | |||
| </project> | |||
| @@ -0,0 +1,295 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> | |||
| <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8"> | |||
| <output url="file://$MODULE_DIR$/../suimangProject/target/classes" /> | |||
| <output-test url="file://$MODULE_DIR$/../suimangProject/target/test-classes" /> | |||
| <content url="file://$MODULE_DIR$"> | |||
| <excludeFolder url="file://$MODULE_DIR$/../suimangProject/target" /> | |||
| </content> | |||
| <orderEntry type="inheritedJdk" /> | |||
| <orderEntry type="sourceFolder" forTests="false" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.15.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.15.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.25" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.29.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.29.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.29.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.4.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.servlet:jakarta.servlet-api:4.0.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-amqp:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.amqp:spring-rabbit:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.rabbitmq:amqp-client:5.7.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.amqp:spring-amqp:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-cache:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.2.2.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.3.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web-services:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.xml.messaging.saaj:saaj-impl:1.5.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.xml.soap:jakarta.xml.soap-api:1.4.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jvnet.mimepull:mimepull:1.9.12" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jvnet.staxex:stax-ex:1.8.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.xml.ws:jakarta.xml.ws-api:2.3.2" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: jakarta.jws:jakarta.jws-api:1.1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.ws:spring-ws-core:3.0.8.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.ws:spring-xml:3.0.8.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-mail:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.mail:jakarta.mail:1.6.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-boot-starter-process:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-boot-autoconfigure:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-security:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-engine:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-bpmn-converter:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-bpmn-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-process-validation:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-image-generator:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-engine-common-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-engine-common:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-variable-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-variable-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-identitylink-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-identitylink-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-task-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-task-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-job-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-job-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-idm-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-idm-engine:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.uuid:java-uuid-generator:3.1.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-idm-engine-configurator:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-cmmn-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-cmmn-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-dmn-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-dmn-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-form-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-form-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-content-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.commons:commons-email:1.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.mail:javax.mail:1.5.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-common:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-job-spring-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-orm:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.2" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.5.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.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.vintage:junit-vintage-engine:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.1.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.13.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.1" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.8" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.8" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.rocketmq.spring.boot:rocketmq-spring-boot-starter:1.0.0.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.rocketmq:rocketmq-client:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.rocketmq:rocketmq-common:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.rocketmq:rocketmq-remoting:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.guava:guava:26.0-jre" 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:2.5.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.1.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.14" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.14" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.8.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:1.2.0.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.javassist:javassist:3.21.0-GA" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.0" level="project" /> | |||
| <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.10" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.crazycake:shiro-redis:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: redis.clients:jedis:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.7.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.puppycrawl.tools:checkstyle:8.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.antlr:antlr4-runtime:4.7" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: net.sf.saxon:Saxon-HE:9.8.0-4" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.60" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.60" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-spring-boot-starter:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-web:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-base:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.1" 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: org.apache.poi:poi-ooxml:4.1.1" 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.apache.poi:poi-ooxml-schemas:4.1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: ognl:ognl:3.2.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-annotation:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.14.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.17.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.10" level="project" /> | |||
| <orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-common:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.30" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-miniapp:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-mp:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-pay:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:qrcode-utils:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.zxing:core:3.2.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jodd:jodd-http:5.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jodd:jodd-core:5.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jodd:jodd-util:6.0.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-open:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.ulisesbocchio:jasypt-spring-boot:2.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jasypt:jasypt:1.9.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.belerweb:pinyin4j:2.5.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-core:4.5.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.opentracing:opentracing-api:0.33.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.opentracing:opentracing-util:0.33.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-dysmsapi:2.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.codehaus.jettison:jettison:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.0.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-sts:3.0.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ecs:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.7.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-jpeg:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-core:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-metadata:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-lang:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-io:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-image:3.6" level="project" /> | |||
| </component> | |||
| </module> | |||
| @@ -0,0 +1,662 @@ | |||
| package com.iformall.plugin.autoTenantId; | |||
| import net.sf.jsqlparser.JSQLParserException; | |||
| import net.sf.jsqlparser.expression.Expression; | |||
| import net.sf.jsqlparser.expression.Parenthesis; | |||
| import net.sf.jsqlparser.expression.StringValue; | |||
| import net.sf.jsqlparser.expression.operators.conditional.AndExpression; | |||
| import net.sf.jsqlparser.expression.operators.conditional.OrExpression; | |||
| import net.sf.jsqlparser.expression.operators.relational.EqualsTo; | |||
| import net.sf.jsqlparser.expression.operators.relational.ExpressionList; | |||
| import net.sf.jsqlparser.expression.operators.relational.ItemsList; | |||
| import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList; | |||
| import net.sf.jsqlparser.parser.CCJSqlParserUtil; | |||
| import net.sf.jsqlparser.schema.Column; | |||
| import net.sf.jsqlparser.schema.Table; | |||
| import net.sf.jsqlparser.statement.Statement; | |||
| import net.sf.jsqlparser.statement.create.table.ColDataType; | |||
| import net.sf.jsqlparser.statement.create.table.ColumnDefinition; | |||
| import net.sf.jsqlparser.statement.create.table.CreateTable; | |||
| import net.sf.jsqlparser.statement.delete.Delete; | |||
| import net.sf.jsqlparser.statement.insert.Insert; | |||
| import net.sf.jsqlparser.statement.select.*; | |||
| import net.sf.jsqlparser.statement.update.Update; | |||
| import net.sf.jsqlparser.util.TablesNamesFinder; | |||
| import org.apache.ibatis.executor.statement.StatementHandler; | |||
| import org.apache.ibatis.mapping.BoundSql; | |||
| import org.apache.ibatis.mapping.MappedStatement; | |||
| import org.apache.ibatis.mapping.SqlCommandType; | |||
| import org.apache.ibatis.plugin.*; | |||
| import org.apache.ibatis.reflection.MetaObject; | |||
| import org.apache.ibatis.reflection.SystemMetaObject; | |||
| import org.apache.ibatis.session.Configuration; | |||
| import org.apache.ibatis.session.ResultHandler; | |||
| import com.iformall.plugin.MyBatisPlus; | |||
| import com.iformall.plugin.entity.ChainValue; | |||
| import java.sql.Connection; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Properties; | |||
| /** | |||
| *共享数据库的多租户系统实现 | |||
| * Created by Stormeye on 2018/10/22. | |||
| */ | |||
| public class MultiTenancy implements MyBatisPlus { | |||
| //获取tenantId的接口 | |||
| private TenantInfo tenantInfo; | |||
| private String tenantIdColumn = "tenant_id"; | |||
| private String parentTenantIdColumn = "parent_tenant_id"; | |||
| private String dialect = "mysql"; | |||
| public TenantInfo getTenantInfo() { | |||
| return tenantInfo; | |||
| } | |||
| public void setTenantInfo(TenantInfo tenantInfo) { | |||
| this.tenantInfo = tenantInfo; | |||
| } | |||
| public String getTenantIdColumn() { | |||
| return tenantIdColumn; | |||
| } | |||
| public void setTenantIdColumn(String tenantIdColumn) { | |||
| this.tenantIdColumn = tenantIdColumn; | |||
| } | |||
| public String getParentTenantIdColumn() { | |||
| return parentTenantIdColumn; | |||
| } | |||
| public void setParentTenantIdColumn(String parentTenantIdColumn) { | |||
| this.parentTenantIdColumn = parentTenantIdColumn; | |||
| } | |||
| public String getDialect() { | |||
| return dialect; | |||
| } | |||
| public void setDialect(String dialect) { | |||
| this.dialect = dialect; | |||
| } | |||
| //属性参数信息 | |||
| private Properties properties; | |||
| public MultiTenancy(){ | |||
| } | |||
| @Override | |||
| public Map<String,ChainValue> intercept(Invocation invocation,Map<String,ChainValue> chainMap) throws Throwable { | |||
| if (getTenantInfo().getTenantId() != null || getTenantInfo().getParentTenantId() != null) { | |||
| // 能从cookie或者session获取到tenantId | |||
| //Map<String,Object> resultMap = new HashMap<String,Object>(); | |||
| //resultMap.put(tenantIdColumn, getTenantInfo().getTenantId()); | |||
| //resultMap.put(parentTenantIdColumn, getTenantInfo().getParentTenantId()); | |||
| return mod(invocation); | |||
| } | |||
| return null; | |||
| } | |||
| /** | |||
| * 更改MappedStatement为新的 | |||
| * @param invocation | |||
| * @throws Throwable | |||
| */ | |||
| public Map<String,ChainValue> mod(Invocation invocation) throws Throwable { | |||
| StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); | |||
| MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); | |||
| Configuration configuration = (Configuration) metaStatementHandler.getValue("delegate.configuration"); | |||
| MappedStatement ms = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement"); | |||
| if (getTenantInfo().doMappedStatementFIlter(ms)) | |||
| return null; | |||
| SqlCommandType type = ms.getSqlCommandType(); | |||
| BoundSql boundSql = statementHandler.getBoundSql(); | |||
| String newSQL = addWhere(boundSql.getSql()); | |||
| if (newSQL != null) { | |||
| metaStatementHandler.setValue("delegate.boundSql.sql", newSQL); | |||
| } | |||
| Map<String,ChainValue> newchainMap = new HashMap<String,ChainValue>(); | |||
| ChainValue tenantIdChain = new ChainValue(); | |||
| tenantIdChain.setColumn(tenantIdColumn); | |||
| tenantIdChain.setValue(getTenantInfo().getTenantId()); | |||
| tenantIdChain.setIgnoreTables(getTenantInfo().filterTables()); | |||
| newchainMap.put(tenantIdColumn,tenantIdChain); | |||
| ChainValue parentTenantIdChain = new ChainValue(); | |||
| parentTenantIdChain.setColumn(parentTenantIdColumn); | |||
| parentTenantIdChain.setValue(getTenantInfo().getParentTenantId()); | |||
| parentTenantIdChain.setIgnoreTables(getTenantInfo().filterSubTables()); | |||
| newchainMap.put(parentTenantIdColumn,parentTenantIdChain); | |||
| return newchainMap; | |||
| } | |||
| /** | |||
| * 添加租户id条件 | |||
| * @param sql | |||
| * @return | |||
| * @throws JSQLParserException | |||
| */ | |||
| private String addWhere(String sql) throws Exception { | |||
| Statement stmt = CCJSqlParserUtil.parse(sql); | |||
| if (stmt instanceof Insert) { | |||
| return processInsert((Insert) stmt); | |||
| } | |||
| if (stmt instanceof Delete) { | |||
| return processDelete((Delete) stmt); | |||
| } | |||
| if (stmt instanceof Update) { | |||
| return processUpdate(sql, stmt); | |||
| } | |||
| if (stmt instanceof Select) { | |||
| return processSelect(stmt); | |||
| } | |||
| if (stmt instanceof CreateTable) { | |||
| return processCreateTable((CreateTable) stmt); | |||
| } | |||
| throw new RuntimeException("非法sql语句,请检查"+sql); | |||
| } | |||
| private String processCreateTable(CreateTable stmt) { | |||
| CreateTable createTable = stmt; | |||
| ColDataType colDataType = new ColDataType(); | |||
| colDataType.setDataType("varchar(10)"); | |||
| // add tenant_id | |||
| ColumnDefinition columnDefinition = new ColumnDefinition(); | |||
| columnDefinition.setColumnName(getTenantIdColumn()); | |||
| columnDefinition.setColDataType(colDataType); | |||
| createTable.getColumnDefinitions().add(columnDefinition); | |||
| // add parent_tenant_id | |||
| ColumnDefinition subColumnDefinition = new ColumnDefinition(); | |||
| subColumnDefinition.setColumnName(getParentTenantIdColumn()); | |||
| subColumnDefinition.setColDataType(colDataType); | |||
| createTable.getColumnDefinitions().add(subColumnDefinition); | |||
| return createTable.toString(); | |||
| } | |||
| private String processSelect(Statement stmt) throws Exception { | |||
| //获得Select对象 | |||
| Select select = (Select) stmt; | |||
| PlainSelect ps = (PlainSelect) select.getSelectBody(); | |||
| TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); | |||
| List<String> tableList = tablesNamesFinder.getTableList(select); | |||
| if (tableList.size() == 0) { | |||
| return select.toString(); | |||
| } | |||
| for (String table : tableList) { | |||
| if (getTenantInfo().doTableFilter(table)) | |||
| continue; | |||
| if (ps.getWhere() != null) { | |||
| AndExpression where = addAndExpression(stmt, table, ps.getWhere()); | |||
| // form 和 join 中加载的表 | |||
| if (where != null) { | |||
| ps.setWhere(where); | |||
| } else { | |||
| //子查询中的表 | |||
| findSubSelect(stmt, ps.getWhere()); | |||
| } | |||
| } else { | |||
| String aliasName = getTableAlias(stmt, table); | |||
| EqualsTo equalsTo = addEqualsTo(stmt, table, aliasName); | |||
| ps.setWhere(equalsTo); | |||
| } | |||
| } | |||
| return select.toString(); | |||
| } | |||
| private String processUpdate(String sql, Statement stmt) throws Exception { | |||
| //获得Update对象 | |||
| Update updateStatement = (Update) stmt; | |||
| TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); | |||
| List<String> tableList = tablesNamesFinder.getTableList(stmt); | |||
| if (tableList.size() == 0) { | |||
| return updateStatement.toString(); | |||
| } | |||
| //获得where条件表达式 | |||
| Expression where = updateStatement.getWhere(); | |||
| for (String table: tableList) { | |||
| if (getTenantInfo().doTableFilter(table)) | |||
| continue; | |||
| if (where != null) { | |||
| AndExpression andE = addAndExpression(stmt, table, updateStatement.getWhere()); | |||
| if (andE != null) { | |||
| updateStatement.setWhere(andE); | |||
| } | |||
| } else { | |||
| throw new Exception("update语句不能没有where条件:" + sql + Arrays.toString(Thread.currentThread().getStackTrace())); | |||
| } | |||
| } | |||
| return updateStatement.toString(); | |||
| } | |||
| private String processDelete(Delete deleteStatement) { | |||
| //获得Delete对象 | |||
| if (getTenantInfo().doTableFilter(deleteStatement.getTable().getName())) | |||
| return deleteStatement.toString(); | |||
| Expression where = deleteStatement.getWhere(); | |||
| EqualsTo equalsTo = new EqualsTo(); | |||
| if (getTenantInfo().getTenantId() != null) { | |||
| equalsTo.setLeftExpression(new Column(getTenantIdColumn())); | |||
| equalsTo.setRightExpression(new StringValue(getTenantInfo().getTenantId())); | |||
| } | |||
| if (!getTenantInfo().doTableFilterSub(deleteStatement.getTable().getName())) { | |||
| if (getTenantInfo().getParentTenantId() != null) { | |||
| equalsTo.setLeftExpression(new Column(getParentTenantIdColumn())); | |||
| equalsTo.setRightExpression(new StringValue(getTenantInfo().getParentTenantId())); | |||
| } | |||
| } | |||
| if (null != where) { | |||
| if (where instanceof OrExpression) { | |||
| AndExpression andExpression = new AndExpression(equalsTo, new Parenthesis(where)); | |||
| deleteStatement.setWhere(andExpression); | |||
| } else { | |||
| AndExpression andExpression = new AndExpression(equalsTo, where); | |||
| deleteStatement.setWhere(andExpression); | |||
| } | |||
| } | |||
| return deleteStatement.toString(); | |||
| } | |||
| /** | |||
| * 插入处理 | |||
| * @param insertStatement | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| private String processInsert(Insert insertStatement) throws Exception { | |||
| // 非tenant表,直接返回 | |||
| if (getTenantInfo().doTableFilter(insertStatement.getTable().getName())) { | |||
| return insertStatement.toString(); | |||
| } | |||
| boolean bExist = insertStatement.getColumns().stream().anyMatch(col -> col.getColumnName().equalsIgnoreCase(getTenantIdColumn())); | |||
| if (!bExist) { | |||
| if (getTenantInfo().getTenantId() != null) { | |||
| insertStatement.getColumns().add(new Column(getTenantIdColumn())); | |||
| } | |||
| if (!getTenantInfo().doTableFilterSub(insertStatement.getTable().getName())) { | |||
| if (getTenantInfo().getParentTenantId() != null) { | |||
| insertStatement.getColumns().add(new Column(getParentTenantIdColumn())); | |||
| } | |||
| } | |||
| ItemsList itemsList = insertStatement.getItemsList(); | |||
| if (itemsList instanceof MultiExpressionList){ | |||
| ((MultiExpressionList) itemsList).getExprList().forEach(el -> { | |||
| el.getExpressions().add(new StringValue(getTenantInfo().getTenantId())); | |||
| if (!getTenantInfo().doTableFilterSub(insertStatement.getTable().getName())) { | |||
| if (getTenantInfo().getParentTenantId() != null) { | |||
| el.getExpressions().add(new StringValue(getTenantInfo().getParentTenantId())); | |||
| } | |||
| } | |||
| }); | |||
| }else { | |||
| ((ExpressionList) itemsList).getExpressions().add(new StringValue(getTenantInfo().getTenantId())); | |||
| if (!getTenantInfo().doTableFilterSub(insertStatement.getTable().getName())) { | |||
| if (getTenantInfo().getParentTenantId() != null) { | |||
| ((ExpressionList) itemsList).getExpressions().add(new StringValue(getTenantInfo().getParentTenantId())); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return insertStatement.toString(); | |||
| } | |||
| /** | |||
| * 获取配置信息 | |||
| * {dialect=mysql, tenantInfo=org.xue.test.TenantInfoImpl, tenantIdColumn=tenant_id, parentTenantIdColumn=parent_tenant_id} | |||
| * @param properties | |||
| */ | |||
| public void setProperties(Properties properties) { | |||
| this.properties=properties; | |||
| try { | |||
| Class onwClass=Class.forName(this.properties.getProperty("tenantInfo")); | |||
| this.tenantInfo = (TenantInfo)onwClass.newInstance(); | |||
| this.tenantIdColumn = this.properties.getProperty("tenantIdColumn"); | |||
| this.parentTenantIdColumn = this.properties.getProperty("parentTenantIdColumn"); | |||
| this.dialect = this.properties.getProperty("dialect"); | |||
| } catch (ClassNotFoundException e) { | |||
| throw new RuntimeException(e); | |||
| } catch (InstantiationException e) { | |||
| throw new RuntimeException(e); | |||
| } catch (IllegalAccessException e) { | |||
| throw new RuntimeException(e); | |||
| } | |||
| } | |||
| /** | |||
| * 多条件情况下,使用AndExpression给where条件加上tenantid条件 | |||
| * | |||
| * @param table | |||
| * @param where | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| public AndExpression addAndExpression(Statement stmt, String table, Expression where) throws Exception { | |||
| String aliasName = getTableAlias(stmt, table); | |||
| EqualsTo equalsTo = addEqualsTo(stmt, table, aliasName); | |||
| if (equalsTo != null) { | |||
| AndExpression right = new AndExpression(equalsTo, where); | |||
| if (!getTenantInfo().doTableFilterSub(table)) { | |||
| EqualsTo equalsToSub = addEqualsToForParentTenantId(stmt, table, aliasName); | |||
| if (equalsToSub != null) { | |||
| return new AndExpression(equalsToSub, right); | |||
| } else { | |||
| return right; | |||
| } | |||
| } else { | |||
| return right; | |||
| } | |||
| } else { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * 创建一个 EqualsTo相同判断 条件 | |||
| * | |||
| * @param stmt 查询对象 | |||
| * @param table 表名 | |||
| * @return “A=B” 单个where条件表达式 | |||
| * @throws Exception | |||
| */ | |||
| public EqualsTo addEqualsTo(Statement stmt, String table, String aliasName) throws Exception { | |||
| if (aliasName != null) { | |||
| if (getTenantInfo().getTenantId() != null) { | |||
| EqualsTo equalsTo = new EqualsTo(); | |||
| equalsTo.setLeftExpression(new Column(aliasName + '.' + getTenantIdColumn())); | |||
| equalsTo.setRightExpression(new StringValue(getTenantInfo().getTenantId())); | |||
| return equalsTo; | |||
| } | |||
| return null; | |||
| } else { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * 创建一个 EqualsTo相同判断 条件 | |||
| * | |||
| * @param stmt 查询对象 | |||
| * @param table 表名 | |||
| * @return “A=B” 单个where条件表达式 | |||
| * @throws Exception | |||
| */ | |||
| public EqualsTo addEqualsToForParentTenantId(Statement stmt, String table, String aliasName) throws Exception { | |||
| if (aliasName != null) { | |||
| if (getTenantInfo().getParentTenantId() != null) { | |||
| EqualsTo equalsTo = new EqualsTo(); | |||
| equalsTo.setLeftExpression(new Column(aliasName + '.' + getParentTenantIdColumn())); | |||
| equalsTo.setRightExpression(new StringValue(getTenantInfo().getParentTenantId())); | |||
| return equalsTo; | |||
| } else { | |||
| return null; | |||
| } | |||
| } else { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * 获取sql送指定表的别名你,没有别名则返回原表名 如果表名不存在返回null | |||
| * 【仅查询from和join 不含 IN 子查询中的表 】 | |||
| * | |||
| * @param stmt | |||
| * @param tableName | |||
| * @return | |||
| */ | |||
| public String getTableAlias(Statement stmt, String tableName) { | |||
| String alias = null; | |||
| // 插入不做处理 | |||
| if (stmt instanceof Insert) { | |||
| return tableName; | |||
| } | |||
| if (stmt instanceof Delete) { | |||
| //获得Delete对象 | |||
| Delete deleteStatement = (Delete) stmt; | |||
| if ((deleteStatement.getTable()).getName().equalsIgnoreCase(tableName)) { | |||
| alias = deleteStatement.getTable().getAlias() != null ? deleteStatement.getTable().getAlias().getName() : tableName; | |||
| } | |||
| } | |||
| if (stmt instanceof Update) { | |||
| //获得Update对象 | |||
| Update updateStatement = (Update) stmt; | |||
| if ((updateStatement.getTables().get(0)).getName().equalsIgnoreCase(tableName)) { | |||
| alias = updateStatement.getTables().get(0).getAlias() != null ? updateStatement.getTables().get(0).getAlias().getName() : tableName; | |||
| } | |||
| } | |||
| if (stmt instanceof Select) { | |||
| Select select = (Select) stmt; | |||
| PlainSelect ps = (PlainSelect) select.getSelectBody(); | |||
| FromItem item = ps.getFromItem(); | |||
| // 判断主表的别名 | |||
| if (item instanceof Table) { | |||
| if (((Table) item).getName().equalsIgnoreCase(tableName)) { | |||
| alias = item.getAlias() != null ? item.getAlias().getName() : tableName; | |||
| } | |||
| } else { | |||
| } | |||
| } | |||
| return alias; | |||
| } | |||
| /** | |||
| * 针对子查询中的表别名查询 | |||
| * | |||
| * @param subSelect | |||
| * @param tableName | |||
| * @return | |||
| */ | |||
| public String getTableAlias(SubSelect subSelect, String tableName) { | |||
| PlainSelect ps = (PlainSelect) subSelect.getSelectBody(); | |||
| // 判断主表的别名 | |||
| String alias = null; | |||
| FromItem item = ps.getFromItem(); | |||
| if (item instanceof Table) { | |||
| if (((Table) item).getName().equalsIgnoreCase(tableName)){ | |||
| if (item.getAlias() != null) { | |||
| alias = item.getAlias().getName(); | |||
| } else { | |||
| alias = tableName; | |||
| } | |||
| } | |||
| } | |||
| return alias; | |||
| } | |||
| /** | |||
| * 递归处理 子查询中的tenantid-where | |||
| * | |||
| * @param stmt sql查询对象 | |||
| * @param where 当前sql的where条件 where为AndExpression或OrExpression的实例,解析其中的rightExpression,然后检查leftExpression是否为空, | |||
| * 不为空则是AndExpression或OrExpression,再次解析其中的rightExpression | |||
| * 注意tenantid-where是加在子查询上的 | |||
| */ | |||
| void findSubSelect(Statement stmt, Expression where) throws Exception { | |||
| // and 表达式 | |||
| if (where instanceof AndExpression) { | |||
| AndExpression andExpression = (AndExpression) where; | |||
| if (andExpression.getRightExpression() instanceof SubSelect) { | |||
| SubSelect subSelect = (SubSelect) andExpression.getRightExpression(); | |||
| doSelect(stmt, subSelect); | |||
| } | |||
| if (andExpression.getLeftExpression() != null) { | |||
| findSubSelect(stmt, andExpression.getLeftExpression()); | |||
| } | |||
| } else if (where instanceof OrExpression) { | |||
| // or表达式 | |||
| OrExpression orExpression = (OrExpression) where; | |||
| if (orExpression.getRightExpression() instanceof SubSelect) { | |||
| SubSelect subSelect = (SubSelect) orExpression.getRightExpression(); | |||
| doSelect(stmt, subSelect); | |||
| } | |||
| if (orExpression.getLeftExpression() != null) { | |||
| findSubSelect(stmt, orExpression.getLeftExpression()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 处理select 和 subSelect | |||
| * | |||
| * @param stmt 查询对象 | |||
| * @param select | |||
| * @return | |||
| * @throws Exception | |||
| */ | |||
| Expression doSelect(Statement stmt, Expression select) throws Exception { | |||
| PlainSelect ps = null; | |||
| boolean hasSubSelect = false; | |||
| if (select instanceof SubSelect) { | |||
| ps = (PlainSelect) ((SubSelect) select).getSelectBody(); | |||
| } | |||
| if (select instanceof Select) { | |||
| ps = (PlainSelect) ((Select) select).getSelectBody(); | |||
| } | |||
| TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); | |||
| List<String> tableList = tablesNamesFinder.getTableList(select); | |||
| if (tableList.size() == 0) { | |||
| return select; | |||
| } | |||
| for (String table : tableList) { | |||
| // sql 包含 where 条件的情况 使用 addAndExpression 连接 已有的条件和新条件 | |||
| if (ps.getWhere() == null) { | |||
| AndExpression where = addAndExpression(stmt, table, ps.getWhere()); | |||
| // form 和 join 中加载的表 | |||
| if (where != null) { | |||
| ps.setWhere(where); | |||
| } else { | |||
| // 如果在Statement中不存在这个表名,则存在于子查询中 | |||
| hasSubSelect = true; | |||
| } | |||
| } else { | |||
| // sql 不含 where条件 新建一个EqualsTo设置为where条件 | |||
| String aliasName = getTableAlias(stmt, table); | |||
| EqualsTo equalsTo = addEqualsTo(stmt, table, aliasName); | |||
| ps.setWhere(equalsTo); | |||
| } | |||
| } | |||
| if (hasSubSelect) { | |||
| //子查询中的表 | |||
| findSubSelect(stmt, ps.getWhere()); | |||
| } | |||
| return select; | |||
| } | |||
| private void processSelectBody(SelectBody selectBody) { | |||
| if (selectBody instanceof PlainSelect) { | |||
| processPlainSelect((PlainSelect) selectBody); | |||
| } else if (selectBody instanceof WithItem) { | |||
| WithItem withItem = (WithItem) selectBody; | |||
| if (withItem.getSelectBody() != null) { | |||
| processSelectBody(withItem.getSelectBody()); | |||
| } | |||
| } else { | |||
| SetOperationList operationList = (SetOperationList) selectBody; | |||
| if (operationList.getOperations() != null && operationList.getSelects().size() > 0) { | |||
| List<SelectBody> plainSelects = operationList.getSelects(); | |||
| for (SelectBody sub: plainSelects) { | |||
| processSelectBody(sub); | |||
| } | |||
| } | |||
| if (!orderByHashParameters(operationList.getOrderByElements())) { | |||
| operationList.setOrderByElements(null); | |||
| } | |||
| } | |||
| } | |||
| private void processPlainSelect(PlainSelect plainSelect) { | |||
| if (!orderByHashParameters(plainSelect.getOrderByElements())) { | |||
| plainSelect.setOrderByElements(null); | |||
| } | |||
| if (plainSelect.getFromItem() != null) { | |||
| processFromItem(plainSelect.getFromItem()); | |||
| } | |||
| if (plainSelect.getJoins() != null && plainSelect.getJoins().size() > 0) { | |||
| List<Join> joins = plainSelect.getJoins(); | |||
| for (Join join : joins) { | |||
| if (join.getRightItem() != null) { | |||
| processFromItem(join.getRightItem()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| public void processFromItem(FromItem fromItem) { | |||
| if (fromItem instanceof SubJoin) { | |||
| SubJoin subJoin = (SubJoin) fromItem; | |||
| if (subJoin.getJoinList() != null) { | |||
| for(Join tjoin: subJoin.getJoinList()) { | |||
| if (tjoin.getRightItem() != null) { | |||
| processFromItem(tjoin.getRightItem()); | |||
| } | |||
| } | |||
| } | |||
| } else if (fromItem instanceof SubSelect) { | |||
| SubSelect subSelect = (SubSelect) fromItem; | |||
| if (subSelect.getSelectBody() != null) { | |||
| processSelectBody(subSelect.getSelectBody()); | |||
| } | |||
| } else if (fromItem instanceof ValuesList) { | |||
| } else if (fromItem instanceof LateralSubSelect) { | |||
| LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem; | |||
| if (lateralSubSelect.getSubSelect() != null) { | |||
| SubSelect subSelect = (SubSelect) (lateralSubSelect.getSubSelect()); | |||
| if (subSelect.getSelectBody() != null) { | |||
| processSelectBody(subSelect.getSelectBody()); | |||
| } | |||
| } | |||
| } | |||
| //Table时不用处理 | |||
| } | |||
| public boolean orderByHashParameters(List<OrderByElement> orderByElements) { | |||
| if (orderByElements == null) { | |||
| return false; | |||
| } | |||
| for (OrderByElement orderByElement : orderByElements) { | |||
| if (orderByElement.toString().toUpperCase().contains("?")) { | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| } | |||
| @@ -0,0 +1,26 @@ | |||
| package com.iformall.plugin.autoTenantId; | |||
| import java.util.List; | |||
| import org.apache.ibatis.mapping.MappedStatement; | |||
| /** | |||
| * 需要实现该接口用于获取租户id | |||
| * Created by Stormeye on 2018/10/22. | |||
| */ | |||
| public interface TenantInfo { | |||
| String getTenantId(); | |||
| String getParentTenantId(); | |||
| boolean doTableFilter(String tableName); | |||
| List<String> filterTables(); | |||
| boolean doTableFilterSub(String tableName); | |||
| List<String> filterSubTables(); | |||
| boolean doMappedStatementFIlter(MappedStatement ms); | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| package com.iformall.plugin.entity; | |||
| import java.io.Serializable; | |||
| import java.util.ArrayList; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Set; | |||
| /** | |||
| * 链里的值 | |||
| * @author alascor | |||
| * {column:"tennat_id", value:"789", ignoreTables:"wx_c_user","wx_c_user_basic_info"...} | |||
| * | |||
| */ | |||
| public class ChainValue implements Serializable{ | |||
| private static final long serialVersionUID = 6290377774649358950L; | |||
| private String column; | |||
| private Object value; | |||
| private List<String> ignoreTables; | |||
| public String getColumn() { | |||
| return column; | |||
| } | |||
| public void setColumn(String column) { | |||
| this.column = column; | |||
| } | |||
| public Object getValue() { | |||
| return value; | |||
| } | |||
| public void setValue(Object value) { | |||
| this.value = value; | |||
| } | |||
| public List<String> getIgnoreTables() { | |||
| return ignoreTables; | |||
| } | |||
| public void setIgnoreTables(List<String> ignoreTables) { | |||
| this.ignoreTables = ignoreTables; | |||
| } | |||
| } | |||
| @@ -0,0 +1,30 @@ | |||
| package com.iformall.plugin.entity; | |||
| import java.util.Map; | |||
| public class ChainValueHelper { | |||
| public static Object getValue(String table,String column,Map<String,ChainValue> parentChainMap) { | |||
| if (null != parentChainMap && parentChainMap.containsKey(column)) { | |||
| ChainValue chainvalue = parentChainMap.get(column); | |||
| if (null != chainvalue) { | |||
| if (null != chainvalue.getIgnoreTables()) { | |||
| if (!chainvalue.getIgnoreTables().contains(table)) { | |||
| Object o = chainvalue.getValue(); | |||
| if (null != o) { | |||
| return o; | |||
| } | |||
| } | |||
| }else { | |||
| Object o = chainvalue.getValue(); | |||
| if (null != o) { | |||
| return o; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| } | |||
| @@ -0,0 +1,16 @@ | |||
| package com.iformall.plugin.shard.annotation; | |||
| import java.lang.annotation.Documented; | |||
| import java.lang.annotation.ElementType; | |||
| import java.lang.annotation.Retention; | |||
| import java.lang.annotation.RetentionPolicy; | |||
| import java.lang.annotation.Target; | |||
| /** | |||
| * 在mapper方法上面用 | |||
| */ | |||
| @Documented | |||
| @Retention(RetentionPolicy.RUNTIME) | |||
| @Target(ElementType.METHOD) | |||
| public @interface IgnoreSharding { | |||
| } | |||
| @@ -0,0 +1,27 @@ | |||
| package com.iformall.plugin.shard.impl; | |||
| public enum EnumShardingRule { | |||
| HASH(1,"哈希值分表"); | |||
| private Integer code; | |||
| private String name; | |||
| private EnumShardingRule(Integer code, String name) { | |||
| this.code = code; | |||
| this.name = name; | |||
| } | |||
| public Integer getCode() { | |||
| return code; | |||
| } | |||
| public void setCode(Integer code) { | |||
| this.code = code; | |||
| } | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| package com.iformall.plugin.shard.impl; | |||
| import java.util.Map; | |||
| import java.util.concurrent.ConcurrentHashMap; | |||
| import com.alibaba.druid.util.StringUtils; | |||
| import com.iformall.plugin.shard.impl.rule.ShardingRuleDefaultService; | |||
| import com.iformall.plugin.shard.impl.rule.ShardingRuleService; | |||
| public class ShardingRuleExcuter { | |||
| private static Map<Integer,ShardingRuleService> serviceMap = null; | |||
| private static Map<Integer,ShardingRuleService> getServiceMap() { | |||
| if (null == serviceMap) { | |||
| serviceMap = new ConcurrentHashMap<Integer, ShardingRuleService>(); | |||
| serviceMap.put(EnumShardingRule.HASH.getCode(), new ShardingRuleDefaultService()); | |||
| } | |||
| return serviceMap; | |||
| } | |||
| public static String getTableIndex(Integer rule,Object value,int tableCount) { | |||
| String index = getServiceMap().get(rule).getTableIndex(value, tableCount); | |||
| if (StringUtils.isEmpty(index)) { | |||
| throw new RuntimeException("Sharding Rule["+rule+"] not support. column value:"+value+" tableCount:"+tableCount) ; | |||
| } | |||
| return index; | |||
| } | |||
| } | |||
| @@ -0,0 +1,38 @@ | |||
| package com.iformall.plugin.shard.impl; | |||
| public class ShardingSphere { | |||
| public static final String TABLE_SUFFIX = "_"; | |||
| /*表名,不用带下划线**/ | |||
| private String tableName; | |||
| /*分表列名**/ | |||
| private String column; | |||
| /*分表规则**/ | |||
| private Integer rule; | |||
| /*表数量**/ | |||
| private Integer count; | |||
| public String getTableName() { | |||
| return tableName; | |||
| } | |||
| public void setTableName(String tableName) { | |||
| this.tableName = tableName; | |||
| } | |||
| public String getColumn() { | |||
| return column; | |||
| } | |||
| public void setColumn(String column) { | |||
| this.column = column; | |||
| } | |||
| public Integer getRule() { | |||
| return rule; | |||
| } | |||
| public void setRule(Integer rule) { | |||
| this.rule = rule; | |||
| } | |||
| public Integer getCount() { | |||
| return count; | |||
| } | |||
| public void setCount(Integer count) { | |||
| this.count = count; | |||
| } | |||
| } | |||
| @@ -0,0 +1,33 @@ | |||
| package com.iformall.plugin.shard.impl; | |||
| import java.util.Map; | |||
| import java.util.concurrent.ConcurrentHashMap; | |||
| public class ShardingTableExcuter { | |||
| private static Map<String,ShardingSphere> tableMap = new ConcurrentHashMap<String, ShardingSphere>(); | |||
| public static Map<String,ShardingSphere> setTableSharding(String table ,ShardingSphere ss) { | |||
| tableMap.put(table, ss); | |||
| return tableMap; | |||
| } | |||
| public static ShardingSphere getShardingSphere(String table) { | |||
| return tableMap.get(table); | |||
| } | |||
| public static boolean isShardingTable(String table) { | |||
| ShardingSphere ss = getShardingSphere(table); | |||
| if (null == ss) { | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| public static boolean hasShardingConfig() { | |||
| if (null == tableMap || tableMap.size() <= 0) { | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package com.iformall.plugin.shard.impl.rule; | |||
| public class ShardingRuleDefaultService implements ShardingRuleService { | |||
| @Override | |||
| public String getTableIndex(Object value, int count) { | |||
| if (null == value || count <= 0 ) { | |||
| return null; | |||
| } | |||
| int hash = 9999999; | |||
| //如果是整数,则直接变为Long,好查询 | |||
| if (value instanceof String) { | |||
| try { | |||
| Long lvalue = Long.parseLong((String)value); | |||
| hash = getHashCode(lvalue); | |||
| }catch(Exception e) { | |||
| hash = getHashCode(value); | |||
| } | |||
| }else { | |||
| hash = getHashCode(value); | |||
| } | |||
| return String.valueOf(hash%count); | |||
| } | |||
| private int getHashCode(Object value) { | |||
| int hash = value.hashCode(); | |||
| if (hash < 0 ) { | |||
| hash = Math.abs(hash); | |||
| } | |||
| return hash; | |||
| } | |||
| } | |||
| @@ -0,0 +1,6 @@ | |||
| package com.iformall.plugin.shard.impl.rule; | |||
| public interface ShardingRuleService { | |||
| public String getTableIndex(Object value,int count); | |||
| } | |||
| @@ -0,0 +1,301 @@ | |||
| package com.iformall.plugin.shard.plugin; | |||
| import net.sf.jsqlparser.JSQLParserException; | |||
| import net.sf.jsqlparser.parser.CCJSqlParserUtil; | |||
| import net.sf.jsqlparser.schema.Table; | |||
| import net.sf.jsqlparser.statement.Statement; | |||
| import net.sf.jsqlparser.statement.create.table.CreateTable; | |||
| import net.sf.jsqlparser.statement.delete.Delete; | |||
| import net.sf.jsqlparser.statement.insert.Insert; | |||
| import net.sf.jsqlparser.statement.select.*; | |||
| import net.sf.jsqlparser.statement.update.Update; | |||
| import net.sf.jsqlparser.util.TablesNamesFinder; | |||
| import org.apache.ibatis.executor.statement.StatementHandler; | |||
| import org.apache.ibatis.logging.LogFactory; | |||
| import org.apache.ibatis.mapping.BoundSql; | |||
| import org.apache.ibatis.mapping.MappedStatement; | |||
| import org.apache.ibatis.mapping.StatementType; | |||
| import org.apache.ibatis.plugin.*; | |||
| import org.apache.ibatis.reflection.MetaObject; | |||
| import org.apache.ibatis.reflection.SystemMetaObject; | |||
| import com.alibaba.druid.wall.violation.ErrorCode; | |||
| import com.iformall.plugin.MyBatisPlus; | |||
| import com.iformall.plugin.entity.ChainValue; | |||
| import com.iformall.plugin.entity.ChainValueHelper; | |||
| import com.iformall.plugin.shard.annotation.IgnoreSharding; | |||
| import com.iformall.plugin.shard.impl.ShardingRuleExcuter; | |||
| import com.iformall.plugin.shard.impl.ShardingSphere; | |||
| import com.iformall.plugin.shard.impl.ShardingTableExcuter; | |||
| import java.lang.reflect.Method; | |||
| import java.math.BigDecimal; | |||
| import java.sql.Date; | |||
| import java.sql.Time; | |||
| import java.sql.Timestamp; | |||
| import java.util.HashMap; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Properties; | |||
| /** | |||
| *分表 | |||
| */ | |||
| public class ShardingSpherePlugin implements MyBatisPlus { | |||
| public ShardingSpherePlugin(){ | |||
| } | |||
| //属性参数信息 | |||
| private Properties properties; | |||
| private String dialect = "mysql"; | |||
| private List<ShardingSphere> ShardingSpheres; | |||
| public String getDialect() { | |||
| return dialect; | |||
| } | |||
| public void setDialect(String dialect) { | |||
| this.dialect = dialect; | |||
| } | |||
| public List<ShardingSphere> getShardingSpheres() { | |||
| return ShardingSpheres; | |||
| } | |||
| public void setShardingSpheres(List<ShardingSphere> shardingSpheres) { | |||
| ShardingSpheres = shardingSpheres; | |||
| } | |||
| /** | |||
| * 获取配置信息 | |||
| * {dialect=mysql, tenantInfo=org.xue.test.TenantInfoImpl, tenantIdColumn=tenant_id, parentTenantIdColumn=parent_tenant_id} | |||
| * @param properties | |||
| */ | |||
| public void setProperties(Properties properties) { | |||
| this.properties=properties; | |||
| this.dialect = this.properties.getProperty("dialect"); | |||
| if (null != this.ShardingSpheres) { | |||
| for (ShardingSphere ss : this.ShardingSpheres) { | |||
| ShardingTableExcuter.setTableSharding(ss.getTableName(), ss); | |||
| } | |||
| } | |||
| } | |||
| public Map<String,ChainValue> intercept(Invocation invocation,Map<String,ChainValue> chainMap) throws Throwable { | |||
| if (!ShardingTableExcuter.hasShardingConfig()) { | |||
| return null; | |||
| } | |||
| StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); | |||
| MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); | |||
| MappedStatement ms = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement"); | |||
| if(ms.getStatementType().equals(StatementType.CALLABLE)){ | |||
| return chainMap; | |||
| } | |||
| //String id = ms.getId(); | |||
| //String className = id.substring(0, id.lastIndexOf(".")); | |||
| //String methodName = id.substring(id.lastIndexOf(".") + 1); | |||
| //Class<?> clazz = Class.forName(className); | |||
| //Method method = getMethodFromAllParent(clazz, methodName); | |||
| //if (method != null) { | |||
| // IgnoreSharding ignore = method.getAnnotation(IgnoreSharding.class); | |||
| // if (null == ignore) { | |||
| Object parameterObject = metaStatementHandler.getValue("delegate.boundSql.parameterObject"); | |||
| BoundSql boundSql = statementHandler.getBoundSql(); | |||
| String newSQL = buildTable(boundSql,parameterObject,chainMap); | |||
| metaStatementHandler.setValue("delegate.boundSql.sql", newSQL); | |||
| // } | |||
| //} | |||
| //没有添加字段,只是根据字段分表,没有别的需要返回 | |||
| return chainMap; | |||
| } | |||
| private String buildTable(BoundSql boundSql,Object parameterObject,Map<String,ChainValue> chainMap) throws JSQLParserException { | |||
| String oldSql = boundSql.getSql(); | |||
| Statement stmt = CCJSqlParserUtil.parse(oldSql); | |||
| if (stmt instanceof Insert) { | |||
| return buildInsert((Insert) stmt,oldSql,parameterObject,chainMap); | |||
| } | |||
| if (stmt instanceof Delete) { | |||
| return buildDelete((Delete) stmt,oldSql,parameterObject,chainMap); | |||
| } | |||
| if (stmt instanceof Update) { | |||
| return buildUpdate((Update) stmt,oldSql,parameterObject,chainMap); | |||
| } | |||
| if (stmt instanceof Select) { | |||
| return buildSelect((Select) stmt,oldSql,parameterObject,chainMap); | |||
| } | |||
| if (stmt instanceof CreateTable) { | |||
| return oldSql; | |||
| } | |||
| throw new RuntimeException("非法sql语句,请检查"+oldSql); | |||
| } | |||
| private String buildInsert(Insert stmt,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| return buildTable(stmt.getTable(), oldSql, parameterObject,chainMap); | |||
| } | |||
| private String buildDelete(Delete stmt,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| return buildTable(stmt.getTable(), oldSql, parameterObject,chainMap); | |||
| } | |||
| private String buildUpdate(Update stmt,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| return buildListTables(stmt.getTables(), oldSql, parameterObject,chainMap); | |||
| } | |||
| private String buildSelect(Select stmt,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); | |||
| List<String> tableList = tablesNamesFinder.getTableList(stmt); | |||
| return buildByListTableNames(tableList, oldSql, parameterObject,chainMap); | |||
| } | |||
| private String buildTable(Table table,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| return buildByTableName(table.getName(), oldSql, parameterObject,chainMap); | |||
| } | |||
| private String buildByTableName(String table,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| if (!ShardingTableExcuter.isShardingTable(table)) { | |||
| return oldSql; | |||
| } | |||
| String newtable = getShareTable(table,parameterObject,chainMap); | |||
| //此处处理前缀相似的表,如wx_c_user, wx_c_user_basic_info, 直接替换wx_c_user会有问题 | |||
| return oldSql.replaceAll(table+"_", "########").replaceAll(table, newtable).replaceAll("########", table+"_"); | |||
| } | |||
| private String buildListTables(List<Table> tables,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| for (Table t : tables) { | |||
| oldSql = buildTable(t,oldSql,parameterObject,chainMap); | |||
| } | |||
| return oldSql; | |||
| } | |||
| private String buildByListTableNames(List<String> tables,String oldSql,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| for (String t : tables) { | |||
| oldSql = buildByTableName(t,oldSql,parameterObject,chainMap); | |||
| } | |||
| return oldSql; | |||
| } | |||
| private String getShareTable(String table,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| ShardingSphere ss = ShardingTableExcuter.getShardingSphere(table); | |||
| return ss.getTableName()+ShardingSphere.TABLE_SUFFIX+ShardingRuleExcuter.getTableIndex(ss.getRule(), getValue(table,ss.getColumn(),parameterObject,chainMap), ss.getCount()); | |||
| } | |||
| private Object getValue(String table,String column,Object parameterObject,Map<String,ChainValue> parentChainMap) { | |||
| Object ov = ChainValueHelper.getValue(table, column, parentChainMap); | |||
| if (null != ov ) { | |||
| return ov; | |||
| } | |||
| if (parameterObject instanceof Map) { | |||
| String field = getField(column); | |||
| field = field.substring(0,1).toLowerCase()+field.substring(1); | |||
| Object o = parameterObject; | |||
| if (((Map) parameterObject).containsKey("et")) { | |||
| o = ((Map) parameterObject).get("et"); | |||
| }else if(((Map) parameterObject).containsKey("ew")) { | |||
| Object ew = ((Map) parameterObject).get("ew"); | |||
| if (ew instanceof com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) { | |||
| o = ((com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) ew).getEntity(); | |||
| } | |||
| }else if(((Map) parameterObject).containsKey(column)) { | |||
| o = ((Map) parameterObject).get(column); | |||
| }else if (((Map) parameterObject).containsKey(field)) { | |||
| o = ((Map) parameterObject).get(field); | |||
| }else { | |||
| Map m = (Map) parameterObject; | |||
| for (Iterator it = m.keySet().iterator();it.hasNext();) { | |||
| Object ito = it.next(); | |||
| Object value = m.get(ito); | |||
| if(isBasicTypeValue(value)) { | |||
| if (ito instanceof String) { | |||
| String itoStr = (String) ito; | |||
| if( itoStr.equals(column) || itoStr.equals(field)) { | |||
| return value; | |||
| }else { | |||
| continue; | |||
| } | |||
| }else { | |||
| continue; | |||
| } | |||
| } | |||
| Object v = getValue(table,column,value,parentChainMap); | |||
| if (null != v) { | |||
| return v; | |||
| } | |||
| } | |||
| } | |||
| return getValue(table,column,o,parentChainMap); | |||
| }else if (isBasicTypeValue(parameterObject)) { | |||
| return parameterObject; | |||
| //认为是实体 | |||
| }else { | |||
| return getEntityValue(column, parameterObject, parentChainMap); | |||
| } | |||
| } | |||
| private String getField(String column) { | |||
| if (null == column) { | |||
| throw new RuntimeException("table sharinding error column is null"); | |||
| } | |||
| try { | |||
| if (column.contains("_") && (!column.endsWith("_")) && (!column.startsWith("_"))) { | |||
| String[] field = column.split("_"); | |||
| String fieldName = ""; | |||
| if (null != field && field.length > 0) { | |||
| for (String f : field) { | |||
| fieldName = fieldName + f.substring(0,1).toUpperCase()+f.substring(1); | |||
| } | |||
| }else { | |||
| fieldName = column.substring(0,1).toUpperCase()+column.substring(1); | |||
| } | |||
| return fieldName; | |||
| }else { | |||
| return column.substring(0,1).toUpperCase()+column.substring(1); | |||
| } | |||
| }catch(Exception e) { | |||
| throw new RuntimeException(e); | |||
| } | |||
| } | |||
| private boolean isBasicTypeValue(Object parameterObject) { | |||
| if( parameterObject instanceof Integer || parameterObject instanceof Long || parameterObject instanceof Short || parameterObject instanceof Float | |||
| || parameterObject instanceof Double || parameterObject instanceof BigDecimal || parameterObject instanceof Character || parameterObject instanceof String | |||
| || parameterObject instanceof Byte || parameterObject instanceof Date || parameterObject instanceof Time || parameterObject instanceof Timestamp ) { | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| private Object getEntityValue(String column,Object parameterObject,Map<String,ChainValue> chainMap) { | |||
| try { | |||
| Method method = getMethodFromAllParent(parameterObject.getClass(),"get"+getField(column)); | |||
| Object o = method.invoke(parameterObject); | |||
| return o; | |||
| }catch(Exception e) { | |||
| e.printStackTrace(); | |||
| throw new RuntimeException(e); | |||
| } | |||
| } | |||
| private Method getMethodFromAllParent(Class<?> currentClazz,String methodName) { | |||
| Method method = null; | |||
| for(Class<?> clazz = currentClazz ; clazz != Object.class ; clazz = clazz.getSuperclass()) { | |||
| try { | |||
| method = clazz.getDeclaredMethod(methodName) ; | |||
| } catch (Exception e) { | |||
| //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 | |||
| //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了 | |||
| } | |||
| } | |||
| if (null == method) { | |||
| throw new RuntimeException(currentClazz+" has no method:"+methodName+"()"); | |||
| } | |||
| return method; | |||
| } | |||
| } | |||
| @@ -0,0 +1,5 @@ | |||
| #Generated by Maven | |||
| #Tue Jan 10 23:40:16 CST 2023 | |||
| version=1.0 | |||
| groupId=com.iformall | |||
| artifactId=suimang-mybatis | |||
| @@ -0,0 +1,295 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> | |||
| <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$"> | |||
| <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.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.15.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.15.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.25" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.29.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.29.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.29.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.4.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.servlet:jakarta.servlet-api:4.0.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-amqp:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.amqp:spring-rabbit:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.rabbitmq:amqp-client:5.7.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.amqp:spring-amqp:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-cache:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.2.2.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.3.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web-services:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.xml.messaging.saaj:saaj-impl:1.5.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.xml.soap:jakarta.xml.soap-api:1.4.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jvnet.mimepull:mimepull:1.9.12" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jvnet.staxex:stax-ex:1.8.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.xml.ws:jakarta.xml.ws-api:2.3.2" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: jakarta.jws:jakarta.jws-api:1.1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.ws:spring-ws-core:3.0.8.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.ws:spring-xml:3.0.8.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-mail:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.mail:jakarta.mail:1.6.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-boot-starter-process:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-boot-autoconfigure:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-security:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-engine:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-bpmn-converter:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-bpmn-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-process-validation:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-image-generator:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-engine-common-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-engine-common:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-variable-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-variable-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-identitylink-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-identitylink-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-task-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-task-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-job-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-job-service-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-idm-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-idm-engine:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.uuid:java-uuid-generator:3.1.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-idm-engine-configurator:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-cmmn-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-cmmn-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-dmn-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-dmn-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-form-model:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-form-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-content-api:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.commons:commons-email:1.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.sun.mail:javax.mail:1.5.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-spring-common:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.flowable:flowable-job-spring-service:6.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-orm:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.2" level="project" /> | |||
| <orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.5.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.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.vintage:junit-vintage-engine:5.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.5.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.1.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.13.2" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.1" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.8" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.8" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.4.RELEASE" level="project" /> | |||
| <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.rocketmq.spring.boot:rocketmq-spring-boot-starter:1.0.0.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.rocketmq:rocketmq-client:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.rocketmq:rocketmq-common:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.rocketmq:rocketmq-remoting:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.netty:netty-all:4.1.45.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.guava:guava:26.0-jre" 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:2.5.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.1.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.14" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.14" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.8.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:1.2.0.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.8.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.javassist:javassist:3.21.0-GA" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.0" level="project" /> | |||
| <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.10" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.crazycake:shiro-redis:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: redis.clients:jedis:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.7.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.puppycrawl.tools:checkstyle:8.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.antlr:antlr4-runtime:4.7" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: net.sf.saxon:Saxon-HE:9.8.0-4" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.60" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.60" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-spring-boot-starter:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-web:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-base:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.poi:poi:4.1.1" 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: org.apache.poi:poi-ooxml:4.1.1" 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.apache.poi:poi-ooxml-schemas:4.1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: ognl:ognl:3.2.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" /> | |||
| <orderEntry type="library" name="Maven: cn.afterturn:easypoi-annotation:4.1.3.A" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.2.5.RELEASE" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.13" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.14.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.17.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.10" level="project" /> | |||
| <orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-common:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.11" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.30" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-miniapp:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-mp:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-pay:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:qrcode-utils:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.google.zxing:core:3.2.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jodd:jodd-http:5.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jodd:jodd-core:5.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jodd:jodd-util:6.0.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.binarywang:weixin-java-open:3.7.0.B" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.github.ulisesbocchio:jasypt-spring-boot:2.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jasypt:jasypt:1.9.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.belerweb:pinyin4j:2.5.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-core:4.5.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.5" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.opentracing:opentracing-api:0.33.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.opentracing:opentracing-util:0.33.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-dysmsapi:2.1.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.10.2" level="project" /> | |||
| <orderEntry type="library" name="Maven: org.codehaus.jettison:jettison:1.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.0.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-sts:3.0.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ecs:4.2.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.7.0" level="project" /> | |||
| <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-jpeg:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-core:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.imageio:imageio-metadata:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-lang:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-io:3.6" level="project" /> | |||
| <orderEntry type="library" name="Maven: com.twelvemonkeys.common:common-image:3.6" level="project" /> | |||
| </component> | |||
| </module> | |||
| @@ -0,0 +1,161 @@ | |||
| package com.iformall.aop; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.iformall.annotation.RedisCache; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.domain.po.WxCUser; | |||
| import com.iformall.domain.po.base.BaseCUserEntity; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.service.CUserTokenService; | |||
| import com.iformall.utils.HashUtil; | |||
| import com.iformall.utils.RedisLock; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| 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.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.redis.core.StringRedisTemplate; | |||
| import org.springframework.data.redis.core.ValueOperations; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.web.context.request.RequestContextHolder; | |||
| import org.springframework.web.context.request.ServletRequestAttributes; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import java.lang.reflect.Method; | |||
| import java.util.Arrays; | |||
| import java.util.Objects; | |||
| @Slf4j | |||
| @Aspect | |||
| @Component | |||
| public class RedisCacheAspect { | |||
| /** | |||
| * 参数分隔符 param1|param2|param3 | |||
| **/ | |||
| private static final String DELIMITER_PARAMS = "|"; | |||
| /** | |||
| * key 分隔符 | |||
| */ | |||
| private static final String DELIMITER_KEY = ":"; | |||
| @Autowired | |||
| private StringRedisTemplate stringRedisTemplate; | |||
| @Autowired | |||
| RedisLock redisLock; | |||
| @Autowired | |||
| private CUserTokenService cUserTokenService; | |||
| @Pointcut("@annotation(com.iformall.annotation.RedisCache)") | |||
| public void cacheAspect() { | |||
| } | |||
| @Around("cacheAspect()") | |||
| public Object round(ProceedingJoinPoint jp) throws Throwable { | |||
| HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); | |||
| // 查询token信息 | |||
| //从header中获取token | |||
| String token = request.getHeader("token"); | |||
| //如果header中不存在token,则从参数中获取token | |||
| if (StringUtils.isBlank(token)) { | |||
| token = request.getParameter("token"); | |||
| } | |||
| if(StringUtils.isBlank(token) || "null".equals(token) || "undefined".equals(token)){ | |||
| token=""; | |||
| //throw new MallinkException(ErrorCode.NET_TOKEN_EMPTY.getCode(),"token为空["+token+"]"); | |||
| } | |||
| log.info("token>>>>>>>>>>>>>>>"+token); | |||
| String tenantId; | |||
| BaseCUserEntity cUser = null ; | |||
| if(StringUtils.isNotBlank(token)) { | |||
| cUser = cUserTokenService.getByToken(token); | |||
| } | |||
| if (Objects.isNull(cUser) || cUser.getExpireTime().getTime() < System.currentTimeMillis()) { | |||
| tenantId = "0"; | |||
| } else { | |||
| tenantId = cUser.getTenantId(); | |||
| } | |||
| // 请求参数 | |||
| Object[] args = jp.getArgs(); | |||
| // 接口 返回结果 | |||
| Object result; | |||
| String redisKey; | |||
| //得到注释的名称 | |||
| MethodSignature signature = (MethodSignature) jp.getSignature(); | |||
| //判断tag是否在用户权限中 如果存在加入参数查询 | |||
| Method method = signature.getMethod(); | |||
| RedisCache cache = method.getAnnotation(RedisCache.class) ; | |||
| if (cache.autoKey()) { | |||
| // 构建 redisKey => reqPath:tenantId:md5(param1_param2_param3) | |||
| String requestUrl = request.getRequestURI(); | |||
| // 接口路径 reqPath => /api/xxx | |||
| String reqPath = requestUrl.substring(requestUrl.indexOf("/api/")); | |||
| if (cache.md5()) { | |||
| String md5Before = StringUtils.join(args, DELIMITER_PARAMS); | |||
| redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, HashUtil.md5(StringUtils.join(token, md5Before, DELIMITER_PARAMS))); | |||
| } else { | |||
| redisKey = StringUtils.join(reqPath, DELIMITER_KEY, tenantId, DELIMITER_KEY, StringUtils.join(token,args, DELIMITER_PARAMS)); | |||
| } | |||
| } else { | |||
| redisKey = cache.key(); | |||
| } | |||
| // redisKey 不存在,获取接口数据并返回 | |||
| if (StringUtils.isBlank(redisKey)) { | |||
| result = jp.proceed(args); | |||
| } else { | |||
| ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue(); | |||
| String value = valueOperations.get(redisKey); | |||
| if (value == null) { | |||
| String lockKey = StringUtils.join(redisKey, ":", "lock"); | |||
| long time = System.currentTimeMillis() + 2000; | |||
| String timeStr = String.valueOf(time); | |||
| try { | |||
| //分布式锁,保证一个线程读DB,其它线程排队 | |||
| if (redisLock.lock2(lockKey, timeStr)) { | |||
| log.debug("CacheAspect 读库中, key:{}: " + lockKey); | |||
| result = jp.proceed(args); | |||
| String json_data = JSONObject.toJSONString(result); | |||
| valueOperations.set(redisKey, json_data, cache.expireTime(), cache.dateUnit()); | |||
| log.debug("CacheAspect 缓存不存在,获取接口数据并放入缓存,key:{}, expire:{}", redisKey, cache.expireTime()); | |||
| } else { | |||
| log.debug("CacheAspect 读库等待中, key:{}: " + lockKey); | |||
| Thread.sleep(2000); | |||
| value = valueOperations.get(redisKey); | |||
| result = parseCache(jp, redisKey, value); | |||
| } | |||
| } catch (Throwable throwable) { | |||
| log.error("CacheAspect proceed error , Illegal argument: {} in {}.{}()", Arrays.toString(jp.getArgs()), | |||
| jp.getSignature().getDeclaringTypeName(), jp.getSignature().getName(), throwable); | |||
| throw throwable; | |||
| } finally { | |||
| redisLock.unlock(lockKey, timeStr); | |||
| } | |||
| } else { | |||
| result = parseCache(jp, redisKey, value); | |||
| } | |||
| // 计数器 | |||
| stringRedisTemplate.opsForHash().increment("hotapi", redisKey, 1); | |||
| } | |||
| return result; | |||
| } | |||
| private Object parseCache(ProceedingJoinPoint jp, String redisKey, String value) { | |||
| if (StringUtils.isBlank(value)) { | |||
| log.debug("CacheAspect 缓存不存在,解析缓存数据为空:{},key:{}", value, redisKey); | |||
| return null; | |||
| } | |||
| Class<?> returnType = ((MethodSignature) jp.getSignature()).getReturnType(); | |||
| log.debug("CacheAspect 缓存存在,解析缓存并返回,key:{}", redisKey); | |||
| return JSONObject.parseObject(value, returnType); | |||
| } | |||
| } | |||
| @@ -0,0 +1,175 @@ | |||
| package com.iformall.utils; | |||
| import net.sourceforge.pinyin4j.PinyinHelper; | |||
| import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; | |||
| import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; | |||
| import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; | |||
| import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; | |||
| import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.util.ResourceUtils; | |||
| import javax.imageio.ImageIO; | |||
| import java.awt.*; | |||
| import java.awt.image.BufferedImage; | |||
| import java.io.ByteArrayInputStream; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.io.File; | |||
| import java.io.InputStream; | |||
| import java.time.LocalDateTime; | |||
| import java.time.format.DateTimeFormatter; | |||
| import java.util.Locale; | |||
| public class ImgIdeaUtil { | |||
| private static final Logger logger = LoggerFactory.getLogger(ImgIdeaUtil.class); | |||
| //模板图片 | |||
| private static final String imgTempPath = "imgTemp/gertificate.jpg"; | |||
| //字体路径 | |||
| private static final String fontPath = "opt/HWLS.TTF"; | |||
| /** | |||
| * 生成图片证书 | |||
| * @return | |||
| */ | |||
| public static byte[] imgGertificate(String name, String englishName, LocalDateTime date){ | |||
| if(StringUtils.isBlank(name)){ | |||
| logger.error("名字为空,无法生成证书"); | |||
| return null; | |||
| } | |||
| if(name.length() == 2){ | |||
| name = name.replaceAll("(\\S)", "$0 "); | |||
| } | |||
| if(StringUtils.isBlank(englishName)){ | |||
| englishName = getUpEname(name); | |||
| } | |||
| if(date == null){ | |||
| date = LocalDateTime.now(); | |||
| } | |||
| DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dMMM yyyy", Locale.UK); | |||
| String dateFormat = date.format(formatter); | |||
| try { | |||
| InputStream backImgUrl = ClassLoader.getSystemResourceAsStream(imgTempPath); | |||
| //InputStream backImgUrl = ImgIdeaUtil.class.getClassLoader().getResourceAsStream(imgTempPath); | |||
| Font font = Font.createFont(Font.TRUETYPE_FONT, ResourceUtils.getFile("classpath:"+fontPath)); | |||
| BufferedImage backImg = ImageIO.read(backImgUrl); | |||
| Graphics g = backImg.getGraphics(); | |||
| //图片加中文名 | |||
| Font fTxtBottomName = font.deriveFont(Font.PLAIN, 170); | |||
| //Font fTxtBottomName = new Font("华文隶书", Font.PLAIN, 170); | |||
| FontMetrics metricsName = g.getFontMetrics(fTxtBottomName); | |||
| int xName = (backImg.getWidth() - metricsName.stringWidth(name)) / 2; | |||
| Color myColorTxtBottomName = Color.BLACK; //颜色 | |||
| g.setColor(myColorTxtBottomName); | |||
| g.setFont(fTxtBottomName); | |||
| g.drawString(name, xName , 1150);//g.drawString(文字, x 位置, y 位置); | |||
| //图片加英文名 | |||
| Font fTxtBottomEname = font.deriveFont(Font.PLAIN, 120); | |||
| //Font fTxtBottomEname = new Font("华文隶书", Font.PLAIN, 120); | |||
| FontMetrics metricsEname = g.getFontMetrics(fTxtBottomEname); | |||
| int xEname = (backImg.getWidth() - metricsEname.stringWidth(englishName)) / 2; | |||
| Color myColorTxtBottomEname = Color.BLACK; | |||
| g.setColor(myColorTxtBottomEname); | |||
| g.setFont(fTxtBottomEname); | |||
| g.drawString(englishName, xEname, 1300); | |||
| //图片加日期 | |||
| Font fTxtBottomDate = font.deriveFont(Font.PLAIN, 90); | |||
| //Font fTxtBottomDate = new Font("华文隶书", Font.PLAIN, 90); | |||
| Color myColorTxtBottomDate = Color.BLACK; | |||
| g.setColor(myColorTxtBottomDate); | |||
| g.setFont(fTxtBottomDate); | |||
| g.drawString(dateFormat, 440, 2100); | |||
| //调这个方法就是开始这个整合 (可以多张图片,多个文字整合成一张图片,只有把他们放在这方法里面就行) | |||
| g.dispose(); | |||
| ByteArrayOutputStream out = new ByteArrayOutputStream(); | |||
| ImageIO.write(backImg, "png", out); | |||
| return out.toByteArray(); | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| logger.error("生成证书异常", e.getMessage()); | |||
| } | |||
| return null; | |||
| } | |||
| /** | |||
| * //姓、名的第一个字母需要为大写 | |||
| * @param name | |||
| * @return | |||
| */ | |||
| public static String getUpEname(String name) { | |||
| char[] strs = name.toCharArray(); | |||
| String newname = null; | |||
| if (strs.length == 2) { | |||
| newname = toUpCase(getEname("" + strs[0])) + " " + toUpCase(getEname("" + strs[1])); | |||
| } else if (strs.length == 3){ | |||
| newname = toUpCase(getEname("" + strs[0])) + " " | |||
| + toUpCase(getEname("" + strs[1] + strs[2])); | |||
| }else if (strs.length == 4){ | |||
| newname = toUpCase(getEname("" + strs[0] + strs[1])) + " " | |||
| + toUpCase(getEname("" + strs[2] + strs[3])); | |||
| } else{ | |||
| newname = toUpCase(getEname(name)); | |||
| } | |||
| return newname; | |||
| } | |||
| /** | |||
| * //将中文转换为英文 | |||
| * @param name | |||
| * @return | |||
| */ | |||
| public static String getEname(String name){ | |||
| HanyuPinyinOutputFormat pyFormat = new HanyuPinyinOutputFormat(); | |||
| pyFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); | |||
| pyFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); | |||
| pyFormat.setVCharType(HanyuPinyinVCharType.WITH_V); | |||
| String s = ""; | |||
| try { | |||
| s = PinyinHelper.toHanyuPinyinString(name, pyFormat, ""); | |||
| } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) { | |||
| badHanyuPinyinOutputFormatCombination.printStackTrace(); | |||
| } | |||
| return s; | |||
| } | |||
| /** | |||
| * 首字母大写 | |||
| * @param str | |||
| * @return | |||
| */ | |||
| private static String toUpCase(String str) { | |||
| StringBuffer newstr = new StringBuffer(); | |||
| newstr.append((str.substring(0, 1)).toUpperCase()).append( | |||
| str.substring(1, str.length())); | |||
| return newstr.toString(); | |||
| } | |||
| // public static void main(String[] args) { | |||
| // String serverUploadImgUrl = "C:/Users/xiaohu/Desktop/img"; // 图片保存路径 | |||
| // try { | |||
| // byte[] bytes = imgGertificate("郑方元", null, null); | |||
| // ByteArrayInputStream bais = new ByteArrayInputStream(bytes); | |||
| // BufferedImage bi1 =ImageIO.read(bais); | |||
| // | |||
| // ImageIO.write(bi1, "png", new File(serverUploadImgUrl+"/0.png")); | |||
| // | |||
| // } catch (Exception e) { | |||
| // e.printStackTrace(); | |||
| // } | |||
| // System.out.println("结束"); | |||
| // } | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| package com.iformall.utils; | |||
| /** | |||
| * @author gongbiao | |||
| */ | |||
| public class UrlCheck { | |||
| public static boolean checkUrl(String url) { | |||
| return url.contains("awsFileUpload") | |||
| || url.contains("awsFilesUpload") | |||
| || url.contains("getCarStopFee"); | |||
| } | |||
| } | |||
| @@ -0,0 +1,68 @@ | |||
| package com.iformall.controller.base; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.iformall.domain.po.base.TenantEntity; | |||
| import com.iformall.utils.IPUtil; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.web.bind.WebDataBinder; | |||
| import org.springframework.web.bind.annotation.InitBinder; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import org.springframework.web.context.request.RequestContextHolder; | |||
| import org.springframework.web.context.request.ServletRequestAttributes; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import java.beans.PropertyEditorSupport; | |||
| import java.text.ParseException; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Date; | |||
| import java.util.Map; | |||
| @RestController | |||
| public class BaseController { | |||
| @InitBinder | |||
| public void InitBinder(WebDataBinder dataBinder) { | |||
| dataBinder.registerCustomEditor(Date.class, new PropertyEditorSupport() { | |||
| public void setAsText(String value) { | |||
| try { | |||
| setValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value)); | |||
| } catch(ParseException e) { | |||
| try { | |||
| setValue(new SimpleDateFormat("yyyy-MM-dd ").parse(value)); | |||
| } catch (ParseException e1) { | |||
| setValue(null); | |||
| } | |||
| } | |||
| } | |||
| public String getAsText() { | |||
| return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) getValue()); | |||
| } | |||
| }); | |||
| } | |||
| public String getIpAddr() { | |||
| HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); | |||
| String ipaddress = IPUtil.getIpAddr(request); | |||
| return ipaddress; | |||
| } | |||
| /** | |||
| * 根据扩展字段获取tenantId | |||
| */ | |||
| public String getTenantId(String attach){ | |||
| if(StringUtils.isNotBlank(attach)){ | |||
| try{ | |||
| Map<String,Object> map = JSONObject.parseObject(attach, Map.class); | |||
| String tenantId = map.get("tenantId").toString(); | |||
| if(StringUtils.isNotBlank(tenantId)){ | |||
| return tenantId; | |||
| } | |||
| }catch (Exception e){ | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| { | |||
| "groups": [ | |||
| { | |||
| "name": "aws", | |||
| "type": "com.iformall.config.AwsProperty", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| } | |||
| ], | |||
| "properties": [ | |||
| { | |||
| "name": "aws.access", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| }, | |||
| { | |||
| "name": "aws.bucket-name", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| }, | |||
| { | |||
| "name": "aws.client-region", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| }, | |||
| { | |||
| "name": "aws.secret", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| } | |||
| ], | |||
| "hints": [] | |||
| } | |||
| @@ -0,0 +1,189 @@ | |||
| spring: | |||
| profiles: | |||
| #include: aliyunRocketMQ | |||
| include: rabbitMQ | |||
| # JDBC | |||
| datasource: | |||
| url: jdbc:mysql://101.200.130.134:3306/malink_suimang?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true | |||
| username: root | |||
| password: fm2020test | |||
| type: com.alibaba.druid.pool.DruidDataSource | |||
| driver-class-name: com.mysql.cj.jdbc.Driver | |||
| filters: stat | |||
| maxActive: 20 | |||
| initialSize: 1 | |||
| maxWait: 60000 | |||
| minIdle: 1 | |||
| timeBetweenEvictionRunsMillis: 28000 | |||
| minEvictableIdleTimeMillis: 28000 | |||
| validationQuery: select 'x' | |||
| testWhileIdle: true | |||
| testOnBorrow: false | |||
| testOnReturn: false | |||
| poolPreparedStatements: true | |||
| maxOpenPreparedStatements: 20 | |||
| connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" | |||
| #jackson: | |||
| #date-format: yyyy-MM-dd HH:mm:ss | |||
| # REDIS | |||
| redis: | |||
| host: 101.200.130.134 | |||
| port: 6379 | |||
| password: iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 5 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 100 | |||
| max-idle: 500 | |||
| max-wait: -1 | |||
| min-idle: 10 | |||
| # SMS | |||
| aliyun: | |||
| sms: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| product: Dysmsapi | |||
| domain: dysmsapi.aliyuncs.com | |||
| regionId: cn-hangzhou | |||
| dateFormat: yyyyMMdd | |||
| endpointName: cn-hangzhou | |||
| oss: | |||
| endpoint: oss-cn-beijing.aliyuncs.com | |||
| keyid: LTAI4G7ixY4AhvM35F8o3W3V | |||
| keysecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| bucketname: formall | |||
| filehost: malinkcallback | |||
| filedomain: https://formall.oss-accelerate.aliyuncs.com | |||
| mail: | |||
| host: smtp.exmail.qq.com | |||
| username: zhengfangyuan@iformall.com | |||
| password: 2hSeppFRaw7KZZyf # 授权密码 | |||
| properties: | |||
| mail: | |||
| smtp: | |||
| auth: true | |||
| starttls: | |||
| enable: true | |||
| socketFactory: | |||
| port: 465 | |||
| class: javax.net.ssl.SSLSocketFactory | |||
| # ROCKETMQ | |||
| rocketmq: | |||
| nameServer: 127.0.0.1:9876 | |||
| producer: | |||
| retry-times-when-send-async-failed: 0 | |||
| send-msg-timeout: 300000 | |||
| compress-msg-body-over-howmuch: 4096 | |||
| max-message-size: 4194304 | |||
| retry-another-broker-when-not-store-ok: false | |||
| retry-times-when-send-failed: 2 | |||
| # RABBITMQ | |||
| rabbitmq: | |||
| host: 101.200.130.134 | |||
| port: 5672 | |||
| username: fumao | |||
| password: f9l98 | |||
| publisher-confirms: true | |||
| publisher-returns: false | |||
| virtual-host: / | |||
| aliyunRocketmq: | |||
| accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" | |||
| accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" | |||
| groupId: "GID_P_1" | |||
| namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" | |||
| aws: | |||
| clientRegion: cn-northwest-1 | |||
| bucketName: iformall-net | |||
| access: ENC(3gx5ghDFBqGrEhO3Wf8aYmXsnwHO7Cj3HNKJGOeUj0o=) | |||
| secret: ENC(HVKIJwCJKVXLlUpGlQPwNqJOlnpxn4xYuy91SH0seTSm2uAttIQHvA49fXWWax90v5wloIk0QuU=) | |||
| #wechat: | |||
| # web: | |||
| # appId: "wxe31beafbfd8295ba" | |||
| # secret: "c689fabf3c4c9f5b6424ff2a36a26727" | |||
| # url: "https://mall.youlane.cn" | |||
| # open: | |||
| # componentAppId: "wx897e4673286c915d" | |||
| # componentSecret: "cdfdfda65c45689beb6766c4c427eed2" | |||
| # componentToken: "formall2018" | |||
| # componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" | |||
| # redis: | |||
| # host: 101.201.103.81 | |||
| # port: 6379 | |||
| # password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) | |||
| # timeout: 3600 | |||
| # expire: 1800 #30分钟 | |||
| # database: 2 | |||
| # defaultExpiration: 2592000 # 默认生命周期30天 | |||
| # jedis: | |||
| # pool: | |||
| # max-active: 100 | |||
| # max-idle: 500 | |||
| # max-wait: -1 | |||
| # min-idle: 10 | |||
| wechat: | |||
| web: | |||
| appId: "wx091907dd0bfd3f6b" | |||
| secret: "2a2ca10738998b9ef92c1fe8a4d366a6" | |||
| url: "https://admintest.malls.iformall.com" | |||
| open: | |||
| componentAppId: wxdfc8fb4e62d6b52b | |||
| componentSecret: 98daa62b316dd6feabaad708327ce233 | |||
| componentToken: formall2018 | |||
| componentAesKey: htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN | |||
| redis: | |||
| host: 101.200.130.134 | |||
| port: 6379 | |||
| password: iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 2 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 100 | |||
| max-idle: 100 | |||
| max-wait: -1 | |||
| min-idle: 10 | |||
| alipay: | |||
| open: | |||
| appId: 2021002137663024 | |||
| appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCUfymV5J73QQMG52PVIGUbowkloYCO4B7TQoKbrTZf2YeYsg/To/o4PiXPMNwEUfEUU8NYQ6WwNhCd2fa1ei8WFXJUf3bfgswtBk1aOmHLeY9yoXFxIKMTQ9RcobnmBzKQZlaAPMTSr7t1QtKZKPuc2gEHGRFYKO/ZuL8gIpnsVidVtmi52yd7hzao/pI3ThLA0lreg4L3rYP5ESQZRytxIPgUQ4KI11pZxFgbe+uy28AGDYIQscSIb+SWOHPYKLvOEqqepIZ8M18w/U0lZzpzepzi/V/llekvXJ6UEf1lzl7x/4UIA3WPN1B40+NzbD/OxEGTuM0UctOG6ZTd4Te9AgMBAAECggEAPYksnHbvARspu/SrRCh2fatkIPn6Ijrxyy3mnch7neCw9i/jqxpqmF/4nxFqO0gRlRDZBHyT7p+Y5zDpsW5+kLI2fJmNkzXKkmXoLBnBaOZo8WHBdtXFfjg/iltig9Y7t+cQtXd5QK2eCwuz5dA75FXa0ywqKdRdAGY0nYZ5LpwrHVU8RXheUDCJyhKNj2+W6lIaSKDxLZU3laO1oBrv1agcy7Crd5E2ndb8O3Enga+z7wSz2h7A1BasC/Yl/Ro0Y21wLCH3s/R6qA0Paq12+WEF+xdodM7SrP43CCTVFGbC1TfEOdanJfixop8QuYsIp7pHrL925+vP4eY9RfckgQKBgQDQqLdpDzzU7Ot/L9Vc/r8d4iwXXbX8+HwVFV4oBuausgFyv8eJJpfrI+IlEoB1ubJcPpJBFqfmeYTW6/v6ioFljJAlWfFvesUVt/HszBMIOsU0Bzt7ex6WlwKOagb0q0ZPA4T0OY0K0lg0loaaaR8ZTr4ivDymaGBtTBYhslpc7QKBgQC2MBznGEc5r2dhyENvdPOR20PnXQcevGnPdqSus8m0VmDcHE72RVcckcZtwczsb3NaLSqmjAcWTn51/VFmlvhB3F34FcFTPZGq6sj7fWK8HuFq7l7mu5OzYuVr73zy9ggsUuaw10IqvvwIVxszNAF0hiRnSGH3z27CoRmz3s+8EQKBgQCK3o7atBJ3X4rIJiypbL4DhIB1uJ+jUjk6yvLUTut+fufp1+tTw0S+cS5UIAEw2Lr1G4u5F/v8rwmTBJG6SC4gSLGyui6uVBYRA1BWmedcxchzfRDAeMt9y9kesUAZ3Fe5xIzbAeZ1ulKMBVZmM+pHrJlsgr0Wv0bV1xqvqITtbQKBgBIsIGXopQoa9dvqBtfyOW1eCprkS5aEQqWf9vM6Ga90QjsSU8n6xqKh48IE57TZtQ7UnIF6TCasc66/MsRh4KdpHLJnMR5lcMc0nhF/wz5ychehaTPol+X3wlyOyc7OPah2KG6ROhdbb3ZBggQMduyxiKYIsUTvmuOtAAxR+DSRAoGADtuDzGQDOJYWiO2uuP6FpA5IJaiwlSfu3xncJVfhO8SVr6VBJFg88igbIB3w6nk/sv7j9VTXqXre9HMvp1flxaaLsdxM4HcTSALS9q6t/ajaveqte6S5kAtWx0WW8C6PtgWXHbxcD7LXARSsKLoEl2JXXyUVS/m2l/RzHBQ8GJI= | |||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | |||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | |||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | |||
| callback: https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||
| video: | |||
| aliyun: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| regionId: cn-beijing | |||
| jasypt: | |||
| encryptor: | |||
| password: oRqdnDbK5pj3eMmB | |||
| fm: | |||
| exception: true | |||
| exception_emails: xuxiaohu@iformall.com | |||
| deploy: 1 | |||
| open: true | |||
| upload_dir: /home/test/server/uploads/ | |||
| videoType: aliyun | |||
| logging: | |||
| level: | |||
| com.iformall: debug | |||
| path: ./logs/admin | |||
| @@ -0,0 +1,148 @@ | |||
| spring: | |||
| profiles: | |||
| include: aliyunRocketMQ | |||
| # JDBC | |||
| datasource: | |||
| url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/malink_suimang?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true | |||
| username: ENC(nUefcxWYlMS/1cDxikIKwA==) | |||
| password: ENC(neToS+hzeFjgSFB/7UEl5qYnW2rUjrPq) | |||
| type: com.alibaba.druid.pool.DruidDataSource | |||
| driver-class-name: com.mysql.cj.jdbc.Driver | |||
| filters: stat | |||
| maxActive: 200 | |||
| initialSize: 1 | |||
| maxWait: 60000 | |||
| minIdle: 1 | |||
| timeBetweenEvictionRunsMillis: 28000 | |||
| minEvictableIdleTimeMillis: 28000 | |||
| validationQuery: select 'x' | |||
| testWhileIdle: true | |||
| testOnBorrow: false | |||
| testOnReturn: false | |||
| poolPreparedStatements: true | |||
| maxOpenPreparedStatements: 20 | |||
| connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" | |||
| # REDIS | |||
| redis: | |||
| host: r-2zeaglwf13qqmnllj5.redis.rds.aliyuncs.com | |||
| port: 6379 | |||
| password: mallone:iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 1 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 100 | |||
| max-idle: 20 | |||
| max-wait: -1 | |||
| min-idle: 0 | |||
| # SMS | |||
| aliyun: | |||
| sms: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| product: Dysmsapi | |||
| domain: dysmsapi.aliyuncs.com | |||
| regionId: cn-hangzhou | |||
| dateFormat: yyyyMMdd | |||
| endpointName: cn-hangzhou | |||
| oss: | |||
| endpoint: oss-cn-beijing.aliyuncs.com | |||
| keyid: LTAI4G7ixY4AhvM35F8o3W3V | |||
| keysecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| bucketname: formall | |||
| filehost: malinkadmin | |||
| filedomain: https://formall.oss-accelerate.aliyuncs.com | |||
| mail: | |||
| host: smtp.exmail.qq.com | |||
| username: zhengfangyuan@iformall.com | |||
| password: 2hSeppFRaw7KZZyf # 授权密码 | |||
| properties: | |||
| mail: | |||
| smtp: | |||
| auth: true | |||
| starttls: | |||
| enable: true | |||
| socketFactory: | |||
| port: 465 | |||
| class: javax.net.ssl.SSLSocketFactory | |||
| # RABBITMQ | |||
| rabbitmq: | |||
| host: localhost | |||
| port: 5672 | |||
| username: ENC(lRmLd6EzgeY1RT5ktcHv9g==) | |||
| password: ENC(gBI8mCjr3OC0v57jcnSb660Ux7mW03K2oePgvohhg7w=) | |||
| publisher-confirms: true | |||
| publisher-returns: false | |||
| virtual-host: / | |||
| aliyunRocketmq: | |||
| accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" | |||
| accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" | |||
| groupId: "GID_P_1" | |||
| namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" | |||
| aws: | |||
| clientRegion: cn-northwest-1 | |||
| bucketName: iformall-net | |||
| access: ENC(a6SN1sZ1enNL49ypiOXkg/pPPAnZD8H4buQFTTKN08s=) | |||
| secret: ENC(5P5ff4bTMJUbXVR4ZsM03UHzOKZ4+Zg5Iutcdkyp/Quny/oXg+A4KpfwEyGarlLu3vQMJahGP5M=) | |||
| wechat: | |||
| web: | |||
| appId: "wx9cc4ca09eb20fe03" | |||
| secret: "af1d7f7a1268022a73cb4ce0b9cf0985" | |||
| url: "https://admin.malls.iformall.com" | |||
| open: | |||
| componentAppId: ENC(b3JG0MUZgQfz5Zj+DC2ZM1zDeLOiGTmmeokfe2O8kaM=) | |||
| componentSecret: ENC(QVyc4BPGdnSjXGs2ivgpDBE1v8wPWHLLRMYI7Vv8uYwC0SiZHQz0QpyyQV/b48Pb) | |||
| componentToken: ENC(rkxj0733WxFFDLgA9x01m2s5Fi2L+0PC) | |||
| componentAesKey: ENC(EIbJUBpbYOrLb4YQ/HXLQmxlxgAqIp2ZmpnGICC8pu5xiTz3Cqfkbwd2S8raCcK/IvYcX2GmedI=) | |||
| redis: | |||
| host: r-2zeaglwf13qqmnllj5.redis.rds.aliyuncs.com | |||
| port: 6379 | |||
| password: mallone:iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 2 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 100 | |||
| max-idle: 100 | |||
| max-wait: -1 | |||
| min-idle: 10 | |||
| alipay: | |||
| open: | |||
| appId: 2021002140616334 | |||
| appPrivateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCEJmHIlS0luIH7zJRRVlypCcgiSkqpSlnmgyCEM7nu8IerV8Yf7dMBitBklTpJB+4URV1bW+q6Ijzo8RsCyjm1Kx+EFiKf1PiJXlT0h1+bF3fYdDr6r5GK0/TtB8O80p774NcRD3HgbzUS8AEe/GcBvhiXbDRgJh7yAngW9vxl9u1o5UcaxOXVLWDrjlQGF6qyXUlycCNIdPXj3LduP3PBK5daVZwJm33Pr7kmSI0agZvV267HaTpSKaiXI7Zwo+nFMqx9g9kpzmYRfOgHx3DWpQUFI646IB8nEpLpQp3/0eDocuqiHXYgEpLpPoFKoVE228v74YSFh3Y4fFGX+qtjAgMBAAECggEAIJK9Y42xtSyHjaNdo7bf3CK3HAyn3pafFjyYFT4SxJyxNEDMay5Z5nVq7IAD/+BehMycOFqtvveVf+1+NO/XzZo1iH9URYVfRazkz+lWXYopVkdACm6gN1ILeymAy9g2q+s918ywyxteP668+ABK+5j5wsk/F7wNwKVvKGn0yMT7DP0FAL1e0KWndZCZlF79VnFpBLscDJq28GqRzqYop4CWqHHTA6DBvIqkfQV4U3IzqnzOsxNLEMBwhnbK08XfYZ3DxCPH0jQdA2Jj/aABrntq2EpWjzW5H9iZqrVo33rmsNHUSQvla/333RkbpwGyNhI6kcPBRq4cVSAa3y7dMQKBgQDVfyDUPWKXVwIJUgO1my8WIUu2p6nhuT7Mfnpk4X7ewdFaRVjb/r0KvhLgoz2/KOwkqtWTlEvNaCDDycpLXk+V5ZH833kYsDEmxY7ikOUjCcrfYJgT7P77//cZ4Kx8a5X45SiKAZT2GQv7BTtIfNhrfTUj6AQx/3MP3sa2QAWeNQKBgQCedWoF7t+qyck2hctqtTFC7fRkEk7RNJVph1ZOeTqOIAKhmhkwaOE3joxQ/VqHDy212YdW4hI0BWUzbEdMy0Idz2G3y9ERVD84hZehf5GGRdiSrY9EEQgHlcI6Qb8/AnDdpy1DlKUMwTYjVNzkDL3AzeWn61JS1XQaOzZBsJy2NwKBgFa+pJQXrOtYytcGn8M2Hlebh6vbS8cPAVkNOqWqiWXw0iMfcg9Q3XZz7C+hpAD7m5b6YnToGDSJTma+opck5qk88agRFJ7XV+Es+/VKcg9edzNzh9bwwFmbksbM5shW3kSWt3X7Vo73dkqzwXaeY0CpSuIf7zRxWkrkdVCvipjRAoGAMcJlPN+6VQNwsDJromKryXy31gT5wzBkCvN44sOm46KhsOWXK2CD+NJGtdgZaXgWvphEq7/qP3PCR9ekvDTH2lyZLwJN8Mcn4zPwXcKVjDi6vbTK3HEMuHUKvQiQadT2ZGRvDl3LRqoVuhqYEvT9UWJWz9hRzblB8ErPyukPDRkCgYB7bMv2iflpaGE1J3gkTlVJB+2QSfnAXaUDMLWsZN4gYjwEBVCEJ+mhWL1/GeEIBjSs5/qZIeRsYzlxGEcnsJzRfog6ITBF14AeZ+xNkHq83ja87OGVKMypiccGwRehijDhJi6tgMJ0u0w6PiqcJvh0SX4jBhDDPjuWzK2XD+lx8A== | |||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002140616334.crt | |||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | |||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | |||
| callback: https://callback.malls.iformall.com/api/alipay/notify/callback | |||
| video: | |||
| aliyun: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| regionId: cn-beijing | |||
| endPoint: https://oss-cn-beijing.aliyuncs.com | |||
| corePoolSize: 6 | |||
| maxPoolSize: 20 | |||
| queueCapacity: 1000 | |||
| namePrefix: aliyun-video-upload | |||
| fm: | |||
| exception: true | |||
| exception_emails: houtaikaifa@iformall.com | |||
| deploy: 3 | |||
| open: true | |||
| upload_dir: /root/uploads/ | |||
| videoType: aliyun | |||
| logging: | |||
| level: | |||
| com.iformall.mapper: debug | |||
| path: ./logs/admin | |||
| @@ -0,0 +1,73 @@ | |||
| server: | |||
| port: 9300 | |||
| servlet: | |||
| context-path: / | |||
| spring: | |||
| application: | |||
| name: suimang | |||
| profiles: | |||
| active: dev | |||
| jackson: | |||
| date-format: yyyy-MM-dd HH:mm:ss | |||
| time-zone: GMT+8 | |||
| default-property-inclusion: non_null | |||
| servlet: | |||
| multipart: | |||
| max-file-size: 2MB | |||
| max-request-size: 2MB | |||
| cache: | |||
| type: REDIS | |||
| cache-names: redis_cache #缓存的名字(可以不指定) | |||
| redis: | |||
| time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) | |||
| # rocketmq: | |||
| # nameServer: 202.165.179.86:9876 | |||
| # producer: | |||
| # retry-times-when-send-async-failed: 0 | |||
| # send-msg-timeout: 300000 | |||
| # compress-msg-body-over-howmuch: 4096 | |||
| # max-message-size: 4194304 | |||
| # retry-another-broker-when-not-store-ok: false | |||
| # retry-times-when-send-failed: 2 | |||
| # rabbitmq: | |||
| # host: 202.165.179.86 | |||
| # port: 5672 | |||
| # username: guest | |||
| # password: guest | |||
| # publisher-confirms: true | |||
| # virtual-host: / | |||
| aop: | |||
| proxy-target-class: true | |||
| auto: true | |||
| # MybatisPlus | |||
| mybatis-plus: | |||
| mapper-locations: classpath:mapper/*Mapper.xml | |||
| global-config: | |||
| db-config: | |||
| id-type: id_worker | |||
| field-strategy: not_null | |||
| db-type: mysql | |||
| configuration: | |||
| jdbc-type-for-null: 'null' | |||
| cache-enabled: false | |||
| call-setters-on-nulls: true | |||
| type-aliases-package: com.iformall.domain.po | |||
| type-enums-package: com.iformall.enums | |||
| # PageHelper | |||
| pagehelper: | |||
| helperDialect: mysql | |||
| reasonable: false | |||
| supportMethodsArguments: true | |||
| params: count=countSql | |||
| offset-as-page-num: true | |||
| page-size-zero: true | |||
| row-bounds-with-count: true | |||
| mapper: | |||
| mappers: | |||
| - com.iformall.common.CommonMapper | |||
| version: 1.0 | |||
| @@ -0,0 +1,100 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <configuration scan="true" scanPeriod="10 seconds"> | |||
| <!-- 外部指定路径 --> | |||
| <springProperty scop="context" name="logPath" source="logging.path" /> | |||
| <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |||
| <encoder> | |||
| <Pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] --%mdc{client}%msg%n</Pattern> | |||
| </encoder> | |||
| </appender> | |||
| <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/trace.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/trace.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| </appender> | |||
| <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/info.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/info.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>INFO</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/debug.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/debug.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>DEBUG</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/warn.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/warn.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>WARN</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/error.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/error.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>ERROR</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <root level="TRACE"> | |||
| <appender-ref ref="TRACE_FILE" /> | |||
| <appender-ref ref="INFO_FILE" /> | |||
| <!-- <appender-ref ref="DEBUG_FILE" /> --> | |||
| <!-- <appender-ref ref="WARN_FILE" /> --> | |||
| <appender-ref ref="ERROR_FILE" /> | |||
| </root> | |||
| <root level="INFO"> | |||
| <appender-ref ref="STDOUT" /> | |||
| </root> | |||
| </configuration> | |||
| @@ -0,0 +1,3 @@ | |||
| version=1.0 | |||
| groupId=com.iformall | |||
| artifactId=suimangCallback | |||
| @@ -0,0 +1,31 @@ | |||
| com\iformall\utils\AlipayMsgPage.class | |||
| com\iformall\controller\HomeController.class | |||
| META-INF\spring-configuration-metadata.json | |||
| com\iformall\config\MyExecutorConfig.class | |||
| com\iformall\controller\base\BaseController$1.class | |||
| com\iformall\interceptor\HttpServletRequestWrapperFilter.class | |||
| com\iformall\config\ShiroLoginFilter.class | |||
| com\iformall\interceptor\RequestInterceptor$1.class | |||
| com\iformall\config\MyBatisConfiguration.class | |||
| com\iformall\config\WebConfig.class | |||
| com\iformall\config\RestFilter.class | |||
| com\iformall\annotation\SystemControllerLog.class | |||
| com\iformall\interceptor\RequestInterceptor.class | |||
| com\iformall\shiro\UserSession.class | |||
| com\iformall\shiro\PasswordHelper.class | |||
| com\iformall\config\RedisConfig.class | |||
| com\iformall\utils\ReportResult.class | |||
| com\iformall\shiro\UseriFormallToken.class | |||
| com\iformall\utils\UrlCheck.class | |||
| com\iformall\controller\base\BaseController.class | |||
| com\iformall\shiro\MyShiroRealm.class | |||
| com\iformall\config\RestTemplateConfig.class | |||
| com\iformall\config\ShiroConfig.class | |||
| com\iformall\interceptor\BodyReaderHttpServletRequestWrapper$1.class | |||
| com\iformall\annotation\SystemServiceLog.class | |||
| com\iformall\shiro\ShiroService.class | |||
| com\iformall\interceptor\BodyReaderHttpServletRequestWrapper.class | |||
| com\iformall\shiro\MyRetryLimitCredentialsMatcher.class | |||
| com\iformall\CallbackApplication.class | |||
| com\iformall\config\AwsProperty.class | |||
| com\iformall\interceptor\XssHttpServletRequestWrapper.class | |||
| @@ -0,0 +1,27 @@ | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\MyExecutorConfig.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\controller\HomeController.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\shiro\ShiroService.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\interceptor\XssHttpServletRequestWrapper.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\shiro\MyShiroRealm.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\CallbackApplication.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\utils\UrlCheck.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\interceptor\HttpServletRequestWrapperFilter.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\AwsProperty.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\ShiroLoginFilter.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\controller\base\BaseController.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\interceptor\BodyReaderHttpServletRequestWrapper.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\RedisConfig.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\ShiroConfig.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\shiro\UseriFormallToken.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\shiro\MyRetryLimitCredentialsMatcher.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\annotation\SystemControllerLog.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\MyBatisConfiguration.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\utils\ReportResult.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\interceptor\RequestInterceptor.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\annotation\SystemServiceLog.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\RestTemplateConfig.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\shiro\UserSession.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\RestFilter.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\shiro\PasswordHelper.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\utils\AlipayMsgPage.java | |||
| C:\Users\xiaohu\ideaSuimangProject\suimangServer\suimangCallback\src\main\java\com\iformall\config\WebConfig.java | |||
| @@ -0,0 +1,79 @@ | |||
| package com.iformall.mq.impl; | |||
| import java.util.Properties; | |||
| import javax.annotation.PostConstruct; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.context.annotation.Profile; | |||
| import org.springframework.stereotype.Service; | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.aliyun.openservices.ons.api.Action; | |||
| import com.aliyun.openservices.ons.api.ConsumeContext; | |||
| import com.aliyun.openservices.ons.api.Consumer; | |||
| import com.aliyun.openservices.ons.api.Message; | |||
| import com.aliyun.openservices.ons.api.MessageListener; | |||
| import com.aliyun.openservices.ons.api.ONSFactory; | |||
| import com.aliyun.openservices.ons.api.PropertyKeyConst; | |||
| import com.aliyun.openservices.ons.api.bean.ConsumerBean; | |||
| import com.iformall.enums.EnumMsgMqTopic; | |||
| import com.iformall.mq.MQConfig; | |||
| import com.iformall.mq.MqBaseConsumer; | |||
| import com.iformall.utils.JsonUtil; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| @Slf4j | |||
| @Service | |||
| @Profile(MQConfig.Impl.ALIYUN_ROCKET_MQ) | |||
| public class AliyunRocketMqConsumer extends MqBaseConsumer { | |||
| @Value("${spring.aliyunRocketmq.accessKeyId}") | |||
| private String accessKeyId; | |||
| @Value("${spring.aliyunRocketmq.accessKeySecret}") | |||
| private String accessKeySecret; | |||
| @Value("${spring.aliyunRocketmq.groupId}") | |||
| private String groupId; | |||
| @Value("${spring.aliyunRocketmq.namesrvAddr}") | |||
| private String namesrvAddr; | |||
| @PostConstruct | |||
| public void init() { | |||
| for (EnumMsgMqTopic topic: EnumMsgMqTopic.values()) { | |||
| Properties properties = new Properties(); | |||
| // 您在控制台创建的 Group ID | |||
| properties.put(PropertyKeyConst.GROUP_ID, topic.getGroupId()); | |||
| // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建 | |||
| properties.put(PropertyKeyConst.AccessKey, accessKeyId); | |||
| // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建 | |||
| properties.put(PropertyKeyConst.SecretKey, accessKeySecret); | |||
| // 设置 TCP 接入域名,到控制台的实例基本信息中查看 | |||
| properties.put(PropertyKeyConst.NAMESRV_ADDR,namesrvAddr); | |||
| // 集群订阅方式(默认) | |||
| // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING); | |||
| // 广播订阅方式 | |||
| // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING); | |||
| Consumer consumer = ONSFactory.createConsumer(properties); | |||
| consumer.subscribe(topic.getCode(), "*", new MessageListener() { //订阅多个 Tag | |||
| public Action consume(Message message, ConsumeContext context) { | |||
| try { | |||
| System.out.println("Receive: " + message); | |||
| doMessage(new String(message.getBody())); | |||
| return Action.CommitMessage; | |||
| }catch(Exception e) { | |||
| log.error("AliyunRocketMqConsumer error:",e); | |||
| return Action.ReconsumeLater; | |||
| } | |||
| } | |||
| }); | |||
| consumer.start(); | |||
| log.info(" aliyunrocketMq consumer start success! "+JSON.toJSONString(consumer)); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,61 @@ | |||
| package com.iformall.mq.impl; | |||
| import com.iformall.mq.MqBaseConsumer; | |||
| import com.iformall.enums.EnumMsgMqTopic; | |||
| import com.iformall.mq.MQConfig; | |||
| import org.springframework.amqp.core.*; | |||
| import org.springframework.amqp.rabbit.annotation.RabbitListener; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.context.annotation.Bean; | |||
| import org.springframework.context.annotation.Profile; | |||
| import org.springframework.stereotype.Component; | |||
| import javax.annotation.PostConstruct; | |||
| @Component | |||
| @Profile(MQConfig.Impl.RABBIT_MQ) | |||
| public class RabbitMqConsumer extends MqBaseConsumer { | |||
| //String queueName = "topic-1"; | |||
| private String[] queuenames = null; | |||
| @Autowired | |||
| private AmqpAdmin amqpAdmin; | |||
| @PostConstruct | |||
| public void init() { | |||
| for (EnumMsgMqTopic topic: EnumMsgMqTopic.values()) { | |||
| DirectExchange exchange = new DirectExchange(topic.getCode()); | |||
| Queue queue = new Queue(topic.getCode()); | |||
| Binding binding = BindingBuilder.bind(queue).to(exchange).withQueueName(); | |||
| amqpAdmin.declareExchange(exchange); | |||
| amqpAdmin.declareQueue(queue); | |||
| amqpAdmin.declareBinding(binding); | |||
| } | |||
| } | |||
| @Autowired | |||
| private AmqpTemplate rabbitTemplate; | |||
| public void send(String queueName, String msg) { | |||
| rabbitTemplate.convertAndSend(queueName, msg); | |||
| } | |||
| @Bean | |||
| public String[] fmRabbitmaQueues(){ | |||
| if (null == queuenames) { | |||
| queuenames = new String[EnumMsgMqTopic.values().length]; | |||
| int i = 0 ; | |||
| for (EnumMsgMqTopic topic: EnumMsgMqTopic.values()) { | |||
| queuenames[i] = topic.getCode(); | |||
| i ++; | |||
| } | |||
| } | |||
| return queuenames; | |||
| } | |||
| @RabbitListener(queues = {"#{fmRabbitmaQueues}"}) | |||
| public void onMessage(String message) { | |||
| doMessage(message); | |||
| } | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| package com.iformall.mq.impl; | |||
| import com.iformall.mq.MqBaseConsumer; | |||
| import com.iformall.mq.MQConfig; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.rocketmq.starter.annotation.RocketMQListener; | |||
| import org.rocketmq.starter.annotation.RocketMQMessage; | |||
| import org.springframework.context.annotation.Profile; | |||
| @Slf4j | |||
| @Profile(MQConfig.Impl.ROCKET_MQ) | |||
| @RocketMQListener(topic = "topic-1",consumeThreadMax=100,consumeThreadMin = 20) | |||
| public class RocketMqConsumer extends MqBaseConsumer { | |||
| @RocketMQMessage(messageClass = String.class, tag = "tag-1") | |||
| public void onMessage(String message) { | |||
| doMessage(message); | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| { | |||
| "groups": [ | |||
| { | |||
| "name": "aws", | |||
| "type": "com.iformall.config.AwsProperty", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| } | |||
| ], | |||
| "properties": [ | |||
| { | |||
| "name": "aws.access", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| }, | |||
| { | |||
| "name": "aws.bucket-name", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| }, | |||
| { | |||
| "name": "aws.client-region", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| }, | |||
| { | |||
| "name": "aws.secret", | |||
| "type": "java.lang.String", | |||
| "sourceType": "com.iformall.config.AwsProperty" | |||
| } | |||
| ], | |||
| "hints": [] | |||
| } | |||
| @@ -0,0 +1,183 @@ | |||
| spring: | |||
| profiles: | |||
| #include: aliyunRocketMQ | |||
| include: rabbitMQ | |||
| # JDBC | |||
| datasource: | |||
| url: jdbc:mysql://101.200.130.134:3306/malink_suimang?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&useAffectedRows=true | |||
| username: root | |||
| password: fm2020test | |||
| type: com.alibaba.druid.pool.DruidDataSource | |||
| driver-class-name: com.mysql.cj.jdbc.Driver | |||
| filters: stat | |||
| maxActive: 20 | |||
| initialSize: 1 | |||
| maxWait: 60000 | |||
| minIdle: 1 | |||
| timeBetweenEvictionRunsMillis: 28000 | |||
| minEvictableIdleTimeMillis: 28000 | |||
| validationQuery: select 'x' | |||
| testWhileIdle: true | |||
| testOnBorrow: false | |||
| testOnReturn: false | |||
| poolPreparedStatements: true | |||
| maxOpenPreparedStatements: 20 | |||
| connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" | |||
| #jackson: | |||
| #date-format: yyyy-MM-dd HH:mm:ss | |||
| # REDIS | |||
| redis: | |||
| host: 101.200.130.134 | |||
| port: 6379 | |||
| password: iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 5 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 50 | |||
| max-idle: 50 | |||
| max-wait: -1 | |||
| min-idle: 10 | |||
| # SMS | |||
| aliyun: | |||
| sms: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| product: Dysmsapi | |||
| domain: dysmsapi.aliyuncs.com | |||
| regionId: cn-hangzhou | |||
| dateFormat: yyyyMMdd | |||
| endpointName: cn-hangzhou | |||
| oss: | |||
| endpoint: oss-cn-beijing.aliyuncs.com | |||
| keyid: LTAI4G7ixY4AhvM35F8o3W3V | |||
| keysecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| bucketname: formall | |||
| filehost: malinkmqconsumer | |||
| filedomain: https://formall.oss-accelerate.aliyuncs.com | |||
| mail: | |||
| host: smtp.exmail.qq.com | |||
| username: zhengfangyuan@iformall.com | |||
| password: 2hSeppFRaw7KZZyf # 授权密码 | |||
| properties: | |||
| mail: | |||
| smtp: | |||
| auth: true | |||
| starttls: | |||
| enable: true | |||
| socketFactory: | |||
| port: 465 | |||
| class: javax.net.ssl.SSLSocketFactory | |||
| rocketmq: | |||
| nameServer: 127.0.0.1:9876 | |||
| producer: | |||
| retry-times-when-send-async-failed: 0 | |||
| send-msg-timeout: 300000 | |||
| compress-msg-body-over-howmuch: 4096 | |||
| max-message-size: 4194304 | |||
| retry-another-broker-when-not-store-ok: false | |||
| retry-times-when-send-failed: 2 | |||
| rabbitmq: | |||
| host: 101.200.130.134 | |||
| port: 5672 | |||
| username: fumao | |||
| password: f9l98 | |||
| publisher-confirms: true | |||
| publisher-returns: false | |||
| virtual-host: / | |||
| aliyunRocketmq: | |||
| accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" | |||
| accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" | |||
| groupId: "GID_P_1" | |||
| namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" | |||
| aws: | |||
| clientRegion: cn-northwest-1 | |||
| bucketName: iformall-net | |||
| access: ENC(3gx5ghDFBqGrEhO3Wf8aYmXsnwHO7Cj3HNKJGOeUj0o=) | |||
| secret: ENC(HVKIJwCJKVXLlUpGlQPwNqJOlnpxn4xYuy91SH0seTSm2uAttIQHvA49fXWWax90v5wloIk0QuU=) | |||
| #wechat: | |||
| # open: | |||
| # componentAppId: "wxdfc8fb4e62d6b52b" | |||
| # componentSecret: "98daa62b316dd6feabaad708327ce233" | |||
| # componentToken: "formall2018" | |||
| # componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" | |||
| # redis: | |||
| # host: 101.201.103.81 | |||
| # port: 6379 | |||
| # password: ENC(xPFDlgd6v8zUhJMbcKc0KmmQiqs9qHtk) | |||
| # timeout: 3600 | |||
| # expire: 1800 #30分钟 | |||
| # database: 2 | |||
| # defaultExpiration: 2592000 # 默认生命周期30天 | |||
| # jedis: | |||
| # pool: | |||
| # max-active: 100 | |||
| # max-idle: 500 | |||
| # max-wait: -1 | |||
| # min-idle: 10 | |||
| wechat: | |||
| web: | |||
| appId: "wx091907dd0bfd3f6b" | |||
| secret: "2a2ca10738998b9ef92c1fe8a4d366a6" | |||
| url: "https://admintest.malls.iformall.com" | |||
| open: | |||
| componentAppId: wxdfc8fb4e62d6b52b | |||
| componentSecret: 98daa62b316dd6feabaad708327ce233 | |||
| componentToken: formall2018 | |||
| componentAesKey: htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN | |||
| redis: | |||
| host: 101.200.130.134 | |||
| port: 6379 | |||
| password: iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 2 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 100 | |||
| max-idle: 100 | |||
| max-wait: -1 | |||
| min-idle: 10 | |||
| alipay: | |||
| open: | |||
| appId: 2021002137663024 | |||
| appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCUfymV5J73QQMG52PVIGUbowkloYCO4B7TQoKbrTZf2YeYsg/To/o4PiXPMNwEUfEUU8NYQ6WwNhCd2fa1ei8WFXJUf3bfgswtBk1aOmHLeY9yoXFxIKMTQ9RcobnmBzKQZlaAPMTSr7t1QtKZKPuc2gEHGRFYKO/ZuL8gIpnsVidVtmi52yd7hzao/pI3ThLA0lreg4L3rYP5ESQZRytxIPgUQ4KI11pZxFgbe+uy28AGDYIQscSIb+SWOHPYKLvOEqqepIZ8M18w/U0lZzpzepzi/V/llekvXJ6UEf1lzl7x/4UIA3WPN1B40+NzbD/OxEGTuM0UctOG6ZTd4Te9AgMBAAECggEAPYksnHbvARspu/SrRCh2fatkIPn6Ijrxyy3mnch7neCw9i/jqxpqmF/4nxFqO0gRlRDZBHyT7p+Y5zDpsW5+kLI2fJmNkzXKkmXoLBnBaOZo8WHBdtXFfjg/iltig9Y7t+cQtXd5QK2eCwuz5dA75FXa0ywqKdRdAGY0nYZ5LpwrHVU8RXheUDCJyhKNj2+W6lIaSKDxLZU3laO1oBrv1agcy7Crd5E2ndb8O3Enga+z7wSz2h7A1BasC/Yl/Ro0Y21wLCH3s/R6qA0Paq12+WEF+xdodM7SrP43CCTVFGbC1TfEOdanJfixop8QuYsIp7pHrL925+vP4eY9RfckgQKBgQDQqLdpDzzU7Ot/L9Vc/r8d4iwXXbX8+HwVFV4oBuausgFyv8eJJpfrI+IlEoB1ubJcPpJBFqfmeYTW6/v6ioFljJAlWfFvesUVt/HszBMIOsU0Bzt7ex6WlwKOagb0q0ZPA4T0OY0K0lg0loaaaR8ZTr4ivDymaGBtTBYhslpc7QKBgQC2MBznGEc5r2dhyENvdPOR20PnXQcevGnPdqSus8m0VmDcHE72RVcckcZtwczsb3NaLSqmjAcWTn51/VFmlvhB3F34FcFTPZGq6sj7fWK8HuFq7l7mu5OzYuVr73zy9ggsUuaw10IqvvwIVxszNAF0hiRnSGH3z27CoRmz3s+8EQKBgQCK3o7atBJ3X4rIJiypbL4DhIB1uJ+jUjk6yvLUTut+fufp1+tTw0S+cS5UIAEw2Lr1G4u5F/v8rwmTBJG6SC4gSLGyui6uVBYRA1BWmedcxchzfRDAeMt9y9kesUAZ3Fe5xIzbAeZ1ulKMBVZmM+pHrJlsgr0Wv0bV1xqvqITtbQKBgBIsIGXopQoa9dvqBtfyOW1eCprkS5aEQqWf9vM6Ga90QjsSU8n6xqKh48IE57TZtQ7UnIF6TCasc66/MsRh4KdpHLJnMR5lcMc0nhF/wz5ychehaTPol+X3wlyOyc7OPah2KG6ROhdbb3ZBggQMduyxiKYIsUTvmuOtAAxR+DSRAoGADtuDzGQDOJYWiO2uuP6FpA5IJaiwlSfu3xncJVfhO8SVr6VBJFg88igbIB3w6nk/sv7j9VTXqXre9HMvp1flxaaLsdxM4HcTSALS9q6t/ajaveqte6S5kAtWx0WW8C6PtgWXHbxcD7LXARSsKLoEl2JXXyUVS/m2l/RzHBQ8GJI= | |||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002137663024.crt | |||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | |||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | |||
| callback: https://callbacktest.malls.iformall.com/api/alipay/notify/callback | |||
| video: | |||
| aliyun: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| regionId: cn-beijing | |||
| jasypt: | |||
| encryptor: | |||
| password: oRqdnDbK5pj3eMmB | |||
| fm: | |||
| exception: true | |||
| exception_emails: xuxiaohu@iformall.com | |||
| deploy: 1 | |||
| open: true | |||
| upload_dir: /home/test/server/uploads/ | |||
| videoType: aliyun | |||
| logging: | |||
| level: | |||
| com.iformall.mapper: debug | |||
| path: ./logs/m | |||
| @@ -0,0 +1,143 @@ | |||
| spring: | |||
| profiles: | |||
| include: aliyunRocketMQ | |||
| # JDBC | |||
| datasource: | |||
| url: jdbc:mysql://zc349w82qvn56ftl5e64-rw4rm.rwlb.rds.aliyuncs.com:3306/malink_suimang?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true | |||
| username: ENC(nUefcxWYlMS/1cDxikIKwA==) | |||
| password: ENC(neToS+hzeFjgSFB/7UEl5qYnW2rUjrPq) | |||
| type: com.alibaba.druid.pool.DruidDataSource | |||
| driver-class-name: com.mysql.cj.jdbc.Driver | |||
| filters: stat | |||
| maxActive: 200 | |||
| initialSize: 1 | |||
| maxWait: 60000 | |||
| minIdle: 1 | |||
| timeBetweenEvictionRunsMillis: 28000 | |||
| minEvictableIdleTimeMillis: 28000 | |||
| validationQuery: select 'x' | |||
| testWhileIdle: true | |||
| testOnBorrow: false | |||
| testOnReturn: false | |||
| poolPreparedStatements: true | |||
| maxOpenPreparedStatements: 20 | |||
| connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" | |||
| # REDIS | |||
| redis: | |||
| host: r-2zeaglwf13qqmnllj5.redis.rds.aliyuncs.com | |||
| port: 6379 | |||
| password: mallone:iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 1 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 50 | |||
| max-idle: 50 | |||
| max-wait: -1 | |||
| min-idle: 0 | |||
| # SMS | |||
| aliyun: | |||
| sms: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| product: Dysmsapi | |||
| domain: dysmsapi.aliyuncs.com | |||
| regionId: cn-hangzhou | |||
| dateFormat: yyyyMMdd | |||
| endpointName: cn-hangzhou | |||
| oss: | |||
| endpoint: oss-cn-beijing.aliyuncs.com | |||
| keyid: LTAI4G7ixY4AhvM35F8o3W3V | |||
| keysecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| bucketname: formall | |||
| filehost: malinkadmin | |||
| filedomain: https://formall.oss-accelerate.aliyuncs.com | |||
| mail: | |||
| host: smtp.exmail.qq.com | |||
| username: zhengfangyuan@iformall.com | |||
| password: 2hSeppFRaw7KZZyf # 授权密码 | |||
| properties: | |||
| mail: | |||
| smtp: | |||
| auth: true | |||
| starttls: | |||
| enable: true | |||
| socketFactory: | |||
| port: 465 | |||
| class: javax.net.ssl.SSLSocketFactory | |||
| # RABBITMQ | |||
| rabbitmq: | |||
| host: localhost | |||
| port: 5672 | |||
| username: ENC(lRmLd6EzgeY1RT5ktcHv9g==) | |||
| password: ENC(gBI8mCjr3OC0v57jcnSb660Ux7mW03K2oePgvohhg7w=) | |||
| publisher-confirms: true | |||
| publisher-returns: false | |||
| virtual-host: / | |||
| aliyunRocketmq: | |||
| accessKeyId: "LTAI4G7ixY4AhvM35F8o3W3V" | |||
| accessKeySecret: "VfWqGb83qIQrS9us45utskl8itd7ry" | |||
| groupId: "GID_P_1" | |||
| namesrvAddr: "http://MQ_INST_1796289517488555_Bcqaq2is.cn-beijing.mq-internal.aliyuncs.com:8080" | |||
| aws: | |||
| clientRegion: cn-northwest-1 | |||
| bucketName: iformall-net | |||
| access: ENC(a6SN1sZ1enNL49ypiOXkg/pPPAnZD8H4buQFTTKN08s=) | |||
| secret: ENC(5P5ff4bTMJUbXVR4ZsM03UHzOKZ4+Zg5Iutcdkyp/Quny/oXg+A4KpfwEyGarlLu3vQMJahGP5M=) | |||
| wechat: | |||
| open: | |||
| componentAppId: ENC(b3JG0MUZgQfz5Zj+DC2ZM1zDeLOiGTmmeokfe2O8kaM=) | |||
| componentSecret: ENC(QVyc4BPGdnSjXGs2ivgpDBE1v8wPWHLLRMYI7Vv8uYwC0SiZHQz0QpyyQV/b48Pb) | |||
| componentToken: ENC(rkxj0733WxFFDLgA9x01m2s5Fi2L+0PC) | |||
| componentAesKey: ENC(EIbJUBpbYOrLb4YQ/HXLQmxlxgAqIp2ZmpnGICC8pu5xiTz3Cqfkbwd2S8raCcK/IvYcX2GmedI=) | |||
| redis: | |||
| host: r-2zeaglwf13qqmnllj5.redis.rds.aliyuncs.com | |||
| port: 6379 | |||
| password: mallone:iF0rm@2l2ol9 | |||
| timeout: 3600 | |||
| expire: 1800 #30分钟 | |||
| database: 2 | |||
| defaultExpiration: 2592000 # 默认生命周期30天 | |||
| jedis: | |||
| pool: | |||
| max-active: 100 | |||
| max-idle: 100 | |||
| max-wait: -1 | |||
| min-idle: 10 | |||
| alipay: | |||
| open: | |||
| appId: 2021002140616334 | |||
| appPrivateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCEJmHIlS0luIH7zJRRVlypCcgiSkqpSlnmgyCEM7nu8IerV8Yf7dMBitBklTpJB+4URV1bW+q6Ijzo8RsCyjm1Kx+EFiKf1PiJXlT0h1+bF3fYdDr6r5GK0/TtB8O80p774NcRD3HgbzUS8AEe/GcBvhiXbDRgJh7yAngW9vxl9u1o5UcaxOXVLWDrjlQGF6qyXUlycCNIdPXj3LduP3PBK5daVZwJm33Pr7kmSI0agZvV267HaTpSKaiXI7Zwo+nFMqx9g9kpzmYRfOgHx3DWpQUFI646IB8nEpLpQp3/0eDocuqiHXYgEpLpPoFKoVE228v74YSFh3Y4fFGX+qtjAgMBAAECggEAIJK9Y42xtSyHjaNdo7bf3CK3HAyn3pafFjyYFT4SxJyxNEDMay5Z5nVq7IAD/+BehMycOFqtvveVf+1+NO/XzZo1iH9URYVfRazkz+lWXYopVkdACm6gN1ILeymAy9g2q+s918ywyxteP668+ABK+5j5wsk/F7wNwKVvKGn0yMT7DP0FAL1e0KWndZCZlF79VnFpBLscDJq28GqRzqYop4CWqHHTA6DBvIqkfQV4U3IzqnzOsxNLEMBwhnbK08XfYZ3DxCPH0jQdA2Jj/aABrntq2EpWjzW5H9iZqrVo33rmsNHUSQvla/333RkbpwGyNhI6kcPBRq4cVSAa3y7dMQKBgQDVfyDUPWKXVwIJUgO1my8WIUu2p6nhuT7Mfnpk4X7ewdFaRVjb/r0KvhLgoz2/KOwkqtWTlEvNaCDDycpLXk+V5ZH833kYsDEmxY7ikOUjCcrfYJgT7P77//cZ4Kx8a5X45SiKAZT2GQv7BTtIfNhrfTUj6AQx/3MP3sa2QAWeNQKBgQCedWoF7t+qyck2hctqtTFC7fRkEk7RNJVph1ZOeTqOIAKhmhkwaOE3joxQ/VqHDy212YdW4hI0BWUzbEdMy0Idz2G3y9ERVD84hZehf5GGRdiSrY9EEQgHlcI6Qb8/AnDdpy1DlKUMwTYjVNzkDL3AzeWn61JS1XQaOzZBsJy2NwKBgFa+pJQXrOtYytcGn8M2Hlebh6vbS8cPAVkNOqWqiWXw0iMfcg9Q3XZz7C+hpAD7m5b6YnToGDSJTma+opck5qk88agRFJ7XV+Es+/VKcg9edzNzh9bwwFmbksbM5shW3kSWt3X7Vo73dkqzwXaeY0CpSuIf7zRxWkrkdVCvipjRAoGAMcJlPN+6VQNwsDJromKryXy31gT5wzBkCvN44sOm46KhsOWXK2CD+NJGtdgZaXgWvphEq7/qP3PCR9ekvDTH2lyZLwJN8Mcn4zPwXcKVjDi6vbTK3HEMuHUKvQiQadT2ZGRvDl3LRqoVuhqYEvT9UWJWz9hRzblB8ErPyukPDRkCgYB7bMv2iflpaGE1J3gkTlVJB+2QSfnAXaUDMLWsZN4gYjwEBVCEJ+mhWL1/GeEIBjSs5/qZIeRsYzlxGEcnsJzRfog6ITBF14AeZ+xNkHq83ja87OGVKMypiccGwRehijDhJi6tgMJ0u0w6PiqcJvh0SX4jBhDDPjuWzK2XD+lx8A== | |||
| appPublicKeyCertPath: /opt/iformall/service/alipay/appCertPublicKey_2021002140616334.crt | |||
| alipayCertPath: /opt/iformall/service/alipay/alipayCertPublicKey_RSA2.crt | |||
| alipayRootCertPath: /opt/iformall/service/alipay/alipayRootCert.crt | |||
| callback: https://callback.malls.iformall.com/api/alipay/notify/callback | |||
| video: | |||
| aliyun: | |||
| accessKeyId: LTAI4G7ixY4AhvM35F8o3W3V | |||
| accessKeySecret: VfWqGb83qIQrS9us45utskl8itd7ry | |||
| regionId: cn-beijing | |||
| endPoint: https://oss-cn-beijing.aliyuncs.com | |||
| corePoolSize: 6 | |||
| maxPoolSize: 20 | |||
| queueCapacity: 1000 | |||
| namePrefix: aliyun-video-upload | |||
| fm: | |||
| exception: true | |||
| exception_emails: houtaikaifa@iformall.com | |||
| deploy: 3 | |||
| open: true | |||
| upload_dir: /root/uploads/ | |||
| videoType: aliyun | |||
| logging: | |||
| level: | |||
| com.iformall: debug | |||
| path: ./logs/m | |||
| @@ -0,0 +1,71 @@ | |||
| server: | |||
| port: 5100 | |||
| servlet: | |||
| context-path: /mq | |||
| spring: | |||
| application: | |||
| name: suimang | |||
| profiles: | |||
| active: dev | |||
| jackson: | |||
| date-format: yyyy-MM-dd HH:mm:ss | |||
| time-zone: GMT+8 | |||
| default-property-inclusion: non_null | |||
| servlet: | |||
| multipart: | |||
| max-file-size: 2MB | |||
| max-request-size: 2MB | |||
| cache: | |||
| type: REDIS | |||
| cache-names: redis_cache #缓存的名字(可以不指定) | |||
| redis: | |||
| time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) | |||
| # rocketmq: | |||
| # nameServer: 127.0.0.1:9876 | |||
| # producer: | |||
| # retry-times-when-send-async-failed: 0 | |||
| # send-msg-timeout: 300000 | |||
| # compress-msg-body-over-howmuch: 4096 | |||
| # max-message-size: 4194304 | |||
| # retry-another-broker-when-not-store-ok: false | |||
| # retry-times-when-send-failed: 2 | |||
| # rabbitmq: | |||
| # host: 202.165.179.86 | |||
| # port: 5672 | |||
| # username: guest | |||
| # password: guest | |||
| # publisher-confirms: true | |||
| # virtual-host: / | |||
| # MybatisPlus | |||
| mybatis-plus: | |||
| mapper-locations: classpath:mapper/*Mapper.xml | |||
| global-config: | |||
| db-config: | |||
| id-type: id_worker | |||
| field-strategy: not_null | |||
| db-type: mysql | |||
| configuration: | |||
| jdbc-type-for-null: 'null' | |||
| cache-enabled: false | |||
| call-setters-on-nulls: true | |||
| type-aliases-package: com.iformall.domain.po | |||
| type-enums-package: com.iformall.enums | |||
| # PageHelper | |||
| pagehelper: | |||
| helperDialect: mysql | |||
| reasonable: false | |||
| supportMethodsArguments: true | |||
| params: count=countSql | |||
| offset-as-page-num: true | |||
| page-size-zero: true | |||
| row-bounds-with-count: true | |||
| mapper: | |||
| mappers: | |||
| - com.iformall.common.CommonMapper | |||
| version: 1.0 | |||
| @@ -0,0 +1,100 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <configuration scan="true" scanPeriod="10 seconds"> | |||
| <!-- 外部指定路径 --> | |||
| <springProperty scop="context" name="logPath" source="logging.path" /> | |||
| <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |||
| <encoder> | |||
| <Pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] --%mdc{client}%msg%n</Pattern> | |||
| </encoder> | |||
| </appender> | |||
| <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/trace.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/trace.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| </appender> | |||
| <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/info.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/info.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>INFO</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/debug.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/debug.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>DEBUG</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/warn.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/warn.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>WARN</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
| <file>${logPath}/error.log</file> | |||
| <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
| <FileNamePattern>${logPath}/daily/error.%d{yyyy-MM-dd}.log</FileNamePattern> | |||
| <maxHistory>30</maxHistory> <!-- 保留180天 --> | |||
| </rollingPolicy> | |||
| <layout> | |||
| <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern> | |||
| </layout> | |||
| <filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
| <level>ERROR</level> | |||
| <onMatch>ACCEPT</onMatch> | |||
| <onMismatch>DENY</onMismatch> | |||
| </filter> | |||
| </appender> | |||
| <root level="TRACE"> | |||
| <appender-ref ref="TRACE_FILE" /> | |||
| <appender-ref ref="INFO_FILE" /> | |||
| <!-- <appender-ref ref="DEBUG_FILE" /> --> | |||
| <!-- <appender-ref ref="WARN_FILE" /> --> | |||
| <appender-ref ref="ERROR_FILE" /> | |||
| </root> | |||
| <root level="INFO"> | |||
| <appender-ref ref="STDOUT" /> | |||
| </root> | |||
| </configuration> | |||
| @@ -0,0 +1,3 @@ | |||
| version=1.0 | |||
| groupId=com.iformall | |||
| artifactId=suimangMQConsumer | |||