diff --git a/README b/README
new file mode 100644
index 0000000..5efbbf3
--- /dev/null
+++ b/README
@@ -0,0 +1,20 @@
+# SpringBootDemo
+本代码集成了SpringBoot+MyBatis+Redis+MySql。
+最新的部分经网友指正已经把冗余的代码去掉了，大家clone到本地后直接转成maven项目应该就可以运行了，项目中使用到的数据库表如下
+
+-- ----------------------------
+-- Table structure for `user_info`
+-- ----------------------------
+DROP TABLE IF EXISTS `user_info`;
+CREATE TABLE `user_info` (
+  `id` int(8) NOT NULL AUTO_INCREMENT,
+  `name` varchar(20) NOT NULL,
+  `age` int(2) DEFAULT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of user_info
+-- ----------------------------
+INSERT INTO `user_info` VALUES ('1', 'xiaour', '1231');
+
diff --git a/README.md b/README.md
deleted file mode 100644
index ae7616d..0000000
--- a/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-## 相关文章
-
-1.[SpringMVC配置太多？试试SpringBoot](https://xiaour.github.io/2018/05/02/The_SpringMVC_configuration_is_too_much_Try_SpringBoot/)
-
-2.[Springboot集成Kafka](https://xiaour.github.io/2018/05/23/Springboot_integrated_Kafka/)
-
-3.[Springboot集成RocketMQ](https://xiaour.github.io/2018/08/16/SpringbootRocketMQ/)
-
-4.Webflux Spring异步编程，你将发现新大陆(代码已经部分上传，blog完善中...)
-
-5.[利用EasyExcel，两行代码开发一个和API结果一致的生成Excel功能](https://github.com/xiaour/EasyExport#readme)
-
-## 代码部分
-
-⭐️ SpringBootDemo
-本代码集成了SpringBoot+MyBatis+Redis+MySql。
-最新的部分经网友指正已经把冗余的代码去掉了，代码部分和配置文件部分都有相关的注释；
-git clone 到本地后就可以运行了，项目中使用到的数据库表如下
-
-```sql
--- ----------------------------
--- Table structure for `user_info`
--- ----------------------------
-DROP TABLE IF EXISTS `user_info`;
-CREATE TABLE `user_info` (
-  `id` int(8) NOT NULL AUTO_INCREMENT,
-  `name` varchar(20) NOT NULL,
-  `age` int(2) DEFAULT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-
--- ----------------------------
--- Records of user_info
--- ----------------------------
-INSERT INTO `user_info` VALUES ('1', 'xiaour', '18');
-```
-
-⭐️ SpringBootDemoV2
-代码主要和SpringBootDemo的区别是使用了Springboot2.0
-
-2018.08.22 添加了Twitter ID生成算法的工具，每秒支持12万ID生成。
-
-⭐️ SpringBootKafkaDemo
-Springboot2.0继承了Kafka消息中间件
-
-⭐️ SpringBootRocketMqDemo
-Springboot2.0继承了RocketMQ4.3消息中间件
-
-⭐️ SpringWebfluxDemo
-Webflux Spring异步编程。
-
-
----------------------------------
-有兴趣的朋友可以关注一下最新开源的
-[spring.boot.sapi.starter](https://github.com/xiaour/spring.boot.sapi.starter)
-
diff --git a/SpringBootDemo/pom.xml b/SpringBootDemo/pom.xml
index 3280d80..1c831f9 100644
--- a/SpringBootDemo/pom.xml
+++ b/SpringBootDemo/pom.xml
@@ -4,20 +4,14 @@
          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>com.github.xiaour</groupId>
-    <artifactId>springbootv1</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>SpringBootDemo</name>
-    <description>Demo project for Spring Boot</description>
-    <packaging>jar</packaging>
-
-
+    <groupId>com.tony</groupId>
+    <artifactId>com.tony.spring.boot</artifactId>
+    <version>1.0-SNAPSHOT</version>
     <!-- 继承父包,此包会添加依赖,spring用到的核心包 -->
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>1.5.2.RELEASE</version>
-        <relativePath/> <!-- lookup parent from repository -->
     </parent>
 
 
@@ -85,11 +79,6 @@
 		    <groupId>javax.servlet</groupId>
 		    <artifactId>javax.servlet-api</artifactId>
 		</dependency>
-
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-        </dependency>
 		
 		<dependency>
 		    <groupId>commons-codec</groupId>
@@ -99,13 +88,13 @@
 		<dependency>
 		    <groupId>com.alibaba</groupId>
 		    <artifactId>fastjson</artifactId>
-		    <version>1.2.83</version>
+		    <version>1.2.31</version>
 		</dependency>
 		
 		<dependency>
 		    <groupId>commons-io</groupId>
 		    <artifactId>commons-io</artifactId>
-		    <version>2.7</version>
+		    <version>2.5</version>
 		</dependency>
 		
 		<dependency>  
@@ -116,25 +105,8 @@
         <dependency>  
             <groupId>org.apache.httpcomponents</groupId>  
             <artifactId>httpmime</artifactId>  
-        </dependency>
-
-
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>4.1.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml</artifactId>
-            <version>3.13</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>ooxml-schemas</artifactId>
-            <version>1.1</version>
-        </dependency>
-
+        </dependency>  
+		
 
     </dependencies>
 
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java
index ba66900..db70642 100644
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/Application.java
@@ -1,45 +1,46 @@
-package com.xiaour.spring.boot;
-
-import org.mybatis.spring.annotation.MapperScan;
-import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
-import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
-import org.springframework.boot.web.servlet.ServletComponentScan;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
-
-/**
- * 
- * @ClassName Application
- * @author Zhang.Tao
- * @Date 2017年4月27日 下午5:30:34
- * @version V2.0.0
- */
-
-@SpringBootApplication(exclude = MybatisAutoConfiguration.class)
-@ServletComponentScan
-@MapperScan("com.xiaour.spring.boot.mapper")
-public class Application  extends SpringBootServletInitializer implements EmbeddedServletContainerCustomizer {
-
-	@Value("${server.port}")
-	private int port;//应用的端口
-	/**
-	 * 启动入口
-	 * @param args
-	 */
-    public static void main(String ... args){
-        SpringApplication.run(Application.class, args);
-    }
-
-    /**
-     * 自定义端口
-     */
-	@Override
-	public void customize(ConfigurableEmbeddedServletContainer container) {
-		container.setPort(port);
-	}
-
-}
+package com.xiaour.spring.boot;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
+import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
+
+/**
+ * 
+ * @ClassName Application
+ * @author Zhang.Tao
+ * @Date 2017年4月27日 下午5:30:34
+ * @version V2.0.0
+ */
+
+@SpringBootApplication(exclude = MybatisAutoConfiguration.class)
+@ServletComponentScan
+@EnableAutoConfiguration
+@MapperScan("com.xiaour.spring.boot.mapper")
+public class Application  extends SpringBootServletInitializer implements EmbeddedServletContainerCustomizer {
+
+	@Value("${server.port}")
+	private int port;//应用的端口
+	/**
+	 * 启动入口
+	 * @param args
+	 */
+    public static void main(String ... args){
+        SpringApplication.run(Application.class, args);
+    }
+
+    /**
+     * 自定义端口
+     */
+	@Override
+	public void customize(ConfigurableEmbeddedServletContainer container) {
+		container.setPort(port);
+	}
+
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/DataBaseConfiguration.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/DataBaseConfiguration.java
new file mode 100644
index 0000000..ab8d982
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/DataBaseConfiguration.java
@@ -0,0 +1,69 @@
+package com.xiaour.spring.boot.config;
+
+import java.sql.SQLException;
+
+import javax.sql.DataSource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.bind.RelaxedPropertyResolver;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import com.alibaba.druid.pool.DruidDataSource;
+
+@Configuration
+@EnableTransactionManagement
+public class DataBaseConfiguration implements EnvironmentAware {
+
+	private RelaxedPropertyResolver propertyResolver;
+
+	private static Logger log = LoggerFactory.getLogger(DataBaseConfiguration.class);
+
+
+	/**
+	 * 初始化yml配置
+	 */
+	@Override
+	public void setEnvironment(Environment env) {
+		this.propertyResolver = new RelaxedPropertyResolver(env, "jdbc.datasource.");
+	}
+
+	/**
+	 * 配置数据源
+	 * @return
+	 */
+	@Bean(name = "dataSource",destroyMethod = "close")
+	public DataSource dataSource() {
+         
+         DruidDataSource dataSource = new DruidDataSource();  
+         dataSource.setUrl(propertyResolver.getProperty("url"));  
+         dataSource.setUsername(propertyResolver.getProperty("username"));//用户名  
+         dataSource.setPassword(propertyResolver.getProperty("password"));//密码  
+         dataSource.setDriverClassName(propertyResolver.getProperty("driver-class-name")); 
+         dataSource.setInitialSize(Integer.parseInt(propertyResolver.getProperty("initialSize")));  
+         dataSource.setMaxActive(Integer.parseInt(propertyResolver.getProperty("maxActive")));  
+         dataSource.setMinIdle(Integer.parseInt(propertyResolver.getProperty("minIdle")));  
+         dataSource.setMaxWait(Integer.parseInt(propertyResolver.getProperty("maxWait")));  
+         dataSource.setTimeBetweenEvictionRunsMillis(Integer.parseInt(propertyResolver.getProperty("timeBetweenEvictionRunsMillis")));  
+         dataSource.setMinEvictableIdleTimeMillis(Integer.parseInt(propertyResolver.getProperty("minEvictableIdleTimeMillis")));  
+         dataSource.setValidationQuery(propertyResolver.getProperty("validationQuery"));  
+         dataSource.setTestOnBorrow(Boolean.getBoolean(propertyResolver.getProperty("testOnBorrow")));  
+         dataSource.setTestWhileIdle(Boolean.getBoolean(propertyResolver.getProperty("testWhileIdle")));  
+         dataSource.setTestOnReturn(Boolean.getBoolean(propertyResolver.getProperty("testOnReturn")));  
+         dataSource.setPoolPreparedStatements(Boolean.getBoolean(propertyResolver.getProperty("poolPreparedStatements")));  
+         dataSource.setMaxPoolPreparedStatementPerConnectionSize(Integer.parseInt(propertyResolver.getProperty("maxOpenPreparedStatements")));
+         try {
+        	 //开启druid监控
+            dataSource.setFilters("stat,wall");
+			dataSource.init();
+		} catch (SQLException e) {
+			log.error(e.getMessage());
+		}
+         return dataSource; 
+	}
+
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java
deleted file mode 100644
index 5b1f78d..0000000
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MyBatisConfig.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.xiaour.spring.boot.config;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-
-
-/**
- * @Date: 2018-12-26 12:05
- * @version: v1.0
- * @Description: mybatis stater从某个版本后去掉了自动配置，需要用config配置
- */
-@Configuration
-public class MyBatisConfig {
-
-    @Autowired
-    private DataSourceProperties dataSourceProperties;
-
-
-    @Bean(name = "dataSource")
-    public DruidDataSource dataSource() {
-        DruidDataSource dataSource = new DruidDataSource();
-        dataSource.setUrl(dataSourceProperties.getUrl());
-
-        dataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
-        dataSource.setUsername(dataSourceProperties.getUsername());
-        dataSource.setPassword(dataSourceProperties.getPassword());
-
-        return dataSource;
-
-    }
-
-    @Bean
-    public SqlSessionFactory sqlSessionFactory() throws Exception {
-        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
-        sqlSessionFactoryBean.setDataSource(dataSource());
-        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
-                .getResources(("classpath*:mapper/*.xml")));
-        return sqlSessionFactoryBean.getObject();
-    }
-}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MybatisConfiguration.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MybatisConfiguration.java
new file mode 100644
index 0000000..fee3549
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/MybatisConfiguration.java
@@ -0,0 +1,75 @@
+package com.xiaour.spring.boot.config;
+
+import javax.annotation.Resource;
+import javax.persistence.EntityManager;
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.bind.RelaxedPropertyResolver;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.DefaultResourceLoader;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 初始化SqlSessionFactory
+ * @ClassName MybatisConfiguration
+ * @author Zhang.Tao
+ * @Date 2017年4月24日 下午5:24:56
+ * @version V2.0.0
+ */
+@Configuration
+@ConditionalOnClass({ EnableTransactionManagement.class, EntityManager.class })
+@AutoConfigureAfter({ DataBaseConfiguration.class })
+public class MybatisConfiguration implements EnvironmentAware {
+
+	private static Log logger = LogFactory.getLog(MybatisConfiguration.class);
+
+	private RelaxedPropertyResolver propertyResolver;
+
+	@Resource(name = "dataSource")
+	DataSource dataSource;
+
+	@Override
+	public void setEnvironment(Environment environment) {
+		this.propertyResolver = new RelaxedPropertyResolver(environment,"mybatis.");
+	}
+
+	/**
+	 * 初始化SessionFactory
+	 * @return
+	 */
+	@Bean
+	@ConditionalOnMissingBean
+	public SqlSessionFactory sqlSessionFactory() {
+		try {
+			
+			SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+			sessionFactory.setDataSource(dataSource);
+			sessionFactory.setTypeAliasesPackage(propertyResolver.getProperty("typeAliasesPackage"));
+			sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(propertyResolver.getProperty("mapperLocations")));
+			sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(propertyResolver.getProperty("configLocation")));
+
+			return sessionFactory.getObject();
+		} catch (Exception e) {
+			logger.warn("Could not confiure mybatis session factory");
+			return null;
+		}
+	}
+
+	@Bean
+	@ConditionalOnMissingBean
+	public DataSourceTransactionManager transactionManager() {
+		return new DataSourceTransactionManager(dataSource);
+	}
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/RedisConfig.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/RedisConfig.java
new file mode 100644
index 0000000..5333733
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/config/RedisConfig.java
@@ -0,0 +1,51 @@
+package com.xiaour.spring.boot.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+/**
+ * 配置redis数据源
+ * Java Lib For OIS, Powered By xiaour.
+ * @ClassName RedisConfig
+ * @author Zhang.Tao
+ * @Date 2017年4月24日 下午5:25:30
+ * @version V2.0.0
+ */
+@Configuration
+public class RedisConfig {
+	private static Logger log = LoggerFactory.getLogger(RedisConfig.class);
+
+    
+  @Bean(name= "jedis.pool")  
+  @Autowired  
+  public JedisPool jedisPool(@Qualifier("jedis.pool.config") JedisPoolConfig config,   
+              @Value("${jedis.pool.host}")String host,   
+              @Value("${jedis.pool.port}")int port) {  
+      return new JedisPool(config, host, port);  
+  }  
+    
+  @Bean(name= "jedis.pool.config")  
+  public JedisPoolConfig jedisPoolConfig (@Value("${jedis.pool.config.maxTotal}")int maxTotal,  
+                              @Value("${jedis.pool.config.maxIdle}")int maxIdle,  
+                              @Value("${jedis.pool.config.maxWaitMillis}")int maxWaitMillis) {  
+      try {
+		JedisPoolConfig config = new JedisPoolConfig();  
+		  config.setMaxTotal(maxTotal);  
+		  config.setMaxIdle(maxIdle);  
+		  config.setMaxWaitMillis(maxWaitMillis);  
+		  return config;
+		} catch (Exception e) {
+			log.error(e.getMessage());
+		}
+	return null;  
+  } 
+
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/controller/TestCtrl.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/controller/TestCtrl.java
index d7d1807..8526e54 100644
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/controller/TestCtrl.java
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/controller/TestCtrl.java
@@ -1,10 +1,7 @@
 package com.xiaour.spring.boot.controller;
 
 
-import com.xiaour.spring.boot.service.RedisService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
-import org.springframework.core.ParameterNameDiscoverer;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -12,11 +9,7 @@
 import com.xiaour.spring.boot.entity.UserInfo;
 import com.xiaour.spring.boot.mapper.UserInfoMapper;
 import com.xiaour.spring.boot.utils.JsonUtil;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.xiaour.spring.boot.utils.RedisUtil;
 
 
 /**
@@ -27,7 +20,7 @@
 public class TestCtrl {
 	
 	@Autowired
-	private RedisService redisService;
+	private RedisUtil redisUtil;
 	
 	@Autowired  
     private UserInfoMapper userInfoMapper;  
@@ -45,9 +38,8 @@ public String index(){
      * @throws Exception
      */
     @RequestMapping("/set")  
-    public String set(String key, String value) throws Exception{
-
-        redisService.set(key, value);
+    public String set(String key, String value) throws Exception{  
+    	redisUtil.set(key, value);  
         return "success";  
     }  
     
@@ -59,7 +51,7 @@ public String set(String key, String value) throws Exception{
     @RequestMapping("/get")  
     public String get(String key){  
         try {
-			return redisService.get(key);
+			return redisUtil.get(key);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
@@ -80,63 +72,7 @@ public String get(@PathVariable("id")int id){
 			e.printStackTrace();
 		}
 		return "";  
-    }
-
-
-    public static void main(String[] args) {
-        Map<String,Object> keyMap= new HashMap<>();
-        keyMap.put("id","编号");
-        keyMap.put("name","名称");
-
-        String [] cnCloumn={"编号","名称"};
-
-        System.out.println(Arrays.asList(convertMap(keyMap, cnCloumn)));
-
-    }
-
-    public static String[] convertMap(Map<String,Object> keyMap,String [] dataList){
-
-        for(int i=0;i<dataList.length;i++){
-
-            for(Map.Entry<String, Object> m:keyMap.entrySet()){
-                if(m.getValue().equals(dataList[i])){
-                   dataList[i]=m.getKey();
-                }
-            }
-        }
-
-        return dataList;
-    }
-
-
-    public static String getName(String name,String add){
-        return null;
-    }
-
-    public static void testGetClassName() {
-        // 方法1：通过SecurityManager的保护方法getClassContext()
-        String clazzName = new SecurityManager() {
-            public String getClassName() {
-                return getClassContext()[1].getName();
-            }
-        }.getClassName();
-        System.out.println(clazzName);
-        // 方法2：通过Throwable的方法getStackTrace()
-        String clazzName2 = new Throwable().getStackTrace()[1].getClassName();
-        System.out.println(clazzName2);
-        // 方法3：通过分析匿名类名称()
-        String clazzName3 = new Object() {
-            public String getClassName() {
-                String clazzName = this.getClass().getName();
-                return clazzName.substring(0, clazzName.lastIndexOf('$'));
-            }
-        }.getClassName();
-        System.out.println(clazzName3);
-        //方法4：通过Thread的方法getStackTrace()
-        String clazzName4 = Thread.currentThread().getStackTrace()[2].getClassName();
-        System.out.println(clazzName4);
-    }
-
-
+    }  
+    
 
 }
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/exception/DingTalkEncryptException.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/exception/DingTalkEncryptException.java
new file mode 100644
index 0000000..f279b8e
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/exception/DingTalkEncryptException.java
@@ -0,0 +1,53 @@
+package com.xiaour.spring.boot.exception;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 钉钉开放平台加解密异常类
+ */
+public class DingTalkEncryptException extends Exception {
+    /**成功**/
+    public static final int SUCCESS = 0;
+    /**加密明文文本非法**/
+    public final static int  ENCRYPTION_PLAINTEXT_ILLEGAL = 900001;
+    /**加密时间戳参数非法**/
+    public final static int  ENCRYPTION_TIMESTAMP_ILLEGAL = 900002;
+    /**加密随机字符串参数非法**/
+    public final static int  ENCRYPTION_NONCE_ILLEGAL = 900003;
+    /**不合法的aeskey**/
+    public final static int AES_KEY_ILLEGAL = 900004;
+    /**签名不匹配**/
+    public final static int SIGNATURE_NOT_MATCH = 900005;
+    /**计算签名错误**/
+    public final static int COMPUTE_SIGNATURE_ERROR = 900006;
+    /**计算加密文字错误**/
+    public final static int COMPUTE_ENCRYPT_TEXT_ERROR  = 900007;
+    /**计算解密文字错误**/
+    public final static int COMPUTE_DECRYPT_TEXT_ERROR  = 900008;
+    /**计算解密文字长度不匹配**/
+    public final static int COMPUTE_DECRYPT_TEXT_LENGTH_ERROR  = 900009;
+    /**计算解密文字corpid不匹配**/
+    public final static int COMPUTE_DECRYPT_TEXT_CORPID_ERROR  = 900010;
+
+    private static Map<Integer,String> msgMap = new HashMap<Integer,String>();
+    static{
+        msgMap.put(SUCCESS,"成功");
+        msgMap.put(ENCRYPTION_PLAINTEXT_ILLEGAL,"加密明文文本非法");
+        msgMap.put(ENCRYPTION_TIMESTAMP_ILLEGAL,"加密时间戳参数非法");
+        msgMap.put(ENCRYPTION_NONCE_ILLEGAL,"加密随机字符串参数非法");
+        msgMap.put(SIGNATURE_NOT_MATCH,"签名不匹配");
+        msgMap.put(COMPUTE_SIGNATURE_ERROR,"签名计算失败");
+        msgMap.put(AES_KEY_ILLEGAL,"不合法的aes key");
+        msgMap.put(COMPUTE_ENCRYPT_TEXT_ERROR,"计算加密文字错误");
+        msgMap.put(COMPUTE_DECRYPT_TEXT_ERROR,"计算解密文字错误");
+        msgMap.put(COMPUTE_DECRYPT_TEXT_LENGTH_ERROR,"计算解密文字长度不匹配");
+        msgMap.put(COMPUTE_DECRYPT_TEXT_CORPID_ERROR,"计算解密文字corpid或者suiteKey不匹配");
+    }
+
+    public Integer  code;
+    public DingTalkEncryptException(Integer exceptionCode){
+        super(msgMap.get(exceptionCode));
+        this.code = exceptionCode;
+    }
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java
index 50cb43f..9850a58 100644
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.java
@@ -1,13 +1,9 @@
-package com.xiaour.spring.boot.mapper;
-
-import com.xiaour.spring.boot.entity.UserInfo;
-import org.apache.ibatis.annotations.Mapper;
-import org.springframework.stereotype.Component;
-
-@Component
-@Mapper
-public interface UserInfoMapper {
-
-    UserInfo selectByPrimaryKey(Integer id);
-
+package com.xiaour.spring.boot.mapper;
+
+import com.xiaour.spring.boot.entity.UserInfo;
+
+public interface UserInfoMapper {
+
+    UserInfo selectByPrimaryKey(Integer id);
+
 }
\ No newline at end of file
diff --git a/SpringBootDemo/src/main/resources/mapper/UserInfoMapper.xml b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.xml
similarity index 100%
rename from SpringBootDemo/src/main/resources/mapper/UserInfoMapper.xml
rename to SpringBootDemo/src/main/java/com/xiaour/spring/boot/mapper/UserInfoMapper.xml
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/service/RedisService.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/service/RedisService.java
deleted file mode 100644
index e08e182..0000000
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/service/RedisService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.xiaour.spring.boot.service;
-
-import java.util.List;
-
-/**
- * Created by zhangtao on 2017/11/8.
- */
-
-public interface RedisService {
-
-     boolean set(String key, String value) throws Exception;
-
-     String get(String key) throws Exception;
-
-     boolean expire(String key, long expire) throws Exception;
-
-     <T> boolean setList(String key, List<T> list) throws Exception;
-
-     <T> List<T> getList(String key, Class<T> clz) throws Exception;
-
-     long lpush(String key, Object obj) throws Exception;
-
-     long rpush(String key, Object obj) throws Exception;
-
-     void hmset(String key, Object obj) throws Exception;
-
-     <T> T hget(String key, Class<T> clz) throws Exception;
-
-
-     void del(String key) throws Exception;
-
-     <T> List<T>  hmGetAll(String key, Class<T> clz) throws Exception;
-
-     String lpop(String key) throws Exception;
-}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/service/impl/RedisServiceImpl.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/service/impl/RedisServiceImpl.java
deleted file mode 100644
index 3f451d2..0000000
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/service/impl/RedisServiceImpl.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package com.xiaour.spring.boot.service.impl;
-
-
-import com.xiaour.spring.boot.service.RedisService;
-import com.xiaour.spring.boot.utils.JsonUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.DataAccessException;
-import org.springframework.data.redis.connection.RedisConnection;
-import org.springframework.data.redis.core.RedisCallback;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.RedisSerializer;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.Assert;
-
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Created by xiaour.github.com on 2017/11/8.
- */
-@Service("redisService")
-@Transactional(rollbackFor = Exception.class)
-public class RedisServiceImpl implements RedisService {
-
-    private static int seconds=3600*24;
-
-    @Autowired
-    private RedisTemplate<String, ?> redisTemplate;
-
-    @Override
-    public boolean set(final String key, final String value) throws Exception {
-        Assert.hasText(key,"Key is not empty.");
-        boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
-            @Override
-            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-                connection.set(serializer.serialize(key), serializer.serialize(value));
-                return true;
-            }
-        });
-        return result;
-    }
-
-    public String get(final String key) throws Exception {
-        Assert.hasText(key,"Key is not empty.");
-        String result = redisTemplate.execute(new RedisCallback<String>() {
-            @Override
-            public String doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-                byte[] value =  connection.get(serializer.serialize(key));
-                return serializer.deserialize(value);
-            }
-        });
-        return result;
-    }
-
-    public void del(final String key) throws Exception {
-        Assert.hasText(key,"Key is not empty.");
-
-        redisTemplate.execute(new RedisCallback<Long>() {
-            @Override
-            public Long doInRedis(RedisConnection conn) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-                return conn.del(serializer.serialize(key));
-            }
-        });
-    }
-
-
-
-    @Override
-    public boolean expire(final String key, long expire) {
-        return redisTemplate.expire(key, expire, TimeUnit.SECONDS);
-    }
-
-    @Override
-    public <T> boolean setList(String key, List<T> list) throws Exception {
-        Assert.hasText(key,"Key is not empty.");
-
-        String value = JsonUtil.getJsonString(list);
-        return set(key,value);
-    }
-
-    @Override
-    public <T> List<T> getList(String key,Class<T> clz)  throws Exception{
-
-        Assert.hasText(key,"Key is not empty.");
-
-        String json = get(key);
-        if(json!=null){
-            List<T> list = JsonUtil.readJson2Array(json,clz);
-            return list;
-        }
-        return null;
-    }
-
-    @Override
-    public long lpush(final String key, Object obj)throws Exception {
-        Assert.hasText(key,"Key is not empty.");
-
-        final String value = JsonUtil.getJsonString(obj);
-        long result = redisTemplate.execute(new RedisCallback<Long>() {
-            @Override
-            public Long doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-                long count = connection.lPush(serializer.serialize(key), serializer.serialize(value));
-                return count;
-            }
-        });
-        return result;
-    }
-
-    @Override
-    public long rpush(final String key, Object obj) throws Exception{
-        Assert.hasText(key,"Key is not empty.");
-
-        final String value = JsonUtil.getJsonString(obj);
-        long result = redisTemplate.execute(new RedisCallback<Long>() {
-            @Override
-            public Long doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-                long count = connection.rPush(serializer.serialize(key), serializer.serialize(value));
-                return count;
-            }
-        });
-        return result;
-    }
-
-    @Override
-    public void hmset(String key, Object obj)  throws Exception{
-        Assert.hasText(key,"Key is not empty.");
-
-        Map<byte[], byte[]> data=JsonUtil.readJsonByteMap(JsonUtil.getJsonString(obj));
-        redisTemplate.execute(new RedisCallback<String>() {
-            @Override
-            public String doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-                connection.hMSet(serializer.serialize(key),data);
-                return "";
-            }
-        });
-    }
-
-    @Override
-    public <T> T hget(String key, Class<T> clz)  throws Exception{
-        Assert.hasText(key,"Key is not empty.");
-
-        return redisTemplate.execute(new RedisCallback<T>() {
-
-            @Override
-            public T doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-
-                Map<String,Object> result;
-
-                Map<byte[],byte[]> data=connection.hGetAll(serializer.serialize(key));
-                result= new HashMap<>();
-                for (Map.Entry<byte[], byte[]> entry: data.entrySet()) {
-                    result.put(serializer.deserialize(entry.getKey()),serializer.deserialize(entry.getValue()));
-                }
-
-                return JsonUtil.json2Obj(JsonUtil.getJsonString(result),clz);
-            }
-        });
-    }
-
-    @Override
-    public<T> List<T>  hmGetAll(String key,Class<T> clz) throws Exception{
-        Assert.hasText(key,"Key is not empty.");
-
-        List<Map<String,Object>> dataList= new ArrayList<>();
-        return redisTemplate.execute(new RedisCallback<List<T>>() {
-            @Override
-            public List<T> doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-
-                Set<String> keysSet=redisTemplate.keys(key);
-                Map<byte[],byte[]> data;
-                Map<String,Object> result;
-                for(String newKey:keysSet) {
-                    data=connection.hGetAll(serializer.serialize(newKey));
-                    result= new HashMap<>();
-                    for (Map.Entry<byte[], byte[]> entry: data.entrySet()) {
-                        result.put(serializer.deserialize(entry.getKey()),serializer.deserialize(entry.getValue()));
-                    }
-                    dataList.add(result);
-                }
-                return JsonUtil.readJson2Array(JsonUtil.getJsonString(dataList),clz);
-            }
-        });
-    }
-
-    @Override
-    public String lpop(final String key) throws Exception{
-        Assert.hasText(key,"Key is not empty.");
-
-        String result = redisTemplate.execute(new RedisCallback<String>() {
-            @Override
-            public String doInRedis(RedisConnection connection) throws DataAccessException {
-                RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
-                byte[] res =  connection.lPop(serializer.serialize(key));
-                return serializer.deserialize(res);
-            }
-        });
-        return result;
-    }
-}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/task/Task.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/task/Task.java
index 78a8337..0954d2e 100644
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/task/Task.java
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/task/Task.java
@@ -10,6 +10,6 @@ public class Task {
 	
     @Scheduled(cron="0 0/1 * * * ?")
 	public void run(){
-		System.out.println("Scheduled Running...");
+		System.out.println("定时任务执行");
 	}
 }
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/FileUtils.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/FileUtils.java
new file mode 100644
index 0000000..9b177aa
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/FileUtils.java
@@ -0,0 +1,136 @@
+package com.xiaour.spring.boot.utils;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.http.util.TextUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+public class FileUtils {
+	public static final String FILEPATH = "Permanent_Data";
+
+	// json写入文件
+	public synchronized static void write2File(Object json, String fileName) {
+		BufferedWriter writer = null;
+		File filePath = new File(FILEPATH);
+		JSONObject eJSON = null;
+		
+		if (!filePath.exists() && !filePath.isDirectory()) {
+			filePath.mkdirs();
+		}
+
+		File file = new File(FILEPATH + File.separator + fileName + ".xml");
+		System.out.println("path:" + file.getPath() + " abs path:" + file.getAbsolutePath());
+		if (!file.exists()) {
+			try {
+				file.createNewFile();
+			} catch (Exception e) {
+				System.out.println("createNewFile，出现异常:");
+				e.printStackTrace();
+			}
+		} else {
+			eJSON = (JSONObject) read2JSON(fileName);
+		}
+
+		try {
+			writer = new BufferedWriter(new FileWriter(file));
+
+			if (eJSON==null) {
+				writer.write(json.toString());
+			} else {
+				Object[] array = ((JSONObject) json).keySet().toArray();
+				for(int i=0;i<array.length;i++){
+					eJSON.put(array[i].toString(), ((JSONObject) json).get(array[i].toString()));
+				}
+
+				writer.write(eJSON.toString());
+			}
+
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				if (writer != null) {
+					writer.close();
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+
+	}
+
+	// 读文件到json
+	public static JSONObject read2JSON(String fileName) {
+		File file = new File(FILEPATH + File.separator + fileName + ".xml");
+		if (!file.exists()) {
+			return null;
+		}
+
+		BufferedReader reader = null;
+		String laststr = "";
+		try {
+			reader = new BufferedReader(new FileReader(file));
+			String tempString = null;
+			while ((tempString = reader.readLine()) != null) {
+				laststr += tempString;
+			}
+			reader.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		return (JSONObject) JSON.parse(laststr);
+	}
+
+	// 通过key值获取文件中的value
+	public static Object getValue(String fileName, String key) {
+		JSONObject eJSON = null;
+		eJSON = (JSONObject) read2JSON(fileName);
+		if (null != eJSON && eJSON.containsKey(key)) {
+			@SuppressWarnings("unchecked")
+			Map<String, Object> values = JSON.parseObject(eJSON.toString(), Map.class);
+			return values.get(key);
+		} else {
+			return null;
+		}
+	}
+   public static HashMap<Long, Long> toHashMap(JSONObject js)  
+   {  
+	   if(js == null){
+		   return null;
+	   }
+       HashMap<Long, Long> data = new HashMap<Long, Long>();  
+       // 将json字符串转换成jsonObject  
+       Set<String> set = js.keySet();
+       // 遍历jsonObject数据，添加到Map对象  
+       Iterator<String>  it = set.iterator();
+       while (it.hasNext())  
+       {  
+           String key = String.valueOf(it.next());
+           Long keyLong = Long.valueOf(key);
+           
+           String value = js.getString(key);
+           Long valueLong;
+           if(TextUtils.isEmpty(value)){
+        	  valueLong = js.getLong(key);
+           }else{
+	          valueLong = Long.valueOf(value);
+           }
+           data.put(keyLong, valueLong);  
+       }  
+       return data;  
+   }  
+
+
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/HttpHelper.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/HttpHelper.java
new file mode 100644
index 0000000..f366645
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/HttpHelper.java
@@ -0,0 +1,251 @@
+package com.xiaour.spring.boot.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.client.RedirectLocations;
+import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.util.EntityUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xiaour.spring.boot.exception.OApiException;
+
+
+public class HttpHelper {
+
+	public static JSONObject httpGet(String url) throws OApiException{
+        HttpGet httpGet = new HttpGet(url);
+        CloseableHttpResponse response = null;
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        RequestConfig requestConfig = RequestConfig.custom().
+        		setSocketTimeout(2000).setConnectTimeout(2000).build();
+        httpGet.setConfig(requestConfig);
+
+        try {
+            response = httpClient.execute(httpGet, new BasicHttpContext());
+
+            if (response.getStatusLine().getStatusCode() != 200) {
+
+                System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+                                   + ", url=" + url);
+                return null;
+            }
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                String resultStr = EntityUtils.toString(entity, "utf-8");
+
+                JSONObject result = JSON.parseObject(resultStr);
+                if (result.getInteger("errcode") == 0) {
+//                	result.remove("errcode");
+//                	result.remove("errmsg");
+                    return result;
+                } else {
+                    System.out.println("request url=" + url + ",return value=");
+                    System.out.println(resultStr);
+                    int errCode = result.getInteger("errcode");
+                    String errMsg = result.getString("errmsg");
+                    throw new OApiException(errCode, errMsg);
+                }
+            }
+        } catch (IOException e) {
+            System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (response != null) try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+	
+	
+	public static JSONObject httpPost(String url, Object data) throws OApiException {
+        HttpPost httpPost = new HttpPost(url);
+        CloseableHttpResponse response = null;
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        RequestConfig requestConfig = RequestConfig.custom().
+        		setSocketTimeout(2000).setConnectTimeout(2000).build();
+        httpPost.setConfig(requestConfig);
+        httpPost.addHeader("Content-Type", "application/json");
+        try {
+        	StringEntity requestEntity = new StringEntity(JSON.toJSONString(data), "utf-8");
+            httpPost.setEntity(requestEntity);
+            
+            response = httpClient.execute(httpPost, new BasicHttpContext());
+
+            if (response.getStatusLine().getStatusCode() != 200) {
+
+                System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+                                   + ", url=" + url);
+                return null;
+            }
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                String resultStr = EntityUtils.toString(entity, "utf-8");
+
+                JSONObject result = JSON.parseObject(resultStr);
+                if (result.getInteger("errcode") == 0) {
+                	result.remove("errcode");
+                	result.remove("errmsg");
+                    return result;
+                } else {
+                    System.out.println("request url=" + url + ",return value=");
+                    System.out.println(resultStr);
+                    int errCode = result.getInteger("errcode");
+                    String errMsg = result.getString("errmsg");
+                    throw new OApiException(errCode, errMsg);
+                }
+            }
+        } catch (IOException e) {
+            System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (response != null) try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+	
+	
+	public static JSONObject uploadMedia(String url, File file) throws OApiException {
+        HttpPost httpPost = new HttpPost(url);
+        CloseableHttpResponse response = null;
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
+        httpPost.setConfig(requestConfig);
+
+        HttpEntity requestEntity = MultipartEntityBuilder.create().addPart("media",
+        		new FileBody(file, ContentType.APPLICATION_OCTET_STREAM, file.getName())).build();
+        httpPost.setEntity(requestEntity);
+
+        try {
+            response = httpClient.execute(httpPost, new BasicHttpContext());
+
+            if (response.getStatusLine().getStatusCode() != 200) {
+
+                System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+                                   + ", url=" + url);
+                return null;
+            }
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                String resultStr = EntityUtils.toString(entity, "utf-8");
+
+                JSONObject result = JSON.parseObject(resultStr);
+                if (result.getInteger("errcode") == 0) {
+                    // 成功
+                	result.remove("errcode");
+                	result.remove("errmsg");
+                    return result;
+                } else {
+                    System.out.println("request url=" + url + ",return value=");
+                    System.out.println(resultStr);
+                    int errCode = result.getInteger("errcode");
+                    String errMsg = result.getString("errmsg");
+                    throw new OApiException(errCode, errMsg);
+                }
+            }
+        } catch (IOException e) {
+            System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (response != null) try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+	
+	
+	public static JSONObject downloadMedia(String url, String fileDir) throws OApiException {
+        HttpGet httpGet = new HttpGet(url);
+        CloseableHttpResponse response = null;
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();
+        httpGet.setConfig(requestConfig);
+
+        try {
+            HttpContext localContext = new BasicHttpContext();
+
+            response = httpClient.execute(httpGet, localContext);
+
+            RedirectLocations locations = (RedirectLocations) localContext.getAttribute(HttpClientContext.REDIRECT_LOCATIONS);
+            if (locations != null) {
+                URI downloadUrl = locations.getAll().get(0);
+                String filename = downloadUrl.toURL().getFile();
+                System.out.println("downloadUrl=" + downloadUrl);
+                File downloadFile = new File(fileDir + File.separator + filename);
+                FileUtils.writeByteArrayToFile(downloadFile, EntityUtils.toByteArray(response.getEntity()));
+                JSONObject obj = new JSONObject();
+                obj.put("downloadFilePath", downloadFile.getAbsolutePath());
+                obj.put("httpcode", response.getStatusLine().getStatusCode());
+                
+               
+                
+                return obj;
+            } else {
+                if (response.getStatusLine().getStatusCode() != 200) {
+
+                    System.out.println("request url failed, http code=" + response.getStatusLine().getStatusCode()
+                                       + ", url=" + url);
+                    return null;
+                }
+                HttpEntity entity = response.getEntity();
+                if (entity != null) {
+                    String resultStr = EntityUtils.toString(entity, "utf-8");
+
+                    JSONObject result = JSON.parseObject(resultStr);
+                    if (result.getInteger("errcode") == 0) {
+                        // 成功
+                    	result.remove("errcode");
+                    	result.remove("errmsg");
+                        return result;
+                    } else {
+                        System.out.println("request url=" + url + ",return value=");
+                        System.out.println(resultStr);
+                        int errCode = result.getInteger("errcode");
+                        String errMsg = result.getString("errmsg");
+                        throw new OApiException(errCode, errMsg);
+                    }
+                }
+            }
+        } catch (IOException e) {
+            System.out.println("request url=" + url + ", exception, msg=" + e.getMessage());
+            e.printStackTrace();
+        } finally {
+            if (response != null) try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java
index 66be6e2..f93b6bf 100644
--- a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/JsonUtil.java
@@ -1,83 +1,56 @@
-package com.xiaour.spring.boot.utils;
-
-import com.google.gson.*;
-import com.google.gson.reflect.TypeToken;
-
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class JsonUtil {
-
-    private static Gson gson = null;
-
-    static{
-        gson  = new Gson();
-    }
-
-    public static synchronized Gson newInstance(){
-        if(gson == null){
-            gson =  new Gson();
-        }
-        return gson;
-    }
-
-    public static String getJsonString(Object obj){
-        return gson.toJson(obj);
-    }
-
-    public static <T> T toBean(String json,Class<T> clz){
-
-        return gson.fromJson(json, clz);
-    }
-
-    public static <T> Map<String, T> readJson2MapObj(String json,Class<T> clz){
-        Map<String, JsonObject> map = gson.fromJson(json, new TypeToken<Map<String,JsonObject>>(){}.getType());
-        Map<String, T> result = new HashMap<>();
-        for(String key:map.keySet()){
-            result.put(key,gson.fromJson(map.get(key),clz) );
-        }
-        return result;
-    }
-
-    public static <T> T json2Obj(String json,Class<T> clz){
-        return gson.fromJson(json,clz);
-    }
-
-    public static Map<String, Object> toMap(String json){
-        Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String,Object>>(){}.getType());
-        return map;
-    }
-
-    public static Map<String,String> readJsonStrMap(String json) {
-        Map<String, JsonObject> map = gson.fromJson(json, new TypeToken<Map<String,JsonObject>>(){}.getType());
-        Map<String,String> result = new HashMap<>();
-        for(String key:map.keySet()){
-            result.put(key,gson.fromJson(map.get(key),String.class) );
-        }
-        return result;
-    }
-
-    public static  Map<byte[], byte[]> readJsonByteMap(String json) {
-        Map<String, JsonPrimitive> map = gson.fromJson(json, new TypeToken<Map<String,JsonPrimitive>>(){}.getType());
-        Map<byte[], byte[]> vmap = new HashMap<>();
-        for(String key:map.keySet()){
-            vmap.put(key.getBytes(),gson.fromJson(map.get(key),String.class).getBytes() );
-        }
-        return vmap;
-
-    }
-
-
-    public static <T> List<T> readJson2Array(String json, Class<T> clz){
-        JsonArray array = new JsonParser().parse(json).getAsJsonArray();
-        List<T> list  = new ArrayList<>();
-        for(final JsonElement elem : array){
-            list.add(gson.fromJson(elem, (Type)clz));
-        }
-        return list;
-    }
-
+package com.xiaour.spring.boot.utils;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class JsonUtil {
+	
+    public static String getJsonString(Object javaObj) throws JsonProcessingException {
+        String ret = "{}";
+        
+        ObjectMapper mapper = new ObjectMapper();
+
+        ret = mapper.writeValueAsString(javaObj);
+
+		return ret.replaceAll(":null",":\"\"");
+
+    }
+
+    public static <T> T readJson2Obj(String json, Class<T> classObj) throws JsonParseException,JsonMappingException,IOException  {
+        T ret = null;
+        
+        ObjectMapper mapper = new ObjectMapper();
+        
+        ret = mapper.readValue(json, classObj);
+        
+        return ret;
+    }
+
+    public static <T> T[] readJson2Array(String json, Class<T[]> classObj) throws JsonParseException,JsonMappingException,IOException   {
+        T[] ret = null;
+        
+        ObjectMapper mapper = new ObjectMapper();
+
+        ret = mapper.readValue(json, classObj);
+
+        return ret;
+    }
+    
+    public static void main(String [] args){                                                                                                                                                                                                                                                                                                                                              
+    	Map<String,Object> map= new HashMap<>();
+    	map.put("name","xiaochouyu");
+    	map.put("stak","小丑鱼");
+    	try {
+			System.out.println(getJsonString(map));
+		} catch (JsonProcessingException e) {
+			e.printStackTrace();
+		}
+    }
+
 }
\ No newline at end of file
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/RedisUtil.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/RedisUtil.java
new file mode 100644
index 0000000..bd711bd
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/RedisUtil.java
@@ -0,0 +1,63 @@
+package com.xiaour.spring.boot.utils;
+
+import java.util.UUID;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+@Component 
+public class RedisUtil {
+	
+	 @Autowired  
+	 private JedisPool jedisPool;  
+	      
+	 public void set(String key, String value) throws Exception {  
+	        Jedis jedis = null;  
+	        try {  
+	            jedis = jedisPool.getResource();  
+	            jedis.set(key, value);  
+	        } finally {  
+	            //返还到连接池  
+	            jedis.close();  
+	        }  
+	    }  
+	      
+    public  String get(String key) throws Exception  {  
+  
+        Jedis jedis = null;  
+        try {  
+            jedis = jedisPool.getResource();  
+            return jedis.get(key);  
+        } finally {  
+            //返还到连接池  
+            jedis.close();  
+        }  
+    }  
+	    
+	public  boolean exists(String key) {
+		Jedis jedis=null ;
+		try {
+			 jedis = jedisPool.getResource();
+			return jedis.exists(key);
+		} finally {
+			jedis.close();
+		}
+	}
+		
+	public Long delete(String key) {
+		Jedis jedis=null ;
+		try {
+			 jedis = jedisPool.getResource();
+			return jedis.del(key);
+		} finally {
+			jedis.close();
+		}
+	}
+	
+	public static void main(String [] args){
+		String uuid=UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
+		System.out.println(uuid);
+	}
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/AuthHelper.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/AuthHelper.java
new file mode 100644
index 0000000..51acc9b
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/AuthHelper.java
@@ -0,0 +1,297 @@
+package com.xiaour.spring.boot.utils.aes;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.SimpleDateFormat;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingtalk.open.client.ServiceFactory;
+import com.dingtalk.open.client.api.model.corp.JsapiTicket;
+import com.dingtalk.open.client.api.service.corp.CorpConnectionService;
+import com.dingtalk.open.client.api.service.corp.JsapiService;
+import com.dingtalk.open.client.common.SdkInitException;
+import com.dingtalk.open.client.common.ServiceException;
+import com.dingtalk.open.client.common.ServiceNotExistException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.xiaour.spring.boot.exception.OApiException;
+import com.xiaour.spring.boot.exception.OApiResultException;
+import com.xiaour.spring.boot.utils.FileUtils;
+import com.xiaour.spring.boot.utils.HttpHelper;
+import com.xiaour.spring.boot.utils.JsonUtil;
+
+public class AuthHelper {
+
+	// public static String jsapiTicket = null;
+	// public static String accessToken = null;
+	public static Timer timer = null;
+	// 调整到1小时50分钟
+	public static final long cacheTime = 1000 * 60 * 55 * 2;
+	public static long currentTime = 0 + cacheTime + 1;
+	public static long lastTime = 0;
+	public static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+	/*
+	 * 在此方法中，为了避免频繁获取access_token，
+	 * 在距离上一次获取access_token时间在两个小时之内的情况，
+	 * 将直接从持久化存储中读取access_token
+	 * 
+	 * 因为access_token和jsapi_ticket的过期时间都是7200秒
+	 * 所以在获取access_token的同时也去获取了jsapi_ticket
+	 * 注：jsapi_ticket是在前端页面JSAPI做权限验证配置的时候需要使用的
+	 * 具体信息请查看开发者文档--权限验证配置
+	 */
+	public static String getAccessToken() throws OApiException {
+		long curTime = System.currentTimeMillis();
+		JSONObject accessTokenValue = (JSONObject) FileUtils.getValue("accesstoken", Env.CORP_ID);
+		String accToken = "";
+		String jsTicket = "";
+		JSONObject jsontemp = new JSONObject();
+		if (accessTokenValue == null || curTime - accessTokenValue.getLong("begin_time") >= cacheTime) {
+			try
+			{
+			ServiceFactory serviceFactory = ServiceFactory.getInstance();
+	        CorpConnectionService corpConnectionService = serviceFactory.getOpenService(CorpConnectionService.class);
+	        accToken = corpConnectionService.getCorpToken(Env.CORP_ID, Env.CORP_SECRET);
+			// save accessToken
+			JSONObject jsonAccess = new JSONObject();
+			jsontemp.clear();
+			jsontemp.put("access_token", accToken);
+			jsontemp.put("begin_time", curTime);
+			jsonAccess.put(Env.CORP_ID, jsontemp);
+			FileUtils.write2File(jsonAccess, "accesstoken");
+			
+			if(accToken.length() > 0){
+				
+				JsapiService jsapiService = serviceFactory.getOpenService(JsapiService.class);
+
+				JsapiTicket JsapiTicket = jsapiService.getJsapiTicket(accToken, "jsapi");
+				jsTicket = JsapiTicket.getTicket();
+				JSONObject jsonTicket = new JSONObject();
+				jsontemp.clear();
+				jsontemp.put("ticket", jsTicket);
+				jsontemp.put("begin_time", curTime);
+				jsonTicket.put(Env.CORP_ID, jsontemp);
+				FileUtils.write2File(jsonTicket, "jsticket");
+			}
+		} catch (SdkInitException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (ServiceException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (ServiceNotExistException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		} else {
+			return accessTokenValue.getString("access_token");
+		}
+
+		return accToken;
+	}
+
+	// 正常的情况下，jsapi_ticket的有效期为7200秒，所以开发者需要在某个地方设计一个定时器，定期去更新jsapi_ticket
+	public static String getJsapiTicket(String accessToken) throws OApiException {
+		JSONObject jsTicketValue = (JSONObject) FileUtils.getValue("jsticket", Env.CORP_ID);
+		long curTime = System.currentTimeMillis();
+		String jsTicket = "";
+
+		 if (jsTicketValue == null || curTime -
+		 jsTicketValue.getLong("begin_time") >= cacheTime) {
+			ServiceFactory serviceFactory;
+			try {
+				serviceFactory = ServiceFactory.getInstance();
+				JsapiService jsapiService = serviceFactory.getOpenService(JsapiService.class);
+
+				JsapiTicket JsapiTicket = jsapiService.getJsapiTicket(accessToken, "jsapi");
+				jsTicket = JsapiTicket.getTicket();
+
+				JSONObject jsonTicket = new JSONObject();
+				JSONObject jsontemp = new JSONObject();
+				jsontemp.clear();
+				jsontemp.put("ticket", jsTicket);
+				jsontemp.put("begin_time", curTime);
+				jsonTicket.put(Env.CORP_ID, jsontemp);
+				FileUtils.write2File(jsonTicket, "jsticket");
+			} catch (SdkInitException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (ServiceException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (ServiceNotExistException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			return jsTicket;
+		 } else {
+			 return jsTicketValue.getString("ticket");
+		 }
+	}
+
+	public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException {
+		String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "&timestamp=" + String.valueOf(timeStamp)
+				+ "&url=" + url;
+		try {
+			MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
+			sha1.reset();
+			sha1.update(plain.getBytes("UTF-8"));
+			return bytesToHex(sha1.digest());
+		} catch (NoSuchAlgorithmException e) {
+			throw new OApiResultException(e.getMessage());
+		} catch (UnsupportedEncodingException e) {
+			throw new OApiResultException(e.getMessage());
+		}
+	}
+
+	private static String bytesToHex(byte[] hash) {
+		Formatter formatter = new Formatter();
+		for (byte b : hash) {
+			formatter.format("%02x", b);
+		}
+		String result = formatter.toString();
+		formatter.close();
+		return result;
+	}
+
+	public static String getConfig(HttpServletRequest request) {
+		String urlString = request.getRequestURL().toString();
+		String queryString = request.getQueryString();
+		String agentId=request.getParameter("agentId");
+
+		String queryStringEncode = null;
+		String url;
+/*		if (queryString != null) {
+			try {
+				queryStringEncode = URLDecoder.decode(queryString,"UTF-8");
+			} catch (UnsupportedEncodingException e) {
+				e.printStackTrace();
+			}
+			url = urlString + "?" + queryStringEncode;
+		} else {
+			url = urlString;
+		}*/
+		
+		String nonceStr = "abcdefg";
+		long timeStamp = System.currentTimeMillis() / 1000;
+		String signedUrl = urlString;
+		String accessToken = null;
+		String ticket = null;
+		String signature = null;
+
+		try {
+			accessToken = AuthHelper.getAccessToken();
+	       
+			ticket = AuthHelper.getJsapiTicket(accessToken);
+			signature = AuthHelper.sign(ticket, nonceStr, timeStamp, signedUrl);
+			
+		} catch (OApiException  e) {
+			e.printStackTrace();
+		}
+		
+		Map<String,Object> data= new HashMap<>();
+		
+		data.put("jsticket", ticket);
+		data.put("signature", signature);
+		data.put("nonceStr", nonceStr);
+		data.put("timeStamp", timeStamp);
+		data.put("corpId", Env.CORP_ID);
+		data.put("agentid",agentId);
+		
+		String configValue = "{jsticket:'" + ticket + "',signature:'" + signature + "',nonceStr:'" + nonceStr + "',timeStamp:'"
+		+ timeStamp + "',corpId:'" + Env.CORP_ID + "',agentid:'" + agentId+  "'}";
+		
+		System.out.println(configValue);
+		try {
+			return JsonUtil.getJsonString(data);
+		} catch (JsonProcessingException e) {
+			e.printStackTrace();
+		}
+		return configValue;
+	}
+
+
+	public static String getSsoToken() throws OApiException {
+		String url = "https://oapi.dingtalk.com/sso/gettoken?corpid=" + Env.CORP_ID + "&corpsecret=" + Env.SSO_Secret;
+		JSONObject response = HttpHelper.httpGet(url);
+		String ssoToken;
+		if (response.containsKey("access_token")) {
+			ssoToken = response.getString("access_token");
+		} else {
+			throw new OApiResultException("Sso_token");
+		}
+		return ssoToken;
+
+	}
+	
+	
+	public static String snsTokenUser(String userCode) throws OApiException {
+		String accessToken;
+		String url = "https://oapi.dingtalk.com/sns/gettoken?appid="+Env.SNS_APP_ID+"&appsecret="+Env.SNS_APP_SECRET;
+		JSONObject response = HttpHelper.httpGet(url);
+		
+		if (response.containsKey("access_token")) {
+			accessToken = response.getString("access_token");
+			JSONObject json1=getPersistentCode(accessToken,userCode);
+			
+			JSONObject json2=getSnsToken(accessToken,json1.getString("openid"),json1.getString("persistent_code"));
+			
+			String userInfo=getSnsUserinfo(json2.getString("sns_token"));
+			return userInfo;
+		} else {
+			throw new OApiResultException("Sso_token");
+		}
+	
+	}
+	
+	
+	private static JSONObject getPersistentCode(String accessToken,String userCode) throws OApiException{
+		String snsUrl = "https://oapi.dingtalk.com/sns/get_persistent_code?access_token="+accessToken;
+		
+		JSONObject data=new JSONObject();
+		data.put("tmp_auth_code", userCode);
+		//String jsonStr="{\"tmp_auth_code\": \""+userCode+"\"}";
+		JSONObject snsResult = HttpHelper.httpPost(snsUrl, data);
+		return snsResult;
+	}
+	
+	private static JSONObject getSnsToken(String accessToken,String openid,String persistentCode) throws OApiException{
+		String snsUrl = "https://oapi.dingtalk.com/sns/get_sns_token?access_token="+accessToken;
+		JSONObject data=new JSONObject();
+			data.put("openid", openid);
+			data.put("persistent_code", persistentCode);
+			
+		//String jsonStr="{\"openid\": \""+openid+"\",\"persistent_code\": \""+persistentCode+"\"}";
+		JSONObject snsResult = HttpHelper.httpPost(snsUrl, data);
+		return snsResult;
+	}
+	
+	private static String getSnsUserinfo(String snsToken) throws OApiException{
+		String snsUrl = "https://oapi.dingtalk.com/sns/getuserinfo?sns_token="+snsToken;
+		JSONObject snsResult = HttpHelper.httpGet(snsUrl);
+		return snsResult.toJSONString();
+	}
+	
+	
+	
+	
+	public static String getUserinfo(String code) throws OApiException {
+		String url = "https://oapi.dingtalk.com/user/getuserinfo?access_token="+getAccessToken()+"&code="+code;
+		JSONObject response = HttpHelper.httpGet(url);
+		String json= response.toJSONString();
+		return json;
+
+	}
+	
+	
+
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/DingTalkEncryptor.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/DingTalkEncryptor.java
new file mode 100644
index 0000000..767cd6f
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/DingTalkEncryptor.java
@@ -0,0 +1,217 @@
+package com.xiaour.spring.boot.utils.aes;
+
+import java.io.ByteArrayOutputStream;
+import java.nio.charset.Charset;
+import java.security.MessageDigest;
+import java.util.*;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+
+import com.xiaour.spring.boot.exception.DingTalkEncryptException;
+
+
+/**
+ * 钉钉开放平台加解密方法
+ * 在ORACLE官方网站下载JCE无限制权限策略文件
+ *     JDK6的下载地址：http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
+ *     JDK7的下载地址： http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
+ */
+public class DingTalkEncryptor {
+
+    private static final Charset CHARSET = Charset.forName("utf-8");
+    private static final Base64         base64  = new Base64();
+    private byte[]         aesKey;
+    private String         token;
+    private String         corpId;
+    /**ask getPaddingBytes key固定长度**/
+    private static final Integer AES_ENCODE_KEY_LENGTH = 43;
+    /**加密随机字符串字节长度**/
+    private static final Integer RANDOM_LENGTH = 16;
+
+    /**
+     * 构造函数
+     * @param token             钉钉开放平台上，开发者设置的token
+     * @param encodingAesKey  钉钉开放台上，开发者设置的EncodingAESKey
+     * @param corpId           ISV进行配置的时候应该传对应套件的SUITE_KEY，普通企业是Corpid
+     * @throws DingTalkEncryptException 执行失败，请查看该异常的错误码和具体的错误信息
+     */
+    public DingTalkEncryptor(String token, String encodingAesKey, String corpId) throws DingTalkEncryptException{
+        if (null==encodingAesKey ||  encodingAesKey.length() != AES_ENCODE_KEY_LENGTH) {
+            throw new DingTalkEncryptException(DingTalkEncryptException.AES_KEY_ILLEGAL);
+        }
+        this.token = token;
+        this.corpId = corpId;
+        aesKey = Base64.decodeBase64(encodingAesKey + "=");
+    }
+
+    /**
+     * 将和钉钉开放平台同步的消息体加密,返回加密Map
+     * @param plaintext     传递的消息体明文
+     * @param timeStamp      时间戳
+     * @param nonce           随机字符串
+     * @return
+     * @throws DingTalkEncryptException
+     */
+    public Map<String,String> getEncryptedMap(String plaintext, Long timeStamp, String nonce) throws DingTalkEncryptException {
+        if(null==plaintext){
+            throw new DingTalkEncryptException(DingTalkEncryptException.ENCRYPTION_PLAINTEXT_ILLEGAL);
+        }
+        if(null==timeStamp){
+            throw new DingTalkEncryptException(DingTalkEncryptException.ENCRYPTION_TIMESTAMP_ILLEGAL);
+        }
+        if(null==nonce){
+            throw new DingTalkEncryptException(DingTalkEncryptException.ENCRYPTION_NONCE_ILLEGAL);
+        }
+        // 加密
+        String encrypt = encrypt(Utils.getRandomStr(RANDOM_LENGTH), plaintext);
+        String signature = getSignature(token, String.valueOf(timeStamp), nonce, encrypt);
+        Map<String,String> resultMap = new HashMap<String, String>();
+        resultMap.put("msg_signature", signature);
+        resultMap.put("encrypt", encrypt);
+        resultMap.put("timeStamp", String.valueOf(timeStamp));
+        resultMap.put("nonce", nonce);
+        return  resultMap;
+    }
+
+    /**
+     * 密文解密
+     * @param msgSignature     签名串
+     * @param timeStamp        时间戳
+     * @param nonce             随机串
+     * @param encryptMsg       密文
+     * @return                  解密后的原文
+     * @throws DingTalkEncryptException
+     */
+    public String getDecryptMsg(String msgSignature, String timeStamp, String nonce, String encryptMsg)throws DingTalkEncryptException {
+        //校验签名
+        String signature = getSignature(token, timeStamp, nonce, encryptMsg);
+        if (!signature.equals(msgSignature)) {
+            throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);
+        }
+        // 解密
+        String result = decrypt(encryptMsg);
+        return result;
+    }
+
+
+    /*
+     * 对明文加密.
+     * @param text 需要加密的明文
+     * @return 加密后base64编码的字符串
+     */
+    private String encrypt(String random, String plaintext) throws DingTalkEncryptException {
+        try {
+            byte[] randomBytes = random.getBytes(CHARSET);
+            byte[] plainTextBytes = plaintext.getBytes(CHARSET);
+            byte[] lengthByte = Utils.int2Bytes(plainTextBytes.length);
+            byte[] corpidBytes = corpId.getBytes(CHARSET);
+            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+            byteStream.write(randomBytes);
+            byteStream.write(lengthByte);
+            byteStream.write(plainTextBytes);
+            byteStream.write(corpidBytes);
+            byte[] padBytes = PKCS7Padding.getPaddingBytes(byteStream.size());
+            byteStream.write(padBytes);
+            byte[] unencrypted = byteStream.toByteArray();
+            byteStream.close();
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+            SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
+            IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
+            byte[] encrypted = cipher.doFinal(unencrypted);
+            String result = base64.encodeToString(encrypted);
+            return result;
+        } catch (Exception e) {
+            throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_ENCRYPT_TEXT_ERROR);
+        }
+    }
+
+    /*
+     * 对密文进行解密.
+     * @param text 需要解密的密文
+     * @return 解密得到的明文
+     */
+    private String decrypt(String text) throws DingTalkEncryptException {
+        byte[] originalArr;
+        try {
+            // 设置解密模式为AES的CBC模式
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+            SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
+            IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
+            cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
+            // 使用BASE64对密文进行解码
+            byte[] encrypted = Base64.decodeBase64(text);
+            // 解密
+            originalArr = cipher.doFinal(encrypted);
+        } catch (Exception e) {
+            throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_ERROR);
+        }
+
+        String plainText;
+        String fromCorpid;
+        try {
+            // 去除补位字符
+            byte[] bytes = PKCS7Padding.removePaddingBytes(originalArr);
+            // 分离16位随机字符串,网络字节序和corpId
+            byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
+            int plainTextLegth = Utils.bytes2int(networkOrder);
+            plainText = new String(Arrays.copyOfRange(bytes, 20, 20 + plainTextLegth), CHARSET);
+            fromCorpid = new String(Arrays.copyOfRange(bytes, 20 + plainTextLegth, bytes.length), CHARSET);
+        } catch (Exception e) {
+            throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_LENGTH_ERROR);
+        }
+
+        // corpid不相同的情况
+        if (!fromCorpid.equals(corpId)) {
+            throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_CORPID_ERROR);
+        }
+        return plainText;
+    }
+
+    /**
+     * 数字签名
+     * @param token         isv token
+     * @param timestamp     时间戳
+     * @param nonce          随机串
+     * @param encrypt       加密文本
+     * @return
+     * @throws DingTalkEncryptException
+     */
+    public String getSignature(String token, String timestamp, String nonce, String encrypt) throws DingTalkEncryptException {
+        try {
+            String[] array = new String[] { token, timestamp, nonce, encrypt };
+            Arrays.sort(array);
+            StringBuffer sb = new StringBuffer();
+            for (int i = 0; i < 4; i++) {
+                sb.append(array[i]);
+            }
+            String str = sb.toString();
+            MessageDigest md = MessageDigest.getInstance("SHA-1");
+            md.update(str.getBytes());
+            byte[] digest = md.digest();
+
+            StringBuffer hexstr = new StringBuffer();
+            String shaHex = "";
+            for (int i = 0; i < digest.length; i++) {
+                shaHex = Integer.toHexString(digest[i] & 0xFF);
+                if (shaHex.length() < 2) {
+                    hexstr.append(0);
+                }
+                hexstr.append(shaHex);
+            }
+            return hexstr.toString();
+        } catch (Exception e) {
+            throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);
+        }
+    }
+
+
+
+
+
+
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/DingTalkJsApiSingnature.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/DingTalkJsApiSingnature.java
new file mode 100644
index 0000000..3b9e387
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/DingTalkJsApiSingnature.java
@@ -0,0 +1,58 @@
+package com.xiaour.spring.boot.utils.aes;
+
+import java.security.MessageDigest;
+import java.util.Formatter;
+
+import com.xiaour.spring.boot.exception.DingTalkEncryptException;
+
+/**
+ * 钉钉jsapi签名工具类
+ */
+public class DingTalkJsApiSingnature {
+    /**
+     * 获取jsapi签名
+     * @param url
+     * @param nonce
+     * @param timeStamp
+     * @param jsTicket
+     * @return
+     * @throws DingTalkEncryptException
+     */
+    public static String getJsApiSingnature(String url,String nonce,Long timeStamp,String jsTicket) throws DingTalkEncryptException{
+        String plainTex = "jsapi_ticket=" + jsTicket +"&noncestr=" + nonce +"&timestamp=" + timeStamp + "&url=" + url;
+        System.out.println(plainTex);
+        String signature = "";
+        try{
+            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
+            crypt.reset();
+            crypt.update(plainTex.getBytes("UTF-8"));
+            signature = byteToHex(crypt.digest());
+            return signature;
+        }catch (Exception e){
+            throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);
+        }
+    }
+
+    private static String byteToHex(final byte[] hash) {
+        Formatter formatter = new Formatter();
+        for (byte b : hash){
+            formatter.format("%02x", b);
+        }
+        String result = formatter.toString();
+        formatter.close();
+        return result;
+    }
+
+
+    public static void main(String args[]) throws Exception{
+
+
+
+                // signature:810e6657e9f411e6491b3e97dfaf7660e89eb874,serverSign:0e781e79966d6f27e2b6456b83d5cee0ebaeb81b
+        String url="http://10.62.53.138:3000/jsapi";
+        String nonce="abcdefgh";
+        Long timeStamp = 1437027269927L;
+        String tikcet="zHoQdGJuH0ZDebwo7sLqLzHGUueLmkWCC4RycYgkuvDu3eoROgN5qhwnQLgfzwEXtuR9SDzh6BdhyVngzAjrxV";
+        System.err.println(getJsApiSingnature(url,nonce,timeStamp,tikcet));
+    }
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Env.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Env.java
new file mode 100644
index 0000000..9e189c7
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Env.java
@@ -0,0 +1,31 @@
+package com.xiaour.spring.boot.utils.aes;
+
+
+
+public class Env {
+	
+	public static final String OAPI_HOST = "https://oapi.dingtalk.com";
+	public static final String OA_BACKGROUND_URL = ""; 
+	public static final String CORP_ID = "ding103b3ec2abc362c135c2f4657eb6378f";
+	
+	public static final String CORP_SECRET = "2wZtuw6dbf4o8KY8qEY1CrRUmMn78s51jNz0PXxBm9ylVZ3Mju56BZZKeiUEnvan";
+	public static final String SSO_Secret = "7d6IsFc_Vs1VmY2YFvOKRtBth7f8N-EFKtEswWDlEBN6g5NfWwJ7InLW5OoeJFCV";
+
+	
+	public static String suiteTicket; 
+	public static String authCode; 
+	public static String suiteToken; 
+
+	public static final String CREATE_SUITE_KEY = "suite4xxxxxxxxxxxxxxx";
+	public static final String SUITE_KEY = "";
+	public static final String SUITE_SECRET = "";
+	public static final String TOKEN = "";
+	public static final String ENCODING_AES_KEY = "";
+	
+	
+	
+	public static final String SNS_APP_ID = "dingoates0filrnnxqbetd";
+	public static final String SNS_APP_SECRET = "KQgORLyXYMcnfE1C6iXVSv1epdfiH_xiWARV6lApPgcAFOTr1SLzAFpr3ErBkpBQ";
+
+	
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/PKCS7Padding.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/PKCS7Padding.java
new file mode 100644
index 0000000..a32656c
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/PKCS7Padding.java
@@ -0,0 +1,50 @@
+package com.xiaour.spring.boot.utils.aes;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+/*
+ * PKCS7算法的加密填充
+ */
+
+public class PKCS7Padding {
+    private final static Charset CHARSET    = Charset.forName("utf-8");
+    private final static int     BLOCK_SIZE = 32;
+
+    /**
+     * 填充mode字节
+     * @param count
+     * @return
+     */
+    public static byte[] getPaddingBytes(int count) {
+        int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
+        if (amountToPad == 0) {
+            amountToPad = BLOCK_SIZE;
+        }
+        char padChr = chr(amountToPad);
+        String tmp = new String();
+        for (int index = 0; index < amountToPad; index++) {
+            tmp += padChr;
+        }
+        return tmp.getBytes(CHARSET);
+    }
+
+    /**
+     * 移除mode填充字节
+     * @param decrypted
+     * @return
+     */
+    public static byte[] removePaddingBytes(byte[] decrypted) {
+        int pad = (int) decrypted[decrypted.length - 1];
+        if (pad < 1 || pad > BLOCK_SIZE) {
+            pad = 0;
+        }
+        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
+    }
+
+    private static char chr(int a) {
+        byte target = (byte) (a & 0xFF);
+        return (char) target;
+    }
+
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Utils.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Utils.java
new file mode 100644
index 0000000..6208dad
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Utils.java
@@ -0,0 +1,50 @@
+package com.xiaour.spring.boot.utils.aes;
+
+import java.util.Random;
+
+/**
+ * 加解密工具类
+ */
+public class Utils {
+    /**
+     *
+     * @return
+     */
+    public static String getRandomStr(int count) {
+        String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+        Random random = new Random();
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < count; i++) {
+            int number = random.nextInt(base.length());
+            sb.append(base.charAt(number));
+        }
+        return sb.toString();
+    }
+
+
+    /*
+     * int转byte数组,高位在前
+     */
+    public static byte[] int2Bytes(int count) {
+        byte[] byteArr = new byte[4];
+        byteArr[3] = (byte) (count & 0xFF);
+        byteArr[2] = (byte) (count >> 8 & 0xFF);
+        byteArr[1] = (byte) (count >> 16 & 0xFF);
+        byteArr[0] = (byte) (count >> 24 & 0xFF);
+        return byteArr;
+    }
+
+    /**
+     * 高位在前bytes数组转int
+     * @param byteArr
+     * @return
+     */
+    public static int bytes2int(byte[] byteArr) {
+        int count = 0;
+        for (int i = 0; i < 4; i++) {
+            count <<= 8;
+            count |= byteArr[i] & 0xff;
+        }
+        return count;
+    }
+}
diff --git a/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Vars.java b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Vars.java
new file mode 100644
index 0000000..b186519
--- /dev/null
+++ b/SpringBootDemo/src/main/java/com/xiaour/spring/boot/utils/aes/Vars.java
@@ -0,0 +1,10 @@
+package com.xiaour.spring.boot.utils.aes;
+
+public class Vars {
+
+	public static String TO_USER = "";
+	public static String TO_PARTY = "";
+	public static String AGENT_ID = "";
+	public static String SENDER = "";
+	public static String CID = "";//cid需要通过jsapi获取，具体详情请查看开放平台文档--->客户端文档--->会话
+}
diff --git a/SpringBootDemo/src/main/resources/application.yml b/SpringBootDemo/src/main/resources/application.yml
index 167b873..3fcd6f7 100644
--- a/SpringBootDemo/src/main/resources/application.yml
+++ b/SpringBootDemo/src/main/resources/application.yml
@@ -1,39 +1,50 @@
-#服务启动端口
-server :  
-  port :  8080
-
-#数据库配置
-spring:
-    datasource:
-        url: jdbc:mysql://127.0.0.1:9966/study?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&useSSL=false&verifyServerCertificate=false
-        username: your.account
-        password: your.pass
-        # 使用druid数据源
-        type: com.alibaba.druid.pool.DruidDataSource
-        driver-class-name: com.mysql.jdbc.Driver
-    redis:
-      host: 127.0.0.1
-      #redis密码，没有密码的可以用～表示
-      password: ~
-      port: 6379
-      pool:
-        max-active: 100
-        max-idle: 10
-        max-wait: 100000
-# Mybatis mapper 映射路径配置
-mybatis:
-  type-aliases-package: com.xiaour.spring.boot.mapper
-  mapper-locations: classpath*:mapper/*.xml
-  configLocation: classpath:mybatis-config.xml
-    
-# 日志输出
-logging: 
-    file: D:/boot.log
-    level: 
-        com.ibatis:DEBUG
-        root:DEBUG
-
-task:
-    cron:0 0/5 * * * ?
-       
-    
+#redis服务配置
+jedis :  
+  pool :  
+    host : 127.0.0.1  
+    port : 6379  
+    config :  
+      maxTotal: 100  
+      maxIdle: 10  
+      maxWaitMillis : 100000
+
+#服务启动端口
+server :  
+  port :  8080
+
+#数据库配置
+jdbc:
+    datasource:
+        name: test
+        url: jdbc:mysql://127.0.0.1:3306/world
+        username: root
+        password: 123456
+        # 使用druid数据源
+        type: com.alibaba.druid.pool.DruidDataSource
+        driver-class-name: com.mysql.jdbc.Driver
+        filters: stat
+        maxActive: 20
+        initialSize: 1
+        maxWait: 60000
+        minIdle: 1
+        timeBetweenEvictionRunsMillis: 60000
+        minEvictableIdleTimeMillis: 300000
+        validationQuery: select 'x'
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        poolPreparedStatements: true
+        maxOpenPreparedStatements: 20
+
+    
+# 日志输出
+logging: 
+    file: D:/boot.log
+    level: 
+        com.ibatis:DEBUG
+        root:DEBUG
+
+task:
+    cron:0 0/5 * * * ?
+       
+    
diff --git a/SpringBootDemoV2/.gitignore b/SpringBootDemoV2/.gitignore
deleted file mode 100644
index 2af7cef..0000000
--- a/SpringBootDemoV2/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-target/
-!.mvn/wrapper/maven-wrapper.jar
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-nbproject/private/
-build/
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
\ No newline at end of file
diff --git a/SpringBootDemoV2/pom.xml b/SpringBootDemoV2/pom.xml
deleted file mode 100644
index 9c0856a..0000000
--- a/SpringBootDemoV2/pom.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?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>com.github.xiaour</groupId>
-	<artifactId>springbootv2</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<name>SpringBootDemoV2</name>
-	<description>Demo project for Spring Boot V2</description>
-	<packaging>jar</packaging>
-
-
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.4.2</version>
-		<relativePath/> <!-- lookup parent from repository -->
-	</parent>
-
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<java.version>1.8</java.version>
-	</properties>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-redis</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>com.alibaba.boot</groupId>
-			<artifactId>dubbo-spring-boot-starter</artifactId>
-			<version>0.1.0</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.apache.zookeeper</groupId>
-			<artifactId>zookeeper</artifactId>
-			<version>3.7.2</version>
-		</dependency>
-
-
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>com.google.code.gson</groupId>
-			<artifactId>gson</artifactId>
-			<version>2.8.9</version>
-		</dependency>
-
-		<dependency>
-			<groupId>commons-codec</groupId>
-			<artifactId>commons-codec</artifactId>
-			<version>1.10</version>
-		</dependency>
-
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.13.1</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.jodd</groupId>
-			<artifactId>jodd-http</artifactId>
-			<version>3.7.1</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient</artifactId>
-		</dependency>
-<!--
-        <dependency>
-            <groupId>com.github.xiaour</groupId>
-            <artifactId>spring.boot.sapi.starter</artifactId>
-            <version>0.0.1-SNAPSHOT</version>
-        </dependency>-->
-
-
-    </dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</build>
-
-
-</project>
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/Application.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/Application.java
deleted file mode 100644
index caf30a9..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/Application.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.github.xiaour;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-@SpringBootApplication
-public class Application {
-
-
-
-	public static void main(String[] args) {
-		//SpringApplication.run(Application.class, args);
-
-
-	}
-
-
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/config/DuckPorperties.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/config/DuckPorperties.java
deleted file mode 100644
index 2f722f6..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/config/DuckPorperties.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.github.xiaour.config;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/3/1 下午5:04
- */
-@Configuration
-@ConfigurationProperties(prefix="duck")
-public class DuckPorperties{
-
-    private String duckName;
-
-    private int  totalCount;
-
-    public String getDuckName() {
-        return duckName;
-    }
-
-    public void setDuckName(String duckName) {
-        this.duckName = duckName;
-    }
-
-    public int getTotalCount() {
-        return totalCount;
-    }
-
-    public void setTotalCount(int totalCount) {
-        this.totalCount = totalCount;
-    }
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/constants/Api.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/constants/Api.java
deleted file mode 100644
index 6bd8fb1..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/constants/Api.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.github.xiaour.constants;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/3/13 上午10:09
- */
-public class Api {
-
-    /**
-     * 获取第三方平台component_access_token
-     */
-    public  static final String component_token="https://api.weixin.qq.com/cgi-bin/component/api_component_token";
-
-    /**
-     * 获取预授权码pre_auth_code
-     */
-    public  static final String create_preauthcode="https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=";
-
-    /**
-     * 使用授权码换取公众号或小程序的接口调用凭据和授权信息
-     */
-    public  static final String query_auth="https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=";
-
-    /**
-     * 获取（刷新）授权公众号或小程序的接口调用凭据（令牌）
-     */
-    public  static final String authorizer_token="https:// api.weixin.qq.com /cgi-bin/component/api_authorizer_token?component_access_token=";
-
-    /**
-     * 获取授权方的帐号基本信息
-     */
-    public  static final String get_authorizer_info="https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=";
-
-    /**
-     * 获取授权方的选项设置信息
-     */
-    public  static final String get_authorizer_option="https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=";
-
-    /**
-     * 设置授权方的选项信息
-     */
-    public  static final String set_authorizer_option="https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option?component_access_token=";
-
-
-    enum Type{
-        A;
-    }
-
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/DemoController.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/DemoController.java
deleted file mode 100644
index 27c6ccd..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/controller/DemoController.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.github.xiaour.controller;
-
-import com.github.xiaour.config.DuckPorperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.bind.Binder;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/3/1 下午4:54
- */
-@RestController
-public class DemoController {
-    @Autowired
-    private DuckPorperties duckPorperties;
-
-    @RequestMapping("/amazing")
-    public Map<String,Object> amazing() {
-        /**
-         * 如果不需要其他的结构，可以直接返回对象类型，不必要强制JSON格式。Springboot默认支持转为json
-         */
-        Map<String,Object> obj= new HashMap<>();
-        obj.put("name","xiaour");
-        obj.put("age","18");
-        obj.put("age","18");
-        return obj;
-    }
-
-    @RequestMapping("/duck")
-    public String duck() {
-        /**
-         * 自动装配模式的配置文件属性。
-         */
-        return duckPorperties.getDuckName();
-    }
-
-
-
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/exception/AesException.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/exception/AesException.java
deleted file mode 100755
index 0014bbc..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/exception/AesException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.github.xiaour.exception;
-
-@SuppressWarnings("serial")
-public class AesException extends Exception {
-
-	public final static int OK = 0;
-	public final static int ValidateSignatureError = -40001;
-	public final static int ParseXmlError = -40002;
-	public final static int ComputeSignatureError = -40003;
-	public final static int IllegalAesKey = -40004;
-	public final static int ValidateAppidError = -40005;
-	public final static int EncryptAESError = -40006;
-	public final static int DecryptAESError = -40007;
-	public final static int IllegalBuffer = -40008;
-	//public final static int EncodeBase64Error = -40009;
-	//public final static int DecodeBase64Error = -40010;
-	//public final static int GenReturnXmlError = -40011;
-
-	private int code;
-
-	private static String getMessage(int code) {
-		switch (code) {
-		case ValidateSignatureError:
-			return "签名验证错误";
-		case ParseXmlError:
-			return "xml解析失败";
-		case ComputeSignatureError:
-			return "sha加密生成签名失败";
-		case IllegalAesKey:
-			return "SymmetricKey非法";
-		case ValidateAppidError:
-			return "appid校验失败";
-		case EncryptAESError:
-			return "aes加密失败";
-		case DecryptAESError:
-			return "aes解密失败";
-		case IllegalBuffer:
-			return "解密后得到的buffer非法";
-//		case EncodeBase64Error:
-//			return "base64加密错误";
-//		case DecodeBase64Error:
-//			return "base64解密错误";
-//		case GenReturnXmlError:
-//			return "xml生成失败";
-		default:
-			return null; // cannot be
-		}
-	}
-
-	public int getCode() {
-		return code;
-	}
-
-	public AesException(int code) {
-		super(getMessage(code));
-		this.code = code;
-	}
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/exception/OApiException.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/exception/OApiException.java
deleted file mode 100644
index e037c5d..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/exception/OApiException.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.github.xiaour.exception;
-
-import java.io.IOException;
-
-public class OApiException extends Exception {
-
-	/**
-	 */
-	private static final long serialVersionUID = 1L;
-
-	public OApiException(int errCode, String errMsg) {
-		super("error code: " + errCode + ", error message: " + errMsg);
-	}
-
-	public OApiException(IOException e) {
-		super(e);
-	}
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/service/DubboService.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/service/DubboService.java
deleted file mode 100644
index 61f0354..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/service/DubboService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.github.xiaour.service;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/4/25 16:57
- */
-
-public interface DubboService {
-
-     String hello(String name);
-
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/service/impl/DubboServiceImpl.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/service/impl/DubboServiceImpl.java
deleted file mode 100644
index b6c8cf1..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/service/impl/DubboServiceImpl.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.github.xiaour.service.impl;
-
-import com.alibaba.dubbo.config.annotation.Service;
-import com.github.xiaour.service.DubboService;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/4/25 16:59
- */
-
-
-@Service(
-        version = "1.0.0",
-        application = "${dubbo.application.id}",
-        protocol = "${dubbo.protocol.id}",
-        registry = "${dubbo.registry.id}"
-)
-public class DubboServiceImpl implements DubboService {
-    @Override
-    public String hello(String name) {
-        return "Hello,"+name;
-    }
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/ByteGroup.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/ByteGroup.java
deleted file mode 100755
index 142d90d..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/ByteGroup.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.github.xiaour.utils;
-
-import java.util.ArrayList;
-
-class ByteGroup {
-	ArrayList<Byte> byteContainer = new ArrayList<Byte>();
-
-	public byte[] toBytes() {
-		byte[] bytes = new byte[byteContainer.size()];
-		for (int i = 0; i < byteContainer.size(); i++) {
-			bytes[i] = byteContainer.get(i);
-		}
-		return bytes;
-	}
-
-	public ByteGroup addBytes(byte[] bytes) {
-		for (byte b : bytes) {
-			byteContainer.add(b);
-		}
-		return this;
-	}
-
-	public int size() {
-		return byteContainer.size();
-	}
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/HttpHelper.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/HttpHelper.java
deleted file mode 100644
index 9a5b791..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/HttpHelper.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package com.github.xiaour.utils;
-
-
-
-import com.github.xiaour.constants.Api;
-import com.github.xiaour.exception.OApiException;
-import com.google.gson.JsonObject;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.util.EntityUtils;
-import org.springframework.web.client.RestTemplate;
-
-import java.io.IOException;
-import java.util.Map;
-
-
-public class HttpHelper {
-
-
-    private static RestTemplate restTemplate = new RestTemplate();
-
-    private static JsonObject jsonObject = null;
-
-    static{
-        jsonObject  = new JsonObject();
-    }
-
-    public static synchronized JsonObject instance(){
-        if(jsonObject == null){
-            jsonObject =  new JsonObject();
-        }
-        return jsonObject;
-    }
-	
-
-	public static JsonObject httpGet(String url) throws OApiException {
-        HttpGet httpGet = new HttpGet(url);
-        CloseableHttpResponse response = null;
-        CloseableHttpClient httpClient = HttpClients.createDefault();
-        RequestConfig requestConfig = RequestConfig.custom().
-        		setSocketTimeout(10000).setConnectTimeout(10000).build();
-        httpGet.setConfig(requestConfig);
-
-        try {
-            response = httpClient.execute(httpGet, new BasicHttpContext());
-
-            if (response.getStatusLine().getStatusCode() != 200) {
-                return null;
-            }
-            HttpEntity entity = response.getEntity();
-            if (entity != null) {
-                String resultStr = EntityUtils.toString(entity, "utf-8");
-                return jsonObject.getAsJsonObject(resultStr);
-
-            }
-        } catch (IOException e) {
-        	throw new OApiException(e);
-        } finally {
-            if (response != null) try {
-                response.close();
-            } catch (IOException e) {
-            	throw new OApiException(e);
-            }
-        }
-
-        return null;
-    }
-	
-	
-	public static String postXmlStr(String url,String xmlStr) throws OApiException {
-        HttpPost httpPost = new HttpPost(url);
-        CloseableHttpResponse response = null;
-        CloseableHttpClient httpClient = HttpClients.createDefault();
-        RequestConfig requestConfig = RequestConfig.custom().
-        		setSocketTimeout(10000).setConnectTimeout(10000).build();
-        httpPost.setConfig(requestConfig);
-        httpPost.addHeader("Content-Type", "application/xml");
-        try {
-        	StringEntity requestEntity = new StringEntity(xmlStr, "utf-8");
-            httpPost.setEntity(requestEntity);
-            
-            response = httpClient.execute(httpPost, new BasicHttpContext());
-
-            if (response.getStatusLine().getStatusCode() != 200) {
-
-                return null;
-            }
-            HttpEntity entity = response.getEntity();
-            if (entity != null) {
-                String resultStr = EntityUtils.toString(entity, "utf-8");
-                return resultStr;
-            }
-        } catch (IOException e) {
-        	throw new OApiException(e);
-        } finally {
-            if (response != null) try {
-                response.close();
-            } catch (IOException e) {
-            	throw new OApiException(e);
-            }
-        }
-
-        return null;
-    }
-	
-	
-	public static JsonObject httpPost(String url, Object data) throws OApiException {
-        HttpPost httpPost = new HttpPost(url);
-        CloseableHttpResponse response = null;
-        CloseableHttpClient httpClient = HttpClients.createDefault();
-        RequestConfig requestConfig = RequestConfig.custom().
-        		setSocketTimeout(10000).setConnectTimeout(10000).build();
-        httpPost.setConfig(requestConfig);
-        httpPost.addHeader("Content-Type", "application/json");
-        try {
-        	String dataStr=JsonUtil.getJsonString(data);
-        	StringEntity requestEntity = new StringEntity(dataStr, "utf-8");
-            httpPost.setEntity(requestEntity);
-            response = httpClient.execute(httpPost, new BasicHttpContext());
-
-            if (response.getStatusLine().getStatusCode() != 200) {
-
-                return null;
-            }
-            
-            HttpEntity entity = response.getEntity();
-            
-            if (entity != null) {
-                String resultStr = EntityUtils.toString(entity, "utf-8");
-                return jsonObject.getAsJsonObject(resultStr);
-            }
-        } catch (IOException e) {
-        	throw new OApiException(e);
-        } finally {
-            if (response != null) try {
-                response.close();
-            } catch (IOException e) {
-            	throw new OApiException(e);
-            }
-        }
-
-        return null;
-    }
-
-
-
-    /**
-     * Get方法
-     *
-     * @param url:地址
-     * @param returnClassName:返回对象类型,如:String.class
-     * @param parameters:parameter参数
-     * @return
-     */
-    public static <T> T getByRest(String url, Class<T> returnClassName, Map<String, Object> parameters){
-        if (parameters == null) {
-            return restTemplate.getForObject(url, returnClassName);
-        }
-        return restTemplate.getForObject(url, returnClassName, parameters);
-    }
-
-    /**
-     * post请求,包含了路径,返回类型,Header,Parameter
-     *
-     * @param url:地址
-     * @param returnClassName:返回对象类型,如:String.class
-     * @param inputParameter
-     * @param jsonBody
-     * @return
-     */
-    public static <T> T postByRest(String url,Class<T> returnClassName,Map<String,Object> inputParameter,String jsonBody){
-
-        org.springframework.http.HttpEntity<String> formEntity = new org.springframework.http.HttpEntity<>(jsonBody);
-        if (inputParameter==null) {
-            return restTemplate.postForObject(url, formEntity, returnClassName);
-        }
-        return restTemplate.postForObject(url, formEntity, returnClassName, inputParameter);
-    }
-
-	
-/*
-	  public static String postWithKey(String appid,String keyPath, String url, WxRefundDto dto) throws OApiException {
-	      SSLContext sslContext = Pksc12KeyStore.initSSLContext(appid,dto.getMch_id(),keyPath);
-	      HttpRequest request = HttpRequest.post(url).withConnectionProvider(new SSLSocketHttpConnectionProvider(sslContext));
-	      request.bodyText(dto.toXml());
-	      HttpResponse response = request.send();
-	      return  response.bodyText();
-	}*/
-
-
-    public static void main(String[] args) {
-
-      /*  String jsonStr="{\"component_appid\":\"wxa797588149020de4\",\"component_verify_ticket\":\"ticket@@@6PEMgS7QZ2xzxJn9bdrOd6DB2xzm5I3liChyE8l4MdkruB10OzJl0FNsirqBXWoiB631xmw2fCHf84wCOSt9ZA\",\"component_appsecret\":\"a38dd974a9e6490dfbf5b21cd38f9996\"}\n";
-        String json= HttpHelper.postByRest(Api.component_token,String.class,null,jsonStr);
-        Map<String,Object> jsonMap= JsonUtil.json2Obj(json,Map.class);
-
-
-
-
-        System.out.println(jsonMap);*/
-
-
-        try {
-            JsonObject jo= HttpHelper.httpPost("https://api.weixin.qq.com/cgi-bin/menu/get?access_token=7_LptTbnbGrlk8OrF3fSreUPozwvDXm_lE1LB-lqVXxD5VYW2XLcRCQ3G4FTwhe1LR670PkaItKHZm7TY4Ms-ECf8oDslqhyE3rUMo3GrqKLOFs8owbj9SSkF3Y6kYqd0GiYtzbgNLopPeP8AiDNYdABAXHS",null);
-            System.out.println(jo.toString());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-	  
-	
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/IDGenerate.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/IDGenerate.java
deleted file mode 100644
index a8d3c4e..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/IDGenerate.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package com.github.xiaour.utils;
-
-import java.util.Date;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * @Author: Xiaour
- * @Description: 一个基于Twitter的
- * @Date: 2018/8/22 14:24
- */
-public class IDGenerate {
-
-    private static final long startTimeStamp = 1534919378079L; //定义一个起始时间 new Date().getTime()
-
-    private static final long workerIdBits = 6L;
-    private static final long dataCenterIdBits = 6L;
-    private static final long maxWorkerId = -1L ^ (-1L << workerIdBits);
-    private static final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits);
-
-    private static final long sequenceBits = 14L;
-    private static final long workerIdShift = sequenceBits;
-    private static final long dataCenterIdShift = sequenceBits + workerIdBits;
-    private static final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits;
-    private static final long sequenceMask = -1L ^ (-1L << sequenceBits);
-    private static final Random r = new Random();
-
-    private final long workerId;
-    private final long dataCenterId;
-    private final long idEpoch;
-    private long lastTimestamp = -1L;
-    private long sequence = 0;
-
-    public IDGenerate() {
-        this(startTimeStamp);
-    }
-
-    public IDGenerate(long idEpoch) {
-        this(r.nextInt((int) maxWorkerId), r.nextInt((int) maxDataCenterId), 0, idEpoch);
-    }
-
-    public IDGenerate(long workerId, long dataCenterId, long sequence) {
-        this(workerId, dataCenterId, sequence, startTimeStamp);
-    }
-
-    public IDGenerate(long workerId, long dataCenterId, long sequence, long idEpoch) {
-        this.workerId = workerId;
-        this.dataCenterId = dataCenterId;
-        this.sequence = sequence;
-        this.idEpoch = idEpoch;
-
-        if (workerId < 0 || workerId > maxWorkerId) {
-            throw new IllegalArgumentException("workerId is illegal: " + workerId);
-        }
-        if (dataCenterId < 0 || dataCenterId > maxDataCenterId) {
-            throw new IllegalArgumentException("dataCenterId is illegal: " + dataCenterId);
-        }
-
-        if (idEpoch >= timeGen()) {
-            throw new IllegalArgumentException("idEpoch is illegal: " + idEpoch);
-        }
-    }
-
-    public long getDataCenterId() {
-        return dataCenterId;
-    }
-
-    public long getWorkerId() {
-        return workerId;
-    }
-
-    public long getTime() {
-        return timeGen();
-    }
-
-    public synchronized long nextId() {
-        long timestamp = timeGen();
-        if (timestamp < lastTimestamp) {
-            throw new IllegalArgumentException("Clock moved backwards.");
-        }
-
-        if (lastTimestamp == timestamp) {
-            sequence = (sequence + 1) & sequenceMask;
-            if (sequence == 0) {
-                timestamp = tilNextMillis(lastTimestamp);
-            }
-        } else {
-            sequence = 0;
-        }
-
-        lastTimestamp = timestamp;
-        long id = ((timestamp - idEpoch) << timestampLeftShift) | (dataCenterId <<
-                dataCenterIdShift) | (workerId << workerIdShift) | sequence;
-        return id;
-    }
-
-    public long getIdTimestamp(long id) {
-        return idEpoch + (id >> timestampLeftShift);
-    }
-
-    private long tilNextMillis(long lastTimestamp) {
-        long timestamp = timeGen();
-        while (timestamp <= lastTimestamp) {
-            timestamp = timeGen();
-        }
-
-        return timestamp;
-    }
-
-    private long timeGen() {
-        return System.currentTimeMillis();
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder("IdBitWorker{");
-        sb.append("workerId=").append(workerId);
-        sb.append(", dataCenterId=").append(dataCenterId);
-        sb.append(", idEpoch=").append(idEpoch);
-        sb.append(", lastTimestamp=").append(lastTimestamp);
-        sb.append(", sequence=").append(sequence);
-        sb.append('}');
-        return sb.toString();
-    }
-
-    public static void main(String[] args) throws Exception {
-        IDGenerate worker = new IDGenerate();
-        ExecutorService executor = Executors.newFixedThreadPool(8);
-
-        CountDownLatch countDownLatch = new CountDownLatch(1000000);
-        Runnable run = () -> {
-            //这里是最主要ID部分
-            System.out.println(worker.nextId());
-            countDownLatch.countDown();
-        };
-
-        long startTime = System.currentTimeMillis();
-        for (int i = 0; i < 1000000; i++) {
-            executor.execute(run);
-        }
-        countDownLatch.await();
-        System.out.println(System.currentTimeMillis() - startTime);
-        executor.shutdown();
-
-        System.out.println(new Date().getTime());
-    }
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/JsonUtil.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/JsonUtil.java
deleted file mode 100644
index 9b18bb9..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/JsonUtil.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.github.xiaour.utils;
-
-import com.google.gson.*;
-import com.google.gson.reflect.TypeToken;
-
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class JsonUtil{
-
-
-    private static Gson gson = null;
-
-    static{
-        gson  = new Gson();
-    }
-
-    public static synchronized Gson newInstance(){
-        if(gson == null){
-            gson =  new Gson();
-        }
-        return gson;
-    }
-
-    public static String getJsonString(Object obj){
-        return gson.toJson(obj);
-    }
-
-    public static <T> T toBean(String json,Class<T> clz){
-
-        return gson.fromJson(json, clz);
-    }
-
-    public static <T> Map<String, T> readJson2MapObj(String json,Class<T> clz){
-        Map<String, JsonObject> map = gson.fromJson(json, new TypeToken<Map<String,JsonObject>>(){}.getType());
-        Map<String, T> result = new HashMap<>();
-        for(String key:map.keySet()){
-            result.put(key,gson.fromJson(map.get(key),clz) );
-        }
-        return result;
-    }
-
-    public static <T> T json2Obj(String json,Class<T> clz){
-        return gson.fromJson(json,clz);
-    }
-
-    public static Map<String, Object> toMap(String json){
-        Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String,Object>>(){}.getType());
-        return map;
-    }
-
-    public static Map<String,String> readJsonStrMap(String json) {
-        Map<String, JsonObject> map = gson.fromJson(json, new TypeToken<Map<String,JsonObject>>(){}.getType());
-        Map<String,String> result = new HashMap<>();
-        for(String key:map.keySet()){
-            result.put(key,gson.fromJson(map.get(key),String.class) );
-        }
-        return result;
-    }
-
-    public static  Map<byte[], byte[]> readJsonByteMap(String json) {
-        Map<String, JsonPrimitive> map = gson.fromJson(json, new TypeToken<Map<String,JsonPrimitive>>(){}.getType());
-        Map<byte[], byte[]> vmap = new HashMap<>();
-        for(String key:map.keySet()){
-            vmap.put(key.getBytes(),gson.fromJson(map.get(key),String.class).getBytes() );
-        }
-        return vmap;
-
-    }
-
-
-    public static <T> List<T> readJson2Array(String json, Class<T> clz){
-        JsonArray array = new JsonParser().parse(json).getAsJsonArray();
-        List<T> list  = new ArrayList<>();
-        for(final JsonElement elem : array){
-            list.add(gson.fromJson(elem, (Type)clz));
-        }
-        return list;
-    }
-
-}
\ No newline at end of file
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/PKCS7Encoder.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/PKCS7Encoder.java
deleted file mode 100755
index 15d1cbb..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/PKCS7Encoder.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- * 
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-package com.github.xiaour.utils;
-
-import java.nio.charset.Charset;
-import java.util.Arrays;
-
-/**
- * 提供基于PKCS7算法的加解密接口.
- */
-class PKCS7Encoder {
-	static Charset CHARSET = Charset.forName("utf-8");
-	static int BLOCK_SIZE = 32;
-
-	/**
-	 * 获得对明文进行补位填充的字节.
-	 * 
-	 * @param count 需要进行填充补位操作的明文字节个数
-	 * @return 补齐用的字节数组
-	 */
-	static byte[] encode(int count) {
-		// 计算需要填充的位数
-		int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
-		if (amountToPad == 0) {
-			amountToPad = BLOCK_SIZE;
-		}
-		// 获得补位所用的字符
-		char padChr = chr(amountToPad);
-		String tmp = new String();
-		for (int index = 0; index < amountToPad; index++) {
-			tmp += padChr;
-		}
-		return tmp.getBytes(CHARSET);
-	}
-
-	/**
-	 * 删除解密后明文的补位字符
-	 * 
-	 * @param decrypted 解密后的明文
-	 * @return 删除补位字符后的明文
-	 */
-	static byte[] decode(byte[] decrypted) {
-		int pad = (int) decrypted[decrypted.length - 1];
-		if (pad < 1 || pad > 32) {
-			pad = 0;
-		}
-		return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
-	}
-
-	/**
-	 * 将数字转化成ASCII码对应的字符，用于对明文进行补码
-	 * 
-	 * @param a 需要转化的数字
-	 * @return 转化得到的字符
-	 */
-	static char chr(int a) {
-		byte target = (byte) (a & 0xFF);
-		return (char) target;
-	}
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/SHA1.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/SHA1.java
deleted file mode 100755
index 0d257f0..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/SHA1.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- * 
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-package com.github.xiaour.utils;
-
-import com.github.xiaour.exception.AesException;
-
-import java.security.MessageDigest;
-import java.util.Arrays;
-
-/**
- * SHA1 class
- *
- * 计算公众平台的消息签名接口.
- */
-class SHA1 {
-
-	/**
-	 * 用SHA1算法生成安全签名
-	 * @param token 票据
-	 * @param timestamp 时间戳
-	 * @param nonce 随机字符串
-	 * @param encrypt 密文
-	 * @return 安全签名
-	 * @throws AesException
-	 */
-	public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException
-			  {
-		try {
-			String[] array = new String[] { token, timestamp, nonce, encrypt };
-			StringBuffer sb = new StringBuffer();
-			// 字符串排序
-			Arrays.sort(array);
-			for (int i = 0; i < 4; i++) {
-				sb.append(array[i]);
-			}
-			String str = sb.toString();
-			// SHA1签名生成
-			MessageDigest md = MessageDigest.getInstance("SHA-1");
-			md.update(str.getBytes());
-			byte[] digest = md.digest();
-
-			StringBuffer hexstr = new StringBuffer();
-			String shaHex = "";
-			for (int i = 0; i < digest.length; i++) {
-				shaHex = Integer.toHexString(digest[i] & 0xFF);
-				if (shaHex.length() < 2) {
-					hexstr.append(0);
-				}
-				hexstr.append(shaHex);
-			}
-			return hexstr.toString();
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.ComputeSignatureError);
-		}
-	}
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/Test.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/Test.java
deleted file mode 100644
index 3196893..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.xiaour.utils;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/3/2 上午10:35
- */
-public class Test {
-
-
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/WXBizMsgCrypt.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/WXBizMsgCrypt.java
deleted file mode 100755
index 6019a47..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/WXBizMsgCrypt.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- * 
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * 针对org.apache.commons.codec.binary.Base64，
- * 需要导入架包commons-codec-1.9（或commons-codec-1.8等其他版本）
- * 官方下载地址：http://commons.apache.org/proper/commons-codec/download_codec.cgi
- */
-package com.github.xiaour.utils;
-
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Random;
-
-import javax.crypto.Cipher;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import com.github.xiaour.exception.AesException;
-import org.apache.commons.codec.binary.Base64;
-
-/**
- * 提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串).
- * <ol>
- * 	<li>第三方回复加密消息给公众平台</li>
- * 	<li>第三方收到公众平台发送的消息，验证消息的安全性，并对消息进行解密。</li>
- * </ol>
- * 说明：异常java.security.InvalidKeyException:illegal Key Size的解决方案
- * <ol>
- * 	<li>在官方网站下载JCE无限制权限策略文件（JDK7的下载地址：
- *      http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>
- * 	<li>下载后解压，可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>
- * 	<li>如果安装了JRE，将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>
- * 	<li>如果安装了JDK，将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>
- * </ol>
- */
-public class WXBizMsgCrypt {
-	static Charset CHARSET = Charset.forName("utf-8");
-	Base64 base64 = new Base64();
-	byte[] aesKey;
-	String token;
-	String appId;
-
-	/**
-	 * 构造函数
-	 * @param token 公众平台上，开发者设置的token
-	 * @param encodingAesKey 公众平台上，开发者设置的EncodingAESKey
-	 * @param appId 公众平台appid
-	 * 
-	 * @throws AesException 执行失败，请查看该异常的错误码和具体的错误信息
-	 */
-	public WXBizMsgCrypt(String token, String encodingAesKey, String appId) throws AesException {
-		if (encodingAesKey.length() != 43) {
-			throw new AesException(AesException.IllegalAesKey);
-		}
-
-		this.token = token;
-		this.appId = appId;
-		aesKey = Base64.decodeBase64(encodingAesKey + "=");
-	}
-
-	// 生成4个字节的网络字节序
-	byte[] getNetworkBytesOrder(int sourceNumber) {
-		byte[] orderBytes = new byte[4];
-		orderBytes[3] = (byte) (sourceNumber & 0xFF);
-		orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF);
-		orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF);
-		orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF);
-		return orderBytes;
-	}
-
-	// 还原4个字节的网络字节序
-	int recoverNetworkBytesOrder(byte[] orderBytes) {
-		int sourceNumber = 0;
-		for (int i = 0; i < 4; i++) {
-			sourceNumber <<= 8;
-			sourceNumber |= orderBytes[i] & 0xff;
-		}
-		return sourceNumber;
-	}
-
-	// 随机生成16位字符串
-	public String getRandomStr() {
-		String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
-		Random random = new Random();
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < 16; i++) {
-			int number = random.nextInt(base.length());
-			sb.append(base.charAt(number));
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * 对明文进行加密.
-	 * 
-	 * @param text 需要加密的明文
-	 * @return 加密后base64编码的字符串
-	 * @throws AesException aes加密失败
-	 */
-	public  String encrypt(String randomStr, String text) throws AesException {
-		ByteGroup byteCollector = new ByteGroup();
-		byte[] randomStrBytes = randomStr.getBytes(CHARSET);
-		byte[] textBytes = text.getBytes(CHARSET);
-		byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);
-		byte[] appidBytes = appId.getBytes(CHARSET);
-
-		// randomStr + networkBytesOrder + text + appid
-		byteCollector.addBytes(randomStrBytes);
-		byteCollector.addBytes(networkBytesOrder);
-		byteCollector.addBytes(textBytes);
-		byteCollector.addBytes(appidBytes);
-
-		// ... + pad: 使用自定义的填充方式对明文进行补位填充
-		byte[] padBytes = PKCS7Encoder.encode(byteCollector.size());
-		byteCollector.addBytes(padBytes);
-
-		// 获得最终的字节流, 未加密
-		byte[] unencrypted = byteCollector.toBytes();
-
-		try {
-			// 设置加密模式为AES的CBC模式
-			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
-			SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
-			IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
-			cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
-
-			// 加密
-			byte[] encrypted = cipher.doFinal(unencrypted);
-
-			// 使用BASE64对加密后的字符串进行编码
-			String base64Encrypted = base64.encodeToString(encrypted);
-
-			return base64Encrypted;
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.EncryptAESError);
-		}
-	}
-
-	/**
-	 * 对密文进行解密.
-	 * 
-	 * @param text 需要解密的密文
-	 * @return 解密得到的明文
-	 * @throws AesException aes解密失败
-	 */
-	public String decrypt(String text) throws AesException {
-		byte[] original;
-		try {
-			// 设置解密模式为AES的CBC模式
-			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
-			SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");
-			IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
-			cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);
-
-			// 使用BASE64对密文进行解码
-			byte[] encrypted = Base64.decodeBase64(text);
-
-			// 解密
-			original = cipher.doFinal(encrypted);
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.DecryptAESError);
-		}
-
-		String xmlContent, from_appid;
-		try {
-			// 去除补位字符
-			byte[] bytes = PKCS7Encoder.decode(original);
-
-			// 分离16位随机字符串,网络字节序和AppId
-			byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
-
-			int xmlLength = recoverNetworkBytesOrder(networkOrder);
-
-			xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);
-			from_appid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),
-					CHARSET);
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.IllegalBuffer);
-		}
-
-		// appid不相同的情况
-		if (!from_appid.equals(appId)) {
-			throw new AesException(AesException.ValidateAppidError);
-		}
-		return xmlContent;
-
-	}
-
-	/**
-	 * 将公众平台回复用户的消息加密打包.
-	 * <ol>
-	 * 	<li>对要发送的消息进行AES-CBC加密</li>
-	 * 	<li>生成安全签名</li>
-	 * 	<li>将消息密文和安全签名打包成xml格式</li>
-	 * </ol>
-	 * 
-	 * @param replyMsg 公众平台待回复用户的消息，xml格式的字符串
-	 * @param timeStamp 时间戳，可以自己生成，也可以用URL参数的timestamp
-	 * @param nonce 随机串，可以自己生成，也可以用URL参数的nonce
-	 * 
-	 * @return 加密后的可以直接回复用户的密文，包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串
-	 * @throws AesException 执行失败，请查看该异常的错误码和具体的错误信息
-	 */
-	public String encryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException {
-		// 加密
-		String encrypt = encrypt(getRandomStr(), replyMsg);
-
-		// 生成安全签名
-		if (timeStamp == "") {
-			timeStamp = Long.toString(System.currentTimeMillis());
-		}
-
-		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);
-
-		// System.out.println("发送给平台的签名是: " + signature[1].toString());
-		// 生成发送的xml
-		String result = XMLParse.generate(encrypt, signature, timeStamp, nonce);
-		return result;
-	}
-
-	/**
-	 * 检验消息的真实性，并且获取解密后的明文.
-	 * <ol>
-	 * 	<li>利用收到的密文生成安全签名，进行签名验证</li>
-	 * 	<li>若验证通过，则提取xml中的加密消息</li>
-	 * 	<li>对消息进行解密</li>
-	 * </ol>
-	 * 
-	 * @param msgSignature 签名串，对应URL参数的msg_signature
-	 * @param timeStamp 时间戳，对应URL参数的timestamp
-	 * @param nonce 随机串，对应URL参数的nonce
-	 * @param encrypt 密文，对应POST请求的数据
-	 * 
-	 * @return 解密后的原文
-	 * @throws AesException 执行失败，请查看该异常的错误码和具体的错误信息
-	 */
-	public String decryptMsg(String msgSignature, String timeStamp, String nonce, String encrypt)
-			throws AesException {
-
-		// 密钥，公众账号的app secret
-		// 提取密文
-
-		// 验证安全签名
-		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);
-
-		// 和URL中的签名比较是否相等
-		// System.out.println("第三方收到URL中的签名：" + msg_sign);
-		// System.out.println("第三方校验签名：" + signature);
-		if (!signature.equals(msgSignature)) {
-			throw new AesException(AesException.ValidateSignatureError);
-		}
-
-		// 解密
-		String result = decrypt(encrypt);
-		return result;
-	}
-
-	/**
-	 * 验证URL
-	 * @param msgSignature 签名串，对应URL参数的msg_signature
-	 * @param timeStamp 时间戳，对应URL参数的timestamp
-	 * @param nonce 随机串，对应URL参数的nonce
-	 * @param echoStr 随机串，对应URL参数的echostr
-	 * 
-	 * @return 解密之后的echostr
-	 * @throws AesException 执行失败，请查看该异常的错误码和具体的错误信息
-	 */
-	public String verifyUrl(String msgSignature, String timeStamp, String nonce, String echoStr)
-			throws AesException {
-		String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
-
-		if (!signature.equals(msgSignature)) {
-			throw new AesException(AesException.ValidateSignatureError);
-		}
-
-		String result = decrypt(echoStr);
-		return result;
-	}
-
-}
\ No newline at end of file
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/WXBizMsgCryptTest.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/WXBizMsgCryptTest.java
deleted file mode 100755
index fb28989..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/WXBizMsgCryptTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package com.github.xiaour.utils;
-
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.io.StringReader;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import com.github.xiaour.exception.AesException;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-public class WXBizMsgCryptTest {
-	String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG";
-	String token = "pamtest";
-	String timestamp = "1409304348";
-	String nonce = "xxxxxx";
-	String appId = "wxb11529c136998cb6";
-	String replyMsg = "我是中文abcd123";
-	String xmlFormat = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
-	String afterAesEncrypt = "jn1L23DB+6ELqJ+6bruv21Y6MD7KeIfP82D6gU39rmkgczbWwt5+3bnyg5K55bgVtVzd832WzZGMhkP72vVOfg==";
-	String randomStr = "aaaabbbbccccdddd";
-
-	String replyMsg2 = "<xml><ToUserName><![CDATA[oia2Tj我是中文jewbmiOUlr6X-1crbLOvLw]]></ToUserName><FromUserName><![CDATA[gh_7f083739789a]]></FromUserName><CreateTime>1407743423</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[eYJ1MbwPRJtOvIEabaxHs7TX2D-HV71s79GUxqdUkjm6Gs2Ed1KF3ulAOA9H1xG0]]></MediaId><Title><![CDATA[testCallBackReplyVideo]]></Title><Description><![CDATA[testCallBackReplyVideo]]></Description></Video></xml>";
-	String afterAesEncrypt2 = "jn1L23DB+6ELqJ+6bruv23M2GmYfkv0xBh2h+XTBOKVKcgDFHle6gqcZ1cZrk3e1qjPQ1F4RsLWzQRG9udbKWesxlkupqcEcW7ZQweImX9+wLMa0GaUzpkycA8+IamDBxn5loLgZpnS7fVAbExOkK5DYHBmv5tptA9tklE/fTIILHR8HLXa5nQvFb3tYPKAlHF3rtTeayNf0QuM+UW/wM9enGIDIJHF7CLHiDNAYxr+r+OrJCmPQyTy8cVWlu9iSvOHPT/77bZqJucQHQ04sq7KZI27OcqpQNSto2OdHCoTccjggX5Z9Mma0nMJBU+jLKJ38YB1fBIz+vBzsYjrTmFQ44YfeEuZ+xRTQwr92vhA9OxchWVINGC50qE/6lmkwWTwGX9wtQpsJKhP+oS7rvTY8+VdzETdfakjkwQ5/Xka042OlUb1/slTwo4RscuQ+RdxSGvDahxAJ6+EAjLt9d8igHngxIbf6YyqqROxuxqIeIch3CssH/LqRs+iAcILvApYZckqmA7FNERspKA5f8GoJ9sv8xmGvZ9Yrf57cExWtnX8aCMMaBropU/1k+hKP5LVdzbWCG0hGwx/dQudYR/eXp3P0XxjlFiy+9DMlaFExWUZQDajPkdPrEeOwofJb";
-
-	@BeforeClass
-	public static void setUpBeforeClass() throws Exception {
-	}
-
-	@AfterClass
-	public static void tearDownAfterClass() throws Exception {
-	}
-
-	@Before
-	public void setUp() throws Exception {
-
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testNormal() throws ParserConfigurationException, SAXException, IOException {
-		try {
-			WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
-			String afterEncrpt = pc.encryptMsg(replyMsg, timestamp, nonce);
-
-			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-			DocumentBuilder db = dbf.newDocumentBuilder();
-			StringReader sr = new StringReader(afterEncrpt);
-			InputSource is = new InputSource(sr);
-			Document document = db.parse(is);
-
-			Element root = document.getDocumentElement();
-			NodeList nodelist1 = root.getElementsByTagName("Encrypt");
-			NodeList nodelist2 = root.getElementsByTagName("MsgSignature");
-
-			String encrypt = nodelist1.item(0).getTextContent();
-			String msgSignature = nodelist2.item(0).getTextContent();
-			String fromXML = String.format(xmlFormat, encrypt);
-
-			// 第三方收到公众号平台发送的消息
-			String afterDecrpt = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);
-			assertEquals(replyMsg, afterDecrpt);
-		} catch (AesException e) {
-			fail("正常流程，怎么就抛出异常了？？？？？？");
-		}
-	}
-
-	@Test
-	public void testAesEncrypt() {
-		try {
-			WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
-			assertEquals(afterAesEncrypt, pc.encrypt(randomStr, replyMsg));
-		} catch (AesException e) {
-			e.printStackTrace();
-			fail("no异常");
-		}
-	}
-
-	@Test
-	public void testAesEncrypt2() {
-		try {
-			WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
-			assertEquals(afterAesEncrypt2, pc.encrypt(randomStr, replyMsg2));
-
-		} catch (AesException e) {
-			e.printStackTrace();
-			fail("no异常");
-		}
-	}
-
-	@Test
-	public void testIllegalAesKey() {
-		try {
-			new WXBizMsgCrypt(token, "abcde", appId);
-		} catch (AesException e) {
-			assertEquals(AesException.IllegalAesKey, e.getCode());
-			return;
-		}
-		fail("错误流程不抛出异常？？？");
-	}
-
-	@Test
-	public void testValidateSignatureError() throws ParserConfigurationException, SAXException,
-			IOException {
-		try {
-			WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
-			String afterEncrpt = pc.encryptMsg(replyMsg, timestamp, nonce);
-			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-			DocumentBuilder db = dbf.newDocumentBuilder();
-			StringReader sr = new StringReader(afterEncrpt);
-			InputSource is = new InputSource(sr);
-			Document document = db.parse(is);
-
-			Element root = document.getDocumentElement();
-			NodeList nodelist1 = root.getElementsByTagName("Encrypt");
-
-			String encrypt = nodelist1.item(0).getTextContent();
-			String fromXML = String.format(xmlFormat, encrypt);
-			pc.decryptMsg("12345", timestamp, nonce, fromXML); // 这里签名错误
-		} catch (AesException e) {
-			assertEquals(AesException.ValidateSignatureError, e.getCode());
-			return;
-		}
-		fail("错误流程不抛出异常？？？");
-	}
-
-	@Test
-	public void testVerifyUrl() throws AesException {
-		WXBizMsgCrypt wxcpt = new WXBizMsgCrypt("QDG6eK",
-				"jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C", "wx5823bf96d3bd56c7");
-		String verifyMsgSig = "5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3";
-		String timeStamp = "1409659589";
-		String nonce = "263014780";
-		String echoStr = "P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ==";
-		wxcpt.verifyUrl(verifyMsgSig, timeStamp, nonce, echoStr);
-		// 只要不抛出异常就好
-	}
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/XMLParse.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/XMLParse.java
deleted file mode 100755
index 67d860f..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/XMLParse.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- * 
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- */
-
-// ------------------------------------------------------------------------
-
-package com.github.xiaour.utils;
-
-import java.io.StringReader;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import com.github.xiaour.exception.AesException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-
-/**
- * XMLParse class
- *
- * 提供提取消息格式中的密文及生成回复消息格式的接口.
- */
-class XMLParse {
-
-	/**
-	 * 提取出xml数据包中的加密消息
-	 * @param xmltext 待提取的xml字符串
-	 * @return 提取出的加密消息字符串
-	 * @throws AesException
-	 */
-	public static Object[] extract(String xmltext) throws AesException     {
-		Object[] result = new Object[3];
-		try {
-			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-			DocumentBuilder db = dbf.newDocumentBuilder();
-			StringReader sr = new StringReader(xmltext);
-			InputSource is = new InputSource(sr);
-			Document document = db.parse(is);
-
-			Element root = document.getDocumentElement();
-			NodeList nodelist1 = root.getElementsByTagName("Encrypt");
-
-			result[0] = 0;
-			result[1] = nodelist1.item(0).getTextContent();
-
-			if(root.getElementsByTagName("ToUserName")!=null) {
-				NodeList nodelist2 = root.getElementsByTagName("ToUserName");
-				result[2] = nodelist2.item(0).getTextContent();
-			}
-			return result;
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new AesException(AesException.ParseXmlError);
-		}
-	}
-
-	/**
-	 * 生成xml消息
-	 * @param encrypt 加密后的消息密文
-	 * @param signature 安全签名
-	 * @param timestamp 时间戳
-	 * @param nonce 随机字符串
-	 * @return 生成的xml字符串
-	 */
-	public static String generate(String encrypt, String signature, String timestamp, String nonce) {
-
-		String format = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n"
-				+ "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n"
-				+ "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" + "</xml>";
-		return String.format(format, encrypt, signature, timestamp, nonce);
-
-	}
-}
diff --git a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/Xml2JsonUtil.java b/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/Xml2JsonUtil.java
deleted file mode 100644
index b9b5c4f..0000000
--- a/SpringBootDemoV2/src/main/java/com/github/xiaour/utils/Xml2JsonUtil.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.github.xiaour.utils;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import org.dom4j.*;
-
-import java.util.List;
-
-/**
- * XML转成JSON
- *
- * @ClassName Xml2JsonUtil
- * @author xiaour@github.com
- * @Date 2017年6月13日 下午6:30:00
- * @version V2.0.0
- */
-public class Xml2JsonUtil {
-
-	    /**
-	     * xml转json
-	     * @param xmlStr
-	     * @return
-	     * @throws DocumentException
-	     */
-	    public static JsonObject xml2Json(String xmlStr) throws DocumentException{
-	        Document doc= DocumentHelper.parseText(xmlStr);
-	        JsonObject json=new JsonObject();
-	        dom4j2Json(doc.getRootElement(), json);
-	        return json;
-	    }
-
-	    /**
-	     * xml转json
-	     * @param element
-	     * @param json
-	     */
-	    private static void dom4j2Json(Element element,JsonObject json){
-	        //如果是属性
-	        for(Object o:element.attributes()){
-	            Attribute attr=(Attribute)o;
-	            if(!isEmpty(attr.getValue())){
-	                json.addProperty("@"+attr.getName(), attr.getValue());
-	            }
-	        }
-	        List<Element> chdEl=element.elements();
-	        if(chdEl.isEmpty()&&!isEmpty(element.getText())){//如果没有子元素,只有一个值
-	            json.addProperty(element.getName(), element.getText());
-	        }
-
-	        for(Element e:chdEl){//有子元素
-	            if(!e.elements().isEmpty()){//子元素也有子元素
-                    JsonObject chdjson=new JsonObject();
-	                dom4j2Json(e,chdjson);
-	                Object o=json.get(e.getName());
-	                if(o!=null){
-	                    JsonArray jsona=null;
-	                    if(o instanceof JsonObject){//如果此元素已存在,则转为jsonArray
-                            JsonObject jsono=(JsonObject)o;
-	                        json.remove(e.getName());
-	                        jsona=new JsonArray();
-	                        jsona.add(jsono);
-	                        jsona.add(chdjson);
-	                    }
-	                    if(o instanceof JsonArray){
-	                        jsona=(JsonArray)o;
-	                        jsona.add(chdjson);
-	                    }
-	                    json.add(e.getName(), jsona);
-	                }else{
-	                    if(!chdjson.isJsonNull()){
-	                        json.add(e.getName(), chdjson);
-	                    }
-	                }
-
-
-	            }else{//子元素没有子元素
-	                for(Object o:element.attributes()){
-	                    Attribute attr=(Attribute)o;
-	                    if(!isEmpty(attr.getValue())){
-	                        json.addProperty("@"+attr.getName(), attr.getValue());
-	                    }
-	                }
-	                if(!e.getText().isEmpty()){
-	                    json.addProperty(e.getName(), e.getText());
-	                }
-	            }
-	        }
-	    }
-
-	    private static boolean isEmpty(String str) {
-
-	        if (str == null || str.trim().isEmpty() || "null".equals(str)) {
-	            return true;
-	        }
-	        return false;
-	    }
-
-}
diff --git a/SpringBootDemoV2/src/main/resources/application.yml b/SpringBootDemoV2/src/main/resources/application.yml
deleted file mode 100644
index c1dbf67..0000000
--- a/SpringBootDemoV2/src/main/resources/application.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-spring:
-  banner:
-    image:
-      location: static/banner.png
-duck:
-   duckName: DonDonald Fauntleroy Duck
-   totalCount: 1
-
-server:
-  servlet:
-    context-path: /xiaour-dubbo
-  port: 8081
-dubbo:
-  scan:
-    base-packages: com.github.xiaour.service
-  application:
-    id: xiaour-provider
-    name: xiaour-provider
-  registry:
-    address: zookeeper://127.0.0.1:2181
-    id: my-registry
-  protocol:
-    id: dubbo
-    name: dubbo
-    port: 20880
\ No newline at end of file
diff --git a/SpringBootDemoV2/src/main/resources/static/banner.png b/SpringBootDemoV2/src/main/resources/static/banner.png
deleted file mode 100644
index 427c3eb..0000000
Binary files a/SpringBootDemoV2/src/main/resources/static/banner.png and /dev/null differ
diff --git a/SpringBootDemoV2/src/test/java/com/github/xiaour/SpringBootDemoV2ApplicationTests.java b/SpringBootDemoV2/src/test/java/com/github/xiaour/SpringBootDemoV2ApplicationTests.java
deleted file mode 100644
index a91a70c..0000000
--- a/SpringBootDemoV2/src/test/java/com/github/xiaour/SpringBootDemoV2ApplicationTests.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.github.xiaour;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SpringBootDemoV2ApplicationTests {
-
-	@Test
-	public void contextLoads() {
-	}
-
-}
diff --git a/SpringBootDemoV3/.gitignore b/SpringBootDemoV3/.gitignore
deleted file mode 100644
index 549e00a..0000000
--- a/SpringBootDemoV3/.gitignore
+++ /dev/null
@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/
diff --git a/SpringBootDemoV3/pom.xml b/SpringBootDemoV3/pom.xml
deleted file mode 100644
index 110db5f..0000000
--- a/SpringBootDemoV3/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>3.2.3</version>
-		<relativePath/> <!-- lookup parent from repository -->
-	</parent>
-
-	<groupId>com.github.xiaour</groupId>
-	<artifactId>springbootv3</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<name>SpringBootDemoV3</name>
-	<description>Demo project for Spring Boot</description>
-	<packaging>jar</packaging>
-
-	<properties>
-		<java.version>17</java.version>
-	</properties>
-
-	<dependencies>
-
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>io.github.xiaour</groupId>
-			<artifactId>easy-export</artifactId>
-			<version>1.0.1-RELEASE</version>
-		</dependency>
-
-		<dependency>
-			<groupId>com.alibaba</groupId>
-			<artifactId>easyexcel</artifactId>
-			<version>2.2.3</version>
-		</dependency>
-
-	</dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</build>
-
-</project>
diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/SpringBootDemoV3Application.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/SpringBootDemoV3Application.java
deleted file mode 100644
index 7b98f02..0000000
--- a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/SpringBootDemoV3Application.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.xiaour.spring.boot;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class SpringBootDemoV3Application {
-
-	public static void main(String[] args) {
-		SpringApplication.run(SpringBootDemoV3Application.class, args);
-		//System.out.println(Math.max(10,11));
-	}
-
-
-}
diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/controller/CatController.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/controller/CatController.java
deleted file mode 100644
index d740815..0000000
--- a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/controller/CatController.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.xiaour.spring.boot.controller;
-
-import com.xiaour.spring.boot.entity.PageIndex;
-import com.xiaour.spring.boot.entity.PageInfo;
-import com.xiaour.spring.boot.service.CatService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/cat")
-public class CatController {
-
-    private CatService catService;
-
-    @Autowired
-    public CatController(CatService catService) {
-        this.catService = catService;
-    }
-
-    @GetMapping("list")
-    public PageInfo getCatList() {
-        PageIndex index = new PageIndex();
-        index.setPageIndex(1);
-        index.setPageSize(30);
-        return catService.getCatList(index);
-    }
-
-
-
-
-
-}
diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/Cat.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/Cat.java
deleted file mode 100644
index 5aef16e..0000000
--- a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/Cat.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.xiaour.spring.boot.entity;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-
-public class Cat {
-
-    /**
-     * 宠物昵称
-     */
-    @ExcelProperty(value = "昵称")
-    private String nickName;
-
-    /**
-     * 年龄
-     */
-    @ExcelProperty(value = "年龄")
-    private Integer age;
-
-    /**
-     * 品种
-     */
-    @ExcelProperty(value = "品种")
-    private String category;
-
-    public Cat() {
-    }
-
-    public Cat(String nickName, Integer age, String category) {
-        this.nickName = nickName;
-        this.age = age;
-        this.category = category;
-    }
-
-    public String getNickName() {
-        return nickName;
-    }
-
-    public Cat setNickName(String nickName) {
-        this.nickName = nickName;
-        return this;
-    }
-
-    public Integer getAge() {
-        return age;
-    }
-
-    public Cat setAge(Integer age) {
-        this.age = age;
-        return this;
-    }
-
-    public String getCategory() {
-        return category;
-    }
-
-    public Cat setCategory(String category) {
-        this.category = category;
-        return this;
-    }
-}
diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageIndex.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageIndex.java
deleted file mode 100644
index abaf3dc..0000000
--- a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageIndex.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.xiaour.spring.boot.entity;
-
-public class PageIndex {
-
-    private Integer  pageIndex;
-
-    private Integer  pageSize;
-
-    public Integer getPageIndex() {
-        return pageIndex;
-    }
-
-    public void setPageIndex(Integer pageIndex) {
-        this.pageIndex = pageIndex;
-    }
-
-    public Integer getPageSize() {
-        return pageSize;
-    }
-
-    public void setPageSize(Integer pageSize) {
-        this.pageSize = pageSize;
-    }
-}
diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageInfo.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageInfo.java
deleted file mode 100644
index 53fafdd..0000000
--- a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/entity/PageInfo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.xiaour.spring.boot.entity;
-
-import java.util.List;
-
-public class PageInfo {
-
-    private List<?> list;
-
-    private Integer total;
-
-    public List<?> getList() {
-        return list;
-    }
-
-    public void setList(List<?> list) {
-        this.list = list;
-    }
-
-    public Integer getTotal() {
-        return total;
-    }
-
-    public void setTotal(Integer total) {
-        this.total = total;
-    }
-}
diff --git a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/service/CatService.java b/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/service/CatService.java
deleted file mode 100644
index ba1b8c1..0000000
--- a/SpringBootDemoV3/src/main/java/com/xiaour/spring/boot/service/CatService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.xiaour.spring.boot.service;
-
-import com.github.xiaour.easyexport.annotation.EasyExport;
-import com.github.xiaour.easyexport.annotation.EasyExportSingle;
-import com.xiaour.spring.boot.entity.Cat;
-import com.xiaour.spring.boot.entity.PageIndex;
-import com.xiaour.spring.boot.entity.PageInfo;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@EasyExport
-@Service
-public class CatService {
-
-    /**
-     * 这里主要是模拟数据和分页参数的一些主要逻辑
-     * @param pageIndex 模拟的分页参数，这里面是伪代码，无需实现
-     * @return
-     */
-    @EasyExportSingle(value = "小猫明细",modelClass = Cat.class)
-    public PageInfo getCatList(PageIndex pageIndex){
-
-        PageInfo page = new PageInfo();
-
-        List<Cat> list = new ArrayList<>();
-
-        //下面提供了两种实体赋值方式，大家可以试试那种更方便
-        Cat cat1 = new Cat("咪咪",1,"波斯猫");
-
-        Cat cat2 = new Cat().setNickName("汤姆").setAge(6).setCategory("金渐层");
-
-        list.add(cat1);
-
-        list.add(cat2);
-
-        page.setList(list);
-
-        page.setTotal(list.size());
-
-        return page;
-    }
-}
diff --git a/SpringBootDemoV3/src/main/resources/application.properties b/SpringBootDemoV3/src/main/resources/application.properties
deleted file mode 100644
index a39567d..0000000
--- a/SpringBootDemoV3/src/main/resources/application.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-server.servlet.context-path= /demo3
-
-#??easyexport
-easyexport.enabled=true
-#??????
-#??????????
-easyexport.fetch.page.size=5000
-#???????????????????true???????
-easyexport.file.delete=true
-#???????????????????Sheet????sheet???150000
-easyexport.file.sheet.size=15000
-#????
-easyexport.field.page.number=pageIndex
-#???????
-easyexport.field.page.size=pageSize
\ No newline at end of file
diff --git a/SpringBootDemoV3/src/test/java/com/xiaour/spring/boot/SpringBootDemoV3ApplicationTests.java b/SpringBootDemoV3/src/test/java/com/xiaour/spring/boot/SpringBootDemoV3ApplicationTests.java
deleted file mode 100644
index bbe9d67..0000000
--- a/SpringBootDemoV3/src/test/java/com/xiaour/spring/boot/SpringBootDemoV3ApplicationTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.xiaour.spring.boot;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class SpringBootDemoV3ApplicationTests {
-
-	@Test
-	void contextLoads() {
-	}
-
-}
diff --git a/SpringBootKafkaDemo/SpringBootKafkaDemo.iml b/SpringBootKafkaDemo/SpringBootKafkaDemo.iml
deleted file mode 100644
index 7e471dc..0000000
--- a/SpringBootKafkaDemo/SpringBootKafkaDemo.iml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="Spring" name="Spring">
-      <configuration />
-    </facet>
-    <facet type="web" name="Web">
-      <configuration>
-        <webroots />
-        <sourceRoots>
-          <root url="file://$MODULE_DIR$/src/main/java" />
-          <root url="file://$MODULE_DIR$/src/main/resources" />
-        </sourceRoots>
-      </configuration>
-    </facet>
-  </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
-    <output url="file://$MODULE_DIR$/target/classes" />
-    <output-test url="file://$MODULE_DIR$/target/test-classes" />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/target" />
-    </content>
-    <orderEntry type="jdk" jdkName="JDK1.8" jdkType="JavaSDK" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.10.0" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
-    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.19" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.kafka:spring-kafka:2.1.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.kafka:kafka-clients:1.0.1" level="project" />
-    <orderEntry type="library" name="Maven: org.lz4:lz4-java:1.4" level="project" />
-    <orderEntry type="library" name="Maven: org.xerial.snappy:snappy-java:1.1.4" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.9.1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.15.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.7.11" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.7.11" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.5.1" level="project" />
-    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.2" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.5" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.5" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.5" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.5" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.5" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.0.2.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.31" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.31" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.31" level="project" />
-    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.9.Final" level="project" />
-    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
-    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.0.6.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.0.6.RELEASE" level="project" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/SpringBootKafkaDemo/pom.xml b/SpringBootKafkaDemo/pom.xml
deleted file mode 100644
index b0eb7a0..0000000
--- a/SpringBootKafkaDemo/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?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>com.github.xiaour</groupId>
-	<artifactId>KafkaDemo</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>jar</packaging>
-
-	<name>kafka</name>
-	<description>Kafka Demo project for Spring Boot</description>
-
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.0.2.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
-	</parent>
-
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<java.version>1.8</java.version>
-	</properties>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.kafka</groupId>
-			<artifactId>spring-kafka</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>com.google.code.gson</groupId>
-			<artifactId>gson</artifactId>
-			<version>2.8.9</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-			<version>2.5.12</version>
-		</dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-            <version>5.2.22.RELEASE</version>
-        </dependency>
-
-    </dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</build>
-
-
-</project>
diff --git a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/KafkaApplication.java b/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/KafkaApplication.java
deleted file mode 100644
index d7b1149..0000000
--- a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/KafkaApplication.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.xiaour.spring.boot.kafka;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class KafkaApplication {
-
-	public static void main(String[] args) {
-		SpringApplication.run(KafkaApplication.class, args);
-	}
-}
diff --git a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/consumer/Consumer.java b/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/consumer/Consumer.java
deleted file mode 100644
index 95a11f9..0000000
--- a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/consumer/Consumer.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.xiaour.spring.boot.kafka.consumer;
-
-import org.apache.kafka.clients.consumer.ConsumerRecord;
-import org.springframework.kafka.annotation.KafkaListener;
-import org.springframework.stereotype.Component;
-
-import java.util.Optional;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/5/22 15:03
- */
-@Component
-public class Consumer {
-
-    @KafkaListener(topics = {"test"})
-    public void listen(ConsumerRecord<?, ?> record){
-
-        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
-
-        if (kafkaMessage.isPresent()) {
-
-            Object message = kafkaMessage.get();
-            System.out.println("---->"+record);
-            System.out.println("---->"+message);
-
-        }
-
-    }
-}
diff --git a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/Message.java b/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/Message.java
deleted file mode 100644
index dd5c544..0000000
--- a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/Message.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.xiaour.spring.boot.kafka.producer;
-
-import java.util.Date;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/5/22 15:09
- */
-public class Message {
-
-    private String id;
-
-    private String msg;
-
-    private Date sendTime;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-
-    public Date getSendTime() {
-        return sendTime;
-    }
-
-    public void setSendTime(Date sendTime) {
-        this.sendTime = sendTime;
-    }
-}
diff --git a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/Producer.java b/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/Producer.java
deleted file mode 100644
index 772ed9c..0000000
--- a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/Producer.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.xiaour.spring.boot.kafka.producer;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.kafka.core.KafkaTemplate;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-import java.util.UUID;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/5/22 15:07
- */
-@Component
-public class Producer {
-
-    @Autowired
-    private KafkaTemplate kafkaTemplate;
-
-    private static Gson gson = new GsonBuilder().create();
-
-    //发送消息方法
-    public void send() {
-        Message message = new Message();
-        message.setId("KFK_"+System.currentTimeMillis());
-        message.setMsg(UUID.randomUUID().toString());
-        message.setSendTime(new Date());
-        kafkaTemplate.send("test", gson.toJson(message));
-    }
-
-}
diff --git a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/SendController.java b/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/SendController.java
deleted file mode 100644
index 6c66e13..0000000
--- a/SpringBootKafkaDemo/src/main/java/com/xiaour/spring/boot/kafka/producer/SendController.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.xiaour.spring.boot.kafka.producer;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @Author: Xiaour
- * @Description:
- * @Date: 2018/5/22 15:13
- */
-@RestController
-@RequestMapping("/kafka")
-public class SendController {
-
-    @Autowired
-    private Producer producer;
-
-    @RequestMapping(value = "/send")
-    public String send() {
-        producer.send();
-        return "{\"code\":0}";
-    }
-}
diff --git a/SpringBootKafkaDemo/src/main/resources/application.yml b/SpringBootKafkaDemo/src/main/resources/application.yml
deleted file mode 100644
index 0b19627..0000000
--- a/SpringBootKafkaDemo/src/main/resources/application.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-server:
-  servlet:
-    context-path: /
-  port: 8080
-spring:
-  kafka:
-    bootstrap-servers: 127.0.0.1:9092
-    #生产者的配置，大部分我们可以使用默认的，这里列出几个比较重要的属性
-    producer:
-      #每批次发送消息的数量
-      batch-size: 16
-      #设置大于0的值将使客户端重新发送任何数据，一旦这些数据发送失败。注意，这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序，如果这两个消息记录都是发送到同一个partition，则第一个消息失败第二个发送成功，则第二条消息会比第一条消息出现要早。
-      retries: 0
-      #producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度，producer会阻塞或者抛出异常，以“block.on.buffer.full”来表明。这项设置将和producer能够使用的总内存相关，但并不是一个硬性的限制，因为不是producer使用的所有内存都是用于缓存。一些额外的内存会用于压缩（如果引入压缩机制），同样还有一些用于维护请求。
-      buffer-memory: 33554432
-      #key序列化方式
-      key-serializer: org.apache.kafka.common.serialization.StringSerializer
-      value-serializer: org.apache.kafka.common.serialization.StringSerializer
-    #消费者的配置
-    consumer:
-      #Kafka中没有初始偏移或如果当前偏移在服务器上不再存在时,默认区最新 ，有三个选项 【latest, earliest, none】
-      auto-offset-reset: latest
-      #是否开启自动提交
-      enable-auto-commit: true
-      #自动提交的时间间隔
-      auto-commit-interval: 100
-      #key的解码方式
-      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
-      #value的解码方式
-      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
-      #在/usr/local/etc/kafka/consumer.properties中有配置
-      group-id: test-consumer-group
-
diff --git a/SpringBootKafkaDemo/src/test/java/com/xiaour/spring/boot/kafka/KafkaApplicationTests.java b/SpringBootKafkaDemo/src/test/java/com/xiaour/spring/boot/kafka/KafkaApplicationTests.java
deleted file mode 100644
index 924f1ba..0000000
--- a/SpringBootKafkaDemo/src/test/java/com/xiaour/spring/boot/kafka/KafkaApplicationTests.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.xiaour.spring.boot.kafka;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class KafkaApplicationTests {
-
-	@Test
-	public void contextLoads() {
-	}
-
-}
diff --git a/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/producer/Message.class b/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/producer/Message.class
deleted file mode 100644
index 9b6edd7..0000000
Binary files a/SpringBootKafkaDemo/target/classes/com/xiaour/spring/boot/kafka/producer/Message.class and /dev/null differ
diff --git a/SpringBootRocketMqDemo/.gitignore b/SpringBootRocketMqDemo/.gitignore
deleted file mode 100644
index 82eca33..0000000
--- a/SpringBootRocketMqDemo/.gitignore
+++ /dev/null
@@ -1,25 +0,0 @@
-/target/
-!.mvn/wrapper/maven-wrapper.jar
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/build/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
\ No newline at end of file
diff --git a/SpringBootRocketMqDemo/.mvn/wrapper/maven-wrapper.jar b/SpringBootRocketMqDemo/.mvn/wrapper/maven-wrapper.jar
deleted file mode 100644
index 9cc84ea..0000000
Binary files a/SpringBootRocketMqDemo/.mvn/wrapper/maven-wrapper.jar and /dev/null differ
diff --git a/SpringBootRocketMqDemo/.mvn/wrapper/maven-wrapper.properties b/SpringBootRocketMqDemo/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100644
index b573bb5..0000000
--- a/SpringBootRocketMqDemo/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1 +0,0 @@
-distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
diff --git a/SpringBootRocketMqDemo/SpringbootRocketMQ.md b/SpringBootRocketMqDemo/SpringbootRocketMQ.md
deleted file mode 100644
index 18cafd7..0000000
--- a/SpringBootRocketMqDemo/SpringbootRocketMQ.md
+++ /dev/null
@@ -1,278 +0,0 @@
----
-title: Springboot集成ROcketMQ
-categories: [Springboot],[MQ]
-date: 2018-05-23 10:43:12
-tags:
----
-
-<img src="http://rocketmq.apache.org/assets/images/bright/rmq-feature-lowlatency.png" alt=post-cover"">
-
-有一段时间没有写东西了，最近工作和生活上发生了一些变化，总算是有点时间来歇一歇自己想要分享的，2018年转眼过去一多半了，想来自己今年好像也没有太多的积累。尽可能的让自己能够多做一些技术上的事情。
-
-从开篇写Springboot系列的教程已经一年多了，Springboot也从1.x升级到了2.x，目前教程中的代码部分大多都是使用Springboot2.x了。
-
-Springboot从开始到流行起来的到现在的风靡是很多开发越来越简单，经我调查发现大部分开发人员都已经开始在生产环境使用，除了一些老的项目或者难以改变技术架构的项目外，Springboot可以说是作为JAVA开发人员必不可少的伙伴了。
-
-如今大多数的JAVA系组件都开发除了自己的boot版本，有一些做的比较优秀，也有一些做的不是那么好，本篇要介绍的RocketMQ在boot上做的就不算很好，有很多开发者自己封装了boot版本，官方可能会在未来出现更好版本的boot；但是没有boot版没关系，咱们自己几行配置也是完全可以做到快速使用RocketMQ了。
-
-在这里我要提一下官方版本的RocketMQ4.3，因为本文就是基于RocketMQ4.3的，"RocketMQ4.3正式发布支持了分布式事务"。这一消息让很多开发者跃跃欲试，以前rocketMQ没有将分布式事务作为一个发行版的部分，基本都是开发者自己实现的事务部分。下面我们从最基础的安装RocketMQ开始，再介绍代码中如何实现基本的配置。
-
-###下载安装RocketMQ
-
-```
-# wget http://mirrors.hust.edu.cn/apache/rocketmq/4.3.0/rocketmq-all-4.3.0-source-release.zip
-# unzip rocketmq-all-4.3.0-source-release.zip
-# mvn -Prelease-all -DskipTests clean install -U
-# cd distribution/target/apache-rocketmq
-```
-
-###启动NameServer，启动后NameServer的端口是9876，请确保自己的9876端口未被占用
-```
-# nohup sh bin/mqnamesrv &
-# tail -f ~/logs/rocketmqlogs/namesrv.log
-  The Name Server boot success...
-```
-
-### 启动Broker
-```
-# nohup sh bin/mqbroker -n localhost:9876 &
-# tail -f ~/logs/rocketmqlogs/broker.log 
-  The broker[%s, 172.30.30.233:10911] boot success...
-```
-启动成功了之后我们就可以创建新的Springboot项目了，如何创建项目这里我就不在介绍了，Eclipse和Idea的方式大同小异，目录结构基本都是一样的。
-
-首先每次说到Springboot的项目都是要先讲讲这个boot的配置，按照惯例呢我先给配置，配置上都有每一行配置的注释，大家可以参考。
-### 代码示例pom.xml
-```
-    <parent>
-    		<groupId>org.springframework.boot</groupId>
-    		<artifactId>spring-boot-starter-parent</artifactId>
-    		<version>2.0.4.RELEASE</version>
-    		<relativePath/>
-    	</parent>
-    
-    	<properties>
-    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    		<java.version>1.8</java.version>
-    	</properties>
-    
-    	<dependencies>
-    		<dependency>
-    			<groupId>org.springframework.boot</groupId>
-    			<artifactId>spring-boot-starter-data-redis</artifactId>
-    		</dependency>
-    
-    		<dependency>
-    			<groupId>org.springframework.boot</groupId>
-    			<artifactId>spring-boot-starter-test</artifactId>
-    			<scope>test</scope>
-    		</dependency>
-    
-            <!--RocketMQ的dependency，目前官方还没有boot-starter-->
-    		<dependency>
-    			<groupId>org.apache.rocketmq</groupId>
-    			<artifactId>rocketmq-client</artifactId>
-    			<version>4.3.0</version>
-    		</dependency>
-    		
-    		<dependency>
-    			<groupId>org.springframework.boot</groupId>
-    			<artifactId>spring-boot-starter-web</artifactId>
-    			<version>RELEASE</version>
-    		</dependency>
-    	</dependencies>
-```
-###application.yml
-```
-apache:
-  rocketmq:
-#消费者的配置
-    consumer:
-      pushConsumer: XiaourPushConsumer
-#生产者的配置
-    producer:
-      producerGroup: Xiaour
-#Nameserver的地址,这里配置你MQ安装的机器上的IP就好，我这里在本机安装的
-    namesrvAddr: 127.0.0.1:9876
- ```
- 
-###Producer 消息生产者
-```java
-import org.apache.commons.lang3.time.StopWatch;
-import org.apache.rocketmq.client.exception.MQBrokerException;
-import org.apache.rocketmq.client.exception.MQClientException;
-import org.apache.rocketmq.client.producer.DefaultMQProducer;
-import org.apache.rocketmq.client.producer.SendResult;
-import org.apache.rocketmq.common.message.Message;
-import org.apache.rocketmq.remoting.common.RemotingHelper;
-import org.apache.rocketmq.remoting.exception.RemotingException;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.io.UnsupportedEncodingException;
-
-/**
- * @Author: Xiaour
- * @Description:生产者
- * @Date: 2018/8/9 14:52
- */
-
-@Component
-public class Producer {
-
-    /**
-     * 生产者的组名
-     */
-    @Value("${apache.rocketmq.producer.producerGroup}")
-    private String producerGroup;
-
-    private DefaultMQProducer producer;
-    /**
-     * NameServer 地址
-     */
-    @Value("${apache.rocketmq.namesrvAddr}")
-    private String namesrvAddr;
-
-    @PostConstruct
-    public void defaultMQProducer() {
-
-        //生产者的组名
-        producer= new DefaultMQProducer(producerGroup);
-        //指定NameServer地址，多个地址以 ; 隔开
-        producer.setNamesrvAddr(namesrvAddr);
-        producer.setVipChannelEnabled(false);
-        try {
-            producer.start();
-            System.out.println("-------->:producer启动了");
-        } catch (MQClientException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public String send(String topic,String tags,String body) throws InterruptedException, RemotingException, MQClientException, MQBrokerException, UnsupportedEncodingException {
-        Message message = new Message(topic, tags, body.getBytes(RemotingHelper.DEFAULT_CHARSET));
-        StopWatch stop = new StopWatch();
-        stop.start();
-        SendResult result = producer.send(message);
-        System.out.println("发送响应：MsgId:" + result.getMsgId() + "，发送状态:" + result.getSendStatus());
-        stop.stop();
-        return "{\"MsgId\":\""+result.getMsgId()+"\"}";
-    }
-}
-```
-###Consumer 消息消费者
-
-```java
-import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
-import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
-import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
-import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
-import org.apache.rocketmq.common.message.Message;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.CommandLineRunner;
-
-import org.springframework.stereotype.Component;
-
-/**
- * @Author: Xiaour
- * @Description:消费者
- * @Date: 2018/8/9 14:51
- */
-
-@Component
-public class Consumer implements CommandLineRunner {
-
-    /**
-     * 消费者
-     */
-    @Value("${apache.rocketmq.consumer.pushConsumer}")
-    private String pushConsumer;
-
-    /**
-     * NameServer 地址
-     */
-    @Value("${apache.rocketmq.namesrvAddr}")
-    private String namesrvAddr;
-
-
-    /**
-     * 初始化RocketMq的监听信息，渠道信息
-     */
-    public void messageListener(){
-
-        DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("SpringBootRocketMqGroup");
-
-        consumer.setNamesrvAddr(namesrvAddr);
-        try {
-
-            // 订阅PushTopic下Tag为push的消息,都订阅消息
-            consumer.subscribe("PushTopic", "push");
-
-            // 程序第一次启动从消息队列头获取数据
-            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
-            //可以修改每次消费消息的数量，默认设置是每次消费一条
-            consumer.setConsumeMessageBatchMaxSize(1);
-
-            //在此监听中消费信息，并返回消费的状态信息
-            consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
-
-                // 会把不同的消息分别放置到不同的队列中
-                for(Message msg:msgs){
-
-                    System.out.println("接收到了消息："+new String(msg.getBody()));
-                }
-                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
-            });
-
-            consumer.start();
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Override
-    public void run(String... args) throws Exception {
-        this.messageListener();
-    }
-}
-```
-###测试接口用例
-这里我们用一个接口来测试我们的消息发送会不会被消费者接收。
-
-```java
-@RestController
-public class TestController {
-    @Autowired
-    private Producer producer;
-
-    @RequestMapping("/push")
-    public String pushMsg(String msg){
-        try {
-            return producer.send("PushTopic","push",msg);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        } catch (RemotingException e) {
-            e.printStackTrace();
-        } catch (MQClientException e) {
-            e.printStackTrace();
-        } catch (MQBrokerException e) {
-            e.printStackTrace();
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-        return "ERROR";
-    }
-}
-```
-在Springboot启动类启动后,在浏览器访问http://127.0.0.1:8080/push?hello，页面提示{"MsgId":"AC100AB660C618B4AAC2XXXXXXXX"}就表示消息发送成功啦。
-我们可以再IDE控制台中看到输出的结果，
-```text
-发送响应：MsgId:AC100AB660C618B4AAC2XXXXXXXX，发送状态:SEND_OK
-接收到了消息：hello
-```
-这时候我们的整合基本上就完成啦。 
-
-具体代码可以在github获取哦。SpringBootRocketMqDemo@github](https://github.com/xiaour/SpringBootDemo/tree/master/SpringBootRocketMqDemo)获取哦。
\ No newline at end of file
diff --git a/SpringBootRocketMqDemo/mvnw b/SpringBootRocketMqDemo/mvnw
deleted file mode 100755
index 5bf251c..0000000
--- a/SpringBootRocketMqDemo/mvnw
+++ /dev/null
@@ -1,225 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# ----------------------------------------------------------------------------
-
-# ----------------------------------------------------------------------------
-# Maven2 Start Up Batch script
-#
-# Required ENV vars:
-# ------------------
-#   JAVA_HOME - location of a JDK home dir
-#
-# Optional ENV vars
-# -----------------
-#   M2_HOME - location of maven2's installed home dir
-#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
-#     e.g. to debug Maven itself, use
-#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-# ----------------------------------------------------------------------------
-
-if [ -z "$MAVEN_SKIP_RC" ] ; then
-
-  if [ -f /etc/mavenrc ] ; then
-    . /etc/mavenrc
-  fi
-
-  if [ -f "$HOME/.mavenrc" ] ; then
-    . "$HOME/.mavenrc"
-  fi
-
-fi
-
-# OS specific support.  $var _must_ be set to either true or false.
-cygwin=false;
-darwin=false;
-mingw=false
-case "`uname`" in
-  CYGWIN*) cygwin=true ;;
-  MINGW*) mingw=true;;
-  Darwin*) darwin=true
-    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
-    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
-    if [ -z "$JAVA_HOME" ]; then
-      if [ -x "/usr/libexec/java_home" ]; then
-        export JAVA_HOME="`/usr/libexec/java_home`"
-      else
-        export JAVA_HOME="/Library/Java/Home"
-      fi
-    fi
-    ;;
-esac
-
-if [ -z "$JAVA_HOME" ] ; then
-  if [ -r /etc/gentoo-release ] ; then
-    JAVA_HOME=`java-config --jre-home`
-  fi
-fi
-
-if [ -z "$M2_HOME" ] ; then
-  ## resolve links - $0 may be a link to maven's home
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-
-  saveddir=`pwd`
-
-  M2_HOME=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  M2_HOME=`cd "$M2_HOME" && pwd`
-
-  cd "$saveddir"
-  # echo Using m2 at $M2_HOME
-fi
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched
-if $cygwin ; then
-  [ -n "$M2_HOME" ] &&
-    M2_HOME=`cygpath --unix "$M2_HOME"`
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-  [ -n "$CLASSPATH" ] &&
-    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
-fi
-
-# For Migwn, ensure paths are in UNIX format before anything is touched
-if $mingw ; then
-  [ -n "$M2_HOME" ] &&
-    M2_HOME="`(cd "$M2_HOME"; pwd)`"
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
-  # TODO classpath?
-fi
-
-if [ -z "$JAVA_HOME" ]; then
-  javaExecutable="`which javac`"
-  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
-    # readlink(1) is not available as standard on Solaris 10.
-    readLink=`which readlink`
-    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
-      if $darwin ; then
-        javaHome="`dirname \"$javaExecutable\"`"
-        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
-      else
-        javaExecutable="`readlink -f \"$javaExecutable\"`"
-      fi
-      javaHome="`dirname \"$javaExecutable\"`"
-      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
-      JAVA_HOME="$javaHome"
-      export JAVA_HOME
-    fi
-  fi
-fi
-
-if [ -z "$JAVACMD" ] ; then
-  if [ -n "$JAVA_HOME"  ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-      # IBM's JDK on AIX uses strange locations for the executables
-      JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-      JAVACMD="$JAVA_HOME/bin/java"
-    fi
-  else
-    JAVACMD="`which java`"
-  fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
-  echo "Error: JAVA_HOME is not defined correctly." >&2
-  echo "  We cannot execute $JAVACMD" >&2
-  exit 1
-fi
-
-if [ -z "$JAVA_HOME" ] ; then
-  echo "Warning: JAVA_HOME environment variable is not set."
-fi
-
-CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
-
-# traverses directory structure from process work directory to filesystem root
-# first directory with .mvn subdirectory is considered project base directory
-find_maven_basedir() {
-
-  if [ -z "$1" ]
-  then
-    echo "Path not specified to find_maven_basedir"
-    return 1
-  fi
-
-  basedir="$1"
-  wdir="$1"
-  while [ "$wdir" != '/' ] ; do
-    if [ -d "$wdir"/.mvn ] ; then
-      basedir=$wdir
-      break
-    fi
-    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
-    if [ -d "${wdir}" ]; then
-      wdir=`cd "$wdir/.."; pwd`
-    fi
-    # end of workaround
-  done
-  echo "${basedir}"
-}
-
-# concatenates all lines of a file
-concat_lines() {
-  if [ -f "$1" ]; then
-    echo "$(tr -s '\n' ' ' < "$1")"
-  fi
-}
-
-BASE_DIR=`find_maven_basedir "$(pwd)"`
-if [ -z "$BASE_DIR" ]; then
-  exit 1;
-fi
-
-export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
-echo $MAVEN_PROJECTBASEDIR
-MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin; then
-  [ -n "$M2_HOME" ] &&
-    M2_HOME=`cygpath --path --windows "$M2_HOME"`
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
-  [ -n "$CLASSPATH" ] &&
-    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
-  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
-    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
-fi
-
-WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-exec "$JAVACMD" \
-  $MAVEN_OPTS \
-  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/SpringBootRocketMqDemo/mvnw.cmd b/SpringBootRocketMqDemo/mvnw.cmd
deleted file mode 100644
index 019bd74..0000000
--- a/SpringBootRocketMqDemo/mvnw.cmd
+++ /dev/null
@@ -1,143 +0,0 @@
-@REM ----------------------------------------------------------------------------
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements.  See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership.  The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License.  You may obtain a copy of the License at
-@REM
-@REM    http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied.  See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM ----------------------------------------------------------------------------
-
-@REM ----------------------------------------------------------------------------
-@REM Maven2 Start Up Batch script
-@REM
-@REM Required ENV vars:
-@REM JAVA_HOME - location of a JDK home dir
-@REM
-@REM Optional ENV vars
-@REM M2_HOME - location of maven2's installed home dir
-@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
-@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
-@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
-@REM     e.g. to debug Maven itself, use
-@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-@REM ----------------------------------------------------------------------------
-
-@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
-@echo off
-@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
-@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
-
-@REM set %HOME% to equivalent of $HOME
-if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
-
-@REM Execute a user defined script before this one
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
-@REM check for pre script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
-if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
-:skipRcPre
-
-@setlocal
-
-set ERROR_CODE=0
-
-@REM To isolate internal variables from possible post scripts, we use another setlocal
-@setlocal
-
-@REM ==== START VALIDATION ====
-if not "%JAVA_HOME%" == "" goto OkJHome
-
-echo.
-echo Error: JAVA_HOME not found in your environment. >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-:OkJHome
-if exist "%JAVA_HOME%\bin\java.exe" goto init
-
-echo.
-echo Error: JAVA_HOME is set to an invalid directory. >&2
-echo JAVA_HOME = "%JAVA_HOME%" >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-@REM ==== END VALIDATION ====
-
-:init
-
-@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
-@REM Fallback to current working directory if not found.
-
-set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
-IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
-
-set EXEC_DIR=%CD%
-set WDIR=%EXEC_DIR%
-:findBaseDir
-IF EXIST "%WDIR%"\.mvn goto baseDirFound
-cd ..
-IF "%WDIR%"=="%CD%" goto baseDirNotFound
-set WDIR=%CD%
-goto findBaseDir
-
-:baseDirFound
-set MAVEN_PROJECTBASEDIR=%WDIR%
-cd "%EXEC_DIR%"
-goto endDetectBaseDir
-
-:baseDirNotFound
-set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
-cd "%EXEC_DIR%"
-
-:endDetectBaseDir
-
-IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
-
-@setlocal EnableExtensions EnableDelayedExpansion
-for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
-@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
-
-:endReadAdditionalConfig
-
-SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
-
-set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
-set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
-if ERRORLEVEL 1 goto error
-goto end
-
-:error
-set ERROR_CODE=1
-
-:end
-@endlocal & set ERROR_CODE=%ERROR_CODE%
-
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
-@REM check for post script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
-if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
-:skipRcPost
-
-@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
-if "%MAVEN_BATCH_PAUSE%" == "on" pause
-
-if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
-
-exit /B %ERROR_CODE%
diff --git a/SpringBootRocketMqDemo/pom.xml b/SpringBootRocketMqDemo/pom.xml
deleted file mode 100644
index d02e456..0000000
--- a/SpringBootRocketMqDemo/pom.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?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>com.github.xiaour</groupId>
-	<artifactId>rocketmqDemo</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<name>SpringBootRocketmqDemo</name>
-	<description>Demo project for RocketMQ</description>
-	<packaging>jar</packaging>
-
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.0.4.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
-	</parent>
-
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<java.version>1.8</java.version>
-	</properties>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-redis</artifactId>
-		</dependency>
-
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-
-
-		<dependency>
-			<groupId>org.apache.rocketmq</groupId>
-			<artifactId>rocketmq-client</artifactId>
-			<version>4.3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-			<version>2.5.12</version>
-		</dependency>
-	</dependencies>
-
-
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</build>
-
-
-</project>
diff --git a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/SpringBootRocketmqDemoApplication.java b/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/SpringBootRocketmqDemoApplication.java
deleted file mode 100644
index 3c4eb4c..0000000
--- a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/SpringBootRocketmqDemoApplication.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.xiaour.spring.boot.rocketmq;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class SpringBootRocketmqDemoApplication {
-
-	public static void main(String[] args) {
-		SpringApplication.run(SpringBootRocketmqDemoApplication.class, args);
-	}
-}
diff --git a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/consumer/Consumer.java b/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/consumer/Consumer.java
deleted file mode 100644
index d895994..0000000
--- a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/consumer/Consumer.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.xiaour.spring.boot.rocketmq.consumer;
-
-import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
-import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
-import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
-import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
-import org.apache.rocketmq.common.message.Message;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.CommandLineRunner;
-
-import org.springframework.stereotype.Component;
-
-/**
- * @Author: Xiaour
- * @Description:消费者
- * @Date: 2018/8/9 14:51
- */
-
-@Component
-public class Consumer implements CommandLineRunner {
-
-    /**
-     * 消费者
-     */
-    @Value("${apache.rocketmq.consumer.pushConsumer}")
-    private String pushConsumer;
-
-    /**
-     * NameServer 地址
-     */
-    @Value("${apache.rocketmq.namesrvAddr}")
-    private String namesrvAddr;
-
-
-    /**
-     * 初始化RocketMq的监听信息，渠道信息
-     */
-    public void messageListener(){
-
-        DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("SpringBootRocketMqGroup");
-
-        consumer.setNamesrvAddr(namesrvAddr);
-        try {
-
-            // 订阅PushTopic下Tag为push的消息,都订阅消息
-            consumer.subscribe("PushTopic", "push");
-
-            // 程序第一次启动从消息队列头获取数据
-            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
-            //可以修改每次消费消息的数量，默认设置是每次消费一条
-            consumer.setConsumeMessageBatchMaxSize(1);
-
-            //在此监听中消费信息，并返回消费的状态信息
-            consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
-
-                // 会把不同的消息分别放置到不同的队列中
-                for(Message msg:msgs){
-
-                    System.out.println("接收到了消息："+new String(msg.getBody()));
-                }
-                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
-            });
-
-            consumer.start();
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Override
-    public void run(String... args) throws Exception {
-        this.messageListener();
-    }
-}
diff --git a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/controller/TestController.java b/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/controller/TestController.java
deleted file mode 100644
index 9bf1eb0..0000000
--- a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/controller/TestController.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.xiaour.spring.boot.rocketmq.controller;
-
-import com.xiaour.spring.boot.rocketmq.producer.Producer;
-import org.apache.rocketmq.client.exception.MQBrokerException;
-import org.apache.rocketmq.client.exception.MQClientException;
-import org.apache.rocketmq.remoting.exception.RemotingException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.io.UnsupportedEncodingException;
-
-/**
- * @Author: Xiaour
- * @Description: 这里是为了测试
- * @Date: 2018/8/9 15:16
- */
-@RestController
-public class TestController {
-    @Autowired
-    private Producer producer;
-
-    @RequestMapping("/push")
-    public String pushMsg(String msg){
-        try {
-            return producer.send("PushTopic","push",msg);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        } catch (RemotingException e) {
-            e.printStackTrace();
-        } catch (MQClientException e) {
-            e.printStackTrace();
-        } catch (MQBrokerException e) {
-            e.printStackTrace();
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-        return "ERROR";
-    }
-}
diff --git a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/producer/Producer.java b/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/producer/Producer.java
deleted file mode 100644
index cb7440b..0000000
--- a/SpringBootRocketMqDemo/src/main/java/com/xiaour/spring/boot/rocketmq/producer/Producer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.xiaour.spring.boot.rocketmq.producer;
-
-import org.apache.commons.lang3.time.StopWatch;
-import org.apache.rocketmq.client.exception.MQBrokerException;
-import org.apache.rocketmq.client.exception.MQClientException;
-import org.apache.rocketmq.client.producer.DefaultMQProducer;
-import org.apache.rocketmq.client.producer.SendResult;
-import org.apache.rocketmq.common.message.Message;
-import org.apache.rocketmq.remoting.common.RemotingHelper;
-import org.apache.rocketmq.remoting.exception.RemotingException;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.io.UnsupportedEncodingException;
-
-/**
- * @Author: Xiaour
- * @Description:生产者
- * @Date: 2018/8/9 14:52
- */
-
-@Component
-public class Producer {
-
-    /**
-     * 生产者的组名
-     */
-    @Value("${apache.rocketmq.producer.producerGroup}")
-    private String producerGroup;
-
-    private DefaultMQProducer producer;
-    /**
-     * NameServer 地址
-     */
-    @Value("${apache.rocketmq.namesrvAddr}")
-    private String namesrvAddr;
-
-    @PostConstruct
-    public void defaultMQProducer() {
-
-        //生产者的组名
-        producer= new DefaultMQProducer(producerGroup);
-        //指定NameServer地址，多个地址以 ; 隔开
-        producer.setNamesrvAddr(namesrvAddr);
-        producer.setVipChannelEnabled(false);
-        try {
-            producer.start();
-            System.out.println("-------->:producer启动了");
-        } catch (MQClientException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public String send(String topic,String tags,String body) throws InterruptedException, RemotingException, MQClientException, MQBrokerException, UnsupportedEncodingException {
-        Message message = new Message(topic, tags, body.getBytes(RemotingHelper.DEFAULT_CHARSET));
-        StopWatch stop = new StopWatch();
-        stop.start();
-        SendResult result = producer.send(message);
-        System.out.println("发送响应：MsgId:" + result.getMsgId() + "，发送状态:" + result.getSendStatus());
-        stop.stop();
-        return "{\"MsgId\":\""+result.getMsgId()+"\"}";
-    }
-
-}
diff --git a/SpringBootRocketMqDemo/src/main/resources/application.yml b/SpringBootRocketMqDemo/src/main/resources/application.yml
deleted file mode 100644
index 115f0d8..0000000
--- a/SpringBootRocketMqDemo/src/main/resources/application.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-apache:
-  rocketmq:
-    consumer:
-      pushConsumer: XiaourPushConsumer
-    producer:
-      producerGroup: Xiaour
-    namesrvAddr: 192.168.2.5:9876
\ No newline at end of file
diff --git a/SpringBootRocketMqDemo/src/test/java/com/xiaour/spring/boot/rocketmq/SpringBootRocketmqDemoApplicationTests.java b/SpringBootRocketMqDemo/src/test/java/com/xiaour/spring/boot/rocketmq/SpringBootRocketmqDemoApplicationTests.java
deleted file mode 100644
index 94a38e5..0000000
--- a/SpringBootRocketMqDemo/src/test/java/com/xiaour/spring/boot/rocketmq/SpringBootRocketmqDemoApplicationTests.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.xiaour.spring.boot.rocketmq;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SpringBootRocketmqDemoApplicationTests {
-
-	@Test
-	public void contextLoads() {
-	}
-
-}
diff --git a/SpringWebFluxDemo/.gitignore b/SpringWebFluxDemo/.gitignore
deleted file mode 100644
index ba5cb5c..0000000
--- a/SpringWebFluxDemo/.gitignore
+++ /dev/null
@@ -1,26 +0,0 @@
-HELP.md
-/target/
-!.mvn/wrapper/maven-wrapper.jar
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-/build/
diff --git a/SpringWebFluxDemo/pom.xml b/SpringWebFluxDemo/pom.xml
deleted file mode 100644
index f98a09c..0000000
--- a/SpringWebFluxDemo/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?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>
-    <parent>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.1.3.RELEASE</version>
-        <relativePath/> <!-- lookup parent from repository -->
-    </parent>
-    <groupId>com.github.xiaour</groupId>
-    <artifactId>fluxDemo</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>SpringWebFluxDemo</name>
-    <description>Demo project for Web Flux</description>
-
-    <properties>
-        <java.version>1.8</java.version>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-webflux</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/SpringWebFluxDemoApplication.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/SpringWebFluxDemoApplication.java
deleted file mode 100644
index d13a52c..0000000
--- a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/SpringWebFluxDemoApplication.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.xiaour.flux;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class SpringWebFluxDemoApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(SpringWebFluxDemoApplication.class, args);
-    }
-
-}
diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/HelloWorlController.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/HelloWorlController.java
deleted file mode 100644
index f45ae29..0000000
--- a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/HelloWorlController.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.github.xiaour.flux.controller;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import reactor.core.publisher.Mono;
-
-/**
- * @Author: cityuu@163.com
- * @Date: 2019-02-27 16:26
- * @version: v1.0
- * @Description: 入门案例
- */
-
-@RestController
-@RequestMapping("/")
-public class HelloWorlController {
-
-        @GetMapping("hello")
-        public Mono<String> hello(){
-            return Mono.just("hello World!");
-        }
-
-}
diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java
deleted file mode 100644
index dbbba46..0000000
--- a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/SSEController.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.github.xiaour.flux.controller;
-
-import io.netty.util.internal.ThreadLocalRandom;
-import org.springframework.http.codec.ServerSentEvent;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import reactor.core.publisher.Flux;
-import reactor.util.function.Tuples;
-
-import java.time.Duration;
-
-/**
- * @Author: cityuu@163.com
- * @Date: 2019-02-27 16:37
- * @version: v1.0
- * @Description: 服务器推送接口
- */
-@RestController
-@RequestMapping("/sse")
-public class SSEController {
-
-    @GetMapping("/randomNumbers")
-    public Flux<ServerSentEvent<Integer>> randomNumbers() {
-        return Flux.interval(Duration.ofSeconds(2))
-                .map(seq -> Tuples.of(seq, ThreadLocalRandom.current().nextInt()))
-                .map(data -> ServerSentEvent.<Integer>builder()
-                        .event("random")
-                        .id(Long.toString(data.getT1()))
-                        .data(data.getT2())
-                        .build());
-    }
-
-}
diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/UserController.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/UserController.java
deleted file mode 100644
index 823df9b..0000000
--- a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/controller/UserController.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.github.xiaour.flux.controller;
-
-import com.github.xiaour.flux.entity.User;
-import com.github.xiaour.flux.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-
-import java.util.Objects;
-
-/**
- * @Author: cityuu@163.com
- * @Date: 2019-02-27 16:33
- * @version: v1.0
- * @Description: 用户管理接口
- */
-@RestController
-@RequestMapping("/user")
-public class UserController {
-
-    @Autowired
-    private UserService userService;
-
-
-    @GetMapping("")
-    public Flux<User> list() {
-        return userService.list();
-    }
-
-    @GetMapping("/{id}")
-    public Mono<User> getById(@PathVariable("id") final String id) {
-        return this.userService.getById(id);
-    }
-
-    @PostMapping("")
-    public Mono<User> create(@RequestBody final User user) {
-        return this.userService.createOrUpdate(user);
-    }
-
-    @PutMapping("/{id}")
-    public Mono<User>  update(@PathVariable("id") final String id, @RequestBody final User user) {
-        Objects.requireNonNull(user);
-        user.setId(id);
-        return this.userService.createOrUpdate(user);
-    }
-
-    @DeleteMapping("/{id}")
-    public Mono<User>  delete(@PathVariable("id") final String id) {
-        return this.userService.delete(id);
-    }
-
-}
diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/entity/User.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/entity/User.java
deleted file mode 100644
index 9a9f9a5..0000000
--- a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/entity/User.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.github.xiaour.flux.entity;
-
-/**
- * @Author: cityuu@suiyueyule.com
- * @Date: 2019-02-27 16:31
- * @version: v1.0
- * @Description:
- */
-public class User {
-
-    private String id;
-
-    private String name;
-
-    private Integer age;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Integer getAge() {
-        return age;
-    }
-
-    public void setAge(Integer age) {
-        this.age = age;
-    }
-}
diff --git a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/service/UserService.java b/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/service/UserService.java
deleted file mode 100644
index 0d39680..0000000
--- a/SpringWebFluxDemo/src/main/java/com/github/xiaour/flux/service/UserService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.github.xiaour.flux.service;
-
-import com.github.xiaour.flux.entity.User;
-import org.springframework.stereotype.Service;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * @Author: cityuu@suiyueyule.com
- * @Date: 2019-02-27 16:30
- * @version: v1.0
- * @Description:
- */
-@Service
-public class UserService {
-
-    private final Map<String, User> data = new ConcurrentHashMap<>();
-
-    public  Flux<User> list() {
-        return Flux.fromIterable(this.data.values());
-    }
-
-    public Flux<User> getById(final Flux<String> ids) {
-        return ids.flatMap(id -> Mono.justOrEmpty(this.data.get(id)));
-    }
-
-    public Mono<User> getById(final String id) {
-        return Mono.justOrEmpty(this.data.get(id));
-    }
-
-    public Mono<User> createOrUpdate(final User user) {
-        this.data.put(user.getId(), user);
-        return Mono.just(user);
-    }
-
-    public Mono<User> delete(final String id) {
-        return Mono.justOrEmpty(this.data.remove(id));
-    }
-
-
-}
diff --git a/SpringWebFluxDemo/src/main/resources/application.properties b/SpringWebFluxDemo/src/main/resources/application.properties
deleted file mode 100644
index 8b13789..0000000
--- a/SpringWebFluxDemo/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/SpringWebFluxDemo/src/test/java/com/github/xiaour/flux/SpringWebFluxDemoApplicationTests.java b/SpringWebFluxDemo/src/test/java/com/github/xiaour/flux/SpringWebFluxDemoApplicationTests.java
deleted file mode 100644
index d2b3784..0000000
--- a/SpringWebFluxDemo/src/test/java/com/github/xiaour/flux/SpringWebFluxDemoApplicationTests.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.github.xiaour.flux;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SpringWebFluxDemoApplicationTests {
-
-    @Test
-    public void contextLoads() {
-    }
-
-}
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 028c717..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<groupId>com.github.xiaour</groupId>
-	<artifactId>com.xiaour.spring.boot</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<name>SpringBootDemo</name>
-	<description>SpringBoot set demo</description>
-	<packaging>pom</packaging>
-
-	<modules>
-		<module>SpringBootDemo</module>
-		<module>SpringBootDemoV2</module>
-		<module>SpringBootDemoV3</module>
-		<module>SpringBootKafkaDemo</module>
-		<module>SpringBootRocketMqDemo</module>
-		<module>SpringWebFluxDemo</module>
-	</modules>
-
-
-	<properties>
-		<java.version>17</java.version>
-	</properties>
-
-</project>
