From c5175df9b49ae0a8b126f8e91fb4a39ce7d4915f Mon Sep 17 00:00:00 2001 From: wuqiping <wuqiping@qq.com> Date: Wed, 03 Mar 2021 10:13:46 +0800 Subject: [PATCH] 初始化 --- screen-api/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java | 55 screen-common/src/main/java/com/moral/redis/RedisUtil.java | 380 +++++ screen-api/src/main/java/com/moral/api/exception/BusinessException.java | 72 + screen-api/src/main/java/com/moral/api/service/impl/TestServiceImpl.java | 53 screen-api/src/main/java/com/moral/api/mapper/TestMapper.java | 16 screen-api/pom.xml | 69 myBatisPlusGenerator/pom.xml | 66 screen-api/src/main/resources/application-dev.yml | 101 + screen-manage/src/main/java/com/moral/api/entity/Test.java | 51 screen-api/src/main/java/com/moral/api/constant/TopicConstants.java | 11 screen-manage/src/main/java/com/moral/api/config/redis/RedisConfig.java | 42 screen-api/src/main/java/com/moral/api/entity/Test.java | 51 screen-manage/src/main/java/com/moral/api/service/TestService.java | 24 screen-common/src/main/java/com/moral/util/DateUtils.java | 1267 ++++++++++++++++++ screen-manage/src/main/java/com/moral/ScreenManageBootstrap.java | 42 screen-api/src/main/resources/logback-spring.xml | 56 screen-api/src/main/java/com/moral/api/Swagger2.java | 34 screen-manage/src/main/resources/logback-spring.xml | 56 screen-api/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java | 23 screen-api/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java | 37 screen-common/pom.xml | 75 + screen-manage/src/main/resources/application-dev.yml | 101 + screen-api/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java | 67 screen-api/src/main/java/com/moral/api/config/redis/RedisConfig.java | 42 screen-manage/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java | 22 screen-manage/src/main/java/com/moral/api/constant/TopicConstants.java | 11 myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java | 134 + screen-manage/src/main/java/com/moral/api/exception/BusinessException.java | 72 + .gitignore | 8 screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java | 37 screen-manage/src/main/java/com/moral/api/service/impl/TestServiceImpl.java | 52 screen-api/src/main/java/com/moral/ScreenApiBootstrap.java | 40 pom.xml | 108 + moral.iml | 2 screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java | 37 screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java | 55 myBatisPlusGenerator/src/main/resources/templates/mapper.xml.ftl | 39 screen-manage/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java | 23 screen-common/src/main/java/com/moral/constant/Constants.java | 29 screen-common/src/main/java/com/moral/util/SpringContextUtils.java | 65 screen-common/src/main/java/com/moral/constant/ResultMessage.java | 130 + screen-manage/pom.xml | 72 + screen-api/src/main/java/com/moral/api/controller/TestController.java | 99 + screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java | 22 screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java | 67 screen-common/src/main/java/com/moral/util/PageResult.java | 34 screen-manage/src/main/java/com/moral/api/controller/TestController.java | 99 + screen-manage/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java | 35 screen-api/src/main/java/com/moral/api/service/TestService.java | 25 screen-manage/src/main/java/com/moral/api/Swagger2.java | 34 screen-manage/src/main/java/com/moral/api/mapper/TestMapper.java | 16 51 files changed, 4,158 insertions(+), 0 deletions(-) diff --git a/.gitignore b/.gitignore index f112f7f..9a8a286 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,11 @@ # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` # should NOT be excluded as they contain compiler settings and other important # information for Eclipse / Flash Builder. +/.idea/ +/screen-api/target/ +/screen-common/target/ +/screen-manage/target/ +/.idea/ +myBatisPlusGenerator/src/test/ +screen-common/src/main/resources/ +screen-manage/src/test/ diff --git a/moral.iml b/moral.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/moral.iml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4" /> \ No newline at end of file diff --git a/myBatisPlusGenerator/pom.xml b/myBatisPlusGenerator/pom.xml new file mode 100644 index 0000000..83d93d9 --- /dev/null +++ b/myBatisPlusGenerator/pom.xml @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>screen</artifactId> + <groupId>org.moral</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>myBatisPlusGenerator</artifactId> + + + <dependencies> + + <!--lombok������--> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <optional>true</optional> + </dependency> + + <!--mybatis-plus--> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-boot-starter</artifactId> + <version>3.3.2</version> + </dependency> + + <!--���������������--> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-generator</artifactId> + <version>3.3.2</version> + </dependency> + + <!-- velocity ������������, ������ --> + <dependency> + <groupId>org.apache.velocity</groupId> + <artifactId>velocity-engine-core</artifactId> + <version>2.0</version> + </dependency> + + <!-- freemarker ������������ --> + <dependency> + <groupId>org.freemarker</groupId> + <artifactId>freemarker</artifactId> + <version>2.3.23</version> + </dependency> + + <!--mysql������--> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <scope>runtime</scope> + </dependency> + + <!--���������--> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>druid</artifactId> + <version>1.1.5</version> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java b/myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java new file mode 100644 index 0000000..305c72e --- /dev/null +++ b/myBatisPlusGenerator/src/main/java/com/moral/CodeGenerator.java @@ -0,0 +1,134 @@ +package com.moral; + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.InjectionConfig; +import com.baomidou.mybatisplus.generator.config.*; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + + +public class CodeGenerator { + + /** + * <p> + * ��������������������� + * </p> + */ + public static String scanner(String tip) { + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("���������" + tip + "���"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (StringUtils.isNotEmpty(ipt)) { + return ipt; + } + } + throw new MybatisPlusException("������������������" + tip + "���"); + } + //��������������������������������������������� + public static void main(String[] args) { + // ��������������� + AutoGenerator mpg = new AutoGenerator(); + + // ������������ + GlobalConfig gc = new GlobalConfig(); + //String projectPath = System.getProperty("user.dir"); + String projectPath="E:\\workspace\\moral\\screen-api"; + gc.setOutputDir(projectPath + "/src/main/java"); + gc.setAuthor("moral"); + gc.setOpen(false); + // service ������������ + gc.setServiceName("%sService"); + // service impl ������������ + gc.setServiceImplName("%sServiceImpl"); + // ������������������������������ %s ��������������������������������� + gc.setMapperName("%sMapper"); + gc.setXmlName("%sMapper"); + gc.setFileOverride(true); + gc.setActiveRecord(true); + // XML ������������ + gc.setEnableCache(false); + // XML ResultMap + gc.setBaseResultMap(true); + // XML columList + gc.setBaseColumnList(false); + // gc.setSwagger2(true); ������������ Swagger2 ������ + mpg.setGlobalConfig(gc); + + // ��������������� + DataSourceConfig dsc = new DataSourceConfig(); + dsc.setUrl("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC"); + dsc.setDriverName("com.mysql.cj.jdbc.Driver"); + dsc.setUsername("root"); + dsc.setPassword("123456"); + mpg.setDataSource(dsc); + + // ��������� + PackageConfig pc = new PackageConfig(); + pc.setParent("com.moral.api"); + pc.setEntity("entity"); + pc.setService("service"); + pc.setServiceImpl("service.impl"); + pc.setController("controller"); + mpg.setPackageInfo(pc); + + // ��������������� + InjectionConfig cfg = new InjectionConfig() { + @Override + public void initMap() { + // to do nothing + } + }; + + // ��������������������� freemarker + String templatePath = "/templates/mapper.xml.ftl"; + // ��������������������� velocity + // String templatePath = "/templates/mapper.xml.vm"; + + // ��������������������� + List<FileOutConfig> focList = new ArrayList<>(); + // ��������������������������������� + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + // ������������������������ ��� ��������� Entity ��������������������������������� xml ������������������������������������ + String moduleName = pc.getModuleName() == null ? "" : pc.getModuleName(); + return projectPath + "/src/main/resources/mapper/" + moduleName + + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT + "xml"; + } + }); + cfg.setFileOutConfigList(focList); + mpg.setCfg(cfg); + + // ������������ + TemplateConfig templateConfig = new TemplateConfig(); + + templateConfig.setController(""); + templateConfig.setXml(null); + mpg.setTemplate(templateConfig); + + // ������������ + StrategyConfig strategy = new StrategyConfig(); + strategy.setNaming(NamingStrategy.underline_to_camel); + strategy.setColumnNaming(NamingStrategy.underline_to_camel); + strategy.setEntityLombokModel(true); + strategy.setRestControllerStyle(true); + //strategy.setInclude(scanner("���������������������������������").split(",")); + strategy.setControllerMappingHyphenStyle(true); + // strategy.setTablePrefix(pc.getModuleName() + "_"); + mpg.setStrategy(strategy); + mpg.setTemplateEngine(new FreemarkerTemplateEngine()); + mpg.execute(); + } + +} diff --git a/myBatisPlusGenerator/src/main/resources/templates/mapper.xml.ftl b/myBatisPlusGenerator/src/main/resources/templates/mapper.xml.ftl new file mode 100644 index 0000000..9dc8071 --- /dev/null +++ b/myBatisPlusGenerator/src/main/resources/templates/mapper.xml.ftl @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="${package.Mapper}.${table.mapperName}"> + + <#if enableCache> + <!-- ������������������ --> + <cache type="${cacheClassName}"/> + + </#if> + <#if baseResultMap> + <!-- ������������������������ --> + <resultMap id="BaseResultMap" type="${package.Entity}.${entity}"> + <#list table.fields as field> + <#if field.keyFlag><#--���������������������������--> + <id column="${field.name}" property="${field.propertyName}" /> + </#if> + </#list> + <#list table.commonFields as field><#--������������������ --> + <result column="${field.name}" property="${field.propertyName}" /> + </#list> + <#list table.fields as field> + <#if !field.keyFlag><#--������������������ --> + <result column="${field.name}" property="${field.propertyName}" /> + </#if> + </#list> + </resultMap> + + </#if> + <#if baseColumnList> + <!-- ��������������������� --> + <sql id="Base_Column_List"> + <#list table.commonFields as field> + ${field.columnName}, + </#list> + ${table.fieldNames} + </sql> + + </#if> +</mapper> \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5128e22 --- /dev/null +++ b/pom.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.moral</groupId> + <artifactId>screen</artifactId> + <version>1.0-SNAPSHOT</version> + <modules> + <module>screen-common</module> + <module>screen-api</module> + <module>myBatisPlusGenerator</module> + <module>screen-manage</module> + + </modules> + <packaging>pom</packaging> + + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>2.1.13.RELEASE</version> + </parent> + + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <java.version>1.8</java.version> + <com.alibaba.version>1.2.46</com.alibaba.version> + <maven-filtering.version>1.1</maven-filtering.version> + <maven-common-artifact-filters.version>1.4</maven-common-artifact-filters.version> + <maven-resources-plugin.version>2.6</maven-resources-plugin.version> + <maven-filtering.version>1.1</maven-filtering.version> + <maven-common-artifact-filters.version>1.4</maven-common-artifact-filters.version> + <maven-dependency-tree.version>2.1</maven-dependency-tree.version> + <maven-shared-incremental.version>1.1</maven-shared-incremental.version> + <spring-web.version>4.1.6.RELEASE</spring-web.version> + <com.alibaba.druid.version>1.1.5</com.alibaba.druid.version> + <org.mybatis-plus.spring.boot.version>3.3.2</org.mybatis-plus.spring.boot.version> + <org.projectlombok.version>1.16.18</org.projectlombok.version> + <io.springfox.version>2.7.0</io.springfox.version> + <swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version> + <spring.kafka.version>2.2.2</spring.kafka.version> + </properties> + + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger2</artifactId> + <version>${io.springfox.version}</version> + </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger-ui</artifactId> + <version>${io.springfox.version}</version> + </dependency> + <dependency> + <groupId>com.github.xiaoymin</groupId> + <artifactId>swagger-bootstrap-ui</artifactId> + <version>${swagger-bootstrap-ui.version}</version> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${org.projectlombok.version}</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-boot-starter</artifactId> + <version>${org.mybatis-plus.spring.boot.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.kafka</groupId> + <artifactId>spring-kafka</artifactId> + </dependency> + <dependency> + <groupId>org.apache.kafka</groupId> + <artifactId>kafka-streams</artifactId> + <version>${spring.kafka.version}</version> + </dependency> + <dependency> + <groupId>org.apache.kafka</groupId> + <artifactId>kafka-clients</artifactId> + <version>${spring.kafka.version}</version> + </dependency> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>druid</artifactId> + <version>${com.alibaba.druid.version}</version> + </dependency> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <scope>runtime</scope> + </dependency> + </dependencies> + + +</project> \ No newline at end of file diff --git a/screen-api/pom.xml b/screen-api/pom.xml new file mode 100644 index 0000000..51edb55 --- /dev/null +++ b/screen-api/pom.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>screen</artifactId> + <groupId>org.moral</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>screen-api</artifactId> + + <dependencies> + <dependency> + <groupId>org.moral</groupId> + <artifactId>screen-common</artifactId> + <version>1.0-SNAPSHOT</version> + </dependency> + </dependencies> + + <build> + <finalName>screen-api</finalName> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>${java.version}</source> + <target>${java.version}</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>${maven-resources-plugin.version}</version> + <dependencies> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-filtering</artifactId> + <version>${maven-filtering.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-common-artifact-filters</artifactId> + <version>${maven-common-artifact-filters.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-dependency-tree</artifactId> + <version>${maven-dependency-tree.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-shared-incremental</artifactId> + <version>${maven-shared-incremental.version}</version> + </dependency> + </dependencies> + </plugin> + + </plugins> + </build> + + +</project> \ No newline at end of file diff --git a/screen-api/src/main/java/com/moral/ScreenApiBootstrap.java b/screen-api/src/main/java/com/moral/ScreenApiBootstrap.java new file mode 100644 index 0000000..26351cd --- /dev/null +++ b/screen-api/src/main/java/com/moral/ScreenApiBootstrap.java @@ -0,0 +1,40 @@ +package com.moral; + +import com.moral.util.SpringContextUtils; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import java.util.Arrays; + + +@MapperScan("com.moral.api.mapper") +@SpringBootApplication +@EnableTransactionManagement +public class ScreenApiBootstrap { + public static void main(String[] args) { + ApplicationContext applicationContext = SpringApplication.run(ScreenApiBootstrap.class, args); + SpringContextUtils.setApplicationContext(applicationContext); + } + @Bean + public FilterRegistrationBean<CorsFilter> corsFilter() { + FilterRegistrationBean<CorsFilter> corsFilterFilterRegistrationBean = new FilterRegistrationBean<>(); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedHeader("*"); + corsConfiguration.addAllowedOrigin("*"); + corsConfiguration.setAllowedMethods(Arrays.asList("POST", "PUT", "GET", "OPTIONS", "DELETE")); + corsConfiguration.setAllowCredentials(true); + corsConfiguration.setMaxAge(3600L); + source.registerCorsConfiguration("/**", corsConfiguration); + corsFilterFilterRegistrationBean.setFilter(new CorsFilter(source)); + corsFilterFilterRegistrationBean.setOrder(-1); + return corsFilterFilterRegistrationBean; + } +} diff --git a/screen-api/src/main/java/com/moral/api/Swagger2.java b/screen-api/src/main/java/com/moral/api/Swagger2.java new file mode 100644 index 0000000..d555f16 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/Swagger2.java @@ -0,0 +1,34 @@ +package com.moral.api; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + + +@Configuration +@EnableSwagger2 +public class Swagger2 { + @Bean + public Docket petApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.moral.api")) + .paths(PathSelectors.any()) + .build(); + } + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("������������������") + .description("������������������") + .version("1.0") + .build(); + } + +} diff --git a/screen-api/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java b/screen-api/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java new file mode 100644 index 0000000..9a85aa8 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java @@ -0,0 +1,23 @@ +package com.moral.api.config.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + + +@Configuration +public class DataSourceConfig { + + @Primary + @Bean(name = "primaryDataSource") + @Qualifier("primaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource primaryDataSource(){ + return new DruidDataSource(); + } +} diff --git a/screen-api/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java b/screen-api/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java new file mode 100644 index 0000000..e5ae67b --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java @@ -0,0 +1,67 @@ +package com.moral.api.config.kafka; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.config.KafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; +import org.springframework.kafka.listener.ContainerProperties; +import java.util.HashMap; +import java.util.Map; + +/*@Configuration +@EnableKafka*/ +public class KafkaConsumerConfig { + @Value("${kafka.consumer.servers}") + private String servers; + @Value("${kafka.consumer.enable.auto.commit}") + private boolean enableAutoCommit; + @Value("${kafka.consumer.session.timeout}") + private String sessionTimeout; + @Value("${kafka.consumer.auto.commit.interval}") + private String autoCommitInterval; + @Value("${kafka.consumer.group.id}") + private String groupId; + @Value("${kafka.consumer.auto.offset.reset}") + private String autoOffsetReset; + @Value("${kafka.consumer.concurrency}") + private int concurrency; + + @Bean + public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory()); + factory.setConcurrency(concurrency); + factory.getContainerProperties().setPollTimeout(1500); + factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE); + + /*factory.setBatchListener(true);//@KafkaListener ������������ ���������������������Kafka���������������������ConsumerConfig.MAX_POLL_RECORDS_CONFIG + factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);//������������������������������*/ + return factory; + } + + public ConsumerFactory<String, String> consumerFactory() { + return new DefaultKafkaConsumerFactory<>(consumerConfigs()); + } + + + public Map<String, Object> consumerConfigs() { + Map<String, Object> propsMap = new HashMap<>(); + propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, servers); + propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit); + propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval); + propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout); + propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset); + return propsMap; + } +} diff --git a/screen-api/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java b/screen-api/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java new file mode 100644 index 0000000..ef5b141 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java @@ -0,0 +1,55 @@ +package com.moral.api.config.kafka; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; + +import java.util.HashMap; +import java.util.Map; + +/*@Configuration +@EnableKafka*/ +public class KafkaProducerConfig { + @Value("${kafka.producer.servers}") + private String servers; + @Value("${kafka.producer.retries}") + private int retries; + @Value("${kafka.producer.batch.size}") + private int batchSize; + @Value("${kafka.producer.linger}") + private int linger; + @Value("${kafka.producer.buffer.memory}") + private int bufferMemory; + + + public Map<String, Object> producerConfigs() { + Map<String, Object> props = new HashMap<>(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, servers); + props.put(ProducerConfig.RETRIES_CONFIG, retries); + props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize); + props.put(ProducerConfig.LINGER_MS_CONFIG, linger); + props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + return props; + } + + public ProducerFactory<String, String> producerFactory() { + return new DefaultKafkaProducerFactory<>(producerConfigs()); + } + + @Bean + public KafkaTemplate<String, String> kafkaTemplate() { + return new KafkaTemplate<String, String>(producerFactory()); + } + +} + + + diff --git a/screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java b/screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java new file mode 100644 index 0000000..4a253f7 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java @@ -0,0 +1,22 @@ +package com.moral.api.config.mybatis; + +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + + +@Configuration +public class MybatisPlusConfig { + + /** + * ������������ + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor page = new PaginationInterceptor(); + return page; + } + + +} diff --git a/screen-api/src/main/java/com/moral/api/config/redis/RedisConfig.java b/screen-api/src/main/java/com/moral/api/config/redis/RedisConfig.java new file mode 100644 index 0000000..b63690d --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/config/redis/RedisConfig.java @@ -0,0 +1,42 @@ +package com.moral.api.config.redis; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + + +@Configuration +public class RedisConfig { + + @Bean(name="redisTemplate") + @ConditionalOnMissingBean(StringRedisTemplate.class) //������������������ ���������������������RedisTemplate ������������ ������������������ + public RedisTemplate<String,Object> stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key������String������������������ + redisTemplate.setKeySerializer(stringRedisSerializer); + // hash���key���������String������������������ + redisTemplate.setHashKeySerializer(stringRedisSerializer); + // valuevalue������jackson��������������� + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + // hash���value������jackson��������������� + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} diff --git a/screen-api/src/main/java/com/moral/api/constant/TopicConstants.java b/screen-api/src/main/java/com/moral/api/constant/TopicConstants.java new file mode 100644 index 0000000..770d60e --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/constant/TopicConstants.java @@ -0,0 +1,11 @@ +package com.moral.api.constant; + +public class TopicConstants { + /** + * Test ������ + */ + public static final String TEST_TOPIC_MESSAGE = "test_topic"; + + + +} diff --git a/screen-api/src/main/java/com/moral/api/controller/TestController.java b/screen-api/src/main/java/com/moral/api/controller/TestController.java new file mode 100644 index 0000000..fd85e5e --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/controller/TestController.java @@ -0,0 +1,99 @@ +package com.moral.api.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.moral.api.entity.Test; +import com.moral.api.service.TestService; +import com.moral.constant.ResultMessage; +import com.moral.redis.RedisUtil; +import com.moral.util.PageResult; +import io.swagger.annotations.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.web.bind.annotation.*; + + +@Slf4j +@Api(tags = {"������"}) +@RestController +@RequestMapping("/api") +public class TestController { + + @Autowired + private KafkaTemplate kafkaTemplate; + + @Autowired + private TestService testService; + /** + * name ������ + * email ������ + * mobile ��������� + */ + @ApiOperation(value = "������������", notes = "������������") + @RequestMapping(value = "/saveTest", method = RequestMethod.POST) + public ResultMessage save() { + + Test test=new Test(); + test.setEmail("test@qq.com"); + test.setName("name"); + test.setMobile("13965898745"); + testService.save(test); + return ResultMessage.ok(); + + } + /** + * page ��������� + * size ������������ + */ + @ApiOperation(value = "������", notes = "������") + @ApiImplicitParams({ + @ApiImplicitParam(name="page",value="������������",required=true,paramType="path",dataType="Int"), + @ApiImplicitParam(name="size",value="������������",required=true,paramType="path",dataType="Int") + }) + @RequestMapping(value = "search/{page}/{size}", method = RequestMethod.GET) + public ResultMessage findBypage(@PathVariable("page") Integer page, @PathVariable("size") Integer size) { + + log.info("page is:"+ page+" size is:"+size); + //������������������������ + Page<Test> userPage = testService.selectByPage(null, page, size); + //������������������������ + PageResult<Test> pageResult = new PageResult<>( + userPage.getTotal(), userPage.getPages(),userPage.getRecords() + ); + //������������ + return ResultMessage.ok(pageResult); + } + + + /** + * redis������ + */ + @ApiOperation(value = "redis������", notes = "redis������") + @RequestMapping(value = "redis", method = RequestMethod.GET) + public ResultMessage testRedis() { + RedisUtil.set("redistest","test"); + return ResultMessage.ok(RedisUtil.get("redistest")); + + } + + /** + * ������ + */ + @ApiOperation(value = "������������", notes = "������������") + @RequestMapping(value = "saveTest", method = RequestMethod.GET) + public ResultMessage saveTest() throws Exception{ + testService.saveTest(); + return ResultMessage.ok(); + + } + + /** + * kafka������ + */ + @ApiOperation(value = "kafka������", notes = "kafka������") + @RequestMapping(value = "kafkaTest", method = RequestMethod.GET) + public void kafkaTest() { + kafkaTemplate.send("test_topic","test111111111111111"); + } + +} diff --git a/screen-api/src/main/java/com/moral/api/entity/Test.java b/screen-api/src/main/java/com/moral/api/entity/Test.java new file mode 100644 index 0000000..05ff045 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/entity/Test.java @@ -0,0 +1,51 @@ +package com.moral.api.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * + * </p> + * + * @author moral + * @since 2021-03-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class Test extends Model<Test> { + + private static final long serialVersionUID = 1L; + + /** + * ������ + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * ������ + */ + private String name; + + /** + * ������ + */ + private String email; + + /** + * ��������� + */ + private String mobile; + + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/screen-api/src/main/java/com/moral/api/exception/BusinessException.java b/screen-api/src/main/java/com/moral/api/exception/BusinessException.java new file mode 100644 index 0000000..1b289fc --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/exception/BusinessException.java @@ -0,0 +1,72 @@ +package com.moral.api.exception; + +/** + * @author + * @site + * @company + * @create 2021-02-26 11:20 + */ +public class BusinessException extends RuntimeException { + + /** + * ��������� + */ + private String code; + + /** + * ������������ + */ + private String msg; + + /** */ + private static final long serialVersionUID = 1L; + + public BusinessException() { + super(); + } + + public BusinessException(String msg) { + super(msg); + this.msg = msg; + } + + public BusinessException(Throwable t) { + super(t); + } + + public BusinessException(String msg, Throwable t) { + super(msg); + this.msg = msg; + } + + public BusinessException(String code, String msg) { + super(msg); + this.code = code; + this.msg = msg; + } + + public BusinessException(String code, String msg, Throwable t) { + super(msg, t); + this.code = code; + this.msg = msg; + } + + /** + * Getter method for property <tt>code</tt>. + * + * @return property value of code + */ + public String getCode() { + return code; + } + + /** + * Getter method for property <tt>msg</tt>. + * + * @return property value of msg + */ + public String getMsg() { + return msg; + } + +} diff --git a/screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java b/screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..b712ee8 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java @@ -0,0 +1,37 @@ +package com.moral.api.exception; + +import com.moral.constant.Constants; +import com.moral.constant.ResultMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + + +@ControllerAdvice +@ResponseBody +public class GlobalExceptionHandler { + /** + * ������������������ + */ + @ExceptionHandler + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public ResultMessage handleException(Exception ex) { + ex.printStackTrace(); + return ResultMessage.fail(Constants.CODE_OPERATION_FAILED, "������������"); + } + + /** + * ������BusinessException������ + */ + @ExceptionHandler({BusinessException.class}) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public ResultMessage handleUserNotExistException(BusinessException ex) { + return ResultMessage.fail(Constants.CODE_OPERATION_FAILED, "������������������������"); + } + +} diff --git a/screen-api/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java b/screen-api/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java new file mode 100644 index 0000000..af6c8cc --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java @@ -0,0 +1,37 @@ +package com.moral.api.kafka.consumer; + +import com.moral.api.constant.TopicConstants; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.support.Acknowledgment; +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Component +@Slf4j +public class KafkaConsumer { + +/* *//** + * ��������������������������������� + * @param record + * @param ack + * @throws Exception + *//* + @KafkaListener(topics = TopicConstants.TEST_TOPIC_MESSAGE,groupId = "test") + public void listenTest(ConsumerRecord<String, String> record , Acknowledgment ack) throws Exception { + String msg = record.value(); + System.out.println(msg); + if (new Random().nextInt(100)<50){ + log.info(String.format("kafka ������������������---------------- listen1 topic = %s, offset = %d, value = %s ", record.topic(), record.offset(), record.value())); + ack.acknowledge(); + } + + }*/ + + + + + +} diff --git a/screen-api/src/main/java/com/moral/api/mapper/TestMapper.java b/screen-api/src/main/java/com/moral/api/mapper/TestMapper.java new file mode 100644 index 0000000..46e1799 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/mapper/TestMapper.java @@ -0,0 +1,16 @@ +package com.moral.api.mapper; + +import com.moral.api.entity.Test; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * Mapper ������ + * </p> + * + * @author moral + * @since 2021-02-25 + */ +public interface TestMapper extends BaseMapper<Test> { + +} diff --git a/screen-api/src/main/java/com/moral/api/service/TestService.java b/screen-api/src/main/java/com/moral/api/service/TestService.java new file mode 100644 index 0000000..79f276b --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/service/TestService.java @@ -0,0 +1,25 @@ +package com.moral.api.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.moral.api.entity.Test; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * <p> + * ��������� + * </p> + * + * @author moral + * @since 2021-02-25 + */ +@Service +@Transactional +public interface TestService extends IService<Test> { + + Page<Test> selectByPage(Test test, Integer page, Integer size); + + @Transactional + void saveTest() throws Exception; +} diff --git a/screen-api/src/main/java/com/moral/api/service/impl/TestServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/TestServiceImpl.java new file mode 100644 index 0000000..df13f64 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/service/impl/TestServiceImpl.java @@ -0,0 +1,53 @@ +package com.moral.api.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.moral.api.entity.Test; +import com.moral.api.exception.BusinessException; +import com.moral.api.mapper.TestMapper; +import com.moral.api.service.TestService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * <p> + * ��������������� + * </p> + * + * @author moral + * @since 2021-02-25 + */ +@Service +public class TestServiceImpl extends ServiceImpl<TestMapper, Test> implements TestService { + + @Autowired + private TestMapper testMapper; + @Override + public Page<Test> selectByPage(Test test, Integer page, Integer size) { + //������������������ + Page<Test> pageData = new Page<>(page, size); + //������������������ + IPage<Test> users = testMapper.selectPage(pageData, new QueryWrapper<>(test)); + //��������������������������������� + pageData.setRecords(users.getRecords()); + //������������ + return pageData; + } + + @Override + @Transactional + public void saveTest() throws Exception{ + Test t=new Test(); + t.setName("aaaa"); + t.setMobile("139652555"); + t.setEmail("33@qq.com"); + testMapper.insert(t); + if ("aaaa".equals(t.getName())){ + throw new BusinessException("aaaa���������������������������������"); + } + + } +} diff --git a/screen-api/src/main/resources/application-dev.yml b/screen-api/src/main/resources/application-dev.yml new file mode 100644 index 0000000..67627c3 --- /dev/null +++ b/screen-api/src/main/resources/application-dev.yml @@ -0,0 +1,101 @@ +server: + port: 8081 + tomcat: + uri-encoding: UTF-8 + #��������������� + min-spare-threads: 500 + #��������������� + max-threads: 2500 + #��������������� + max-connections: 6500 + #������������������������ + accept-count: 1000 +spring: + profiles: + active: dev + application: + name: screen-api + redis: + #cluster: + #nodes: 47.112.126.78:7001,47.112.126.78:7002,47.112.126.132:7003,47.112.126.132:7004,47.112.132.193:7005,47.112.132.193:7006 + #password: test + #timeout: 500 + host: 127.0.0.1 + port: 6379 + password: 123456 + timeout: 30000 + jedis: + pool: + max-active: 256 + max-wait: 30000 + max-idle: 64 + min-idle: 32 + lettuce: + pool: + max-active: 256 + max-idle: 64 + max-wait: 30000 + min-idle: 32 + datasource: + minIdle: 1 + time-between-eviction-runs-millis: 60000 + max-active: 20 + test-while-idle: true + validation-query: select 'x' + filters: stat + type: com.alibaba.druid.pool.DruidDataSource + max-wait: 60000 + url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC + password: 123456 + test-on-borrow: false + sql-script-encoding: utf-8 + pool-prepared-statements: true + min-evictable-idle-time-millis: 300000 + initial-size: 1 + driver-class-name: com.mysql.cj.jdbc.Driver + max-conn-lifetime-millis: 20 + test-on-return: false + username: root + +mybatis-plus: + mapper-locations: classpath:mapper/*.xml + global-config: + db-config: + id-type: auto + field-strategy: NOT_EMPTY + db-type: MYSQL + configuration: + map-underscore-to-camel-case: true + call-setters-on-nulls: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +kafka: + listener: + ack-mode: manual_immediate + consumer: + auto: + commit: + interval: 100 + offset: + reset: latest + concurrency: 3 + enable: + auto: + commit: false + group: + id: test + servers: 192.168.0.16:9092,192.168.0.17:9092,192.168.0.18:9092 + session: + timeout: 6000 + topic: test_topic + zookeeper: + connect: 192.168.0.16:2181,192.168.0.17:2181,192.168.0.18:2181 + producer: + batch: + size: 4096 + buffer: + memory: 40960 + linger: 1 + retries: 0 + servers: 192.168.0.16:9092,192.168.0.17:9092,192.168.0.18:9092 + diff --git a/screen-api/src/main/resources/logback-spring.xml b/screen-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..efd0d87 --- /dev/null +++ b/screen-api/src/main/resources/logback-spring.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <include resource="org/springframework/boot/logging/logback/defaults.xml"/> + + <springProperty scope="context" name="springAppName" source="spring.application.name"/> + <!-- ��������������������������������� --> + <property name="LOG_FILE" value="home/moral/soft/log/${springAppName}"/> + <!-- ������������������������������ --> + <property name="CONSOLE_LOG_PATTERN" + value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%X{logseq}]{faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> + + <property name="FILE_LOG_PATTERN" + value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{logseq}] [%thread] %X{T} [%level] %logger.%method:%line %msg%n"/> + + <!-- ���������Appender --> + <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>INFO</level> + </filter> + <encoder> + <pattern>${CONSOLE_LOG_PATTERN}</pattern> + <charset>utf8</charset> + </encoder> + </appender> + <!-- ������������Appender --> + <appender name="screenApiLog" class="ch.qos.logback.classic.sift.SiftingAppender"> + <discriminator> + <key>taskId</key> + <defaultValue>default</defaultValue> + </discriminator> + <sift> + <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> + + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>INFO</level> + </filter> + <file>${LOG_FILE}/%d{yyyy-MM-dd}/${springAppName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <maxFileSize>30MB</maxFileSize> + <fileNamePattern>${LOG_FILE}/%d{yyyy-MM-dd}/${springAppName}-%d{yyyy-MM-dd}.log%i.log</fileNamePattern> + <maxHistory>30</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${FILE_LOG_PATTERN}</pattern> + <charset>utf8</charset> + </encoder> + </appender> + </sift> + </appender> + + + <root level="INFO"> + <appender-ref ref="console"/> + <appender-ref ref="screenApiLog"/> + </root> +</configuration> diff --git a/screen-common/pom.xml b/screen-common/pom.xml new file mode 100644 index 0000000..5fed457 --- /dev/null +++ b/screen-common/pom.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>screen</artifactId> + <groupId>org.moral</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>screen-common</artifactId> + + <properties> + + <spring-boot-starter-data-redis.version>2.1.3.RELEASE</spring-boot-starter-data-redis.version> + <jedis.version>2.9.0</jedis.version> + </properties> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-redis</artifactId> + <version>${spring-boot-starter-data-redis.version}</version> + </dependency> + <dependency> + <groupId>redis.clients</groupId> + <artifactId>jedis</artifactId> + <version>${jedis.version}</version> + </dependency> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>fastjson</artifactId> + <version>${com.alibaba.version}</version> + </dependency> + </dependencies> + + + <build> + <finalName>screen-common</finalName> + <plugins> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>${maven-resources-plugin.version}</version> + <dependencies> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-filtering</artifactId> + <version>${maven-filtering.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-common-artifact-filters</artifactId> + <version>${maven-common-artifact-filters.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-dependency-tree</artifactId> + <version>${maven-dependency-tree.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-shared-incremental</artifactId> + <version>${maven-shared-incremental.version}</version> + </dependency> + </dependencies> + </plugin> + + </plugins> + + </build> + +</project> \ No newline at end of file diff --git a/screen-common/src/main/java/com/moral/constant/Constants.java b/screen-common/src/main/java/com/moral/constant/Constants.java new file mode 100644 index 0000000..d824510 --- /dev/null +++ b/screen-common/src/main/java/com/moral/constant/Constants.java @@ -0,0 +1,29 @@ +package com.moral.constant; + +/** + * ������������������ + */ +public class Constants { + + /** + * ������������ + */ + public static final String MSG_OPERATION_SUCCESS = "���������������"; + + /** + * ������������ + */ + public static final String MSG_OPERATION_FAILED = "���������������"; + + /** + * ������������code + */ + public static final int CODE_OPERATION_SUCCESS = 0; + /** + * ������������code + */ + public static final int CODE_OPERATION_FAILED = -1; + + + +} diff --git a/screen-common/src/main/java/com/moral/constant/ResultMessage.java b/screen-common/src/main/java/com/moral/constant/ResultMessage.java new file mode 100644 index 0000000..bc1d2f5 --- /dev/null +++ b/screen-common/src/main/java/com/moral/constant/ResultMessage.java @@ -0,0 +1,130 @@ +package com.moral.constant; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.HashMap; + +@ApiModel("������������������") +public class ResultMessage<T> { + + /** + * ��������� + */ + @ApiModelProperty("code") + private int code; + /** + * ������������ + */ + @ApiModelProperty("msg") + private String msg; + /** + * ������������ + */ + @ApiModelProperty("������������") + private T data; + + public static ResultMessage ok() { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(Constants.CODE_OPERATION_SUCCESS); + resultMessage.setMessage(Constants.MSG_OPERATION_SUCCESS); + resultMessage.setData(new HashMap<>()); + return resultMessage; + } + + public static ResultMessage ok(String msg) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(Constants.CODE_OPERATION_SUCCESS); + resultMessage.setMessage(msg); + resultMessage.setData(new HashMap<>()); + return resultMessage; + } + + public static ResultMessage ok(int code, String msg) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(code); + resultMessage.setMessage(msg); + resultMessage.setData(new HashMap<>()); + return resultMessage; + } + + public static <T> ResultMessage<T> ok(int code, T data) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(code); + resultMessage.setData(data == null? new HashMap<>():data); + return resultMessage; + } + + public static <T> ResultMessage<T> ok(T data) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(Constants.CODE_OPERATION_SUCCESS); + resultMessage.setMessage(Constants.MSG_OPERATION_SUCCESS); + resultMessage.setData(data == null ?new HashMap<>():data); + return resultMessage; + } + + public static <T> ResultMessage<T> ok(int code, String msg, T data) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(code); + resultMessage.setMessage(msg); + resultMessage.setData(data == null?new HashMap<>():data); + return resultMessage; + } + + public static ResultMessage fail() { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(Constants.CODE_OPERATION_FAILED); + resultMessage.setMessage(Constants.MSG_OPERATION_FAILED); + resultMessage.setData(new HashMap<>()); + return resultMessage; + } + + public static ResultMessage fail(String msg) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(Constants.CODE_OPERATION_FAILED); + resultMessage.setMessage(msg); + resultMessage.setData(new HashMap<>()); + return resultMessage; + } + + public static ResultMessage fail(int code, String msg) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(code); + resultMessage.setMessage(msg); + resultMessage.setData(new HashMap<>()); + return resultMessage; + } + + public static <T> ResultMessage<T> fail(T data) { + ResultMessage resultMessage = new ResultMessage(); + resultMessage.setCode(Constants.CODE_OPERATION_FAILED); + resultMessage.setMessage(Constants.MSG_OPERATION_FAILED); + resultMessage.setData(data == null ?new HashMap<>():data); + return resultMessage; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return msg; + } + + public void setMessage(String message) { + this.msg = message; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/screen-common/src/main/java/com/moral/redis/RedisUtil.java b/screen-common/src/main/java/com/moral/redis/RedisUtil.java new file mode 100644 index 0000000..f39cc12 --- /dev/null +++ b/screen-common/src/main/java/com/moral/redis/RedisUtil.java @@ -0,0 +1,380 @@ +package com.moral.redis; + + +import com.moral.util.SpringContextUtils; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + + +public final class RedisUtil { + + @SuppressWarnings("rawtypes") + private static RedisTemplate redisTemplate = SpringContextUtils.getBeanByName("redisTemplate"); + + // =============================common============================ + /** + * ������������������������key + * + * @param: key + * @param: time + * @return: boolean + * @author: wuqp + * @date: 2021/02/24 9:46 + */ + public static boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * ������������������������key + * + * @param: key + * @param: time + * @return: long + * @author: wuqp + * @date: 2021/02/24 9:46 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * ������key + * + * @param: key + * @return: boolean + * @author: wuqp + * @date: 2021/02/24 9:46 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * ������������ + * + * @param: key + * @param: time + * @return: boolean + * @author: wuqp + * @date: 2021/02/24 9:46 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + // ============================String============================= + /** + * ������string��������������� + * + * @param: key + * @param: time + * @return: Object + * @author: wuqp + * @date: 2021/02/24 9:46 + */ + public static Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * ������string��������������� + * + * @param: key + * @param: value + * @return: boolean + * @author: wuqp + * @date: 2021/02/24 9:46 + */ + public static boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * ������string������������������������������ + * + * @param: key + * @param: value + * @param: time + * @return: boolean + * @author: wuqp + * @date: 2021/02/24 9:46 + */ + public static boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + // ================================Map================================= + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + public Map<Object, Object> hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + public boolean hmset(String key, Map<String, Object> map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean hmset(String key, Map<String, Object> map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } + + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + public Set<Object> sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) + expire(key, time); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + // ===============================list================================= + public List<Object> lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean lSet(String key, List<Object> value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean lSet(String key, List<Object> value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public long lRemove(String key, long count, Object value) { + try { + Long remove = redisTemplate.opsForList().remove(key, count, value); + return remove; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public Set<String> keys(String pattern) { + try { + Set<String> set = redisTemplate.keys(pattern); + return set; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/screen-common/src/main/java/com/moral/util/DateUtils.java b/screen-common/src/main/java/com/moral/util/DateUtils.java new file mode 100644 index 0000000..69f256d --- /dev/null +++ b/screen-common/src/main/java/com/moral/util/DateUtils.java @@ -0,0 +1,1267 @@ +package com.moral.util; + + + +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.*; + + +public class DateUtils { + /** ������������(yyyy-MM-dd) */ + public static final String yyyy_MM_dd_EN = "yyyy-MM-dd"; + /** ������������(yyyy/MM/dd) */ + public static final String yyyy_MM_dd_decline = "yyyy/MM/dd"; + /** ������������(yyyyMMdd) */ + public static final String yyyyMMdd_EN = "yyyyMMdd"; + /** ������������(yyyy-MM) */ + public static final String yyyy_MM_EN = "yyyy-MM"; + /** ������������(yyyyMM) */ + public static final String yyyyMM_EN = "yyyyMM"; + /** ������������(yyyy-MM-dd HH:mm:ss) */ + public static final String yyyy_MM_dd_HH_mm_ss_EN = "yyyy-MM-dd HH:mm:ss"; + /** ������������(yyyy-MM-dd HH:mm:ss.S) */ + public static final String yyyy_MM_dd_HH_mm_ss_S_EN = "yyyy-MM-dd HH:mm:ss.S"; + /** ������������(yyyyMMddHHmmss) */ + public static final String yyyyMMddHHmmss_EN = "yyyyMMddHHmmss"; + /** ������������(yyyy���MM���dd���) */ + public static final String yyyy_MM_dd_CN = "yyyy���MM���dd���"; + /** ������������(yyyy���MM���dd���HH���mm���ss���) */ + public static final String yyyy_MM_dd_HH_mm_ss_CN = "yyyy���MM���dd���HH���mm���ss���"; + /** ������������(yyyy���MM���dd���HH���mm���) */ + public static final String yyyy_MM_dd_HH_mm_CN = "yyyy���MM���dd���HH���mm���"; + /** ������boss��������������������������������� */ + public static final String BJBOSS_DATE = "yyyy-MM-dd'T'HH:mm:ss'Z'"; + /** ������������(HH:mm:ss) */ + public static final String HH_mm_ss_EN = "HH:mm:ss"; + /** DateFormat������ */ + private static Map<String, DateFormat> dateFormatMap = new HashMap<String, DateFormat>(); + + /** + * ������DateFormat + * + * @param formatStr + * @return + */ + public static DateFormat getDateFormat(String formatStr) { + DateFormat df = dateFormatMap.get(formatStr); + if (df == null) { + df = new SimpleDateFormat(formatStr); + dateFormatMap.put(formatStr, df); + } + return df; + } + + public static Date getDate() { + return Calendar.getInstance().getTime(); + } + + /** + * ������������formatStr������������������dateTimeStr���Date������ dateTimeStr���������formatStr��������� + * + * @param dateTimeStr + * @param formatStr + * @return + */ + public static Date getDate(String dateTimeStr, String formatStr) { + try { + if (dateTimeStr == null || dateTimeStr.equals("")) { + return null; + } + DateFormat sdf = getDateFormat(formatStr); + return sdf.parse(dateTimeStr); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * ������dateTimeStr���Date������ + * + * @param dateTimeStr + * @return + */ + public static Date convertDate(String dateTimeStr) { + try { + if (dateTimeStr == null || dateTimeStr.equals("")) { + return null; + } + DateFormat sdf = getDateFormat(yyyy_MM_dd_EN); + Date d = sdf.parse(dateTimeStr); + return d; + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * ���������������������������������������"yyyy-MM-dd"���������dateTimeStr���Date������ dateTimeStr���������"yyyy-MM-dd"��������� + * + * @param dateTimeStr + * @return + */ + public static Date getDate(String dateTimeStr) { + return getDate(dateTimeStr, yyyy_MM_dd_EN); + } + + /** + * ���YYYYMMDD���������Date������ + * + * @param date + * @return + * @throws Exception + */ + public static Date transferDate(String date) throws Exception { + if (date == null || date.length() < 1) + return null; + + if (date.length() != 8) + throw new Exception("������������������"); + String con = "-"; + + String yyyy = date.substring(0, 4); + String mm = date.substring(4, 6); + String dd = date.substring(6, 8); + + int month = Integer.parseInt(mm); + int day = Integer.parseInt(dd); + if (month < 1 || month > 12 || day < 1 || day > 31) + throw new Exception("������������������"); + + String str = yyyy + con + mm + con + dd; + return getDate(str, yyyy_MM_dd_EN); + } + + /** + * ���Date���������������������yyyy-mm-dd hh:mm:ss��������������� + * + * @param date + * @return + */ + public static String dateToDateString(Date date) { + return dateToDateString(date, yyyy_MM_dd_HH_mm_ss_EN); + } + + /** + * ���Date���������������������yyyymmddhhmmss��������������� + * + * @param date + * @return + */ + public static String dateToDateFullString(Date date) { + if (null == date) + return null; + else + return dateToDateString(date, yyyyMMddHHmmss_EN); + } + + /** + * ���Date���������formatStr������������������ + * + * @param date + * @param formatStr + * @return + */ + public static String dateToDateString(Date date, String formatStr) { + DateFormat df = getDateFormat(formatStr); + return df.format(date); + } + + /** + * ���String���������formatStr������������������ + * + * @param date + * @param formatStr1 + * @param formatStr2 + * @return + */ + public static String stringToDateString(String date, String formatStr1, String formatStr2) { + Date d = getDate(date, formatStr1); + DateFormat df = getDateFormat(formatStr2); + return df.format(d); + } + + /** + * ������������������yyyy-MM-dd��������� + * + * @return + */ + public static String getCurDate() { + return dateToDateString(new Date(), yyyy_MM_dd_EN); + } + + /** + * ������������������ + * + * @return + */ + public static String getCurDate(String formatStr) { + return dateToDateString(new Date(), formatStr); + } + + /** + * ������������������yyyy���MM���dd������������ + * + * @return + */ + public static String getCurCNDate() { + return dateToDateString(new Date(), yyyy_MM_dd_CN); + } + + /** + * ������������������������yyyy-MM-dd HH:mm:ss��������� + * + * @return + */ + public static String getCurDateTime() { + return dateToDateString(new Date(), yyyy_MM_dd_HH_mm_ss_EN); + } + + /** + * ������������������������yyyy���MM���dd���HH���mm���ss������������ + * + * @return + */ + public static String getCurZhCNDateTime() { + return dateToDateString(new Date(), yyyy_MM_dd_HH_mm_ss_CN); + } + + /** + * ������������"yyyy-MM-dd HH:mm:ss"������������������������������������������,time2-time1 + * + * @param time1 + * @param time2 + * @return + */ + public static long compareDateStr(String time1, String time2) { + Date d1 = getDate(time1); + Date d2 = getDate(time2); + return d2.getTime() - d1.getTime(); + } + + /** + * ��������������������������������������� + * + * @param time1 + * @param time2 + * @param format + * @return + */ + public static long compareDateStr(String time1, String time2, String format) { + Date d1 = getDate(time1, format); + Date d2 = getDate(time2, format); + return d2.getTime() - d1.getTime(); + } + + /** + * ������������������������������������������������ + * + * @param time + * @param format + * @return + */ + public static long compareDateNow(String time, String format) { + Date date = getDate(time, format); + return new Date().getTime() - date.getTime(); + } + + /** + * ������������"yyyy-MM-dd HH:mm:ss"������������������������������������������,time2-time1 + * + * @param time1 + * @param time2 + * @return + */ + public static long compareDateStr(Date time1, Date time2) { + return time2.getTime() - time1.getTime(); + } + + /** + * nows������������date������ ���true + * + * @param nows + * @param date + * @return + */ + public static boolean isTimeBefor(Date nows, Date date) { + long hous = nows.getTime() - date.getTime(); + if (hous > 0) { + return true; + } else { + return false; + } + } + + /** + * ������������������������������������������������������ + * + * @param hours + * @return + */ + public static long getMicroSec(BigDecimal hours) { + BigDecimal bd; + bd = hours.multiply(new BigDecimal(3600 * 1000)); + return bd.longValue(); + } + + /** + * ������������������years���������������(formatStr)������������ + * + * @param years + * @param formatStr + * @return + */ + public static String getDateStringOfYear(int years, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(new Date()); + now.add(Calendar.YEAR, years); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ������������������mon���������������(formatStr)������������ + * + * @param months + * @param formatStr + * @return + */ + public static String getDateStringOfMon(int months, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(new Date()); + now.add(Calendar.MONTH, months); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ������������������days���������������(formatStr)������������ + * + * @param days + * @param formatStr + * @return + */ + public static String getDateStringOfDay(int days, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(new Date()); + now.add(Calendar.DATE, days); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ��������������������������� + * + * @param date + * @return + */ + public static int theDateIsToday(String date, String format) { + String theDate = stringToDateString(date, format, yyyyMMdd_EN); + String today = getDateStringOfDay(0, yyyyMMdd_EN); + if (theDate.equals(today)) { + return 1; + } else { + return 0; + } + } + + /** + * ������������������hours������������������(formatStr)������������ + * + * @param hours + * @param formatStr + * @return + */ + public static String getDateStringOfHour(int hours, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(new Date()); + now.add(Calendar.HOUR_OF_DAY, hours); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ������������������mon���������������(formatStr)������������ + * + * @param date + * @param mon + * @param formatStr + * @return + */ + public static String getDateOfMon(String date, int mon, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(getDate(date, formatStr)); + now.add(Calendar.MONTH, mon); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ������������������day���������������(formatStr)������������ + * + * @param date + * @param day + * @param formatStr + * @return + */ + public static String getDateOfDay(String date, int day, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(getDate(date, formatStr)); + now.add(Calendar.DATE, day); + return dateToDateString(now.getTime(), formatStr); + } + + public static Date getDate(Date beginDate, int ds) { + if (ds == 0) + return new Date(); + try { + SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd"); + Calendar date = Calendar.getInstance(); + date.setTime(beginDate); + date.set(Calendar.DATE, date.get(Calendar.DATE) - ds); + Date endDate = dft.parse(dft.format(date.getTime())); + return endDate; + } catch (ParseException e) { + e.printStackTrace(); + } + return new Date(); + } + + public static String getAfterNDays(Date date, int n, String formateStr) { + SimpleDateFormat sdf = new SimpleDateFormat(formateStr); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + calendar.add(Calendar.DATE, n); + return sdf.format(calendar.getTime()); + } + + /** + * ������������������mins������������������(formatStr)������������ + * + * @param date + * @param mins + * @param formatStr + * @return + */ + public static String getDateOfMin(String date, int mins, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(getDate(date, formatStr)); + now.add(Calendar.SECOND, mins * 60); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ������������������mins������������������������ + * + * @param date + * @param mins + * @return + */ + public static Date getDateOfMin(Date date, int mins) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(date); + now.add(Calendar.SECOND, mins * 60); + return now.getTime(); + } + + /** + * ������������������mins������������������(formatStr)������������ + * + * @param mins + * @param formatStr + * @return + */ + public static String getDateStringOfMin(int mins, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(new Date()); + now.add(Calendar.MINUTE, mins); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ������������������mins������������������������ + * + * @param mins + * @return + */ + public static Date getDateOfMin(int mins) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(new Date()); + now.add(Calendar.MINUTE, mins); + return now.getTime(); + } + + /** + * ������������������sec���������������(formatStr)������������ + * + * @param sec + * @param formatStr + * @return + */ + public static String getDateStringOfSec(int sec, String formatStr) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(new Date()); + now.add(Calendar.SECOND, sec); + return dateToDateString(now.getTime(), formatStr); + } + + /** + * ��������������������������������� + * + * @return + */ + public static int getMonthDay(Date date) { + Calendar c = Calendar.getInstance(); + c.setTime(date); + return c.getActualMaximum(Calendar.DAY_OF_MONTH); + + } + + /** + * ��������������������������������� + * + * @return + */ + public static int getCurentMonthDay() { + Date date = Calendar.getInstance().getTime(); + return getMonthDay(date); + } + + /** + * ��������������������������������� yyyy-mm-dd + * + * @return + */ + public static int getMonthDay(String date) { + Date strDate = getDate(date, yyyy_MM_dd_EN); + return getMonthDay(strDate); + } + + /** + * ������19xx,20xx������������ + * + * @param d + * @return + */ + public static int getYear(Date d) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(d); + return now.get(Calendar.YEAR); + } + + /** + * ���������������1-12��� + * + * @param d + * @return + */ + public static int getMonth(Date d) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(d); + return now.get(Calendar.MONTH) + 1; + } + + /** + * ������xxxx-xx-xx������ + * + * @param d + * @return + */ + public static int getDay(Date d) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(d); + return now.get(Calendar.DAY_OF_MONTH); + } + + /** + * ������Date������������(24������) + * + * @param d + * @return + */ + public static int getHour(Date d) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(d); + return now.get(Calendar.HOUR_OF_DAY); + } + + /** + * ������Date������������ + * + * @param d + * @return + */ + public static int getMin(Date d) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(d); + return now.get(Calendar.MINUTE); + } + + /** + * ������Date��������� + * + * @param d + * @return + */ + public static int getSecond(Date d) { + Calendar now = Calendar.getInstance(TimeZone.getDefault()); + now.setTime(d); + return now.get(Calendar.SECOND); + } + + /** + * ������������������ + * + * @return yyyy-MM-dd + */ + public static String getMondayOfThisWeek() { + Calendar c = Calendar.getInstance(); + int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1; + if (day_of_week == 0) + day_of_week = 7; + c.add(Calendar.DATE, -day_of_week + 1); + return dateToDateString(c.getTime(), yyyy_MM_dd_EN); + } + + /** + * ������������������ + * + * @return yyyy-MM-dd + */ + public static String getSundayOfThisWeek() { + Calendar c = Calendar.getInstance(); + int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1; + if (day_of_week == 0) + day_of_week = 7; + c.add(Calendar.DATE, -day_of_week + 7); + return dateToDateString(c.getTime()); + } + + /** + * ���������������(*) + * + * @return yyyy-MM-dd + */ + public static String getDayOfThisWeek(int num) { + Calendar c = Calendar.getInstance(); + int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1; + if (day_of_week == 0) + day_of_week = 7; + c.add(Calendar.DATE, -day_of_week + num); + return dateToDateString(c.getTime(), yyyy_MM_dd_EN); + } + + /** + * ��������������������� + * + * @return yyyy-MM-dd + */ + public static String getDayOfThisMoon(String num) { + String date = dateToDateString(new Date(), yyyy_MM_EN); + date = date + "-" + num; + return date; + } + + /** + * ��������������������������������� + * + * @param beginDate + * @param endDate + * @return + */ + public static long getQuotByDays(String beginDate, String endDate) { + long quot = 0; + DateFormat df = getDateFormat(yyyy_MM_dd_EN); + try { + Date d1 = df.parse(beginDate); + Date d2 = df.parse(endDate); + quot = d2.getTime() - d1.getTime(); + quot = quot / 1000 / 60 / 60 / 24; + } catch (ParseException e) { + throw new RuntimeException(e); + } + return quot; + } + + /** + * ��������������������������������������������������� + * + * @param date + * @param days + * @return + */ + public static String getDateAddDay(String date, int days, String format) { + DateFormat df = getDateFormat(format); + try { + Calendar cal = Calendar.getInstance(); + cal.setTime(df.parse(date)); + cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) + days); + + date = df.format(cal.getTime()); + } catch (ParseException e) { + throw new RuntimeException(e); + } + return date; + } + + /** + * ������������������������������ + * + * @return + */ + public static Date getLastDayOfCurrMonth() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MONTH, 1); + cal.set(Calendar.DAY_OF_MONTH, 0); + + return cal.getTime(); + } + + /** + * ��������������������������������������������������� + * + * @param date + * @param m + * @return + */ + public static String getDateAddMonth(String date, int m) { + DateFormat df = getDateFormat(yyyyMM_EN); + try { + Calendar cal = Calendar.getInstance(); + cal.setTime(df.parse(date)); + cal.add(Calendar.MONTH, m); + date = df.format(cal.getTime()); + } catch (ParseException e) { + throw new RuntimeException(e); + } + return date; + } + + /** + * ������������������������������ + * + * @param year + * @param month + * @return + */ + public static String getFirstDayOfMonth(int year, int month) { + Calendar cal = Calendar.getInstance(); + // ������������ + cal.set(Calendar.YEAR, year); + // ������������ + cal.set(Calendar.MONTH, month - 1); + // ������������������������ + int lastDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH); + // ������������������������������������ + cal.set(Calendar.DAY_OF_MONTH, lastDay); + // ��������������� + DateFormat df = getDateFormat(yyyy_MM_dd_EN); + return df.format(cal.getTime()); + } + + /** + * ������������������������������ + * + * @param year + * @param month + * @return + */ + public static String getLastDayOfMonth(int year, int month) { + Calendar cal = Calendar.getInstance(); + // ������������ + cal.set(Calendar.YEAR, year); + // ������������ + cal.set(Calendar.MONTH, month - 1); + // ������������������������ + int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); + // ������������������������������������ + cal.set(Calendar.DAY_OF_MONTH, lastDay); + // ��������������� + DateFormat df = getDateFormat(yyyy_MM_dd_EN); + return df.format(cal.getTime()); + } + + /** + * ������������������ + * + * @param date + * @return + * @throws ParseException + */ + public static String getYesterday(Date date) throws ParseException { + DateFormat df = getDateFormat(yyyy_MM_dd_EN); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(df.parse(df.format(date))); + calendar.add(Calendar.DAY_OF_MONTH, -1); + return df.format(calendar.getTime()); + } + + + /** + * 10��������������������� + * + * @param dateInt + * @param format + * @return + */ + public static String getIntToStr(String dateInt, String format) { + DateFormat df = getDateFormat(format); + long times = Integer.parseInt(dateInt) * 1000L; + Date date = new Date(times); + return df.format(date); + } + + /** + * ������ 10������������ + * + * @return + */ + public static Integer getDateInt() { + return (int) (System.currentTimeMillis() / 1000); + } + + /** + * 13��������������������� + * + * @param time + * @param format + * @return + */ + public static String getLongToStr(long time, String format) { + Date date = new Date(time); + return dateToDateString(date, format); + } + + /** + * ������������������������������������ + * + * @param start + * @param end + * @return + */ + public static int getIntervalSec(int start, int end) { + return (end - start) * 60 * 60; + } + + /** + * ��������������������������������� + * + * @param time + * @return + */ + public static String getMillsStr(long time) { + String timeStr = String.valueOf(time); + String suffix = timeStr.substring(0, timeStr.length() - 3); + String prefix = timeStr.substring(timeStr.length() - 3, timeStr.length()); + return suffix + "." + prefix; + } + + /** + * ��������������������������������������������� + * + * @param timeStr + * @param formatStr + * @return + */ + public static String longToString(String timeStr, String formatStr) { + long times = Long.parseLong(timeStr.replace(".", "")); + Date date = new Date(times); + return dateToDateString(date, formatStr); + } + + /** + * ������������������������ + * + * @return + */ + public static Long getTodayTime() { + Calendar todayStart = Calendar.getInstance(); + todayStart.set(Calendar.HOUR_OF_DAY, 0); + todayStart.set(Calendar.MINUTE, 0); + todayStart.set(Calendar.SECOND, 0); + todayStart.set(Calendar.MILLISECOND, 0); + return todayStart.getTime().getTime(); + } + + public static Integer getTodayInt() { + return (int) (getTodayTime() / 1000); + } + + /** + * ������������������������ + * + * @return + */ + public static Long getEndTime() { + Calendar todayEnd = Calendar.getInstance(); + todayEnd.set(Calendar.HOUR, 23); + todayEnd.set(Calendar.MINUTE, 59); + todayEnd.set(Calendar.SECOND, 59); + todayEnd.set(Calendar.MILLISECOND, 999); + return todayEnd.getTime().getTime(); + } + + public static Integer getTomorrowInt() { + return (int) (getTomorrowTime() / 1000); + } + + /** + * ��������������������������� + * + * @return + */ + public static Long getTomorrowTime() { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.add(Calendar.DAY_OF_MONTH, 1); + return cal.getTime().getTime(); + } + + /** + * ��������������������������������� + * + * @param hour + * @return + */ + public static Long getPointHourTime(int hour) { + Calendar todayStart = Calendar.getInstance(); + todayStart.set(Calendar.HOUR_OF_DAY, hour); + todayStart.set(Calendar.MINUTE, 0); + todayStart.set(Calendar.SECOND, 0); + todayStart.set(Calendar.MILLISECOND, 0); + return todayStart.getTime().getTime(); + } + + /** + * ������������n���������h������ + * + * @param days + * @param hour + * @return + */ + public static Long getPointDateHourTime(int days, int hour) { + Calendar todayStart = Calendar.getInstance(); + todayStart.add(Calendar.DATE, days); + todayStart.set(Calendar.HOUR_OF_DAY, hour); + todayStart.set(Calendar.MINUTE, 0); + todayStart.set(Calendar.SECOND, 0); + todayStart.set(Calendar.MILLISECOND, 0); + return todayStart.getTime().getTime(); + } + + /** + * ��������������������� + * + * @param time + * @return + */ + public static Integer hourTosec(String time) { + if ("null".equals(time) || StringUtils.isEmpty(time)) { + return null; + } + if (time.length() <= 5) { + time += ":00"; + } + int index1 = time.indexOf(":"); + int index2 = time.indexOf(":", index1 + 1); + int hh = Integer.parseInt(time.substring(0, index1)); + int mi = Integer.parseInt(time.substring(index1 + 1, index2)); + int ss = Integer.parseInt(time.substring(index2 + 1)); + return hh * 60 * 60 + mi * 60 + ss; + } + + /** + * ��������������������� + * + * @param time + * @return + */ + public static Integer minTosec(String time) { + if (time.length() <= 5) { + time += ":00"; + } + int index1 = time.indexOf(":"); + int index2 = time.indexOf(":", index1 + 1); + int mi = Integer.parseInt(time.substring(0, index1)); + int ss = Integer.parseInt(time.substring(index1 + 1, index2)); + return mi * 60 + ss; + } + + + + public static boolean isDate(String dateTimeStr, String formatStr) { + DateFormat df = getDateFormat(formatStr); + try { + df.parse(dateTimeStr); + return true; + } catch (Exception e) { + return false; + } + } + + /** + * ��������������������������������� + * + * @param strDate + * ������������ yyyy-MM-dd HH:mm:ss + * @param strDateBegin + * ������������ 00:00:00 + * @param strDateEnd + * ������������ 00:05:00 + * @return + */ + public static boolean isInDate(String strDate, String strDateBegin, String strDateEnd) { + // ��������������������������� + int strDateH = Integer.parseInt(strDate.substring(11, 13)); + int strDateM = Integer.parseInt(strDate.substring(14, 16)); + int strDateS = Integer.parseInt(strDate.substring(17, 19)); + // ��������������������������� + int strDateBeginH = Integer.parseInt(strDateBegin.substring(0, 2)); + int strDateBeginM = Integer.parseInt(strDateBegin.substring(3, 5)); + int strDateBeginS = Integer.parseInt(strDateBegin.substring(6, 8)); + // ��������������������������� + int strDateEndH = Integer.parseInt(strDateEnd.substring(0, 2)); + int strDateEndM = Integer.parseInt(strDateEnd.substring(3, 5)); + int strDateEndS = Integer.parseInt(strDateEnd.substring(6, 8)); + if ((strDateH >= strDateBeginH && strDateH <= strDateEndH)) { + // ������������������������������������������������������������������ + if (strDateH > strDateBeginH && strDateH < strDateEndH) { + return true; + // ������������������������������������������������������������������������������������ + } else if (strDateH == strDateBeginH && strDateM >= strDateBeginM && strDateM <= strDateEndM) { + return true; + // ������������������������������������������������������������������������������������������������������������������������ + } else if (strDateH == strDateBeginH && strDateM == strDateBeginM && strDateS >= strDateBeginS + && strDateS <= strDateEndS) { + return true; + } + // ��������������������������������������������������������������������������������������������������������������������������� + else if (strDateH >= strDateBeginH && strDateH == strDateEndH && strDateM <= strDateEndM) { + return true; + // ������������������������������������������������������������������������������������������������������������������������������������������������������������ + } else if (strDateH >= strDateBeginH && strDateH == strDateEndH && strDateM == strDateEndM + && strDateS <= strDateEndS) { + return true; + } else { + return false; + } + } else { + return false; + } + } + + /** + * ��������������������������������� + * + * @param date + * ������������ yyyy-MM-dd HH:mm:ss + * @param strDateBegin + * ������������ 00:00:00 + * @param strDateEnd + * ������������ 00:05:00 + * @return + */ + public static boolean isInDate(Date date, String strDateBegin, String strDateEnd) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String strDate = sdf.format(date); + // ��������������������������� + int strDateH = Integer.parseInt(strDate.substring(11, 13)); + int strDateM = Integer.parseInt(strDate.substring(14, 16)); + int strDateS = Integer.parseInt(strDate.substring(17, 19)); + // ��������������������������� + int strDateBeginH = Integer.parseInt(strDateBegin.substring(0, 2)); + int strDateBeginM = Integer.parseInt(strDateBegin.substring(3, 5)); + int strDateBeginS = Integer.parseInt(strDateBegin.substring(6, 8)); + // ��������������������������� + int strDateEndH = Integer.parseInt(strDateEnd.substring(0, 2)); + int strDateEndM = Integer.parseInt(strDateEnd.substring(3, 5)); + int strDateEndS = Integer.parseInt(strDateEnd.substring(6, 8)); + if ((strDateH >= strDateBeginH && strDateH <= strDateEndH)) { + // ������������������������������������������������������������������ + if (strDateH > strDateBeginH && strDateH < strDateEndH) { + return true; + // ������������������������������������������������������������������������������������ + } else if (strDateH == strDateBeginH && strDateM >= strDateBeginM && strDateM <= strDateEndM) { + return true; + // ������������������������������������������������������������������������������������������������������������������������ + } else if (strDateH == strDateBeginH && strDateM == strDateBeginM && strDateS >= strDateBeginS + && strDateS <= strDateEndS) { + return true; + } + // ��������������������������������������������������������������������������������������������������������������������������� + else if (strDateH >= strDateBeginH && strDateH == strDateEndH && strDateM <= strDateEndM) { + return true; + // ������������������������������������������������������������������������������������������������������������������������������������������������������������ + } else if (strDateH >= strDateBeginH && strDateH == strDateEndH && strDateM == strDateEndM + && strDateS <= strDateEndS) { + return true; + } else { + return false; + } + } else { + return false; + } + } + + public static boolean isInTime(int time, int begin, int end) { + if (time >= begin && time < end) { + return true; + } + return false; + } + + public static int getMinutest(String begin, String format) { + String nowMinutes = getCurDate("HH:mm"); + long time = compareDateStr("09:00", nowMinutes, "HH:mm"); + return (int) time; + } + + /** + * <p> + * Title: addDays + * </p> + * <p> + * Description: ������������ + * </p> + * + * @param days + * @return + */ + public static Date addDays(Date date, int days) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, days); + return calendar.getTime(); + } + + /** + * <p> + * Title: addMonths + * </p> + * <p> + * Description: ������������ + * </p> + * + * @param date + * @param months + * @return + */ + public static Date addMonths(Date date, int months) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, months); + return calendar.getTime(); + } + + /** + * <p> + * Title: getDays + * </p> + * <p> + * Description: ��������������������������������������� + * </p> + * + * @param minDate + * @param maxDate + * @return + */ + public static int getDays(Date minDate, Date maxDate) { + int days = 0; + if (null == minDate || null == maxDate) + return days; + days = (int) ((maxDate.getTime() - minDate.getTime()) / (24 * 60 * 60 * 1000)); + return days; + } + + /** + * ������������ date + * + * @param longDate ��������� + * @return + */ + public static Date getConversionDateByLong(long longDate) { + //1529398742830 + ZoneId zid = ZoneId.systemDefault(); + LocalDateTime time = LocalDateTime.ofInstant(Instant.ofEpochMilli(longDate), zid); + ZonedDateTime zdt = time.atZone(zid); + Date date = Date.from(zdt.toInstant()); + return date; + } + + /** + * yyyyMMdd ��� yyyy_MM_dd + * + * @param strData ��������� + * @return + */ + public static String getdatefor_yyyy_MM_dd(String strData) { + //1529398742830 + //20180205 + String yyyy_MM_dd=""; + if (null == strData || strData.length()==0) { + return yyyy_MM_dd; + }else { + String yyyy = strData.substring(0, 4); + String mm = strData.substring(4, 6); + String dd = strData.substring(6, 8); + yyyy_MM_dd = yyyy+"-"+mm +"-"+dd; + } + return yyyy_MM_dd; + } + + public static String getdatefor_HH_mm_ss(String strData) { + //1529398742830 + //20180205 + String HH_mm_ss=""; + if (null == strData || strData.length()==0) { + return HH_mm_ss; + }else { + String HH = strData.substring(0, 2); + String mm = strData.substring(2, 4); + String ss = strData.substring(4, 6); + HH_mm_ss = HH+":"+mm +":"+ss; + } + return HH_mm_ss; + } + + /** + * yyyyMMdd + * + * @return + */ + public static String getdatefor_yyyyMMdd() { + Date newdate = new Date(); + SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd"); + String date = dft.format(newdate); + return date; + } + + /** + * yyyyMMdd + * + * @return + */ + public static String getdatefor_yyyy_MM_dd() { + Date newdate = new Date(); + SimpleDateFormat dft = new SimpleDateFormat("yyyy-MM-dd"); + String date = dft.format(newdate); + return date; + } + + + + public static void main(String[] args) { + Date newdate = new Date(); + SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd"); + String date = dft.format(newdate); + System.out.println(date); +// return endDate; + } +} diff --git a/screen-common/src/main/java/com/moral/util/PageResult.java b/screen-common/src/main/java/com/moral/util/PageResult.java new file mode 100644 index 0000000..2bbc687 --- /dev/null +++ b/screen-common/src/main/java/com/moral/util/PageResult.java @@ -0,0 +1,34 @@ +package com.moral.util; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * ��������������� + */ +@Data +@ApiModel("���������������������") +public class PageResult<T> { + + @ApiModelProperty("���������") + private Long total; + @ApiModelProperty("���������") + private Long totalPage; + @ApiModelProperty("���������������") + private List<T> items; + public PageResult(Long total, List<T> items) { + this.total = total; + this.items = items; + } + + public PageResult(Long total, Long totalPage, List<T> items) { + this.total = total; + this.totalPage = totalPage; + this.items = items; + } + + +} \ No newline at end of file diff --git a/screen-common/src/main/java/com/moral/util/SpringContextUtils.java b/screen-common/src/main/java/com/moral/util/SpringContextUtils.java new file mode 100644 index 0000000..8274ca7 --- /dev/null +++ b/screen-common/src/main/java/com/moral/util/SpringContextUtils.java @@ -0,0 +1,65 @@ +package com.moral.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; + +import java.lang.annotation.Annotation; +import java.util.Map; + + +public class SpringContextUtils { + + private static ApplicationContext applicationContext; + + public SpringContextUtils() { + } + + /** + * ������applicationContext������ + * + * @return + */ + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + + public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtils.applicationContext = applicationContext; + } + + + /** + * ������ bean ��� name ��������������� + * + * @param beanName bean name + * @param <T> + * @return + */ + @SuppressWarnings("unchecked") + public static <T> T getBeanByName(String beanName) { + return (T) applicationContext.getBean(beanName); + } + + + /** + * ������ bean ��� ������ ��������������� + * + * @param requiredType + * @param <T> + * @return + */ + @SuppressWarnings("unchecked") + public static <T> T getBeanByClass(Class<?> requiredType) { + return (T) applicationContext.getBean(requiredType); + } + + public static <T> Map<String, T> getBeansByClass(Class<T> cls) { + return applicationContext.getBeansOfType(cls); + } + + public static Map<String, Object> getBeansByAnnotation(Class<? extends Annotation> annotationCls) { + return applicationContext.getBeansWithAnnotation(annotationCls); + } + +} diff --git a/screen-manage/pom.xml b/screen-manage/pom.xml new file mode 100644 index 0000000..165d0b7 --- /dev/null +++ b/screen-manage/pom.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>screen</artifactId> + <groupId>org.moral</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>screen-manage</artifactId> + + + <dependencies> + <dependency> + <groupId>org.moral</groupId> + <artifactId>screen-common</artifactId> + <version>1.0-SNAPSHOT</version> + <scope>compile</scope> + </dependency> + </dependencies> + + <build> + <finalName>screen-manage</finalName> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>${java.version}</source> + <target>${java.version}</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>${maven-resources-plugin.version}</version> + <dependencies> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-filtering</artifactId> + <version>${maven-filtering.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-common-artifact-filters</artifactId> + <version>${maven-common-artifact-filters.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-dependency-tree</artifactId> + <version>${maven-dependency-tree.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-shared-incremental</artifactId> + <version>${maven-shared-incremental.version}</version> + </dependency> + </dependencies> + </plugin> + + </plugins> + </build> + + + +</project> \ No newline at end of file diff --git a/screen-manage/src/main/java/com/moral/ScreenManageBootstrap.java b/screen-manage/src/main/java/com/moral/ScreenManageBootstrap.java new file mode 100644 index 0000000..097d490 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/ScreenManageBootstrap.java @@ -0,0 +1,42 @@ +package com.moral; + + +import com.moral.util.SpringContextUtils; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import java.util.Arrays; + + +@MapperScan("com.moral.api.mapper") +@EnableTransactionManagement +@SpringBootApplication +public class ScreenManageBootstrap { + public static void main(String[] args) { + ApplicationContext applicationContext = SpringApplication.run(ScreenManageBootstrap.class, args); + SpringContextUtils.setApplicationContext(applicationContext); + } + @Bean + public FilterRegistrationBean<CorsFilter> corsFilter() { + FilterRegistrationBean<CorsFilter> corsFilterFilterRegistrationBean = new FilterRegistrationBean<>(); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedHeader("*"); + corsConfiguration.addAllowedOrigin("*"); + corsConfiguration.setAllowedMethods(Arrays.asList("POST", "PUT", "GET", "OPTIONS", "DELETE")); + corsConfiguration.setAllowCredentials(true); + corsConfiguration.setMaxAge(3600L); + source.registerCorsConfiguration("/**", corsConfiguration); + corsFilterFilterRegistrationBean.setFilter(new CorsFilter(source)); + corsFilterFilterRegistrationBean.setOrder(-1); + return corsFilterFilterRegistrationBean; + } +} diff --git a/screen-manage/src/main/java/com/moral/api/Swagger2.java b/screen-manage/src/main/java/com/moral/api/Swagger2.java new file mode 100644 index 0000000..90bb77e --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/Swagger2.java @@ -0,0 +1,34 @@ +package com.moral.api; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + + +@Configuration +@EnableSwagger2 +public class Swagger2 { + @Bean + public Docket petApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.moral.api")) + .paths(PathSelectors.any()) + .build(); + } + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("������������������������") + .description("������������������������") + .version("1.0") + .build(); + } + +} diff --git a/screen-manage/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java b/screen-manage/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java new file mode 100644 index 0000000..9a85aa8 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/config/datasource/DataSourceConfig.java @@ -0,0 +1,23 @@ +package com.moral.api.config.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + + +@Configuration +public class DataSourceConfig { + + @Primary + @Bean(name = "primaryDataSource") + @Qualifier("primaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource primaryDataSource(){ + return new DruidDataSource(); + } +} diff --git a/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java new file mode 100644 index 0000000..e5ae67b --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java @@ -0,0 +1,67 @@ +package com.moral.api.config.kafka; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.config.KafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; +import org.springframework.kafka.listener.ContainerProperties; +import java.util.HashMap; +import java.util.Map; + +/*@Configuration +@EnableKafka*/ +public class KafkaConsumerConfig { + @Value("${kafka.consumer.servers}") + private String servers; + @Value("${kafka.consumer.enable.auto.commit}") + private boolean enableAutoCommit; + @Value("${kafka.consumer.session.timeout}") + private String sessionTimeout; + @Value("${kafka.consumer.auto.commit.interval}") + private String autoCommitInterval; + @Value("${kafka.consumer.group.id}") + private String groupId; + @Value("${kafka.consumer.auto.offset.reset}") + private String autoOffsetReset; + @Value("${kafka.consumer.concurrency}") + private int concurrency; + + @Bean + public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory()); + factory.setConcurrency(concurrency); + factory.getContainerProperties().setPollTimeout(1500); + factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE); + + /*factory.setBatchListener(true);//@KafkaListener ������������ ���������������������Kafka���������������������ConsumerConfig.MAX_POLL_RECORDS_CONFIG + factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);//������������������������������*/ + return factory; + } + + public ConsumerFactory<String, String> consumerFactory() { + return new DefaultKafkaConsumerFactory<>(consumerConfigs()); + } + + + public Map<String, Object> consumerConfigs() { + Map<String, Object> propsMap = new HashMap<>(); + propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, servers); + propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit); + propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval); + propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout); + propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset); + return propsMap; + } +} diff --git a/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java new file mode 100644 index 0000000..ef5b141 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/config/kafka/KafkaProducerConfig.java @@ -0,0 +1,55 @@ +package com.moral.api.config.kafka; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; + +import java.util.HashMap; +import java.util.Map; + +/*@Configuration +@EnableKafka*/ +public class KafkaProducerConfig { + @Value("${kafka.producer.servers}") + private String servers; + @Value("${kafka.producer.retries}") + private int retries; + @Value("${kafka.producer.batch.size}") + private int batchSize; + @Value("${kafka.producer.linger}") + private int linger; + @Value("${kafka.producer.buffer.memory}") + private int bufferMemory; + + + public Map<String, Object> producerConfigs() { + Map<String, Object> props = new HashMap<>(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, servers); + props.put(ProducerConfig.RETRIES_CONFIG, retries); + props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize); + props.put(ProducerConfig.LINGER_MS_CONFIG, linger); + props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + return props; + } + + public ProducerFactory<String, String> producerFactory() { + return new DefaultKafkaProducerFactory<>(producerConfigs()); + } + + @Bean + public KafkaTemplate<String, String> kafkaTemplate() { + return new KafkaTemplate<String, String>(producerFactory()); + } + +} + + + diff --git a/screen-manage/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java b/screen-manage/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java new file mode 100644 index 0000000..4a253f7 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/config/mybatis/MybatisPlusConfig.java @@ -0,0 +1,22 @@ +package com.moral.api.config.mybatis; + +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + + +@Configuration +public class MybatisPlusConfig { + + /** + * ������������ + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor page = new PaginationInterceptor(); + return page; + } + + +} diff --git a/screen-manage/src/main/java/com/moral/api/config/redis/RedisConfig.java b/screen-manage/src/main/java/com/moral/api/config/redis/RedisConfig.java new file mode 100644 index 0000000..b63690d --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/config/redis/RedisConfig.java @@ -0,0 +1,42 @@ +package com.moral.api.config.redis; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + + +@Configuration +public class RedisConfig { + + @Bean(name="redisTemplate") + @ConditionalOnMissingBean(StringRedisTemplate.class) //������������������ ���������������������RedisTemplate ������������ ������������������ + public RedisTemplate<String,Object> stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key������String������������������ + redisTemplate.setKeySerializer(stringRedisSerializer); + // hash���key���������String������������������ + redisTemplate.setHashKeySerializer(stringRedisSerializer); + // valuevalue������jackson��������������� + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); + // hash���value������jackson��������������� + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} diff --git a/screen-manage/src/main/java/com/moral/api/constant/TopicConstants.java b/screen-manage/src/main/java/com/moral/api/constant/TopicConstants.java new file mode 100644 index 0000000..770d60e --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/constant/TopicConstants.java @@ -0,0 +1,11 @@ +package com.moral.api.constant; + +public class TopicConstants { + /** + * Test ������ + */ + public static final String TEST_TOPIC_MESSAGE = "test_topic"; + + + +} diff --git a/screen-manage/src/main/java/com/moral/api/controller/TestController.java b/screen-manage/src/main/java/com/moral/api/controller/TestController.java new file mode 100644 index 0000000..8a437f5 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/controller/TestController.java @@ -0,0 +1,99 @@ +package com.moral.api.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.moral.api.entity.Test; +import com.moral.api.service.TestService; +import com.moral.constant.ResultMessage; +import com.moral.redis.RedisUtil; +import com.moral.util.PageResult; +import io.swagger.annotations.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.web.bind.annotation.*; + + +@Slf4j +@Api(tags = {"������������"}) +@RestController +@RequestMapping("/manage") +public class TestController { + + @Autowired + private KafkaTemplate kafkaTemplate; + + @Autowired + private TestService testService; + /** + * name ������ + * email ������ + * mobile ��������� + */ + @ApiOperation(value = "������������", notes = "������������") + @RequestMapping(value = "/saveTest", method = RequestMethod.POST) + public ResultMessage save() { + + Test test=new Test(); + test.setEmail("test@qq.com"); + test.setName("name"); + test.setMobile("13965898745"); + testService.save(test); + return ResultMessage.ok(); + + } + /** + * page ��������� + * size ������������ + */ + @ApiOperation(value = "������", notes = "������") + @ApiImplicitParams({ + @ApiImplicitParam(name="page",value="������������",required=true,paramType="path",dataType="Int"), + @ApiImplicitParam(name="size",value="������������",required=true,paramType="path",dataType="Int") + }) + @RequestMapping(value = "search/{page}/{size}", method = RequestMethod.GET) + public ResultMessage findBypage(@PathVariable("page") Integer page, @PathVariable("size") Integer size) { + + log.info("page is:"+ page+" size is:"+size); + //������������������������ + Page<Test> userPage = testService.selectByPage(null, page, size); + //������������������������ + PageResult<Test> pageResult = new PageResult<>( + userPage.getTotal(), userPage.getPages(),userPage.getRecords() + ); + //������������ + return ResultMessage.ok(pageResult); + } + + + /** + * redis������ + */ + @ApiOperation(value = "redis������", notes = "redis������") + @RequestMapping(value = "redis", method = RequestMethod.GET) + public ResultMessage testRedis() { + RedisUtil.set("redistest","test"); + return ResultMessage.ok(RedisUtil.get("redistest")); + + } + + /** + * ������ + */ + @ApiOperation(value = "������������", notes = "������������") + @RequestMapping(value = "saveTest", method = RequestMethod.GET) + public ResultMessage saveTest() throws Exception{ + testService.saveTest(); + return ResultMessage.ok(); + + } + + /** + * kafka������ + */ + @ApiOperation(value = "kafka������", notes = "kafka������") + @RequestMapping(value = "kafkaTest", method = RequestMethod.GET) + public void kafkaTest() { + kafkaTemplate.send("test_topic","test111111111111111"); + } + +} diff --git a/screen-manage/src/main/java/com/moral/api/entity/Test.java b/screen-manage/src/main/java/com/moral/api/entity/Test.java new file mode 100644 index 0000000..05ff045 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/entity/Test.java @@ -0,0 +1,51 @@ +package com.moral.api.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * + * </p> + * + * @author moral + * @since 2021-03-01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class Test extends Model<Test> { + + private static final long serialVersionUID = 1L; + + /** + * ������ + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * ������ + */ + private String name; + + /** + * ������ + */ + private String email; + + /** + * ��������� + */ + private String mobile; + + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/screen-manage/src/main/java/com/moral/api/exception/BusinessException.java b/screen-manage/src/main/java/com/moral/api/exception/BusinessException.java new file mode 100644 index 0000000..1b289fc --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/exception/BusinessException.java @@ -0,0 +1,72 @@ +package com.moral.api.exception; + +/** + * @author + * @site + * @company + * @create 2021-02-26 11:20 + */ +public class BusinessException extends RuntimeException { + + /** + * ��������� + */ + private String code; + + /** + * ������������ + */ + private String msg; + + /** */ + private static final long serialVersionUID = 1L; + + public BusinessException() { + super(); + } + + public BusinessException(String msg) { + super(msg); + this.msg = msg; + } + + public BusinessException(Throwable t) { + super(t); + } + + public BusinessException(String msg, Throwable t) { + super(msg); + this.msg = msg; + } + + public BusinessException(String code, String msg) { + super(msg); + this.code = code; + this.msg = msg; + } + + public BusinessException(String code, String msg, Throwable t) { + super(msg, t); + this.code = code; + this.msg = msg; + } + + /** + * Getter method for property <tt>code</tt>. + * + * @return property value of code + */ + public String getCode() { + return code; + } + + /** + * Getter method for property <tt>msg</tt>. + * + * @return property value of msg + */ + public String getMsg() { + return msg; + } + +} diff --git a/screen-manage/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java b/screen-manage/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..f9293f8 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/exception/GlobalExceptionHandler.java @@ -0,0 +1,35 @@ +package com.moral.api.exception; + +import com.moral.constant.Constants; +import com.moral.constant.ResultMessage; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + + +@ControllerAdvice +@ResponseBody +public class GlobalExceptionHandler { + /** + * ������������������ + */ + @ExceptionHandler + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public ResultMessage handleException(Exception ex) { + return ResultMessage.fail(Constants.CODE_OPERATION_FAILED, "������������"); + } + + /** + * ������BusinessException������ + */ + @ExceptionHandler({BusinessException.class}) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public ResultMessage handleUserNotExistException(BusinessException ex) { + return ResultMessage.fail(Constants.CODE_OPERATION_FAILED, "������������������������"); + } + +} diff --git a/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java b/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java new file mode 100644 index 0000000..af6c8cc --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java @@ -0,0 +1,37 @@ +package com.moral.api.kafka.consumer; + +import com.moral.api.constant.TopicConstants; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.support.Acknowledgment; +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Component +@Slf4j +public class KafkaConsumer { + +/* *//** + * ��������������������������������� + * @param record + * @param ack + * @throws Exception + *//* + @KafkaListener(topics = TopicConstants.TEST_TOPIC_MESSAGE,groupId = "test") + public void listenTest(ConsumerRecord<String, String> record , Acknowledgment ack) throws Exception { + String msg = record.value(); + System.out.println(msg); + if (new Random().nextInt(100)<50){ + log.info(String.format("kafka ������������������---------------- listen1 topic = %s, offset = %d, value = %s ", record.topic(), record.offset(), record.value())); + ack.acknowledge(); + } + + }*/ + + + + + +} diff --git a/screen-manage/src/main/java/com/moral/api/mapper/TestMapper.java b/screen-manage/src/main/java/com/moral/api/mapper/TestMapper.java new file mode 100644 index 0000000..46e1799 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/mapper/TestMapper.java @@ -0,0 +1,16 @@ +package com.moral.api.mapper; + +import com.moral.api.entity.Test; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * Mapper ������ + * </p> + * + * @author moral + * @since 2021-02-25 + */ +public interface TestMapper extends BaseMapper<Test> { + +} diff --git a/screen-manage/src/main/java/com/moral/api/service/TestService.java b/screen-manage/src/main/java/com/moral/api/service/TestService.java new file mode 100644 index 0000000..5ab915b --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/service/TestService.java @@ -0,0 +1,24 @@ +package com.moral.api.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.moral.api.entity.Test; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * <p> + * ��������� + * </p> + * + * @author moral + * @since 2021-02-25 + */ +@Service +@Transactional +public interface TestService extends IService<Test> { + + Page<Test> selectByPage(Test test, Integer page, Integer size); + + void saveTest() throws Exception; +} diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/TestServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/TestServiceImpl.java new file mode 100644 index 0000000..50040a8 --- /dev/null +++ b/screen-manage/src/main/java/com/moral/api/service/impl/TestServiceImpl.java @@ -0,0 +1,52 @@ +package com.moral.api.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.moral.api.entity.Test; +import com.moral.api.exception.BusinessException; +import com.moral.api.mapper.TestMapper; +import com.moral.api.service.TestService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * <p> + * ��������������� + * </p> + * + * @author moral + * @since 2021-02-25 + */ +@Service +public class TestServiceImpl extends ServiceImpl<TestMapper, Test> implements TestService { + + @Autowired + private TestMapper testMapper; + @Override + public Page<Test> selectByPage(Test test, Integer page, Integer size) { + //������������������ + Page<Test> pageData = new Page<>(page, size); + //������������������ + IPage<Test> users = testMapper.selectPage(pageData, new QueryWrapper<>(test)); + //��������������������������������� + pageData.setRecords(users.getRecords()); + //������������ + return pageData; + } + + @Override + public void saveTest() throws Exception{ + Test t=new Test(); + t.setName("aaaa"); + t.setMobile("139652555"); + t.setEmail("33@qq.com"); + testMapper.insert(t); + if ("aaaa".equals(t.getName())){ + throw new BusinessException("aaaa���������������������������������"); + } + + } +} diff --git a/screen-manage/src/main/resources/application-dev.yml b/screen-manage/src/main/resources/application-dev.yml new file mode 100644 index 0000000..ac59da8 --- /dev/null +++ b/screen-manage/src/main/resources/application-dev.yml @@ -0,0 +1,101 @@ +server: + port: 8082 + tomcat: + uri-encoding: UTF-8 + #��������������� + min-spare-threads: 500 + #��������������� + max-threads: 2500 + #��������������� + max-connections: 6500 + #������������������������ + accept-count: 1000 +spring: + profiles: + active: dev + application: + name: screen-manage + redis: + #cluster: + #nodes: 47.112.126.78:7001,47.112.126.78:7002,47.112.126.132:7003,47.112.126.132:7004,47.112.132.193:7005,47.112.132.193:7006 + #password: test + #timeout: 500 + host: 127.0.0.1 + port: 6379 + password: 123456 + timeout: 30000 + jedis: + pool: + max-active: 256 + max-wait: 30000 + max-idle: 64 + min-idle: 32 + lettuce: + pool: + max-active: 256 + max-idle: 64 + max-wait: 30000 + min-idle: 32 + datasource: + minIdle: 1 + time-between-eviction-runs-millis: 60000 + max-active: 20 + test-while-idle: true + validation-query: select 'x' + filters: stat + type: com.alibaba.druid.pool.DruidDataSource + max-wait: 60000 + url: jdbc:mysql://192.168.0.18:4000/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC + password: 123456 + test-on-borrow: false + sql-script-encoding: utf-8 + pool-prepared-statements: true + min-evictable-idle-time-millis: 300000 + initial-size: 1 + driver-class-name: com.mysql.cj.jdbc.Driver + max-conn-lifetime-millis: 20 + test-on-return: false + username: root + +mybatis-plus: + mapper-locations: classpath:mapper/*.xml + global-config: + db-config: + id-type: auto + field-strategy: NOT_EMPTY + db-type: MYSQL + configuration: + map-underscore-to-camel-case: true + call-setters-on-nulls: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +kafka: + listener: + ack-mode: manual_immediate + consumer: + auto: + commit: + interval: 100 + offset: + reset: latest + concurrency: 3 + enable: + auto: + commit: false + group: + id: test + servers: 192.168.0.16:9092,192.168.0.17:9092,192.168.0.18:9092 + session: + timeout: 6000 + topic: test_topic + zookeeper: + connect: 192.168.0.16:2181,192.168.0.17:2181,192.168.0.18:2181 + producer: + batch: + size: 4096 + buffer: + memory: 40960 + linger: 1 + retries: 0 + servers: 192.168.0.16:9092,192.168.0.17:9092,192.168.0.18:9092 + diff --git a/screen-manage/src/main/resources/logback-spring.xml b/screen-manage/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..9936d12 --- /dev/null +++ b/screen-manage/src/main/resources/logback-spring.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <include resource="org/springframework/boot/logging/logback/defaults.xml"/> + + <springProperty scope="context" name="springAppName" source="spring.application.name"/> + <!-- ��������������������������������� --> + <property name="LOG_FILE" value="/home/moral/soft/log/${springAppName}"/> + <!-- ������������������������������ --> + <property name="CONSOLE_LOG_PATTERN" + value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%X{logseq}]{faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> + + <property name="FILE_LOG_PATTERN" + value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{logseq}] [%thread] %X{T} [%level] %logger.%method:%line %msg%n"/> + + <!-- ���������Appender --> + <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>INFO</level> + </filter> + <encoder> + <pattern>${CONSOLE_LOG_PATTERN}</pattern> + <charset>utf8</charset> + </encoder> + </appender> + <!-- ������������Appender --> + <appender name="screenManageLog" class="ch.qos.logback.classic.sift.SiftingAppender"> + <discriminator> + <key>taskId</key> + <defaultValue>default</defaultValue> + </discriminator> + <sift> + <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> + + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>INFO</level> + </filter> + <file>${LOG_FILE}/%d{yyyy-MM-dd}/${springAppName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <maxFileSize>30MB</maxFileSize> + <fileNamePattern>${LOG_FILE}/%d{yyyy-MM-dd}/${springAppName}-%d{yyyy-MM-dd}.log%i.log</fileNamePattern> + <maxHistory>30</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${FILE_LOG_PATTERN}</pattern> + <charset>utf8</charset> + </encoder> + </appender> + </sift> + </appender> + + + <root level="INFO"> + <appender-ref ref="console"/> + <appender-ref ref="screenManageLog"/> + </root> +</configuration> -- Gitblit v1.8.0