diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b4f66076247712dbd69e9ec586a827b3bd8fcd7b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+workspace
+.project
+.classpath
+*.settings
+.idea
+*.class
+target/
\ No newline at end of file
diff --git a/README.md b/README.md
index 1f72977000d98263ff7a40099e416a7257eda425..a47a413c7657ba8ce96dac4c1780eec41e577a53 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,33 @@
-# shop-Mall
 
+#### 技术选型
+- 核心框架:Spring Boot 2.15
+- 安全框架:Apache Shiro 1.4
+- 视图框架:Spring MVC 5.0
+- 持久层框架:MyBatis 3.3,mybatis-plus3.1.2
+- 数据库连接池:Druid 1.1.13
+- 日志管理:SLF4J 1.7
+- 后端校验框架:Hibernate Validator
+<br> 
+
+#### 安装教程
+- git clone下载源码
+- 安装lombok插件
+- 修改配置文件application-dev.yml
+- 启动项目
+- Swagger文档路径:http://localhost:8080/swagger-ui.html
+<br> 
+
+#### 项目结构
+```
+├─wisenergy-parent 父模块
+│  ├─wisenergy-common 通用模块
+│  ├─wisenergy-model 实体类
+│  ├─wisenergy-mapper DAO接口
+│  ├─wisenergy-service 业务实现
+│  ├─wisenergy-web-admin web接口
+└─
+```
+
+#### 部署
+- 打包:maven clean package
+- 启动:nohup java -jar wisenergy-web-admin-1.0.0-SNAPSHOT.jar > admin.log 2>&1 &
\ No newline at end of file
diff --git a/db.zip b/db.zip
new file mode 100644
index 0000000000000000000000000000000000000000..5191f40aff8f52c283e8871a675d323fb5836404
Binary files /dev/null and b/db.zip differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3246ef406e7addd9e4d8b455cb2ca7316230f14e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,156 @@
+<?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.5.RELEASE</version>
+    </parent>
+    <groupId>cn.wisenergy</groupId>
+    <artifactId>wisenergy-parent</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0-SNAPSHOT</version>
+    <name>${project.artifactId}</name>
+
+    <!-- 项目模块 -->
+    <modules>
+        <module>wisenergy-common</module>
+        <module>wisenergy-model</module>
+            <module>wisenergy-mapper</module>
+        <module>wisenergy-service</module>
+        <module>wisenergy-web-admin</module>
+    </modules>
+
+    <!--POM属性变量-->
+    <properties>
+        <!-- 文件拷贝时的编码 -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <!-- 编译时的编码 -->
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+        <!--模块版本管理-->
+        <projectDevMode>SNAPSHOT</projectDevMode>
+        <moduleVersion.wisenergy-common>1.0.0-${projectDevMode}</moduleVersion.wisenergy-common>
+        <moduleVersion.wisenergy-model>1.0.0-${projectDevMode}</moduleVersion.wisenergy-model>
+        <moduleVersion.wisenergy-mapper>1.0.0-${projectDevMode}</moduleVersion.wisenergy-mapper>
+        <moduleVersion.wisenergy-service>1.0.0-${projectDevMode}</moduleVersion.wisenergy-service>
+        <moduleVersion.wisenergy-web-admin>1.0.0-${projectDevMode}</moduleVersion.wisenergy-web-admin>
+    </properties>
+
+    <!-- JAR 依赖 -->
+    <dependencies>
+        <!-- Apache Commons-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-pool</groupId>
+            <artifactId>commons-pool</artifactId>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- lombok简化代码,需要本地配置 -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <!--谷歌工具包,对Java API的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解-->
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>22.0</version>
+        </dependency>
+        <!-- 阿里巴巴json工具类 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.68</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.6</version>
+        </dependency>
+
+    </dependencies>
+
+    <!-- MVN构建插件 -->
+    <build>
+        <plugins>
+            <!-- 自动跳过单元测试 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.21.0</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+
+            <!--编译lib中的JAR文件到WAR包中-->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.5.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+</project>
\ No newline at end of file
diff --git a/wisenergy-common/.gitignore b/wisenergy-common/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b4f66076247712dbd69e9ec586a827b3bd8fcd7b
--- /dev/null
+++ b/wisenergy-common/.gitignore
@@ -0,0 +1,7 @@
+workspace
+.project
+.classpath
+*.settings
+.idea
+*.class
+target/
\ No newline at end of file
diff --git a/wisenergy-common/pom.xml b/wisenergy-common/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1208563c10d7a30c038f9dcc715a4b2ddb86c885
--- /dev/null
+++ b/wisenergy-common/pom.xml
@@ -0,0 +1,149 @@
+<?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>
+        <artifactId>wisenergy-parent</artifactId>
+        <groupId>cn.wisenergy</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>wisenergy-common</artifactId>
+    <version>${moduleVersion.wisenergy-common}</version>
+    <packaging>jar</packaging>
+
+    <!-- 项目依赖 -->
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <!--undertow容器-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <!--spring aop依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.2</version>
+        </dependency>
+        <!--配置文件处理器-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.2.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- Mysql -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!-- Mybatis -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.1.2</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.baomidou</groupId>
+                    <artifactId>mybatis-plus-generator</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- Druid -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.22</version>
+        </dependency>
+        <!-- Redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <!-- Secret key  -->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.54</version>
+        </dependency>
+        <!-- Swagger配置 -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+        </dependency>
+        <!-- shiro -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-core</artifactId>
+            <version>1.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>1.4.0</version>
+        </dependency>
+        <!-- POI -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>4.6.7</version>
+        </dependency>
+    </dependencies>
+
+    <!-- MAVEN构建 -->
+    <build>
+        <finalName>${project.artifactId}-${project.version}</finalName>
+    </build>
+</project>
\ No newline at end of file
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/annotation/DataAuth.java b/wisenergy-common/src/main/java/cn/wisenergy/common/annotation/DataAuth.java
new file mode 100644
index 0000000000000000000000000000000000000000..36f86b2a4a2b2980d6826db4de66b6a73d7954b6
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/annotation/DataAuth.java
@@ -0,0 +1,14 @@
+package cn.wisenergy.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据权限注解,标注在方法上
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataAuth {
+
+	String value() default "dataAuthList";
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/annotation/SysLog.java b/wisenergy-common/src/main/java/cn/wisenergy/common/annotation/SysLog.java
new file mode 100644
index 0000000000000000000000000000000000000000..e340aa90a8af226954b3762ddb09f715bfae9270
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/annotation/SysLog.java
@@ -0,0 +1,14 @@
+package cn.wisenergy.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 系统日志注解
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface SysLog {
+
+	String value() default "";
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/camera/CameraConfig.java b/wisenergy-common/src/main/java/cn/wisenergy/common/camera/CameraConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..29dc54d58c1738bfdfe8d4b87d4fd22ac5500f71
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/camera/CameraConfig.java
@@ -0,0 +1,24 @@
+package cn.wisenergy.common.camera;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author jiawei
+ */
+@Configuration
+@ConfigurationProperties(prefix = "camera.isc.api")
+@Data
+public class CameraConfig {
+
+    private String appKey;
+
+    private String appSecret;
+
+    private String host;
+
+    private String path;
+
+    private String protocol="https";
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/config/RedisConfig.java b/wisenergy-common/src/main/java/cn/wisenergy/common/config/RedisConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..584c366f46ce0c91781cf912cbc1990863141231
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/config/RedisConfig.java
@@ -0,0 +1,54 @@
+package cn.wisenergy.common.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.*;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * Redis配置
+ *
+ */
+@Configuration
+public class RedisConfig {
+    @Autowired
+    private RedisConnectionFactory factory;
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate() {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
+        redisTemplate.setValueSerializer(new StringRedisSerializer());
+        redisTemplate.setConnectionFactory(factory);
+        return redisTemplate;
+    }
+
+    @Bean
+    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForHash();
+    }
+
+    @Bean
+    public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
+        return redisTemplate.opsForValue();
+    }
+
+    @Bean
+    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForList();
+    }
+
+    @Bean
+    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForSet();
+    }
+
+    @Bean
+    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForZSet();
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/config/cors/CORSFilter.java b/wisenergy-common/src/main/java/cn/wisenergy/common/config/cors/CORSFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..19ae88e96b63bf611d6ee233aa4d4494ae509ead
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/config/cors/CORSFilter.java
@@ -0,0 +1,35 @@
+package cn.wisenergy.common.config.cors;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * 跨域过滤器设置
+ *
+ * @author wyy
+ * @date 2019-09-04 14:31
+ */
+@Configuration
+public class CORSFilter {
+
+    /**
+     * 前置跨域设置【过滤器方式先于拦截器生效】
+     *
+     * @return
+     */
+    @Bean
+    public CorsFilter corsFilter() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.addAllowedOrigin("*");
+        config.setAllowCredentials(true);
+        config.addAllowedMethod("*");
+        config.addAllowedHeader("*");
+        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
+        configSource.registerCorsConfiguration("/**", config);
+        return new CorsFilter(configSource);
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/config/file/FileUploadConfig.java b/wisenergy-common/src/main/java/cn/wisenergy/common/config/file/FileUploadConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ba93de5d6b97b9cb06fff1381ca9579bcd51d7d
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/config/file/FileUploadConfig.java
@@ -0,0 +1,29 @@
+package cn.wisenergy.common.config.file;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.multipart.MultipartResolver;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+/**
+ * 文件上传配置
+ * @author wyy
+ * @date 2019-08-22 19:20
+ */
+@Configuration
+public class FileUploadConfig {
+
+    /**
+     * 重新定义文件上传对象【springBoot request转化成MultipartHttpServletRequest】
+     * @return
+     */
+    @Bean(name = "multipartResolver")
+    public MultipartResolver multipartResolver() {
+        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
+        resolver.setDefaultEncoding("UTF-8");
+        resolver.setResolveLazily(true);
+        resolver.setMaxInMemorySize(40960);
+        resolver.setMaxUploadSize(512 * 1024 * 1024);
+        return resolver;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CacheConstants.java b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CacheConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..5858fdfd3e0e24882ce798da16bdc949eab333d4
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CacheConstants.java
@@ -0,0 +1,12 @@
+package cn.wisenergy.common.constant;
+
+/**
+ * 缓存常量
+ */
+public interface CacheConstants {
+
+    /**
+     * 菜单详情
+     */
+    String MENU_DETAILS = "menu_details";
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CommonAttributes.java b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CommonAttributes.java
new file mode 100644
index 0000000000000000000000000000000000000000..75db7f8d752d8f70387e5b1f1b2a306f0f9c0070
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CommonAttributes.java
@@ -0,0 +1,25 @@
+package cn.wisenergy.common.constant;
+
+/**
+ * 公共参数
+ */
+public final class CommonAttributes {
+
+	/** 日期格式配比 */
+	public static final String[] DATE_PATTERNS = new String[] { "HH:mm", "yyyy", "yyyy-MM", "yyyyMM", "yyyy/MM", "yyyy-MM-dd", "yyyyMMdd", "yyyy/MM/dd","yyyy-MM-dd HH:mm", "yyyyMMddHHmm", "yyyy/MM/dd HH:mm", "yyyy-MM-dd HH:mm:ss", "yyyyMMddHHmmss", "yyyy/MM/dd HH:mm:ss" };
+
+	/** xml文件路径 */
+	public static final String XML_PATH = "/app_config.xml";
+
+	/** properties文件路径 */
+	public static final String PROPERTIES_PATH = "/app_config.properties";
+
+	/**
+	 * 不可实例化
+	 */
+	private CommonAttributes() {
+	}
+
+	public static final Integer NUM_ONE = 1;
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CommonConstants.java b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CommonConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..38d5569d211baeae35ad72b42789554e9fb384ae
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/CommonConstants.java
@@ -0,0 +1,14 @@
+package cn.wisenergy.common.constant;
+
+/**
+ * 通用常量
+ *
+ */
+public interface CommonConstants {
+
+	/**
+     * 超级管理员ID
+     */
+	String SUPER_ADMIN = "1";
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/constant/IscCameraConstants.java b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/IscCameraConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..355a769d83e29f985854308063be3ef29926004a
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/IscCameraConstants.java
@@ -0,0 +1,118 @@
+package cn.wisenergy.common.constant;
+
+public interface IscCameraConstants {
+
+    /**
+     * 查询编码设备列表v2
+     * 根据条件查询目录下有权限的编码设备列表。当返回字段对应的值为空时,该字段不返回。
+     * 综合安防管理平台iSecure Center V1.4及以上版本
+     */
+    String encodeDevice_search = "";
+
+    /**
+     * 根据区域编码、资源操作权限码分页获取当前区域下(不包含子区域)有权限的编码设备列表,主要用于逐层获取区域下的编码设备信息。
+     * 综合安防管理平台iSecure Center v1.3及以上版本
+     */
+    String encodeDevice_subResources = "/api/resource/v1/encodeDevice/subResources";
+
+    /**
+     * 根据编号获取监控点详细信息
+     * 获取单个监控点信息是指根据监控点唯一标识来获取指定的监控点信息。
+     */
+    String cameras_indexCode = "/api/resource/v1/cameras/indexCode";
+
+    /**
+     * 分页获取监控点资源
+     */
+    String cameras = "/api/resource/v1/cameras";
+
+    /**
+     * 获取监控点预览取流URLv2
+     * 综合安防管理平台iSecure Center V1.4及以上版本
+     */
+    String previewURLs = "/api/video/v2/cameras/previewURLs";
+
+    /**
+     * 获取监控点回放取流URLv2
+     * 综合安防管理平台iSecure Center V1.4及以上版本
+     */
+    String playbackURLs = "/api/video/v2/cameras/playbackURLs";
+
+    /**
+     * 查询对讲URL
+     * 该接口用于获取监控点的对讲url,为保证数据的安全性,URL设有有效时间,有效时间为5分钟。
+     * 综合安防管理平台iSecure Center V1.2及以上版本
+     */
+    String talkURLs = "/api/video/v1/cameras/talkURLs";
+
+    /**
+     * 手动抓图
+     * 该接口用于手动触发设备抓图,返回图片的地址,抓图前请确保平台上已配置图片存储信息。抓图时间为触发手动抓图命令的时间。
+     * 综合安防管理平台iSecure Center V1.2及以上版本
+     */
+    String manualCapture = "/api/video/v1/manualCapture";
+
+    /**
+     * 通过向中心存储接入服务下发锁定/解锁指定编码器,指定时间段的录像。
+     * 综合安防管理平台iSecure Center V1.4及以上版本
+     */
+    String lock = "/api/video/v1/record/lock";
+
+
+    /**
+     * 开始手动录像
+     * 综合安防管理平台iSecure Center V1.3及以上版本
+     */
+    String manualRecordStart = "/api/video/v1/manualRecord/start";
+
+    /**
+     * 停止手动录像
+     * 综合安防管理平台iSecure Center V1.5及以上版本
+     */
+    String manualRecordStop = "/api/video/v1/manualRecord/stop";
+
+    /**
+     * 获取手动录像状态
+     * 综合安防管理平台iSecure Center V1.5及以上版本
+     */
+    String manualRecordStatus = "/api/video/v1/manualRecord/status";
+
+    /**
+     * 查询手动录像编号
+     * 该接口用于根据用户id获取当前用户创建的手动录像任务ID,用于获取手动录像状态和停止手动录像
+     */
+    String manualRecordSearch = "/api/video/v1/manualRecord/taskId/search";
+
+    /**
+     * 根据区域编号获取下一级区域列表v2
+     */
+    String regionsSubRegions = "/api/resource/v2/regions/subRegions";
+
+
+    /**
+     * 获取根区域信息
+     */
+    String regionsRoot = "/api/resource/v1/regions/root";
+
+    /**
+     * 查询区域列表v2
+     */
+    String regionNodes = "/api/irds/v2/region/nodesByParams";
+
+    /**
+     * 根据区域编号获取下级监控点列表
+     */
+    String regionIndexCodeCameras = "/api/resource/v1/regions/regionIndexCode/cameras";
+
+    /**
+     * 获取监控点在线状态
+     */
+    String onlineCamera = "/api/nms/v1/online/camera/get";
+
+    /**
+     * 获取编码设备在线状态
+     */
+    String onlineEncodeDevice = "/api/nms/v1/online/encode_device/get";
+
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/constant/RedisConsts.java b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/RedisConsts.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2b8719fcae7522b2bab348085c361c2d72cc8dc
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/constant/RedisConsts.java
@@ -0,0 +1,28 @@
+package cn.wisenergy.common.constant;
+
+/**
+ * redis 常量
+ */
+public class RedisConsts {
+	/****************************** 后台管理端缓存设置开始 ******************************/
+	// 系统setting
+	public static final String SYSTEM_SETTING = "system:setting:setting";
+	// 接口Token参数设置
+	public final static String ADMIN_ACCTNAME = "admin:acctName:";
+	public final static int ADMIN_ACCTNAME_EXPIRE = 60 * 60 * 24 * 30;
+	/****************************** 后台管理端缓存设置结束 ******************************/
+
+	/************************** shiro 设置开始 ******************************** */
+	// shiroSessionçš„redis-key
+	public static final String ADMIN_SHIRO_SESSION_KEY = "admin:shiro_redis_session:";
+	// shiroSession的过期时间,单位:秒,此值须大于spring-cache.xml中的全局session有效期
+	public static final int ADMIN_SHIRO_SESSION_EXPIRE = 3600;
+	// shiroRealmçš„redis-key
+	public static final String ADMIN_SHIRO_REALM_KEY = "admin:shiro_redis_realm:";
+	// shiroRealm的过期时间,单位:秒,设置与SHIRO_SESSION_EXPIRE相等
+	public static final int ADMIN_SHIRO_REALM_EXPIRE = 3600;
+	/************************** shiro 设置结束 ******************************** */
+
+	public static final String JWT_ACCESS_TOKEN = "jwt_access_token_";
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/enums/MenuTypeEnum.java b/wisenergy-common/src/main/java/cn/wisenergy/common/enums/MenuTypeEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..d466d438e06dbbe26153b510a0a0c89e2b179c57
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/enums/MenuTypeEnum.java
@@ -0,0 +1,29 @@
+package cn.wisenergy.common.enums;
+
+/**
+ * 菜单类型枚举
+ */
+public enum MenuTypeEnum {
+    /**
+     * 目录
+     */
+    CATALOG(0),
+    /**
+     * 菜单
+     */
+    MENU(1),
+    /**
+     * 按钮
+     */
+    BUTTON(2);
+
+    private int value;
+
+    MenuTypeEnum(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/enums/RespCodeEnum.java b/wisenergy-common/src/main/java/cn/wisenergy/common/enums/RespCodeEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..c57593dbc932fc14f1376073c88144532c2676e3
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/enums/RespCodeEnum.java
@@ -0,0 +1,98 @@
+package cn.wisenergy.common.enums;
+
+/**
+ * 响应码基类
+ *
+ * @author wyy
+ * @data 2019/08/15
+ */
+public enum RespCodeEnum {
+    /********************* SpringMBoot 系统异常 **********************/
+    MIS_REQ_PARAM("400", "请求参数丢失"),
+    NO_AUTH_REQUEST("401", "未授权"),
+    REJECT_REQUEST("403", "未授权"),
+    AUTH_ERROR("40104", "权限认证失败"),
+    RESOURCE_NOT_FOUND("404", "请求的资源不存在"),
+    METHOD_NOT_SUPPORTED("405", "不支持的请求方法"),
+    MEDIA_TYPE_NOT_ACCEPT("406", "无法接受请求中的媒体类型"),
+    REQUEST_TIME_OUT("408", "无法接受请求中的媒体类型"),
+    MEDIA_TYPE_NOT_SUPPORTED("415", "不支持的媒体类型"),
+    SERVER_ERROR("500", "获取数据异常"),
+
+    /* ******************** 业务自定义异常 ********************* */
+    RSA_PRIVATE_KEY_ERROR("1001", "生成RSA非对称加密公钥出错"),
+    RSA_NOT_EXIST("1002", "RSA非对称加密公钥不存在"),
+    RSA_DECRYPTION_ERROR("1003", "RSA解密错误"),
+    REQUIRED_IDENTIFY_NOT_EXIST("1005", "请求标识对象不存在"),
+    ILLEGAL_PARAMETER("1006", "非法参数"),
+    MISS_PARAMETER("1007", "缺少必须的参数"),
+    ACCT_NOT_EXIST("1007", "账号不存在"),
+    ACCT_OR_ACCOPASS_ERROR("1009", "账号或密码错误"),
+    ACCT_HAS_FROZEN("1010", "账号已冻结"),
+    NOT_LOGIN_ERROR("1011", "用户未登录"),
+    CAPTCHA_CODE_INVALID("1012", "验证码失效"),
+    CAPTCHA_CODE_ERROR("1013", "验证码错误"),
+    NO_DATA("1004", "数据为空"),
+    CAPTCHA_EXIST("1005", "验证码已发送,请稍等"),
+    TOKEN_IS_NOT_MISSING("40101", "TOKEN无效"),
+    TOKEN_IS_NOT_TIMEOUT("40102", "TOKEN超时,请检查TOKEN的有效期"),
+    TOKEN_IS_NOT_ERROR("40103", "TOKEN解析异常"),
+    DATA_AUTH_UNAUTHORIZED("40105", "数据权限不足"),
+    USERNAME_IS_NOT_ERROR("2001", "用户名不能为空"),
+    USERNAME_IS_EXIST_ERROR("2002", "用户名已存在"),
+    EMPLOYEE_IS_NULL_ERROR("2003", "人员编号不能为空"),
+    EMPLOYEE_IS_NOT_EXIST_ERROR("2004", "该员工不存在"),
+    USER_EXIST_EMPLOYEE_ERROR("2005", "该用户已分配人员"),
+    USER_IS_NOT_EXIST_ERROR("2006", "该用户不存在"),
+    USER_IS_NOT_ERROR("2000", "用户不能为空");
+
+
+    /**
+     * 错误编码
+     */
+    public String code;
+
+    /**
+     * 错误编码信息
+     */
+    public String msg;
+
+    /**
+     * 构造函数
+     *
+     * @param code 编码
+     * @param msg  编码信息
+     */
+    RespCodeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    /**
+     * 获取编码
+     */
+    public String getCode() {
+        return code;
+    }
+
+    /**
+     * 设置编码
+     */
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    /**
+     * 获取编码信息
+     */
+    public String getMsg() {
+        return msg;
+    }
+
+    /**
+     * 设置编码信息
+     */
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseException.java b/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseException.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c4a578c442ff24fda02517701f869ec1627d1a2
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseException.java
@@ -0,0 +1,38 @@
+package cn.wisenergy.common.expection;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 自定义异常
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+public class BaseException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+	
+    private String msg;
+    private int code = 500;
+    
+    public BaseException(String msg) {
+		super(msg);
+		this.msg = msg;
+	}
+	
+	public BaseException(String msg, Throwable e) {
+		super(msg, e);
+		this.msg = msg;
+	}
+	
+	public BaseException(String msg, int code) {
+		super(msg);
+		this.msg = msg;
+		this.code = code;
+	}
+	
+	public BaseException(String msg, int code, Throwable e) {
+		super(msg, e);
+		this.msg = msg;
+		this.code = code;
+	}
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseExceptionHandler.java b/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseExceptionHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f8c37608b24e18e01eba076b4e3484534b122e7
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseExceptionHandler.java
@@ -0,0 +1,46 @@
+package cn.wisenergy.common.expection;
+
+import cn.wisenergy.common.utils.R;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.AuthorizationException;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+/**
+ * 统一异常处理器
+ * @author lut
+ */
+@Slf4j
+@RestControllerAdvice
+public class BaseExceptionHandler {
+
+	/**
+	 * 处理自定义异常
+	 */
+	@ExceptionHandler(BaseException.class)
+	public R<?> handleRRException(BaseException e){
+		log.error(e.getMessage(), e);
+		return R.error(e.getCode(), e.getMsg());
+	}
+
+	@ExceptionHandler(NoHandlerFoundException.class)
+	public R<?> handlerNoFoundException(NoHandlerFoundException e) {
+		log.error(e.getMessage(), e);
+		return R.error(404, "路径不存在,请检查路径是否正确");
+	}
+
+	@ExceptionHandler(DuplicateKeyException.class)
+	public R<?> handleDuplicateKeyException(DuplicateKeyException e){
+		log.error(e.getMessage(), e);
+		return R.error("数据库中已存在该记录");
+	}
+
+	@ExceptionHandler(AuthorizationException.class)
+	public R<?> handleAuthorizationException(AuthorizationException e){
+		log.error(e.getMessage(), e);
+		return R.error("没有权限,请联系管理员授权");
+	}
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/BaseUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/BaseUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..044b49b6547605705ba561026a307292f86af0d7
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/BaseUtil.java
@@ -0,0 +1,182 @@
+package cn.wisenergy.common.utils;
+
+import com.google.common.base.Joiner;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 工具类
+ *
+ * @author lut
+ */
+@Slf4j
+public class BaseUtil {
+
+    /**
+     * 下载文件header头
+     */
+    private static final String FileHeader = "attachment;filename=\"%1$s\";filename*=utf-8''%1$s";
+
+    /**
+     * 无参数url转换成有参url
+     *
+     * @param url
+     * @param params
+     * @return
+     */
+    public static String getParamsUrl(String url, Map<String, Object> params) {
+        if (!params.isEmpty()) {
+            return Joiner.on("?").join(url, Joiner.on("&").join(params.keySet().stream()
+                    .map(o -> String.format("%1$s={%1$s}", o)).collect(Collectors.toList())));
+        }
+        return url;
+    }
+
+    /**
+     * 设置下载文件名称(解决编码问题)
+     *
+     * @param response
+     * @param fileName
+     */
+    public static void setDownloadFileHeader(HttpServletResponse response, String fileName) {
+        // IE8兼容
+        response.setHeader("Cache-Control", "must-revalidate");
+        response.setHeader("Cache-Control", "post-check=0");
+        response.setHeader("Cache-Control", "pre-check=0");
+        // 文件名称
+        response.setContentType("application/force-download");
+        response.setHeader("Content-Disposition", String.format(FileHeader, getEncodeFileName(fileName)));
+    }
+
+    /**
+     * 获取编码文件名称
+     *
+     * @param fileName
+     * @return
+     */
+    private static String getEncodeFileName(String fileName) {
+        try {
+            return URLEncoder.encode(fileName, "utf-8").replaceAll("\\+", "%20");
+        } catch (Exception e) {
+            log.error("文件名转码失败:{}", e);
+        }
+        return fileName;
+    }
+
+
+    /**
+     * 按日历日期增加
+     */
+    public static Date addMonth(Date d1, int month) {
+        // 创建实例
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(d1);
+        //日期
+        calendar.add(Calendar.MONTH, month);
+        // 一个月后的日期(Date类型)
+        Date date = calendar.getTime();
+        return date;
+    }
+
+
+    /**
+     * 按日历日期增加
+     */
+    public static Date addDay(Date d1, int day) {
+        // 创建实例
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(d1);
+        // 一个月后的日期
+        calendar.add(Calendar.DAY_OF_YEAR, day);
+        // 一个月后的日期(Date类型)
+        Date date = calendar.getTime();
+        return date;
+    }
+
+    /**
+     * 日期添加
+     *
+     * @param date
+     * @param day
+     * @return
+     */
+    public static Date addDate(Date date, int day) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.DATE, day);
+        date = cal.getTime();
+        return date;
+    }
+
+    /**
+     * 说明:日期增加一个月,获得一个月后的日期
+     *
+     * @param str1
+     * @return Date
+     */
+    public static Date add1Month(String str1) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        try {
+            return addMonth(sdf.parse(str1), 1);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 说明:日期增加三个月,获得三个月后的日期
+     *
+     * @param str1
+     * @return Date
+     */
+    public static Date add3Month(String str1) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        try {
+            return addMonth(sdf.parse(str1), 3);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 说明:日期增加十二个月,获得一年后的日期
+     */
+    public static Date add1Year(String str1) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        try {
+            return addMonth(sdf.parse(str1), 12);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 通过出生日期获取年龄
+     *
+     * @param birth
+     * @param deadDate
+     * @return
+     */
+    public static int getAgeByBirth(Date birth, Date deadDate) {
+        // 判定出生日期是否存在
+        if (birth != null) {
+            return birth.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
+                    .until(deadDate != null ? deadDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() : LocalDate.now())
+                    .getYears();
+        }
+        return 0;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ByteUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ByteUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..45d7ab87ebd7601bcc6f4507c10a007ae18dbcff
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ByteUtil.java
@@ -0,0 +1,216 @@
+package cn.wisenergy.common.utils;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+
+/**
+ * 字节转换工具类
+ */
+public class ByteUtil {
+
+    /**
+     * 字节数组转字符数组
+     *
+     * @param bytes
+     * @return
+     */
+    public static char[] byteArrTocharArr(byte[] bytes) {
+        Charset cs = Charset.forName("UTF-8");
+        ByteBuffer bb = ByteBuffer.allocate(bytes.length);
+        bb.put(bytes);
+        bb.flip();
+        CharBuffer cb = cs.decode(bb);
+        return cb.array();
+    }
+
+    /**
+     * char数组转Byte数组
+     *
+     * @param chars
+     * @return
+     */
+    public static byte[] charArrToByteArr(char[] chars) {
+        Charset cs = Charset.forName("UTF-8");
+        CharBuffer cb = CharBuffer.allocate(chars.length);
+        cb.put(chars);
+        cb.flip();
+        ByteBuffer bb = cs.encode(cb);
+        return bb.array();
+    }
+
+    public static byte[] hexStringToByte(String hex) {
+        int len = (hex.length() / 2);
+        byte[] result = new byte[len];
+        char[] achar = hex.toCharArray();
+        for (int i = 0; i < len; i++) {
+            int pos = i * 2;
+            result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
+        }
+        return result;
+    }
+
+    private static byte toByte(char c) {
+        byte b = (byte) "0123456789ABCDEF".indexOf(c);
+        return b;
+    }
+
+    /**
+     * 把字节数组转换成16进制字符串
+     *
+     * @param bArray
+     * @return
+     */
+    public static final String bytesToHexString(byte[] bArray) {
+        StringBuffer sb = new StringBuffer(bArray.length);
+        String sTemp;
+        for (int i = 0; i < bArray.length; i++) {
+            sTemp = Integer.toHexString(0xFF & bArray[i]);
+            if (sTemp.length() < 2)
+                sb.append(0);
+            sb.append(sTemp.toUpperCase());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 把字节数组转换为对象
+     *
+     * @param bytes
+     * @return
+     * @throws IOException
+     * @throws ClassNotFoundException
+     */
+    public static final Object bytesToObject(byte[] bytes) throws IOException, ClassNotFoundException {
+        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+        ObjectInputStream oi = new ObjectInputStream(in);
+        Object o = oi.readObject();
+        oi.close();
+        return o;
+    }
+
+    /**
+     * 把可序列化对象转换成字节数组
+     *
+     * @param s
+     * @return
+     * @throws IOException
+     */
+    public static final byte[] objectToBytes(Object s) throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ObjectOutputStream ot = new ObjectOutputStream(out);
+        ot.writeObject(s);
+        ot.flush();
+        ot.close();
+        return out.toByteArray();
+    }
+
+    public static final String objectToHexString(Serializable s) throws IOException {
+        return bytesToHexString(objectToBytes(s));
+    }
+
+    public static final Object hexStringToObject(String hex) throws IOException, ClassNotFoundException {
+        return bytesToObject(hexStringToByte(hex));
+    }
+
+    /**
+     * @函数功能: BCD码转为10进制串(阿拉伯数据)
+     * @输入参数: BCD码
+     * @输出结果: 10进制串
+     */
+    public static String bcd2Str(byte[] bytes) {
+        StringBuffer temp = new StringBuffer(bytes.length * 2);
+
+        for (int i = 0; i < bytes.length; i++) {
+            temp.append((byte) ((bytes[i] & 0xf0) >>> 4));
+            temp.append((byte) (bytes[i] & 0x0f));
+        }
+        return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp.toString().substring(1) : temp.toString();
+    }
+
+    /**
+     * @函数功能: 10进制串转为BCD码
+     * @输入参数: 10进制串
+     * @输出结果: BCD码
+     */
+    public static byte[] str2Bcd(String asc) {
+        int len = asc.length();
+        int mod = len % 2;
+
+        if (mod != 0) {
+            asc = "0" + asc;
+            len = asc.length();
+        }
+
+        byte abt[] = new byte[len];
+        if (len >= 2) {
+            len = len / 2;
+        }
+
+        byte bbt[] = new byte[len];
+        abt = asc.getBytes();
+        int j, k;
+
+        for (int p = 0; p < asc.length() / 2; p++) {
+            if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {
+                j = abt[2 * p] - '0';
+            } else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {
+                j = abt[2 * p] - 'a' + 0x0a;
+            } else {
+                j = abt[2 * p] - 'A' + 0x0a;
+            }
+
+            if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {
+                k = abt[2 * p + 1] - '0';
+            } else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {
+                k = abt[2 * p + 1] - 'a' + 0x0a;
+            } else {
+                k = abt[2 * p + 1] - 'A' + 0x0a;
+            }
+
+            int a = (j << 4) + k;
+            byte b = (byte) a;
+            bbt[p] = b;
+        }
+        return bbt;
+    }
+
+    /**
+     * 低位到高位排列的字节数组
+     *
+     * @param byte2Arr
+     * @return
+     */
+    public static int bytesTo16Int(byte[] byte2Arr) {
+        return (byte2Arr[0] & 0xFF) | (byte2Arr[1] << 8);
+    }
+
+    /**
+     * 低位到高位排列的字节数组
+     *
+     * @param byte4Arr
+     * @return
+     */
+    public static int bytesTo32Int(byte[] byte4Arr) {
+        return (byte4Arr[0] & 0xFF) | ((byte4Arr[1] & 0xFF) << 8) | ((byte4Arr[2] & 0xFF) << 16) | ((byte4Arr[3] & 0xFF) << 24);
+    }
+
+    /**
+     * 低位到高位
+     *
+     * @param b
+     * @return
+     */
+    public static float bytesTo32Float(byte[] b) {
+        int l;
+        l = b[0];
+        l &= 0xff;
+        l |= ((long) b[1] << 8);
+        l &= 0xffff;
+        l |= ((long) b[2] << 16);
+        l &= 0xffffff;
+        l |= ((long) b[3] << 24);
+        return Float.intBitsToFloat(l);
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/CardNumberUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/CardNumberUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..c53c92c68b7e4f9de658a157446481e7f4111775
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/CardNumberUtil.java
@@ -0,0 +1,24 @@
+package cn.wisenergy.common.utils;
+
+import cn.hutool.core.lang.UUID;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+/**
+ * 生成充值卡子卡卡号工具类
+ */
+public class CardNumberUtil implements Serializable {
+    private static final long serialVersionUID = -9056417839913098262L;
+
+    //字符串长度
+    static final int LENGTH= 11;
+
+    public static String cardNumber() {
+        //添加十一位数字生成卡号
+        String uuid = String.format("%040d", new BigInteger(UUID.randomUUID().toString().replace("-", ""), 16));
+
+        return uuid.toString().substring(0,LENGTH);
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/DateUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/DateUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5e1be8d05ce6b1e8278f678e3628e66e59a5381
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/DateUtil.java
@@ -0,0 +1,804 @@
+package cn.wisenergy.common.utils;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+public class DateUtil {
+
+	public static final String[] YEAR_MONTHS = new String[]{"01", "02", "03",
+			"04", "05", "06", "07", "08", "09", "10", "11", "12"};
+
+	public static final String[] CHINA_MONTHS = new String[]{"一月", "二月",
+			"三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"};
+
+	public static final String[] DAY_HOURS = new String[]{"00", "01", "02",
+			"03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13",
+			"14", "15", "16", "17", "18", "19", "20", "21", "22", "23"};
+
+	public static final String[] MONTH_DAYS = new String[]{"01", "02", "03",
+			"04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14",
+			"15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25",
+			"26", "27", "28", "29", "30", "31"};
+
+	/**
+	 * 生成多层日期目录
+	 *
+	 * @param level 目录层数(最多3层)即:月(200906)-日(0605)-时(01)
+	 * @return
+	 */
+	public static String generateDateDir(int level) {
+		if (level < 1 || level > 5) {
+			level = 3;// 默认3
+		}
+		SimpleDateFormat levelOne = new SimpleDateFormat("yyyyMM");
+		SimpleDateFormat levelTwo = new SimpleDateFormat("MMdd");
+		SimpleDateFormat levelThree = new SimpleDateFormat("HH");
+		SimpleDateFormat levelFour = new SimpleDateFormat("yyyy-MM-dd");
+
+		String s = "/";
+		String destDirectory = "";
+		Date date = new Date(System.currentTimeMillis());
+
+		switch (level) {
+			case 1:
+				destDirectory += levelOne.format(date);
+				break;
+			case 2:
+				destDirectory += levelOne.format(date) + s + levelTwo.format(date);
+				break;
+			case 3:
+				destDirectory += levelOne.format(date) + s + levelTwo.format(date)
+						+ s + levelThree.format(date);
+				break;
+			case 4:
+				destDirectory = levelFour.format(date);
+				break;
+			case 5:
+				destDirectory = levelFour.format(getYesterday());
+				break;
+		}
+		return destDirectory;
+	}
+
+	/**
+	 * 获取年
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static int getYear(Date date) {
+		return getValue(date, Calendar.YEAR);
+	}
+
+	/**
+	 * 获取月
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static int getMonth(Date date) {
+		return getValue(date, Calendar.MONTH);
+	}
+
+	/**
+	 * 获取星期
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static int getWeek(Date date) {
+		return getValue(date, Calendar.DAY_OF_WEEK);
+	}
+
+	/**
+	 * 获取日
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static int getDay(Date date) {
+		return getValue(date, Calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 获取小时
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static int getHour(Date date) {
+		return getValue(date, Calendar.HOUR_OF_DAY);
+	}
+
+	/**
+	 * 获取分钟
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static int getMinute(Date date) {
+		return getValue(date, Calendar.MINUTE);
+	}
+
+	/**
+	 * 获取分钟
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static int getSecond(Date date) {
+		return getValue(date, Calendar.SECOND);
+	}
+
+	/**
+	 * @param date
+	 * @param field
+	 * @return
+	 */
+	private static int getValue(Date date, int field) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTimeInMillis(date.getTime());
+		return calendar.get(field);
+	}
+
+	/**
+	 * 解析日期
+	 *
+	 * @param strDate
+	 * @return
+	 * @throws ParseException
+	 */
+	public static Date convertStrToDate(String strDate, String pattern) {
+		try {
+			SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+			return sdf.parse(strDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 字符串转calendar
+	 *
+	 * @param date    日期的字符串
+	 * @param pattern 日期的格式
+	 * @return
+	 */
+	public static Calendar convertStrToCalendar(String date, String pattern) {
+		Calendar calendar = null;
+		try {
+			calendar = Calendar.getInstance();
+			SimpleDateFormat format = new SimpleDateFormat(pattern);
+			calendar.setTime(format.parse(date));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return calendar;
+	}
+
+	/**
+	 * 格式化date为指定的格式字符串
+	 *
+	 * @param date
+	 * @param pattern
+	 * @return
+	 */
+	public static String convertDateToStr(Date date, String pattern) {
+		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+		return sdf.format(date);
+	}
+
+	/**
+	 * 转换日期为字符串
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static String convertDateToYMDStr(Date date) {
+		if (date == null) {
+			return null;
+		}
+		return new SimpleDateFormat("yyyy-MM-dd").format(date);
+	}
+
+	/**
+	 * 给日期增加值
+	 *
+	 * @param date
+	 * @param field
+	 * @param amount
+	 * @return
+	 */
+	public static Date add(Date date, int field, int amount) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTimeInMillis(date.getTime());
+		calendar.add(field, amount);
+		return new Date(calendar.getTimeInMillis());
+	}
+
+	/**
+	 * 取上个月的第一天
+	 */
+	public static Calendar getLastMonFirstDay(Calendar calendar) {
+		int year = calendar.get(Calendar.YEAR);
+		int month = calendar.get(Calendar.MONTH);
+		if (month > 0) {
+			month--;
+		} else {
+			year--;
+			month = 11;
+		}
+		calendar.set(Calendar.YEAR, year);
+		calendar.set(Calendar.MONTH, month);
+		calendar.set(Calendar.DAY_OF_MONTH, 1);
+		return calendar;
+	}
+
+	/**
+	 * 取上个月的最后一天
+	 */
+	public static Calendar getLastMonLastDay(Calendar calendar) {
+		calendar.set(Calendar.DAY_OF_MONTH, 1);
+		calendar.add(Calendar.DAY_OF_MONTH, -1);
+		return calendar;
+	}
+
+	/**
+	 * 取得上一天
+	 */
+	public static Calendar getLastDay(Calendar calendar) {
+		calendar.add(Calendar.DAY_OF_YEAR, -1);
+		return calendar;
+	}
+
+	/**
+	 * 取上个周的最后一天
+	 */
+	public static Calendar getLastweekLastDay(Calendar calendar) {
+		calendar.add(Calendar.SUNDAY, -7);
+		return calendar;
+	}
+
+	/**
+	 * 取一天中最大时间 毫秒为999
+	 *
+	 * @param day
+	 * @return
+	 * @throws ParseException
+	 */
+	public static Date getEndOfDay(Date day) {
+
+		if (day == null) {
+			day = new Date();
+		}
+
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(day);
+		cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
+		cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
+		cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
+		cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
+
+		return cal.getTime();
+	}
+
+	/**
+	 * 取一天中最大时间 毫秒为0
+	 *
+	 * @param day
+	 * @return
+	 * @throws ParseException
+	 */
+	public static Date getEndZeroMillOfDay(Date day) {
+
+		if (day == null) {
+			day = new Date();
+		}
+
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(day);
+		cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
+		cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
+		cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
+		cal.set(Calendar.MILLISECOND, 0);
+
+		return cal.getTime();
+	}
+
+	/**
+	 * 取一天中最小时间
+	 *
+	 * @param day
+	 * @return
+	 * @throws ParseException
+	 */
+	public static Date getStartOfDay(Date day) {
+
+		if (day == null) {
+			day = new Date();
+		}
+
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(day);
+		cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY));
+		cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
+		cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
+		cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
+
+		return cal.getTime();
+	}
+
+	/**
+	 * 取今天的最小时间
+	 *
+	 * @return
+	 * @throws ParseException
+	 */
+	public static Date getTodayStart() {
+		return getStartOfDay(new Date());
+	}
+
+	/**
+	 * 计算两个日期之间相差的天数
+	 *
+	 * @param startDate 较小的时间
+	 * @param endDate   较大的时间
+	 * @return 相差天数
+	 */
+	public static int daysBetween(Date startDate, Date endDate) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(startDate);
+		long time1 = cal.getTimeInMillis();
+		cal.setTime(endDate);
+		long time2 = cal.getTimeInMillis();
+		long betweenDays = (time2 - time1) / (1000 * 3600 * 24);
+		return Integer.parseInt(String.valueOf(betweenDays));
+	}
+
+	/**
+	 * 获取当前月份天数的数组
+	 *
+	 * @return
+	 */
+	public static String[] getCurrentMonthDaysArray() {
+		return getMonthDaysArray(new Date());
+	}
+
+	/**
+	 * 获取指定月份天数的数组
+	 *
+	 * @return
+	 */
+	public static String[] getMonthDaysArray(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+		String[] array = new String[maxDay];
+		System.arraycopy(MONTH_DAYS, 0, array, 0, maxDay);
+		return array;
+	}
+
+	/**
+	 * 获取当前月的第一天
+	 *
+	 * @return
+	 */
+	public static Date getCurrentFirstDayOfMonth() {
+		return getFirstDayOfMonth(new Date());
+	}
+
+	/**
+	 * 获取当前月的
+	 *
+	 * @return
+	 */
+	public static Date getCurrentLastDayOfMonth() {
+		return getLastDayOfMonth(new Date());
+	}
+
+	/**
+	 * 获取指定时间中月的第一天
+	 *
+	 * @return
+	 */
+	public static Date getFirstDayOfMonth(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.DAY_OF_MONTH, 1);
+		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.MINUTE, 0);
+		calendar.set(Calendar.SECOND, 0);
+		calendar.set(Calendar.MILLISECOND, 0);
+		return calendar.getTime();
+	}
+
+	/**
+	 * 获取指定时间中月的
+	 *
+	 * @return
+	 */
+	public static Date getLastDayOfMonth(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.DAY_OF_MONTH,
+				calendar.getMaximum(Calendar.DAY_OF_MONTH));
+		calendar.set(Calendar.HOUR_OF_DAY, 23);
+		calendar.set(Calendar.MINUTE, 59);
+		calendar.set(Calendar.SECOND, 59);
+		calendar.set(Calendar.MILLISECOND, 999);
+		return calendar.getTime();
+	}
+
+	/**
+	 * 获取当前年的第一天
+	 *
+	 * @return
+	 */
+	public static Date getCurrentFirstDayOfYear() {
+		return getFirstDayOfYear(new Date());
+	}
+
+	/**
+	 * 获取指定年份的第一天
+	 *
+	 * @return
+	 */
+	public static Date getFirstDayOfYear(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.DAY_OF_YEAR, 1);
+		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.MINUTE, 0);
+		calendar.set(Calendar.SECOND, 0);
+		calendar.set(Calendar.MILLISECOND, 0);
+		return calendar.getTime();
+	}
+
+	/**
+	 * 获取昨天时间
+	 *
+	 * @return
+	 */
+	public static Date getYesterday() {
+		Calendar cal = Calendar.getInstance();
+		cal.add(Calendar.DATE, -1);
+		return cal.getTime();
+	}
+
+	public/**
+	 * 获取今天
+	 */
+	static Date getToday() {
+		Calendar cal = Calendar.getInstance();
+		return cal.getTime();
+	}
+
+	/**
+	 * 获取前一天
+	 *
+	 * @return
+	 */
+	public static Date getYesterday(Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.add(Calendar.DATE, -1);
+		return cal.getTime();
+	}
+
+	/**
+	 * 获取后一天
+	 *
+	 * @return
+	 */
+	public static Date getTomorrow(Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.add(Calendar.DATE, 1);
+		return cal.getTime();
+	}
+
+	/**
+	 * 获取前一个月
+	 *
+	 * @return
+	 */
+	public static Date getLastMonth(Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.add(Calendar.MONTH, -1);
+		return cal.getTime();
+	}
+
+	/**
+	 * 获取后一个月
+	 *
+	 * @return
+	 */
+	public static Date getNextMonth(Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.add(Calendar.MONTH, 1);
+		return cal.getTime();
+	}
+
+	/**
+	 * 获取大写的月份
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static String getChinaMonth(Date date) {
+		Calendar instance = Calendar.getInstance();
+		instance.setTime(date);
+		return CHINA_MONTHS[instance.get(Calendar.MONTH)];
+	}
+
+	/**
+	 * 比较两个时间的时分
+	 *
+	 * @param date1
+	 * @param date2
+	 * @return
+	 */
+	public static int compareToHourMin(Date date1, Date date2) {
+		Calendar calendar1 = Calendar.getInstance();
+		calendar1.setTime(date1);
+		calendar1.set(Calendar.SECOND, 0);
+
+		Calendar temp = Calendar.getInstance();
+		temp.setTime(date2);
+
+		Calendar calendar2 = (Calendar) calendar1.clone();
+		calendar2.set(Calendar.HOUR_OF_DAY, temp.get(Calendar.HOUR_OF_DAY));
+		calendar2.set(Calendar.MINUTE, temp.get(Calendar.MINUTE));
+		calendar2.set(Calendar.SECOND, 0);
+
+		return calendar1.compareTo(calendar2);
+	}
+
+	/**
+	 * 计算两个日期是否是一周(周一作为一周的开始时间)
+	 *
+	 * @param date1
+	 * @param date2
+	 * @return
+	 */
+	public static boolean isSameWeek(Date date1, Date date2) {
+
+		Calendar calendar1 = Calendar.getInstance();
+		calendar1.setTime(date1);
+		calendar1.setFirstDayOfWeek(Calendar.MONDAY);
+
+		Calendar calendar2 = Calendar.getInstance();
+		calendar2.setTime(date2);
+		calendar2.setFirstDayOfWeek(Calendar.MONDAY);
+
+		if (calendar1.get(Calendar.WEEK_OF_YEAR) == calendar2
+				.get(Calendar.WEEK_OF_YEAR)) {
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * 根据开始时间和结束时间返回时间段内的时间集合
+	 *
+	 * @param startDate
+	 * @param endDate
+	 * @return List
+	 */
+	public static List<Date> getDatesBetweenTwoDate(Date startDate, Date endDate) {
+		List<Date> dates = new ArrayList<Date>();
+		dates.add(startDate);// 把开始时间加入集合
+		Calendar cal = Calendar.getInstance();
+		// 使用给定的 Date 设置此 Calendar 的时间
+		cal.setTime(startDate);
+		while (true) {
+			cal.add(Calendar.DAY_OF_MONTH, 1);
+			if (endDate.after(cal.getTime())
+					&& !DateUtils.isSameDay(endDate, cal.getTime())) {
+				dates.add(cal.getTime());
+			} else {
+				break;
+			}
+		}
+		if (startDate.compareTo(endDate) != 0) {
+			dates.add(endDate);// 把结束时间加入集合
+		}
+		return dates;
+	}
+
+	/**
+	 * 获取时间段内的时间字符串集合
+	 *
+	 * @param startDate
+	 * @param endDate
+	 * @param dateFormat
+	 * @return
+	 */
+	public static List<String> getDateCollection(Date startDate, Date endDate,
+												 String dateFormat) {
+
+		if (dateFormat == null || StringUtils.equals(dateFormat, "")) {
+			dateFormat = "yyyy-MM-dd";
+		}
+		List<String> dates = new ArrayList<String>();
+		dates.add(DateUtil.convertDateToStr(startDate, dateFormat));
+		Calendar cal = Calendar.getInstance();
+		// 使用给定的 Date 设置此 Calendar 的时间
+		cal.setTime(startDate);
+		while (true) {
+			cal.add(Calendar.DAY_OF_MONTH, 1);
+			if (endDate.after(cal.getTime())
+					&& !DateUtils.isSameDay(endDate, cal.getTime())) {
+				dates.add(DateUtil.convertDateToStr(cal.getTime(), dateFormat));
+			} else {
+				break;
+			}
+		}
+		dates.add(DateUtil.convertDateToStr(endDate, dateFormat));// 把结束时间加入集合
+		return dates;
+	}
+
+	/**
+	 * 获得某个月的日期表格
+	 *
+	 * @param month
+	 * @return List
+	 */
+	public static List<Date> getDateTab(Date month) {
+		Date startDate = getFirstDayOfMonth(month);
+		Date endDate = getLastDayOfMonth(month);
+		Calendar cal1 = Calendar.getInstance();
+		Calendar cal2 = Calendar.getInstance();
+		cal1.setTime(startDate);
+		cal2.setTime(endDate);
+		int i = cal1.get(Calendar.DAY_OF_WEEK);
+		int j = cal2.get(Calendar.DAY_OF_WEEK);
+		cal1.add(Calendar.DAY_OF_MONTH, -i + 1);
+		cal2.add(Calendar.DAY_OF_MONTH, 7 - j);
+		Date beforeDate = cal1.getTime();
+		Date afterDate = cal2.getTime();
+		return getDatesBetweenTwoDate(beforeDate, afterDate);
+	}
+
+	/**
+	 * 转化大写的月份(一月……十二月)为数字月份(01……12)
+	 *
+	 * @param chinaMonthName
+	 * @return
+	 */
+	public static String convertMonthToNum(String chinaMonthName) {
+		int i = ArrayUtils.indexOf(CHINA_MONTHS, chinaMonthName);
+		return i > -1 ? YEAR_MONTHS[i] : "";
+	}
+
+	/**
+	 * 将两个时间根据指定天数分割为多个时间段
+	 *
+	 * @param startDate 开始时间
+	 * @param endDate   结束时间
+	 * @param fate      每个时间段间隔的天数
+	 * @return 分割后的时间段:[[开始时间,结束时间],[开始时间,结束时间],...]
+	 */
+	public static List<Date[]> toTimeSlot(Date startDate, Date endDate,
+										  Integer fate) {
+		if (startDate == null || endDate == null) {
+			/* 开始时间或结束时间为空返回空集合 */
+			return new ArrayList<Date[]>();
+		}
+		List<Date[]> result = new ArrayList<Date[]>();
+		/* 间隔天 */
+		List<Date> days = getDatesBetweenTwoDate(startDate, endDate);
+		/* 总天数 */
+		Integer dayNumber = days.size();
+		if (dayNumber < fate) {
+			/* 如果间隔天数大于总天数则直接返回开始时间和结束时间 */
+			result.add(new Date[]{startDate, endDate});
+		} else {
+			/* 时间段个数 */
+			Integer size = dayNumber / fate;
+			/* 余数 */
+			Integer remain = dayNumber % fate;
+			if (remain > 0) {
+				/* 余数大于零则将时间段个数加一 */
+				size += 1;
+			} else {
+				/* 否则则将余数设置为间隔天数 */
+				remain = fate;
+			}
+			/* 计算时间段 */
+			for (int i = 1; i <= size; i++) {
+				Integer start = i - 1;
+				/* 时间段开始时间所在的索引 */
+				Integer startIndex = start * fate;// +(start==0?0:1);
+				/* 时间段结束时间所在的索引 */
+				Integer endIndex = startIndex + fate;
+				if (i == size) {
+					endIndex = startIndex + (remain - 1);
+				}
+				result.add(new Date[]{days.get(startIndex),
+						days.get(endIndex - (start == 0 ? 1 : 0)) // 如果当前是第一次遍历结束时间索引减一
+				});
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 获取指定时间的时间戳【毫秒】
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static Long getTime(Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		return cal.getTimeInMillis();
+	}
+
+	/**
+	 * 根据字符串获取date
+	 */
+	public static Date getTime(String date, String format) {
+		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+		try {
+			return dateFormat.parse(date);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static String getTime(Date date, String format) {
+		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+		return dateFormat.format(date);
+	}
+
+	/**
+	 * 计算两个时间相差时间,格式 *天*小时*分钟*秒
+	 */
+	public static String getDatePoor(Date endDate, Date nowDate) {
+
+		long nd = 1000 * 24 * 60 * 60;
+		long nh = 1000 * 60 * 60;
+		long nm = 1000 * 60;
+		long ns = 1000;
+		// 获得两个时间的毫秒时间差异
+		long diff = endDate.getTime() - nowDate.getTime();
+		// 计算差多少天
+		long day = diff / nd;
+		// 计算差多少小时
+		long hour = diff % nd / nh;
+		// 计算差多少分钟
+		long min = diff % nd % nh / nm;
+		// 计算差多少秒//输出结果
+		long sec = diff % nd % nh % nm / ns;
+		return day + "天" + hour + "小时" + min + "分钟" + sec + "秒";
+	}
+
+	/**
+	 * 计算两个时间相差多少分钟
+	 */
+	public static Long getDateDifferenceMinute(Date endDate, Date nowDate) {
+
+
+		long nm = 1000 * 60;
+		// 获得两个时间的毫秒时间差异
+		long diff = endDate.getTime() - nowDate.getTime();
+		// 计算差多少分钟
+		long min = diff / nm;
+
+		return min;
+	}
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ExcelUtils.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ExcelUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..071e6090892bec6d433976855760e6a722264d05
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ExcelUtils.java
@@ -0,0 +1,276 @@
+package cn.wisenergy.common.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFDataFormat;
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.xmlbeans.impl.piccolo.io.FileFormatException;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class ExcelUtils {
+
+
+	private static final String EXTENSION_XLS = "xls";
+	private static final String EXTENSION_XLSX = "xlsx";
+
+
+	/**
+	 * 判断EXCEL版本
+	 *
+	 * @param in
+	 * @param filename
+	 * @return
+	 * @throws IOException
+	 */
+	public static Workbook getWorkbook(InputStream in, String filename) throws IOException {
+		Workbook wb = null;
+		if (filename.endsWith(EXTENSION_XLS)) {
+			wb = new HSSFWorkbook(in);//Excel 2003
+		} else if (filename.endsWith(EXTENSION_XLSX)) {
+			wb = new XSSFWorkbook(in);//Excel 2007
+		}
+		return wb;
+	}
+
+
+	/**
+	 * 文件校验是否是excel
+	 *
+	 * @param filePath
+	 * @throws FileNotFoundException
+	 * @throws FileFormatException
+	 */
+	public static void preReadCheck(String fileName) throws FileNotFoundException,
+			FileFormatException {
+		// 常规检查
+		if (StringUtils.isBlank(fileName)) {
+			throw new FileNotFoundException("传入的文件不存在:" + fileName);
+		}
+
+		if (!fileName.endsWith(EXTENSION_XLS) && !fileName.endsWith(EXTENSION_XLSX)) {
+			throw new FileFormatException("传入的文件不是excel");
+		}
+	}
+
+
+	/**
+	 * 读取EXCEL
+	 *
+	 * @param filePath
+	 * @throws FileNotFoundException
+	 * @throws FileFormatException
+	 */
+	public static List<List<String>> readExcel(MultipartFile file) throws FileNotFoundException, FileFormatException {
+		// 检查
+		preReadCheck(file.getOriginalFilename());
+		// 获取workbook对象
+		Workbook workbook = null;
+		/*InputStream is = new FileInputStream(filePath);*/
+		List<List<String>> result = new ArrayList<List<String>>();
+		try {
+			workbook = getWorkbook(file.getInputStream(), file.getOriginalFilename());
+			// workbook = WorkbookFactory.create(is);
+
+			int sheetCount = workbook.getNumberOfSheets();  //Sheet的数量
+			// 读文件 一个sheet一个sheet地读取
+			for (int numSheet = 0; numSheet < sheetCount; numSheet++) {
+				Sheet sheet = workbook.getSheetAt(numSheet);
+				if (sheet == null) {
+					continue;
+				}
+
+				int firstRowIndex = sheet.getFirstRowNum();
+				int lastRowIndex = sheet.getLastRowNum();
+
+				if (firstRowIndex != lastRowIndex && lastRowIndex != 0) {
+
+					// 读取数据行
+					for (int rowIndex = firstRowIndex + 1; rowIndex <= lastRowIndex; rowIndex++) {
+						Row currentRow = sheet.getRow(rowIndex);// 当前行
+						int firstColumnIndex = currentRow.getFirstCellNum(); // 首列
+						int lastColumnIndex = currentRow.getLastCellNum();// 最后一列
+						List<String> rowList = new ArrayList<String>();
+						for (int columnIndex = firstColumnIndex; columnIndex < lastColumnIndex; columnIndex++) {
+							Cell currentCell = currentRow.getCell(columnIndex);// 当前单元格
+
+							String currentCellValue = getCellValue(currentCell, true);// 当前单元格的值
+							rowList.add(currentCellValue);
+						}
+
+						//行为空的不读
+						Boolean flag = false;
+						for (String str : rowList) {
+							if (!StringUtils.isBlank(str)) {
+								flag = true;
+								break;
+							}
+						}
+						if (flag) {
+							result.add(rowList);
+						}
+					}
+				}
+
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+		}
+		return result;
+	}
+
+	public static List<List<String>> readInlandCompare(String filePath, Integer startSheet, Integer endSheet) throws FileNotFoundException, FileFormatException {
+		// 检查
+		preReadCheck(filePath);
+		// 获取workbook对象
+		Workbook workbook = null;
+		InputStream is = new FileInputStream(filePath);
+		List<List<String>> result = new ArrayList<List<String>>();
+		try {
+			workbook = getWorkbook(is, filePath);
+			// workbook = WorkbookFactory.create(is);
+
+			int sheetCount = workbook.getNumberOfSheets();  //Sheet的数量
+			// 读文件 一个sheet一个sheet地读取
+			for (int numSheet = startSheet; numSheet < endSheet; numSheet++) {
+				Sheet sheet = workbook.getSheetAt(numSheet);
+				if (sheet == null) {
+					continue;
+				}
+
+				int firstRowIndex = sheet.getFirstRowNum();
+				int lastRowIndex = sheet.getLastRowNum();
+
+				if (firstRowIndex != lastRowIndex && lastRowIndex != 0) {
+
+					// 读取数据行
+					for (int rowIndex = firstRowIndex + 1; rowIndex <= lastRowIndex; rowIndex++) {
+						Row currentRow = sheet.getRow(rowIndex);// 当前行
+						int firstColumnIndex = currentRow.getFirstCellNum(); // 首列
+						int lastColumnIndex = currentRow.getLastCellNum();// 最后一列
+						List<String> rowList = new ArrayList<String>();
+						for (int columnIndex = firstColumnIndex; columnIndex < lastColumnIndex; columnIndex++) {
+							Cell currentCell = currentRow.getCell(columnIndex);// 当前单元格
+
+							String currentCellValue = getCellValue(currentCell, true);// 当前单元格的值
+							rowList.add(currentCellValue);
+						}
+						//行为空的不读
+						Boolean flag = false;
+						for (String str : rowList) {
+							if (!StringUtils.isBlank(str)) {
+								flag = true;
+								break;
+							}
+						}
+						if (flag) {
+							result.add(rowList);
+						}
+					}
+				}
+
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+		}
+		return result;
+	}
+
+	/**
+	 * 取单元格的值
+	 *
+	 * @param cell       单元格对象
+	 * @param treatAsStr 为true时,当做文本来取值 (取到的是文本,不会把“1”取成“1.0”)
+	 * @return
+	 */
+	public static String getCellValue(Cell cell, boolean treatAsStr) {
+		if (cell == null) {
+			return "";
+		}
+
+       /* if (treatAsStr) {
+            // 虽然excel中设置的都是文本,但是数字文本还被读错,如“1”取成“1.0”
+            // 加上下面这句,临时把它当做文本来读取
+            cell.setCellType(Cell.CELL_TYPE_STRING);
+        }*/
+		//SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
+
+		String cellValue = null;
+		int cellType = cell.getCellType();
+		switch (cellType) {
+			case Cell.CELL_TYPE_STRING: // 文本
+				cellValue = cell.getStringCellValue();
+				break;
+			case Cell.CELL_TYPE_NUMERIC: // 数字、日期
+				if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
+					SimpleDateFormat sdf = null;
+					if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
+							.getBuiltinFormat("h:mm")) {
+						sdf = new SimpleDateFormat("HH:mm:ss");
+					} else {// 日期
+						sdf = new SimpleDateFormat("yyyy-MM-dd");
+					}
+					Date date = cell.getDateCellValue();
+					return sdf.format(date);
+				} else if (cell.getCellStyle().getDataFormat() == 58) {
+					// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
+					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+					double value = cell.getNumericCellValue();
+					Date date = org.apache.poi.ss.usermodel.DateUtil
+							.getJavaDate(value);
+					return sdf.format(date);
+				} else {
+					double value = cell.getNumericCellValue();
+					CellStyle style = cell.getCellStyle();
+					DecimalFormat format = new DecimalFormat();
+					String temp = style.getDataFormatString();
+					// 单元格设置成常规
+					if (temp.equals("General")) {
+						format.applyPattern("#");
+					}
+					return format.format(value);
+				}
+
+			case Cell.CELL_TYPE_BOOLEAN: // 布尔型
+				cellValue = String.valueOf(cell.getBooleanCellValue());
+				break;
+			case Cell.CELL_TYPE_BLANK: // 空白
+				cellValue = cell.getStringCellValue();
+				break;
+			case Cell.CELL_TYPE_ERROR: // 错误
+				cellValue = "错误";
+				break;
+			case Cell.CELL_TYPE_FORMULA: // 公式
+               /* try {
+                    cellValue = cell.getStringCellValue();
+                } catch (IllegalStateException e) {
+                    cellValue = String.valueOf(cell.getNumericCellValue());
+                }*/
+				try {
+					cellValue = String.valueOf(cell.getNumericCellValue());
+				} catch (IllegalStateException e) {
+					cellValue = String.valueOf(cell.getRichStringCellValue());
+				}
+				break;
+			default:
+				cellValue = "错误";
+		}
+		return cellValue;
+	}
+
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/FileUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/FileUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..e22cd2403e83d330d50f966b3848e2ba03ff82b6
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/FileUtil.java
@@ -0,0 +1,87 @@
+package cn.wisenergy.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.io.*;
+import java.util.Properties;
+
+@Slf4j
+public class FileUtil {
+
+    /**
+     * @param filePath
+     * @return
+     * @throws IOException
+     * @Title: readProperties
+     * @Description: 读取prop配置文件获取Properties对象
+     */
+    public static Properties readProperties(String filePath) throws IOException {
+        // 创建Properties文件
+        Properties prop = new Properties();
+        // 获取流
+        InputStream input = FileUtil.class.getClassLoader().getResourceAsStream(filePath);
+        // 导入流
+        prop.load(input);
+        return prop;
+    }
+
+    /**
+     * @param filePath 文件的路径
+     * @return
+     * @Title: readJsonFile
+     * @Description: 将JSON文件读取为JSON字符串
+     */
+    public static String readJsonFile(String filePath) {
+        String laststr = "";
+        File file = new File(filePath);// 打开文件
+        BufferedReader reader = null;
+        try {
+            FileInputStream in = new FileInputStream(file);
+            reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));// 读取文件
+            String tempString = null;
+            while ((tempString = reader.readLine()) != null) {
+                laststr = laststr + tempString;
+            }
+            reader.close();
+        } catch (IOException e) {
+        	log.error(e.getMessage(),e);
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException el) {
+                	log.error(el.getMessage(),el);
+                }
+            }
+        }
+        return laststr;
+    }
+
+    /**
+     * 将URL远程路径文件转成InputStream返回
+     *
+     * @param url
+     *            远程地址
+     * @return InputStream
+     */
+    public static InputStream remotePathToStream(String url) {
+        InputStream inputStream = null;
+        try {
+            CloseableHttpClient httpsClient = HttpUtil.createSSLClientDefault();
+            HttpGet get = new HttpGet(url);
+            HttpResponse response = httpsClient.execute(get);
+            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                inputStream = response.getEntity().getContent();
+            }
+        } catch (Exception e) {
+            ExceptionUtils.getStackTrace(e);
+        }
+        return inputStream;
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/HttpContextUtils.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/HttpContextUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..a86f0ef4547c9ca435d1351950ffcc7c6247daee
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/HttpContextUtils.java
@@ -0,0 +1,24 @@
+package cn.wisenergy.common.utils;
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class HttpContextUtils {
+
+    public static HttpServletRequest getHttpServletRequest() {
+        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+    }
+
+    public static String getDomain() {
+        HttpServletRequest request = getHttpServletRequest();
+        StringBuffer url = request.getRequestURL();
+        return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();
+    }
+
+    public static String getOrigin() {
+        HttpServletRequest request = getHttpServletRequest();
+        return request.getHeader("Origin");
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/HttpUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/HttpUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ea1a3e56037d974e2cff6d1cce2fd7fbff38e44
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/HttpUtil.java
@@ -0,0 +1,770 @@
+package cn.wisenergy.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.beanutils.ConvertUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+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.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContextBuilder;
+import org.apache.http.conn.ssl.SSLContexts;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.Assert;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class HttpUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);
+
+    private static final int TIME_OUT = 60000;
+
+    private static RequestConfig.Builder requestConfigBuilder = null;
+
+    /**
+     * 创建https协议的client
+     *
+     * @return CloseableHttpClient
+     */
+    public static CloseableHttpClient createSSLClientDefault() {
+        try {
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+                //信任所有
+                public boolean isTrusted(X509Certificate[] chain,
+                                         String authType) throws CertificateException {
+                    return true;
+                }
+            }).build();
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
+            return HttpClients.custom().setDefaultRequestConfig(getDefaultRequestConfig()).setSSLSocketFactory(sslsf).build();
+        } catch (KeyManagementException e) {
+            log.error("创建SSLClientDefault失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } catch (NoSuchAlgorithmException e) {
+            log.error("创建SSLClientDefault失败:{}" + ExceptionUtils.getFullStackTrace(e));
+        } catch (KeyStoreException e) {
+            log.error("创建SSLClientDefault失败:{}" + ExceptionUtils.getFullStackTrace(e));
+        }
+        return createClientDefault();
+    }
+
+    /**
+     * 创建https协议的client
+     *
+     * @return CloseableHttpClient
+     */
+    public static CloseableHttpClient createClientDefault() {
+        return HttpClients.custom().setDefaultRequestConfig(getDefaultRequestConfig()).build();
+    }
+
+    /**
+     * 获取默认Request配置
+     *
+     * @return
+     */
+    private static RequestConfig getDefaultRequestConfig() {
+        if (requestConfigBuilder == null) {
+            requestConfigBuilder = RequestConfig.custom().setConnectTimeout(TIME_OUT).setSocketTimeout(TIME_OUT)
+                    .setConnectionRequestTimeout(TIME_OUT).setStaleConnectionCheckEnabled(true);
+        }
+        return requestConfigBuilder.build();
+    }
+
+    /**
+     * Http协议POST请求
+     *
+     * @param url          请求地址
+     * @param parameterMap 请求参数
+     * @param charsetCode  编码类型
+     * @return
+     */
+    public static String post(String url, Map<String, Object> parameterMap, String charsetCode) {
+        // 参数为空判断
+        Assert.hasText(url, "Http请求URL为空");
+
+        // 初始化Http客户端
+        String result = null;
+        CloseableHttpClient httpClient = createClientDefault();
+        try {
+            HttpPost httpPost = new HttpPost(url);
+            List<NameValuePair> nameValuePairs = getNameValuePair(parameterMap);
+            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, charsetCode));
+            CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
+            HttpEntity httpEntity = httpResponse.getEntity();
+            result = EntityUtils.toString(httpEntity, charsetCode);
+            EntityUtils.consume(httpEntity);
+        } catch (Exception e) {
+            log.error("HTTP_POST【ParamMap】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpClient.close();
+            } catch (IOException e) {
+                log.error("HTTP_POST【ParamMap】关闭httpClient失败:{}", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Http协议POST请求
+     *
+     * @param url         请求地址
+     * @param paramStr    请求参数
+     * @param charsetCode 编码类型
+     * @return
+     */
+    public static String post(String url, String paramStr, String charsetCode) {
+        // 参数为空判断
+        Assert.hasText(url, "Http请求URL为空");
+
+        // 初始化Http客户端
+        String result = null;
+        CloseableHttpClient httpClient = createClientDefault();
+        try {
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setEntity(new StringEntity(paramStr, charsetCode));
+            HttpResponse httpResponse = httpClient.execute(httpPost);
+            HttpEntity httpEntity = httpResponse.getEntity();
+            result = EntityUtils.toString(httpEntity, charsetCode);
+            EntityUtils.consume(httpEntity);
+        } catch (Exception e) {
+            log.error("HTTP_POST【paramStr】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpClient.close();
+            } catch (IOException e) {
+                log.error("HTTP_POST【paramStr】关闭httpClient失败:{}", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * Http协议POST请求
+     *
+     * @param url          请求URL
+     * @param parameterMap 参数集合
+     * @return
+     */
+    public static String post(String url, Map<String, Object> parameterMap) {
+        return post(url, parameterMap, "UTF-8");
+    }
+
+    /**
+     * Http协议POST请求
+     *
+     * @param url      请求URL
+     * @param paramStr 字符串参数
+     * @return
+     */
+    public static String post(String url, String paramStr) {
+        return post(url, paramStr, "UTF-8");
+    }
+
+    /**
+     * Http协议GET请求
+     *
+     * @param url          请求URL
+     * @param parameterMap 参数集合
+     * @param headerMap    请求头参数集合
+     * @param charsetCode  编码
+     * @return
+     */
+    public static String get(String url, Map<String, Object> parameterMap, Map<String, Object> headerMap, String charsetCode) {
+        // 参数为空判断
+        Assert.hasText(url, "Http请求URL为空");
+
+        // 初始化HTTP客户端
+        String result = null;
+        CloseableHttpClient httpClient = createClientDefault();
+        try {
+            // 获取请求体名值对List参数集合
+            List<NameValuePair> nameValuePairs = getNameValuePair(parameterMap);
+            HttpGet httpGet = new HttpGet(url + (StringUtils.contains(url, "?") ? "&" : "?") + EntityUtils.toString(new UrlEncodedFormEntity(nameValuePairs, charsetCode)));
+
+            //添加header参数
+            if (MapUtils.isNotEmpty(headerMap)) {
+                Set<Map.Entry<String, Object>> headerEntries = headerMap.entrySet();
+                for (Map.Entry<String, Object> headerEntry : headerEntries) {
+                    httpGet.setHeader(headerEntry.getKey(), ConvertUtils.convert(headerEntry.getValue()));
+                }
+            }
+
+            // HTTP协议GET请求
+            HttpResponse httpResponse = httpClient.execute(httpGet);
+            HttpEntity httpEntity = httpResponse.getEntity();
+            result = EntityUtils.toString(httpEntity, charsetCode);
+            EntityUtils.consume(httpEntity);
+        } catch (Exception e) {
+            log.error("\r\n *******************HTTP_GET【ParamMap】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpClient.close();
+            } catch (IOException e) {
+                log.error("\r\n *******************HTTP_GET【ParamMap】关闭httpClient失败:{}", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Http协议GET请求
+     *
+     * @param url          Http请求URL
+     * @param parameterMap HTTP请求参数集合
+     * @param charsetCode  HTTP请求编码
+     * @return String 返回字符串
+     */
+    public static String get(String url, Map<String, Object> parameterMap, String charsetCode) {
+        return get(url, parameterMap, null, charsetCode);
+    }
+
+    /**
+     * Http协议GET请求
+     *
+     * @param url          Http请求URL
+     * @param parameterMap HTTP请求参数集合
+     * @return String 返回字符串
+     */
+    public static String get(String url, Map<String, Object> parameterMap) {
+        return get(url, parameterMap, "UTF-8");
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url          Https请求URL
+     * @param parameterMap Https请求参数集合
+     * @param charsetCode  Https请求编码
+     * @return String 返回字符串
+     */
+    public static String httpsPost(String url, Map<String, Object> parameterMap, String charsetCode) {
+        // 初始化HTTPS客户端
+        CloseableHttpClient httpsClient = createSSLClientDefault();
+        String result = null;
+        try {
+            HttpPost post = new HttpPost(url);
+            List<NameValuePair> nameValuePairs = getNameValuePair(parameterMap);
+            post.setEntity(new UrlEncodedFormEntity(nameValuePairs, charsetCode));
+            HttpResponse response = httpsClient.execute(post);
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, charsetCode);
+            EntityUtils.consume(entity);
+        } catch (Exception e) {
+            log.error("\r\n *****************HTTP_POST【parameterMap】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpsClient.close();
+            } catch (IOException e) {
+                log.error("\r\n *****************HTTP_POST【parameterMap】关闭httpClient失败:{}", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url          Https请求URL
+     * @param charsetCode 请求编码
+     * @param parameterMap Https请求参数集合
+     * @return String 返回字符串
+     */
+    public static byte[] httpsPost(String url,String charsetCode, Map<String, Object> parameterMap) {
+        // 初始化HTTPS客户端
+        CloseableHttpClient httpsClient = createSSLClientDefault();
+        byte[] result = null;
+        try {
+            HttpPost post = new HttpPost(url);
+            List<NameValuePair> nameValuePairs = getNameValuePair(parameterMap);
+            post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
+            HttpResponse response = httpsClient.execute(post);
+            HttpEntity httpEntity = response.getEntity();
+            if (httpEntity.isStreaming()) {
+                result = EntityUtils.toByteArray(httpEntity);
+            } else {
+                log.info("\r\n ****** Https请求错误:{}", EntityUtils.toString(httpEntity, "UTF-8"));
+            }
+            EntityUtils.consume(httpEntity);
+        } catch (Exception e) {
+            log.error("\r\n *****************HTTP_POST【parameterMap】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpsClient.close();
+            } catch (IOException e) {
+                log.error("\r\n *****************HTTP_POST【parameterMap】关闭httpClient失败:{}", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url         Https请求URL
+     * @param paramList   HTTPS请求参数集合
+     * @param charsetCode HTTPS请求编码
+     * @return
+     */
+    public static String httpsPost(String url, List<String[]> paramList, String charsetCode) {
+        // 初始化HTTP客户端
+        CloseableHttpClient httpsClient = createSSLClientDefault();
+        String result = null;
+        try {
+            // 初始化HTTPS请求参数
+            HttpPost post = new HttpPost(url);
+            List<NameValuePair> nameValuePairs = getNameValuePair(paramList);
+            post.setEntity(new UrlEncodedFormEntity(nameValuePairs, charsetCode));
+
+            // 发起HTTPS请求
+            HttpResponse response = httpsClient.execute(post);
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, charsetCode);
+            EntityUtils.consume(entity);
+        } catch (Exception e) {
+            log.error("\r\n *****************HTTP_POST【paramList】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpsClient.close();
+            } catch (IOException e) {
+                log.error("\r\n *****************HTTP_POST【paramList】关闭httpClient失败:{}", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url         Https请求URL
+     * @param paramStr    HTTPS请求参数集合
+     * @param charsetCode HTTPS请求编码
+     * @return
+     */
+    public static String httpsPost(String url, String paramStr, String charsetCode) {
+        // 初始化HTTPS请求客户端
+        CloseableHttpClient httpsClient = createSSLClientDefault();
+        String result = null;
+        try {
+            HttpPost post = new HttpPost(url);
+//            StringEntity stringEntity = new StringEntity(paramStr, charsetCode);
+            ByteArrayEntity byteArrayEntity = new ByteArrayEntity(paramStr.getBytes("UTF-8"));
+            post.setEntity(byteArrayEntity);
+            HttpResponse response = httpsClient.execute(post);
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, charsetCode);
+            EntityUtils.consume(entity);
+        } catch (Exception e) {
+            log.error("\r\n *****************HTTP_POST【paramStr】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpsClient.close();
+            } catch (IOException e) {
+                log.error("*****************HTTP_POST【paramStr】关闭httpClient失败:{}", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url          Https请求URL
+     * @param parameterMap HTTPS请求参数集合
+     * @return
+     */
+    public static String httpsPost(String url, Map<String, Object> parameterMap) {
+        return httpsPost(url, parameterMap, "UTF-8");
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url    Https请求URL
+     * @param params HTTPS请求参数集合
+     * @return
+     */
+    public static String httpsPost(String url, List<String[]> params) {
+        return httpsPost(url, params, "UTF-8");
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url     HTTPS请求URL
+     * @param postStr HTTPS请求参数集合
+     * @return
+     */
+    public static String httpsPost(String url, String postStr) {
+        return httpsPost(url, postStr, "UTF-8");
+    }
+
+    /**
+     * HTTPS协议GET请求
+     *
+     * @param url          Https请求URL
+     * @param parameterMap HTTPS请求参数集合
+     * @param charsetCode  HTTPS请求编码
+     * @return
+     */
+    public static String httpsGet(String url, Map<String, Object> parameterMap, String charsetCode) {
+        // 初始化HTTPS请求客户端
+        CloseableHttpClient httpsClient = createSSLClientDefault();
+        String result = null;
+        try {
+            List<NameValuePair> nameValuePairs = getNameValuePair(parameterMap);
+            HttpGet httpGet = new HttpGet(url + (StringUtils.contains(url, "?") ? "&" : "?") + EntityUtils.toString(new UrlEncodedFormEntity(nameValuePairs, charsetCode)));
+            HttpResponse response = httpsClient.execute(httpGet);
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, charsetCode);
+            EntityUtils.consume(entity);
+        } catch (Exception e) {
+            log.error("\r\n ***************** HTTPS_GET【parameterMap】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpsClient.close();
+            } catch (IOException e) {
+                log.error("\r\n ***************** HTTPS_GET【parameterMap】关闭httpClient失败:" + ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * HTTPS协议GET请求
+     *
+     * @param url          Https请求URL
+     * @param parameterMap HTTPS请求参数集合
+     * @param charsetCode  HTTPS请求编码
+     * @return
+     */
+    public static byte[] httpsGet(String charsetCode, String url, Map<String, Object> parameterMap) {
+        // 初始化HTTPS请求客户端
+        CloseableHttpClient httpsClient = createSSLClientDefault();
+        byte[] result = null;
+        try {
+            List<NameValuePair> nameValuePairs = getNameValuePair(parameterMap);
+            HttpGet httpGet = new HttpGet(url + (StringUtils.contains(url, "?") ? "&" : "?") + EntityUtils.toString(new UrlEncodedFormEntity(nameValuePairs, charsetCode)));
+            HttpResponse response = httpsClient.execute(httpGet);
+            HttpEntity httpEntity = response.getEntity();
+            if (httpEntity.isStreaming()) {
+                result = EntityUtils.toByteArray(httpEntity);
+            } else {
+                log.info("\r\n ****** Https请求错误:{}", EntityUtils.toString(httpEntity, charsetCode));
+            }
+            EntityUtils.consume(httpEntity);
+        } catch (Exception e) {
+            log.error("\r\n ***************** HTTPS_GET【parameterMap】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                httpsClient.close();
+            } catch (IOException e) {
+                log.error("\r\n ***************** HTTPS_GET【parameterMap】关闭httpClient失败:" + ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * HTTPS协议GET请求
+     *
+     * @param url         HTTPS请求URL
+     * @param paramList   HTTPS请求参数集合
+     * @param charsetCode HTTPS请求编码
+     * @return
+     */
+    public static String httpsGet(String url, List<String[]> paramList, String charsetCode) {
+        // 初始化HTTPS请求客户端
+        CloseableHttpClient client = createSSLClientDefault();
+        String result = null;
+        try {
+            List<NameValuePair> nameValuePairs = getNameValuePair(paramList);
+            HttpGet httpGet = new HttpGet(url + (StringUtils.contains(url, "?") ? "&" : "?") + EntityUtils.toString(new UrlEncodedFormEntity(nameValuePairs, charsetCode)));
+            HttpResponse response = client.execute(httpGet);
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, charsetCode);
+            EntityUtils.consume(entity);
+        } catch (Exception e) {
+            log.error("\r\n ***************** HTTPS_GET【paramList】请求失败:{}", ExceptionUtils.getFullStackTrace(e));
+        } finally {
+            try {
+                client.close();
+            } catch (IOException e) {
+                log.error("\r\n ***************** HTTPS_GET【paramList】关闭httpClient失败:", ExceptionUtils.getFullStackTrace(e));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url          HTTPS协议POST请求
+     * @param parameterMap HTTPS协议参数
+     * @return
+     */
+    public static JSONObject getJSONObjectFromHttpsPost(String url, Map<String, Object> parameterMap) {
+        try {
+            return JSONObject.parseObject(httpsPost(url, parameterMap));
+        } catch (Exception e) {
+            log.error("\r\n ******************HTTPS_POST【parameterMap】请求出错:{}", ExceptionUtils.getStackTrace(e));
+        }
+        return null;
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url       HTTPS协议POST请求
+     * @param paramList HTTPS协议参数
+     * @return
+     */
+    public static JSONObject getJSONObjectFromHttpsPost(String url, List<String[]> paramList) {
+        try {
+            return JSONObject.parseObject(httpsPost(url, paramList));
+        } catch (Exception e) {
+            log.error("\r\n ******************HTTPS_POST【paramList】请求出错:{}", ExceptionUtils.getStackTrace(e));
+        }
+        return null;
+    }
+
+    /**
+     * HTTPS协议POST请求
+     *
+     * @param url      HTTPS请求URL
+     * @param paramStr HTTPS请求参数集合
+     * @return
+     */
+    public static JSONObject getJSONObjectFromHttpsPost(String url, String paramStr) {
+        try {
+            return JSONObject.parseObject(httpsPost(url, paramStr));
+        } catch (Exception e) {
+            log.error("\r\n ******************HTTPS_POST【paramStr】请求出错:{}", ExceptionUtils.getStackTrace(e));
+        }
+        return null;
+    }
+
+    /**
+     * HTTPS协议GET请求
+     *
+     * @param url          HTTPS请求URL
+     * @param parameterMap HTTPS请求参数集合
+     * @return
+     */
+    public static JSONObject getJSONObjectFromHttpsGet(String url, Map<String, Object> parameterMap) {
+        try {
+            return JSONObject.parseObject(httpsGet(url, parameterMap, "UTF-8"));
+        } catch (Exception e) {
+            log.error("\r\n ******************HTTPS_GET【parameterMap】请求出错:{}", ExceptionUtils.getStackTrace(e));
+        }
+        return null;
+    }
+
+    /**
+     * HTTPS协议GET请求
+     *
+     * @param url       HTTPS请求URL
+     * @param paramList HTTPS请求参数集合
+     * @return
+     */
+    public static JSONObject getJSONObjectFromHttpsGet(String url, List<String[]> paramList) {
+        try {
+            return JSONObject.parseObject(httpsGet(url, paramList, "UTF-8"));
+        } catch (Exception e) {
+            log.error("\r\n ******************HTTPS_GET【paramList】请求出错:{}", ExceptionUtils.getStackTrace(e));
+        }
+        return null;
+    }
+
+    /**
+     * 获取post请求,并将响应变更为jsonObject
+     *
+     * @param url          请求地址
+     * @param parameterMap 参数
+     * @param charsetCode  编码
+     * @return
+     */
+    public static JSONObject getJSONObjectFromPost(String url, Map<String, Object> parameterMap, String charsetCode) {
+        return JSONObject.parseObject(post(url, parameterMap, charsetCode));
+    }
+
+    /**
+     * 获取post请求,并将响应变更为jsonObject
+     *
+     * @param url          请求地址
+     * @param parameterMap 参数
+     * @return
+     */
+    public static JSONObject getJSONObjectFromPost(String url, Map<String, Object> parameterMap) {
+        return getJSONObjectFromPost(url, parameterMap, "UTF-8");
+    }
+
+    /**
+     * 发起带有CA认证的https的post请求,默认utf-8编码(仅用于含有需要证书认证的微信支付支付接口)
+     *
+     * @param url         微信接口URL
+     * @param postStr     微信接口参数(XML格式)
+     * @param certPath    微信退款CA证书路径
+     * @param certassword 微信退款证书密码(默认密码为商户号)
+     * @return
+     */
+    public static String httpsPostWithCA(String url, String postStr, String certPath, String certassword) {
+        return httpsPostWithCA(url, postStr, certPath, certassword, "UTF-8");
+    }
+
+    /**
+     * 发起带有CA认证的https的post请求,默认utf-8编码(仅用于含有需要证书认证的微信支付支付接口),返回XML字符串
+     *
+     * @param url          微信退款接口URL
+     * @param postStr      微信退款接口参数
+     * @param charsetCode  接口调用编码格式(默认UTF-8)
+     * @param certPath     CA证书路径
+     * @param certPassword CA证书密码
+     * @return
+     */
+    public static String httpsPostWithCA(String url, String postStr, String certPath, String certPassword, String charsetCode) {
+
+        //初始化返回变量
+        String result = null;
+
+        //初始化KeyStore实例
+        KeyStore keyStore = null;
+        FileInputStream instream = null;
+        char[] pwdChar = StringUtils.isNotBlank(certPassword) ? certPassword.toCharArray() : new char[]{};
+        try {
+            keyStore = KeyStore.getInstance("PKCS12");
+            instream = new FileInputStream(new File(certPath));
+            keyStore.load(instream, pwdChar);
+        } catch (Exception e) {
+            log.error("\r\n **************************【httpsPostWithCA】接口KeyStore初始化失败START ************************ \r\n");
+            log.error(ExceptionUtils.getFullStackTrace(e));
+            log.error("\r\n *************************【httpsPostWithCA】接口KeyStore初始化失败END ************************ \r\n");
+            e.printStackTrace();
+        } finally {
+            try {
+                instream.close();
+            } catch (IOException e) {
+                log.error("\r\n **************************【httpsPostWithCA】接口文件流关闭失败START ************************ \r\n");
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                log.error("\r\n *************************【httpsPostWithCA】接口文件流关闭失败END ************************ \r\n");
+                e.printStackTrace();
+            }
+        }
+
+        // 依赖自己的微信证书
+        SSLContext sslcontext = null;
+        try {
+            sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, pwdChar).build();
+        } catch (Exception e) {
+            log.error("\r\n **************************【httpsPostWithCA】接口初始化证书SSL失败START ************************ \r\n");
+            log.error(ExceptionUtils.getFullStackTrace(e));
+            log.error("\r\n *************************【httpsPostWithCA】接口初始化证书SSL失败END ************************ \r\n");
+            e.printStackTrace();
+        }
+
+        // 初始化证书认证的HttpClient
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
+        CloseableHttpResponse response = null;
+        try {
+            HttpPost post = new HttpPost(url);
+            post.setEntity(new StringEntity(postStr, charsetCode));
+            response = httpclient.execute(post);
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, charsetCode);
+            log.info("\r\n ************************** 退款接口返回信息START ************************ \r\n");
+            log.info(result);
+            log.info("\r\n ************************** 退款接口返回信息END ************************ \r\n");
+            EntityUtils.consume(entity);
+        } catch (Exception e) {
+            log.error("\r\n **************************【httpsPostWithCA】接口HttpPost请求失败START ************************ \r\n");
+            log.error(ExceptionUtils.getFullStackTrace(e));
+            log.error("\r\n **************************【httpsPostWithCA】接口HttpPost请求失败END ************************ \r\n");
+        } finally {
+            try {
+                response.close();
+                httpclient.close();
+            } catch (IOException e) {
+                log.error("\r\n **************************【httpsPostWithCA】接口HttpPost请求关闭失败START ************************ \r\n");
+                log.error(ExceptionUtils.getFullStackTrace(e));
+                log.error("\r\n **************************【httpsPostWithCA】接口HttpPost请求关闭失败END ************************ \r\n");
+            }
+        }
+
+        return result;
+    }
+
+
+    /* ********************************************************* 对象内部私有方法 ********************************************************* */
+
+    /**
+     * 根据参数集合转化名值对
+     *
+     * @param parameterMap 参数集合
+     * @return List<NameValuePair> 名值对集合
+     */
+    private static List<NameValuePair> getNameValuePair(Map<String, Object> parameterMap) {
+        // 初始化返回集合
+        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
+
+        // 转化参数集合为名值对集合
+        if (MapUtils.isNotEmpty(parameterMap)) {
+            for (Map.Entry<String, Object> entry : parameterMap.entrySet()) {
+                String name = entry.getKey();
+                String value = ConvertUtils.convert(entry.getValue());
+                if (StringUtils.isNotEmpty(name)) {
+                    nameValuePairs.add(new BasicNameValuePair(name, value));
+                }
+            }
+        }
+        return nameValuePairs;
+    }
+
+    /**
+     * 根据参数集合转化名值对
+     *
+     * @param paramList 参数集合
+     * @return List<NameValuePair> 名值对集合
+     */
+    private static List<NameValuePair> getNameValuePair(List<String[]> paramList) {
+        // 初始化返回集合
+        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
+        if (paramList != null && !paramList.isEmpty()) {
+            for (String[] arr : paramList) {
+                nameValuePairs.add(new BasicNameValuePair(arr[0], arr[1]));
+            }
+        }
+        return nameValuePairs;
+    }
+
+}
\ No newline at end of file
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ListUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ListUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d70185ddc88d54653ac3788c5287344398dbf59
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ListUtil.java
@@ -0,0 +1,44 @@
+package cn.wisenergy.common.utils;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ * @ClassName ListUtil
+ * @Description TODO
+ * @Author meng
+ * @Date 2020/3/4 15:58
+ * @Version 1.0
+ */
+public class ListUtil {
+    /**
+     * 将该集合中的元素向右移动index位置
+     * @param list
+     * @param index
+     * @return
+     */
+    public static <T> List<T> moveRight(List<T> list, int index){
+        if(list == null || list.size()==0){
+            return list;
+        }
+        Queue queue = new LinkedList<T>();
+        //倒叙进队列
+        for(int i = list.size()-1;i>=0;i--) {
+            queue.offer(list.get(i));
+        }
+        for(int j = 0;j<index;j++) {
+            //出队列
+            T param = (T) queue.poll();
+            //进队列
+            queue.offer(param);
+        }
+        list = new ArrayList<T>();
+        int len = queue.size();
+        for(int i = 0;i<len;i++) {
+            list.add(0,(T) queue.poll());
+        }
+        return list;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/LngLatDirection.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/LngLatDirection.java
new file mode 100644
index 0000000000000000000000000000000000000000..5455af275ba6ed827d9bad0025e81f8fd2c9b60c
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/LngLatDirection.java
@@ -0,0 +1,80 @@
+package cn.wisenergy.common.utils;
+
+/**
+ * @Author zyj
+ * @Date 2020/5/6 18:18
+ * @Description 计算一个经纬度在另一个经纬度什么方向
+ */
+
+public class LngLatDirection {
+
+	public static void main(String[] args) {
+		LngLatDirection lngLatDirection = new LngLatDirection();
+		String str = getDirection(39.915322, 116.404341, 39.954713, 116.45982);
+		System.out.println(str);
+	}
+
+	/**
+	 * @param lat1 纬度1
+	 * @param lng1 经度1
+	 * @param lat2 纬度2
+	 * @param lng2 经度2
+	 * @return 方向
+	 */
+	public static String getDirection(double lat1, double lng1, double lat2, double lng2) {
+		double jiaodu = getAngle(lat1, lng1, lat2, lng2);
+		if ((jiaodu <= 10) || (jiaodu > 350))
+			return "东";
+		if ((jiaodu > 10) && (jiaodu <= 80))
+			return "东北";
+		if ((jiaodu > 80) && (jiaodu <= 100))
+			return "北";
+		if ((jiaodu > 100) && (jiaodu <= 170))
+			return "西北";
+		if ((jiaodu > 170) && (jiaodu <= 190))
+			return "西";
+		if ((jiaodu > 190) && (jiaodu <= 260))
+			return "西南";
+		if ((jiaodu > 260) && (jiaodu <= 280))
+			return "南";
+		if ((jiaodu > 280) && (jiaodu <= 350))
+			return "东南";
+		return "";
+	}
+
+	private static double getAngle(double lat1, double lng1, double lat2, double lng2) {
+		double x1 = lng1;
+		double y1 = lat1;
+		double x2 = lng2;
+		double y2 = lat2;
+		double pi = Math.PI;
+		double w1 = y1 / 180 * pi;
+		double j1 = x1 / 180 * pi;
+		double w2 = y2 / 180 * pi;
+		double j2 = x2 / 180 * pi;
+		double ret;
+		if (j1 == j2) {
+			if (w1 > w2)
+				return 270; // 北半球的情况,南半球忽略
+			else if (w1 < w2)
+				return 90;
+			else
+				return -1;// 位置完全相同
+		}
+		ret = 4 * Math.pow(Math.sin((w1 - w2) / 2), 2) - Math.pow(
+				Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)), 2);
+		ret = Math.sqrt(ret);
+		double temp = (Math.sin(Math.abs(j1 - j2) / 2) * (Math.cos(w1) + Math
+				.cos(w2)));
+		ret = ret / temp;
+		ret = Math.atan(ret) / pi * 180;
+		if (j1 > j2) { // 1为参考点坐标
+			if (w1 > w2)
+				ret += 180;
+			else
+				ret = 180 - ret;
+		} else if (w1 > w2)
+			ret = 360 - ret;
+		return ret;
+	}
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/Md5Util.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/Md5Util.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f9f7ffd469fbb283e9a7d4535deeca590a8359f
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/Md5Util.java
@@ -0,0 +1,63 @@
+package cn.wisenergy.common.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Random;
+
+public class Md5Util {
+    private static Logger log = LoggerFactory.getLogger(Md5Util.class);
+
+    /**
+     * MD5加密
+     *
+     * @param value
+     * @return
+     */
+    public static String digestMD5(String value) {
+        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
+        byte[] strTemp = value.getBytes();
+        MessageDigest mdTemp = null;
+        try {
+            mdTemp = MessageDigest.getInstance("MD5");
+        } catch (NoSuchAlgorithmException e) {
+            log.error(e.getMessage(), e);
+            return null;
+        }
+        mdTemp.update(strTemp);
+        byte[] md = mdTemp.digest();
+
+        int j = md.length;
+        char[] str = new char[j * 2];
+        int k = 0;
+        for (int i = 0; i < j; ++i) {
+            byte byte0 = md[i];
+            str[(k++)] = hexDigits[(byte0 >>> 4 & 0xF)];
+
+            str[(k++)] = hexDigits[(byte0 & 0xF)];
+        }
+        return new String(str);
+    }
+
+    /**
+     * @param len
+     * @return
+     * @throws Exception
+     * @Title generatePassword
+     * @Description: 随机生成8位密码  必须含有数字字母 特殊字符
+     * @date 2018年12月11日 下午6:29:28
+     * @author lut
+     */
+    public static String generatePassword(int len) throws Exception {
+        char charr[] = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        Random r = new Random();
+        for (int x = 0; x < len; ++x) {
+            sb.append(charr[r.nextInt(charr.length)]);
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/R.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/R.java
new file mode 100644
index 0000000000000000000000000000000000000000..ffd05c60b89f2ec305f64a37fe2dda2e78b54ded
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/R.java
@@ -0,0 +1,138 @@
+package cn.wisenergy.common.utils;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.http.HttpStatus;
+
+import java.io.Serializable;
+
+/**
+ * 响应信息类
+ *
+ * @author lut
+ */
+@Data
+@ApiModel(description = "响应信息主体")
+public class R<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty("返回标记:成功标记=0,失败标记1")
+    private int code;
+    @ApiModelProperty("返回信息")
+    private String message;
+    @ApiModelProperty("数据")
+    private T data;
+
+    public R() {
+        this.code = 0;
+        this.message = "success";
+    }
+
+    public R(int code, String msg) {
+        this.code = code;
+        this.message = msg;
+    }
+
+    public R(int code, T data) {
+        this.code = code;
+        this.data = data;
+    }
+
+    public R(T data) {
+        this.code = 0;
+        this.message = "success";
+        this.data = data;
+    }
+
+    public R(T data, String msg) {
+        this.code = 0;
+        this.data = data;
+        this.message = msg;
+    }
+
+    public R(int code, String msg,T data) {
+        this.code = code;
+        this.data = data;
+        this.message = msg;
+    }
+
+    /**
+     * 请求成功
+     */
+    public static <T> R<T> ok() {
+        return new R<>();
+    }
+
+    /**
+     * 请求成功,返回前端的信息
+     *
+     * @param msg 描述
+     * @return R
+     */
+    public static <T> R<T> ok(String msg, T data) {
+        return new R<>(data, msg);
+    }
+
+    /**
+     * 请求成功,返回前端的信息
+     *
+     * @param data 返回值
+     * @return R
+     */
+    public static <T> R<T> ok(T data) {
+        return new R<>(0, data);
+    }
+
+    /**
+     * 请求成功,返回前端信息
+     *
+     * @param code 状态码
+     * @param data 返回值
+     * @return R
+     */
+    public static <T> R<T> ok(int code, T data) {
+        return new R<>(code, data);
+    }
+
+    /**
+     * 请求失败
+     *
+     * @return R
+     */
+    public static <T> R<T> error() {
+        return new R<>(-1, "操作失败");
+    }
+
+    /**
+     * 请求失败,返回前台信息
+     *
+     * @param msg 描述
+     * @return R
+     */
+    public static <T> R<T> error(String msg) {
+        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
+    }
+
+    /**
+     * 请求失败,返回前台信息
+     *
+     * @param code 错误码
+     * @param msg  描述
+     * @return R
+     */
+    public static <T> R<T> error(int code, String msg) {
+        return new R<>(code, msg);
+    }
+
+    /**
+     * 请求失败,返回前台信息
+     *
+     * @param code 错误码
+     * @param msg  描述
+     * @return R
+     */
+    public static <T> R<T> error(int code, String msg,T data) {
+        return new R<>(code, msg,data);
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RSAUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RSAUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d56832641c8d5d75f4e74d565fa83c6a347a7cb
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RSAUtil.java
@@ -0,0 +1,339 @@
+package cn.wisenergy.common.utils;
+
+import java.io.ByteArrayOutputStream;
+import java.math.BigInteger;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.RSAPrivateKeySpec;
+import java.security.spec.RSAPublicKeySpec;
+
+import javax.crypto.Cipher;
+
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.springframework.util.Assert;
+
+/**
+ * Utils - RSA加密解密
+ *
+ * @version 3.0
+ */
+public final class RSAUtil {
+
+	/**
+	 * 安全服务提供者
+	 */
+	private static final Provider PROVIDER = new BouncyCastleProvider();
+
+	/**
+	 * 密钥大小
+	 */
+	private static final int KEY_SIZE = 1024;
+
+	/**
+	 * 加密解密模式 - 填充
+	 */
+	public static final String RSA_ECB_PKCS1PADDING = "RSA/ECB/PKCS1Padding";
+
+	/**
+	 * 加密解密模式
+	 */
+	public static final String RSA = "RSA";
+
+	/**
+	 * 不可实例化
+	 */
+	private RSAUtil() {
+	}
+
+	/**
+	 * 生成密钥对
+	 *
+	 * @return 密钥对
+	 */
+	public static KeyPair generateKeyPair() {
+		try {
+			KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
+					"RSA", PROVIDER);
+			keyPairGenerator.initialize(KEY_SIZE, new SecureRandom());
+			return keyPairGenerator.generateKeyPair();
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * 通过公钥和数组加密
+	 *
+	 * @param publicKey
+	 *            公钥
+	 * @param data
+	 *            数据
+	 * @return 加密后的数据
+	 */
+	@SuppressWarnings("deprecation")
+	public static byte[] encrypt(PublicKey publicKey, byte[] data) {
+		Assert.notNull(publicKey);
+		Assert.notNull(data);
+		try {
+			Cipher cipher = Cipher.getInstance("RSA", PROVIDER);
+			cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+			int blockSize = cipher.getBlockSize();// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024
+			// 加密块大小为127byte,加密后为128个byte;因此共有2个加密块,第一个127byte第二个为1个byte
+			int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小
+			int leavedSize = data.length % blockSize;
+			int blocksSize = leavedSize != 0 ? data.length / blockSize + 1
+					: data.length / blockSize;
+			byte[] raw = new byte[outputSize * blocksSize];
+			int i = 0;
+			while (data.length - i * blockSize > 0) {
+				if (data.length - i * blockSize > blockSize) {
+					cipher.doFinal(data, i * blockSize, blockSize, raw, i
+							* outputSize);
+				} else {
+					cipher.doFinal(data, i * blockSize, data.length - i
+							* blockSize, raw, i * outputSize);
+				}
+				i++;
+			}
+			return raw;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 通过公钥和字符串加密
+	 *
+	 * @param publicKey
+	 *            公钥
+	 * @param text
+	 *            字符串
+	 * @return Base64编码字符串
+	 */
+	@SuppressWarnings("deprecation")
+	public static String encrypt(PublicKey publicKey, String text) {
+		Assert.notNull(publicKey);
+		Assert.notNull(text);
+		byte[] data = encrypt(publicKey, text.getBytes());
+		return data != null ? Base64.encodeBase64String(data) : null;
+	}
+
+	/**
+	 * 通过公钥的模量和指数构建公钥后加密字符串
+	 *
+	 * @param modulus
+	 * @param exponent
+	 * @param text
+	 * @return
+	 */
+	public static String encrypt(String modulus, String exponent, String text) {
+		try {
+			byte[] aryExponent = Base64.decodeBase64(exponent);
+			byte[] aryModulus = Base64.decodeBase64(modulus);
+			BigInteger bigExponent = new BigInteger(1, aryExponent);
+			BigInteger bigModulus = new BigInteger(1, aryModulus);
+			RSAPublicKeySpec keySpec = new RSAPublicKeySpec(bigModulus,
+					bigExponent);
+			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+			PublicKey publicKey = keyFactory.generatePublic(keySpec);
+			return encrypt(publicKey, text);
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		} catch (InvalidKeySpecException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 通过私钥和数组解密
+	 *
+	 * @param privateKey
+	 *            私钥
+	 * @param data
+	 *            数据
+	 * @return 解密后的数据
+	 */
+	@SuppressWarnings({ "deprecation", "static-access" })
+	public static byte[] decrypt(PrivateKey privateKey, byte[] data) {
+		Assert.notNull(privateKey);
+		Assert.notNull(data);
+		try {
+			Cipher cipher = Cipher.getInstance("RSA", PROVIDER);
+			cipher.init(cipher.DECRYPT_MODE, privateKey);
+			int blockSize = cipher.getBlockSize();
+			ByteArrayOutputStream bout = new ByteArrayOutputStream(64);
+			int j = 0;
+
+			while (data.length - j * blockSize > 0) {
+				bout.write(cipher.doFinal(data, j * blockSize, blockSize));
+				j++;
+			}
+			return bout.toByteArray();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 通过私钥和数组解密 - 有模式
+	 *
+	 * @param mode
+	 *            模式
+	 * @param privateKey
+	 *            私钥
+	 * @param data
+	 *            数据
+	 * @return 解密后的数据
+	 */
+	@SuppressWarnings({ "deprecation", "static-access" })
+	public static byte[] decrypt(String mode, PrivateKey privateKey, byte[] data) {
+		Assert.notNull(privateKey);
+		Assert.notNull(data);
+		try {
+			Cipher cipher = Cipher.getInstance(mode, PROVIDER);
+			cipher.init(cipher.DECRYPT_MODE, privateKey);
+			int blockSize = cipher.getBlockSize();
+			ByteArrayOutputStream bout = new ByteArrayOutputStream(64);
+			int j = 0;
+
+			while (data.length - j * blockSize > 0) {
+				bout.write(cipher.doFinal(data, j * blockSize, blockSize));
+				j++;
+			}
+			return bout.toByteArray();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 通过私钥和数组解密 - 点位图用
+	 *
+	 * @param privateKey
+	 *            私钥
+	 * @param data
+	 *            数据
+	 * @return 解密后的数据
+	 */
+	@SuppressWarnings({ "deprecation", "static-access" })
+	public static byte[] decryptForBitmap(PrivateKey privateKey, byte[] data) {
+		Assert.notNull(privateKey);
+		Assert.notNull(data);
+		try {
+			// 点位图ios端使用了默认的填充模式: RSA/ECB/PKCS1Padding
+			Cipher cipher = Cipher
+					.getInstance("RSA/ECB/PKCS1Padding", PROVIDER);
+			cipher.init(cipher.DECRYPT_MODE, privateKey);
+			int blockSize = cipher.getBlockSize();
+			ByteArrayOutputStream bout = new ByteArrayOutputStream(64);
+			int j = 0;
+
+			while (data.length - j * blockSize > 0) {
+				bout.write(cipher.doFinal(data, j * blockSize, blockSize));
+				j++;
+			}
+			return bout.toByteArray();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	/**
+	 * 通过私钥和字符串解密
+	 *
+	 * @param privateKey
+	 *            私钥
+	 * @param text
+	 *            Base64编码字符串
+	 * @return 解密后的数据
+	 */
+	@SuppressWarnings("deprecation")
+	public static String decrypt(PrivateKey privateKey, String text) {
+		Assert.notNull(privateKey);
+		Assert.notNull(text);
+		byte[] data = decrypt(privateKey, Base64.decodeBase64(text));
+		return data != null ? new String(data) : null;
+	}
+
+	/**
+	 * 通过私钥和字符串解密 - 有模式
+	 *
+	 * @param mode
+	 *            模式
+	 * @param privateKey
+	 *            私钥
+	 * @param text
+	 *            Base64编码字符串
+	 * @return 解密后的数据
+	 */
+	@SuppressWarnings("deprecation")
+	public static String decrypt(String mode, PrivateKey privateKey, String text) {
+		Assert.notNull(privateKey);
+		Assert.notNull(text);
+		byte[] data = decrypt(mode, privateKey, Base64.decodeBase64(text));
+		return data != null ? new String(data) : null;
+	}
+
+	/**
+	 * 通过私钥和字符串解密 - 点位图
+	 *
+	 * @param privateKey
+	 *            私钥
+	 * @param text
+	 *            Base64编码字符串
+	 * @return 解密后的数据
+	 */
+	@SuppressWarnings("deprecation")
+	public static String decryptForBitmap(PrivateKey privateKey, String text) {
+		Assert.notNull(privateKey);
+		Assert.notNull(text);
+		byte[] data = decryptForBitmap(privateKey, Base64.decodeBase64(text));
+		return data != null ? new String(data) : null;
+	}
+
+	/**
+	 * 通过私钥的模量和指数构建私钥后和字符串解密
+	 *
+	 * @param modulus
+	 * @param exponent
+	 * @param text
+	 * @return
+	 */
+	public static String decrypt(String modulus, String exponent, String text) {
+		try {
+			byte[] aryExponent = Base64.decodeBase64(exponent);
+			byte[] aryModulus = Base64.decodeBase64(modulus);
+			BigInteger bigExponent = new BigInteger(1, aryExponent);
+			BigInteger bigModulus = new BigInteger(1, aryModulus);
+			RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(bigModulus,
+					bigExponent);
+			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+			PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
+			return decrypt(privateKey, text);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static void main(String[] args) {
+		String exponent = "AQAB";
+		String modulus = "AKJ7e1Lhn5kBnQQ++UWl8MJn9dGwCoTdXExlOsI6YVZkq4+R+Qb3gNo5v1TgHgfS2EMQ0YChr2//nJdmKc1w8bAz6XPRD4L2ZXnKDTfTOmKcel1jC7CzNUY5M1ahhEQeI6f367loH2me9UwScBN8rtIeGEGhP8E8DVriTk9g1xFv";
+		String password = "admin123";
+		System.out.print(encrypt(modulus, exponent, password));
+	}
+}
\ No newline at end of file
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RedisUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RedisUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..6be32d430da5850bd86fd62172692084f79688b0
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RedisUtil.java
@@ -0,0 +1,88 @@
+package cn.wisenergy.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.*;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Redis工具类
+ *
+ */
+@Component
+public class RedisUtil {
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
+    private ValueOperations<String, String> valueOperations;
+    @Autowired
+    private HashOperations<String, String, Object> hashOperations;
+    @Autowired
+    private ListOperations<String, Object> listOperations;
+    @Autowired
+    private SetOperations<String, Object> setOperations;
+    @Autowired
+    private ZSetOperations<String, Object> zSetOperations;
+    /**  不设置过期时长 */
+    public final static long NOT_EXPIRE = -1;
+
+    public void set(String key, Object value){
+        set(key, value);
+    }
+
+    public void set(String key, Object value, long expire){
+        valueOperations.set(key, toJson(value), expire, TimeUnit.SECONDS);
+    }
+
+    public void set(String key, Object value, long expire, TimeUnit var5){
+        valueOperations.set(key, toJson(value), expire, var5);
+    }
+
+    public <T> T get(String key, Class<T> clazz, long expire) {
+        String value = valueOperations.get(key);
+        if(expire != NOT_EXPIRE){
+            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
+        }
+        return value == null ? null : fromJson(value, clazz);
+    }
+
+    public <T> T get(String key, Class<T> clazz) {
+        return get(key, clazz, NOT_EXPIRE);
+    }
+
+    public String get(String key, long expire) {
+        String value = valueOperations.get(key);
+        if(expire != NOT_EXPIRE){
+            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
+        }
+        return value;
+    }
+
+    public String get(String key) {
+        return get(key, NOT_EXPIRE);
+    }
+
+    public Boolean delete(String key) {
+        return redisTemplate.delete(key);
+    }
+
+    /**
+     * Object转成JSON数据
+     */
+    private String toJson(Object object){
+        if(object instanceof Integer || object instanceof Long || object instanceof Float ||
+                object instanceof Double || object instanceof Boolean || object instanceof String){
+            return String.valueOf(object);
+        }
+        return JSON.toJSONString(object);
+    }
+
+    /**
+     * JSON数据,转成Object
+     */
+    private <T> T fromJson(String json, Class<T> clazz){
+        return JSON.parseObject(json, clazz);
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/SecretkeyUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/SecretkeyUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5b701e320183e7f2509acaf2f71bba673b9bce9
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/SecretkeyUtil.java
@@ -0,0 +1,41 @@
+package cn.wisenergy.common.utils;
+
+import java.util.Random;
+
+/**
+ * 生成充值卡子卡秘钥工具类
+ * @author 86187
+ */
+public class SecretkeyUtil {
+
+    //字符串长度
+    static final int LENGTH= 16;
+
+    //开头数字最小长度
+    static final int MIN_LENGTH_OF_NUMBER= 4;
+
+    //字母拼接最大位置
+    static final int MAX_LENGTH_OF_STRING=11;
+    public static String getSecretkey(){
+        char[] chars={'a','b','c','d','e','f','g','h','l','j','k','i','m','n','o','p','q','r','s','t','y','u','w','x','v','z'};
+        StringBuilder stringBuilder=new StringBuilder(16);
+        Random random = new Random();
+        int i1 =random.nextInt(4)+MIN_LENGTH_OF_NUMBER;
+        for (int i = 0; i <i1; i++) {
+            stringBuilder.append(random.nextInt(9));
+        }
+        while (i1<MAX_LENGTH_OF_STRING) {
+            int i2 =random.nextInt(25);
+            if (i2 < 26) {
+                stringBuilder.append(chars[i2]);
+                i1++;
+            }
+
+        }
+        for (int i = MAX_LENGTH_OF_STRING; i <LENGTH ; i++) {
+            stringBuilder.append(random.nextInt(9));
+        }
+
+        return stringBuilder.toString();
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/SpringUtils.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/SpringUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7aabc390fc2ef6d731bc85206a7552ebc9f00f4
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/SpringUtils.java
@@ -0,0 +1,72 @@
+package cn.wisenergy.common.utils;
+
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
+
+@Component("springUtils")
+@Lazy(false)
+public final class SpringUtils implements ApplicationContextAware,
+		DisposableBean {
+
+	/**
+	 * applicationContext
+	 */
+	private static ApplicationContext applicationContext;
+
+	/**
+	 * 不可实例化
+	 */
+	private SpringUtils() {
+	}
+
+	public void setApplicationContext(ApplicationContext applicationContext) {
+		SpringUtils.applicationContext = applicationContext;
+	}
+
+	public void destroy() throws Exception {
+		applicationContext = null;
+	}
+
+	/**
+	 * 获取applicationContext
+	 *
+	 * @return applicationContext
+	 */
+	public static ApplicationContext getApplicationContext() {
+		return applicationContext;
+	}
+
+	/**
+	 * 获取实例
+	 *
+	 * @param name
+	 *            Bean名称
+	 * @return 实例
+	 */
+	@SuppressWarnings("deprecation")
+	public static Object getBean(String name) {
+		Assert.hasText(name);
+		return applicationContext.getBean(name);
+	}
+
+	/**
+	 * 获取实例
+	 *
+	 * @param name
+	 *            Bean名称
+	 * @param type
+	 *            Bean类型
+	 * @return 实例
+	 */
+	@SuppressWarnings("deprecation")
+	public static <T> T getBean(String name, Class<T> type) {
+		Assert.hasText(name);
+		Assert.notNull(type);
+		return applicationContext.getBean(name, type);
+	}
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/StringUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/StringUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..b97e227ddd427a02a5b88aceb244eeefb0d856fa
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/StringUtil.java
@@ -0,0 +1,565 @@
+package cn.wisenergy.common.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 字符串工具类
+ */
+public class StringUtil {
+
+    /**
+     * String转为Integer
+     *
+     * @param str
+     * @return
+     */
+    public static Integer stringToInteger(String str) {
+        if (str != null && !str.equalsIgnoreCase("")) {
+            try {
+                return new Integer(str);
+            } catch (NumberFormatException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * String转为Long
+     *
+     * @param str
+     * @return
+     */
+    public static Long stringToLong(String str) {
+        if (str != null && !str.equalsIgnoreCase("")) {
+            try {
+                return new Long(str);
+            } catch (NumberFormatException e) {
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 将字符串数组转化成Long数组
+     *
+     * @param strArr
+     * @return
+     */
+    public static Long[] strArrToLongArr(String[] strArr) {
+        Long[] longArr = new Long[strArr.length];
+        for (int i = 0; i < strArr.length; i++) {
+            longArr[i] = stringToLong(strArr[i]);
+        }
+        return longArr;
+    }
+
+    /**
+     * 将字符串转化为Boolean类型
+     *
+     * @param str
+     * @return
+     */
+    public static Double stringToDouble(String str) {
+        if (str != null && !str.equalsIgnoreCase("")) {
+            try {
+                return new Double(str);
+            } catch (NumberFormatException e) {
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 将字符串转化为BigDecimal
+     *
+     * @param str
+     * @return
+     */
+    public static BigDecimal stringToDecimal(String str) {
+        if (StringUtils.isNotEmpty(str)) {
+            try {
+                return new BigDecimal(str);
+            } catch (NumberFormatException e) {
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 是否为BigDecimal类型
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isDecimal(String str) {
+        boolean res = true;
+        if (StringUtils.isEmpty(str)) {
+            return false;
+        }
+        try {
+            new BigDecimal(str);
+        } catch (NumberFormatException e) {
+            res = false;
+        }
+        return res;
+    }
+
+    /**
+     * 格式化double为字符串
+     *
+     * @param num
+     * @param pattern
+     * @return
+     */
+    public static String formatNumToString(double num, String pattern) {
+        DecimalFormat format = new DecimalFormat(pattern);
+        return format.format(num);
+    }
+
+    /**
+     * 格式化long为字符串
+     *
+     * @param num
+     * @param pattern
+     * @return
+     */
+    public static String formatNumToString(long num, String pattern) {
+        DecimalFormat format = new DecimalFormat(pattern);
+        return format.format(num);
+    }
+
+    /**
+     * 格式化BigDecimal为字符串
+     *
+     * @param num
+     * @param pattern
+     * @return
+     */
+    public static String formatNumToString(BigDecimal num, String pattern) {
+        DecimalFormat format = new DecimalFormat(pattern);
+        return format.format(num.doubleValue());
+    }
+
+    /**
+     * 格式化BigDiemal为固定格式的字符串
+     *
+     * @param num
+     * @return
+     */
+    public static String formatNumToString(BigDecimal num) {
+        return formatNumToString(num, "#,###.##");
+    }
+
+    /**
+     * 格式化日期
+     *
+     * @param date
+     * @param pattern
+     * @return
+     */
+    public static Date formatDate(Date date, String pattern) {
+        SimpleDateFormat dsf = new SimpleDateFormat(pattern);
+        String dateStr = dsf.format(date);
+        try {
+            return dsf.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+    /**
+     * 将字符串做重复多次的拼接
+     *
+     * @param str
+     * @param n
+     * @return
+     */
+    public static String dupStr(String str, int n) {
+        StringBuffer sb = new StringBuffer("");
+        for (int i = 1; i <= n; i++) {
+            sb.append(str);
+        }
+        return sb.toString();
+    }
+
+    public static String dateToString(Date date) {
+        return dateToString(date, "yyyy-MM-dd");
+    }
+
+    public static String datetimeToString(Date date) {
+        return dateToString(date, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    public static String dateToString(Date date, String pattern) {
+        if (date != null) {
+            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+            return sdf.format(date);
+        } else {
+            return null;
+        }
+    }
+
+    public static Date stringToDate(String str) {
+        return stringToDate(str, "yyyy-MM-dd");
+    }
+
+    public static Date stringToDatetime(String str) {
+        return stringToDate(str, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    public static Date stringToDate(String str, String pattern) {
+        if (StringUtils.isNotEmpty(str)) {
+            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+            try {
+                return sdf.parse(str);
+            } catch (ParseException e) {
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * double类型精度的四舍五入
+     *
+     * @param v
+     * @param scale
+     * @return
+     */
+    public static double round(double v, int scale) {
+        if (scale < 0) {
+            throw new IllegalArgumentException(
+                    "The scale must be a positive integer or zero");
+        } else {
+            BigDecimal b = new BigDecimal(Double.toString(v));
+            BigDecimal one = new BigDecimal("1");
+            return b.divide(one, scale, 4).doubleValue();
+        }
+    }
+
+    /**
+     * 根据长度截取字符串,超过长度截取,否则不截取
+     *
+     * @param str
+     * @param len
+     * @return
+     */
+    public static String subStrByLen(String str, int len) {
+        if (StringUtils.isNotEmpty(str)) {
+            return str.trim().length() > len ? str.trim().substring(0, len)
+                    : str.trim();
+        }
+        return str;
+    }
+
+    /**
+     * 转换数组为字符串,中间用split隔开
+     *
+     * @param arr
+     * @param split
+     * @return
+     */
+    public static String arrayToString(String[] arr, String split) {
+        if (arr == null || arr.length == 0)
+            return "";
+
+        StringBuffer buffer = new StringBuffer("");
+
+        for (int i = 0; i < arr.length; i++) {
+
+            if (StringUtils.isEmpty(arr[i]))
+                continue;
+
+            buffer.append(arr[i]);
+            buffer.append(split);
+        }
+
+        return buffer.length() > 0 ? buffer.substring(0, buffer.length() - 1)
+                : buffer.toString();
+    }
+
+    /**
+     * 转换字符串数组为字符串,默认用逗号隔开
+     *
+     * @param arr
+     * @return
+     */
+    public static String arrToString(String arr[]) {
+        return arrayToString(arr, ",");
+    }
+
+    /**
+     * 将\r\n转化为<br/>,主要用于视图页面的显示
+     *
+     * @param str
+     * @return
+     */
+    public static String converRNToBR(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return "";
+        }
+        return str.replaceAll("\r\n", "<br/>");
+    }
+
+    /**
+     * 判断char类型的字符是否不为表情字符
+     *
+     * @param codePoint
+     * @return
+     */
+    private static boolean isNotEmojiCharacter(char codePoint) {
+        return (codePoint == 0x0) ||
+                (codePoint == 0x9) ||
+                (codePoint == 0xA) ||
+                (codePoint == 0xD) ||
+                ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
+                ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
+                ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
+    }
+
+    /**
+     * 过滤emoji 或者 其他非文字类型的字符
+     *
+     * @param source
+     * @return
+     */
+    public static String filterEmoji(String source) {
+        if (source == null) {
+            return null;
+        }
+        int len = source.length();
+        StringBuilder buf = new StringBuilder(len);
+        for (int i = 0; i < len; i++) {
+            char codePoint = source.charAt(i);
+            if (isNotEmojiCharacter(codePoint)) {
+                buf.append(codePoint);
+            }
+        }
+        return buf.toString();
+    }
+
+    /**
+     * 去除字符串中的双引号
+     *
+     * @param str
+     * @return
+     */
+    public static String trimDoubleQuotations(String str) {
+        if (str == null) {
+            return null;
+        }
+        return str.replaceAll("\"", "");
+    }
+
+    /**
+     * 判断字符是否为中文
+     *
+     * @param c
+     * @return
+     */
+    public static boolean isChinese(char c) {
+        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
+        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
+                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
+                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
+                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 判断字符串是否包括中文
+     *
+     * @param strName
+     * @return
+     */
+    public static boolean isContainsChinese(String strName) {
+        char[] ch = strName.toCharArray();
+        for (int i = 0; i < ch.length; i++) {
+            char c = ch[i];
+            if (isChinese(c)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 获取字符串长度(汉子算两位)
+     *
+     * @param s
+     * @return
+     */
+    public static int getLength(String s) {
+        int length = 0;
+        char[] ch = s.toCharArray();
+        for (char c : ch) {
+            if (StringUtil.isChinese(c)) {
+                length += 2;
+            } else {
+                length += 1;
+            }
+        }
+        return length;
+    }
+
+
+    /**
+     * 获取字符串长度(汉子算两位)
+     *
+     * @param s
+     * @return
+     */
+    public static int getLengthByUtf8(String s) {
+        int length = 0;
+        char[] ch = s.toCharArray();
+        for (char c : ch) {
+            if (StringUtil.isChinese(c)) {
+                length += 3;
+            } else {
+                length += 1;
+            }
+        }
+        return length;
+    }
+
+    /**
+     * 指定长度后面补指定字符
+     *
+     * @param s
+     * @param len
+     * @param item
+     * @return
+     */
+    public static String addChars(String s, int len, String item) {
+        if (StringUtils.isBlank(s)) {
+            return "";
+        }
+
+        int length = getLength(s);
+
+        if (length >= len) {
+            return s;
+        } else {
+            int count = len - length;
+            StringBuilder sb = new StringBuilder(s);
+            for (int i = 0; i < count; i++) {
+                sb.append(item);
+            }
+            return sb.toString();
+        }
+
+    }
+
+    /**
+     * 指定长度后面补空格
+     *
+     * @param s
+     * @param len
+     * @return
+     */
+    public static String addSpace(String s, int len) {
+        return addChars(s, len, " ");
+    }
+
+    /**
+     * 指定字节长度后面补空格
+     *
+     * @param s
+     * @param len
+     * @return
+     */
+    public static String addSpaceByByteLen(String s, int len) {
+        if ("".equals(s)) {
+            return StringUtils.rightPad(s, len);
+        }
+        int length = org.apache.commons.codec.binary.StringUtils.getBytesUtf8(s).length;
+
+        int strLength = getLength(s);
+
+        if (len <= length) {
+            return s;
+        }
+        return StringUtils.rightPad(s, len - (length - strLength));
+    }
+
+    /**
+     * 指定空格前面补空格
+     *
+     * @param s
+     * @param len
+     * @return
+     */
+    public static String addLeftSpace(String s, int len) {
+        int length = getLength(s);
+        if (length >= len) {
+            return s;
+        } else {
+            int count = len - length;
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < count; i++) {
+                sb.append(" ");
+            }
+            sb.append(s);
+            return sb.toString();
+        }
+    }
+
+    /**
+     * 指定长度两头加空格
+     *
+     * @param s
+     * @param len
+     * @return
+     */
+    public static String addBothSpace(String s, int len) {
+        int length = getLength(s);
+
+        if (length >= len) {
+            return s;
+        } else {
+            int count = len - length;
+            count = count / 2;
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < count; i++) {
+                sb.append(" ");
+            }
+            StringBuilder sb2 = new StringBuilder();
+            sb2.append(sb.toString());
+            sb2.append(s);
+            sb2.append(sb.toString());
+            return sb2.toString();
+        }
+    }
+
+    /**
+     * 把 "1,2,3,4,5,6,7"  转化为list
+     *
+     * @param s 入参
+     * @return 结果
+     */
+    public static List<Integer> strToArray(String s) {
+        if (StringUtils.isEmpty(s)) {
+            return new ArrayList<>();
+        }
+
+        List<Integer> result = new ArrayList<>();
+        String[] str = s.split(",");
+        for (String string : str) {
+            result.add(Integer.valueOf(string));
+        }
+        return result;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/TimeUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/TimeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..28de8051313fc7a3ecaf289900bfcff282ca4305
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/TimeUtil.java
@@ -0,0 +1,105 @@
+package cn.wisenergy.common.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 时间格式转换工具类
+ */
+public class TimeUtil {
+	private static final String timeFormat = "yyyy-MM-dd HH:mm";
+	private static final String dateFormat = "yyyy-MM-dd";
+
+	/**
+	 * 时间日期格式
+	 * 
+	 * @param time
+	 * @return
+	 * @throws ParseException
+	 */
+	public static Date getTime(String time) throws ParseException {
+		SimpleDateFormat ft = new SimpleDateFormat(timeFormat);
+		return ft.parse(time);
+	}
+
+	/**
+	 * 时间日期格式
+	 * 
+	 * @param time
+	 * @return
+	 */
+	public static String getTime(Date time) {
+		SimpleDateFormat ft = new SimpleDateFormat(timeFormat);
+		return ft.format(time);
+	}
+
+	/**
+	 * 日期格式
+	 * 
+	 * @param date
+	 * @return
+	 * @throws ParseException
+	 */
+	public static Date getDate(String date) throws ParseException {
+		SimpleDateFormat ft = new SimpleDateFormat(dateFormat);
+		return ft.parse(date);
+	}
+
+	/**
+	 * 日期格式
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static String getDate(Date date) {
+		SimpleDateFormat ft = new SimpleDateFormat(dateFormat);
+		return ft.format(date);
+	}
+
+	/**
+	 * 将日期转化成毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Long getTimeMill(Date date) {
+		return date.getTime();
+	}
+
+	/**
+	 * 将毫秒转化为日期
+	 * 
+	 * @param time
+	 * @return
+	 */
+	public static Date getTimeMill(Long time) {
+		Date date = new Date();
+		date.setTime(time);
+		return date;
+	}
+
+	/**
+	 * 两个时间相差的分钟数
+	 * 
+	 * @param time1
+	 * @param time2
+	 * @return
+	 * @Description:
+	 */
+	public static Integer getDistanceMinutes(Date time1, Date time2) {
+		try {
+			SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
+			String fromDate = simpleFormat.format(time1);
+			String toDate = simpleFormat.format(time2);
+			long from = simpleFormat.parse(fromDate).getTime();
+			long to = simpleFormat.parse(toDate).getTime();
+			int minutes = (int) ((to - from) / (1000 * 60));
+			return minutes;
+		} catch (ParseException e) {
+			e.printStackTrace();
+			return 0;
+		}
+
+	}
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/WebUtils.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/WebUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..c310230dbc40e34ac588bf11f52df9aa972b9a53
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/WebUtils.java
@@ -0,0 +1,281 @@
+package cn.wisenergy.common.utils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.Assert;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+
+public class WebUtils {
+    // 注入日志类
+    private static Logger log = LoggerFactory.getLogger(WebUtils.class);
+
+    /**
+     * 不可实例化
+     */
+    private WebUtils() {
+    }
+
+    /**
+     * 添加cookie
+     *
+     * @param request  HttpServletRequest
+     * @param response HttpServletResponse
+     * @param name     cookie名称
+     * @param value    cookie值
+     * @param maxAge   有效期(单位: 秒)
+     * @param path     路径
+     * @param domain   域
+     * @param secure   是否启用加密
+     */
+    public static void addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, Integer maxAge, String path, String domain, Boolean secure, Boolean httpOnly) {
+        Assert.notNull(request, "request请求为空");
+        Assert.notNull(response, "response响应为空");
+        Assert.hasText(name, "cookie名称为空");
+        try {
+            name = URLEncoder.encode(name, "UTF-8");
+            value = URLEncoder.encode(value, "UTF-8");
+            Cookie cookie = new Cookie(name, value);
+            if (maxAge != null) {
+                cookie.setMaxAge(maxAge);
+            }
+            if (StringUtils.isNotEmpty(path)) {
+                cookie.setPath(path);
+            }
+            if (StringUtils.isNotEmpty(domain)) {
+                cookie.setDomain(domain);
+            }
+            if (secure != null) {
+                cookie.setSecure(secure);
+            }
+            if (httpOnly != null) {
+                cookie.setHttpOnly(httpOnly);
+            }
+            response.addCookie(cookie);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 添加cookie
+     *
+     * @param request  HttpServletRequest
+     * @param response HttpServletResponse
+     * @param name     cookie名称
+     * @param value    cookie值
+     * @param maxAge   有效期(单位: 秒)
+     */
+    public static void addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, Integer maxAge) {
+        addCookie(request, response, name, value, maxAge, "/", "", null, null);
+    }
+
+    /**
+     * 添加cookie【根路径】
+     *
+     * @param request
+     * @param response
+     * @param name
+     * @param value
+     * @param httpOnly
+     */
+    public static void addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, Boolean httpOnly) {
+        addCookie(request, response, name, value, null, "/", "", null, httpOnly);
+    }
+
+    /**
+     * 添加cookie
+     *
+     * @param request  HttpServletRequest
+     * @param response HttpServletResponse
+     * @param name     cookie名称
+     * @param value    cookie值
+     */
+    public static void addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value) {
+        addCookie(request, response, name, value, null, "/", "", null, null);
+    }
+
+    /**
+     * 获取cookie
+     *
+     * @param request HttpServletRequest
+     * @param name    cookie名称
+     * @return 若不存在则返回null
+     */
+    public static String getCookie(HttpServletRequest request, String name) {
+        Assert.notNull(request, "Request is null when receiving cookie");
+        Assert.hasText(name, "The name of cookie is null when receiving cookie");
+        Cookie[] cookies = request.getCookies();
+        if (cookies != null) {
+            try {
+                name = URLEncoder.encode(name, "UTF-8");
+                for (Cookie cookie : cookies) {
+                    if (StringUtils.equals(name, cookie.getName())) {
+                        return URLDecoder.decode(cookie.getValue(), "UTF-8");
+                    }
+                }
+            } catch (UnsupportedEncodingException e) {
+                log.error("从Request中获取Cookie出错:{}", ExceptionUtils.getStackTrace(e));
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 移除cookie
+     *
+     * @param request  HttpServletRequest
+     * @param response HttpServletResponse
+     * @param name     cookie名称
+     * @param path     路径
+     * @param domain   域
+     */
+    public static void removeCookie(HttpServletRequest request, HttpServletResponse response, String name, String path, String domain) {
+        Assert.notNull(request, "Request is Null when Removing Cookie");
+        Assert.notNull(response, "Response is null when removing Cookie");
+        Assert.hasText(name, "The name of cookie is null when removing cookie");
+        try {
+            // 初始化响应Cookie对象
+            name = URLEncoder.encode(name, "UTF-8");
+            Cookie cookie = new Cookie(name, null);
+            cookie.setMaxAge(0); // -1 表示关闭浏览器失效  0: 立即失效  >0: 单位是秒, 多少秒后失效
+            if (StringUtils.isNotEmpty(path)) {
+                cookie.setPath(path);
+            }
+            if (StringUtils.isNotEmpty(domain)) {
+                cookie.setDomain(domain);
+            }
+            response.addCookie(cookie);
+        } catch (Exception e) {
+            log.error("从Request中移除Cookie出错:{}", ExceptionUtils.getStackTrace(e));
+        }
+    }
+
+    /**
+     * 移除cookie
+     *
+     * @param request  HttpServletRequest
+     * @param response HttpServletResponse
+     * @param name     cookie名称
+     */
+    public static void removeCookie(HttpServletRequest request, HttpServletResponse response, String name) {
+        removeCookie(request, response, name, "/", "");
+    }
+
+    /**
+     * 获取参数
+     *
+     * @param queryString 查询字符串
+     * @param encoding    编码格式
+     * @param name        参数名称
+     * @return 参数
+     */
+    public static String getParameter(String queryString, String encoding, String name) {
+        String[] parameterValues = getParameterMap(queryString, encoding).get(name);
+        return parameterValues != null && parameterValues.length > 0 ? parameterValues[0] : null;
+    }
+
+    /**
+     * 获取参数
+     *
+     * @param queryString 查询字符串
+     * @param encoding    编码格式
+     * @param name        参数名称
+     * @return 参数
+     */
+    public static String[] getParameterValues(String queryString, String encoding, String name) {
+        return getParameterMap(queryString, encoding).get(name);
+    }
+
+    /**
+     * 获取参数
+     *
+     * @param queryString 查询字符串
+     * @param encoding    编码格式
+     * @return 参数
+     */
+    public static Map<String, String[]> getParameterMap(String queryString, String encoding) {
+        Map<String, String[]> parameterMap = new HashMap<String, String[]>();
+        Charset charset = Charset.forName(encoding);
+        if (StringUtils.isNotEmpty(queryString)) {
+            byte[] bytes = queryString.getBytes(charset);
+            if (bytes != null && bytes.length > 0) {
+                int ix = 0;
+                int ox = 0;
+                String key = null;
+                String value = null;
+                while (ix < bytes.length) {
+                    byte c = bytes[ix++];
+                    switch ((char) c) {
+                        case '&':
+                            value = new String(bytes, 0, ox, charset);
+                            if (key != null) {
+                                putMapEntry(parameterMap, key, value);
+                                key = null;
+                            }
+                            ox = 0;
+                            break;
+                        case '=':
+                            if (key == null) {
+                                key = new String(bytes, 0, ox, charset);
+                                ox = 0;
+                            } else {
+                                bytes[ox++] = c;
+                            }
+                            break;
+                        case '+':
+                            bytes[ox++] = (byte) ' ';
+                            break;
+                        case '%':
+                            bytes[ox++] = (byte) ((convertHexDigit(bytes[ix++]) << 4) + convertHexDigit(bytes[ix++]));
+                            break;
+                        default:
+                            bytes[ox++] = c;
+                    }
+                }
+                if (key != null) {
+                    value = new String(bytes, 0, ox, charset);
+                    putMapEntry(parameterMap, key, value);
+                }
+            }
+        }
+        return parameterMap;
+    }
+
+    private static void putMapEntry(Map<String, String[]> map, String name, String value) {
+        String[] newValues = null;
+        String[] oldValues = map.get(name);
+        if (oldValues == null) {
+            newValues = new String[]{value};
+        } else {
+            newValues = new String[oldValues.length + 1];
+            System.arraycopy(oldValues, 0, newValues, 0, oldValues.length);
+            newValues[oldValues.length] = value;
+        }
+        map.put(name, newValues);
+    }
+
+    private static byte convertHexDigit(byte b) {
+        if ((b >= '0') && (b <= '9')) {
+            return (byte) (b - '0');
+        }
+        if ((b >= 'a') && (b <= 'f')) {
+            return (byte) (b - 'a' + 10);
+        }
+        if ((b >= 'A') && (b <= 'F')) {
+            return (byte) (b - 'A' + 10);
+        }
+        throw new IllegalArgumentException();
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/BaseCustomException.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/BaseCustomException.java
new file mode 100644
index 0000000000000000000000000000000000000000..096489ed8265642e714fee96fa5ce263cf074447
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/BaseCustomException.java
@@ -0,0 +1,66 @@
+package cn.wisenergy.common.utils.exception;
+
+import cn.wisenergy.common.enums.RespCodeEnum;
+
+/**
+ * 接口异常对象
+ */
+public class BaseCustomException extends RuntimeException {
+    private static final long serialVersionUID = -4974461182923482972L;
+    // 错误编码
+    private String errorCode;
+
+    // 错误编码信息
+    private String errorMsg;
+
+    /**
+     * 应用接口有参构造函数
+     *
+     * @param errorCode 错误编码
+     * @param errorMsg  错误信息
+     */
+    public BaseCustomException(String errorCode, String errorMsg) {
+        super("errorCode:" + errorCode + "  errorMsg:" + errorMsg);
+        this.errorCode = errorCode;
+        this.errorMsg = errorMsg;
+    }
+
+    /**
+     * 应用接口有参构造函数
+     *
+     * @param baseResponseCodeEnum 基本响应枚举类
+     */
+    public BaseCustomException(RespCodeEnum baseResponseCodeEnum) {
+        super("errorCode:" + baseResponseCodeEnum.getCode() + "  errorMsg:" + baseResponseCodeEnum.getMsg());
+        this.errorCode = baseResponseCodeEnum.getCode();
+        this.errorMsg = baseResponseCodeEnum.getMsg();
+    }
+
+    /**
+     * 获取错误编码
+     */
+    public String getErrorCode() {
+        return errorCode;
+    }
+
+    /**
+     * 设置错误编码
+     */
+    public void setErrorCode(String errorCode) {
+        this.errorCode = errorCode;
+    }
+
+    /**
+     * 获取异常编码
+     */
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    /**
+     * 设置异常编码
+     */
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/Result.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/Result.java
new file mode 100644
index 0000000000000000000000000000000000000000..01d3f08edcbad748e5da085ab7bac6950790f0d2
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/Result.java
@@ -0,0 +1,61 @@
+package cn.wisenergy.common.utils.exception;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author wyy
+ * @date 2019-10-11 20:51
+ */
+@Data
+@ApiModel("返回结果")
+public class Result<T> {
+    // 结果标识
+    @ApiModelProperty(value = "结果标识",example = "success")
+    private String result;
+
+    // 错误编码
+    @ApiModelProperty(value = "错误编码",example = "1001")
+    private String errorCode;
+
+    // 错误信息
+    @ApiModelProperty(value = "错误信息",example = "操作成功")
+    public String errorMsg;
+
+    // 封装数据的参数名称
+    @ApiModelProperty(value = "返回结果")
+    private T data;
+
+    /**
+     * 结果参数枚举
+     */
+    public enum RESULT_FLG {
+        SUCCESS("success"),
+        FAIL("fail");
+
+        /**
+         * 值变量
+         */
+        private String value;
+
+        /**
+         * 含有结果值的构造函数
+         *
+         * @param value
+         */
+        private RESULT_FLG(String value) {
+            this.value = value;
+        }
+
+        /**
+         * 获取值
+         *
+         * @return
+         */
+        public String getValue() {
+            return this.value;
+        }
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/BigDecimalConvert.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/BigDecimalConvert.java
new file mode 100644
index 0000000000000000000000000000000000000000..865548102515e18afb36e2abf21544b9d4f19d6c
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/BigDecimalConvert.java
@@ -0,0 +1,38 @@
+package cn.wisenergy.common.utils.exportView.convert;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+
+/**
+ * BigDecimal 转化类
+ */
+public class BigDecimalConvert implements Convert {
+
+    private int scale = 2;
+
+    public BigDecimalConvert() {
+
+    }
+
+    public BigDecimalConvert(int scale) {
+        this.scale = scale;
+    }
+
+    @Override
+    public String convert(String value) {
+
+        if (StringUtils.isBlank(value)) {
+            return "";
+        }
+
+        try {
+            BigDecimal b = new BigDecimal(value);
+            return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "";
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/Convert.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/Convert.java
new file mode 100644
index 0000000000000000000000000000000000000000..2e8604bfd17a64076a6726d408527ec26d7eb2ab
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/Convert.java
@@ -0,0 +1,8 @@
+package cn.wisenergy.common.utils.exportView.convert;
+
+/**
+ * 类型转化接口
+ */
+public interface Convert {
+    String convert(String value);
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/DateConvert.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/DateConvert.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd3c0d8f3e52ced066e605bf3309a784fec4fcce
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/convert/DateConvert.java
@@ -0,0 +1,40 @@
+package cn.wisenergy.common.utils.exportView.convert;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+/**
+ * 日期类型转化
+ */
+public class DateConvert implements Convert {
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy", Locale.US);
+
+    private SimpleDateFormat outSDF = null;
+
+    public DateConvert() {
+        this(null);
+    }
+
+    public DateConvert(String pattern) {
+        if (StringUtils.isBlank(pattern)) {
+            pattern = "yyyy-MM-dd HH:mm:ss";
+        }
+        outSDF = new SimpleDateFormat(pattern);
+    }
+
+    @Override
+    public String convert(String value) {
+        try {
+            if (StringUtils.isNotBlank(value)) {
+                return outSDF.format(SDF.parse(value));
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/view/ExcelView.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/view/ExcelView.java
new file mode 100644
index 0000000000000000000000000000000000000000..1dbffed50d38d0c08236ee191b6ffc3e9d263a8e
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/view/ExcelView.java
@@ -0,0 +1,563 @@
+package cn.wisenergy.common.utils.exportView.view;
+
+import cn.wisenergy.common.utils.FileUtil;
+import cn.wisenergy.common.utils.exportView.convert.Convert;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.hssf.usermodel.HSSFFont;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
+import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.Assert;
+import org.springframework.web.servlet.view.document.AbstractXlsxView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * excel视图
+ */
+public class ExcelView extends AbstractXlsxView {
+
+	/**
+	 * 日志类
+	 */
+	private Logger log = LoggerFactory.getLogger(this.getClass());
+
+	/**
+	 * 文件名称
+	 */
+	private String filename;
+
+	/**
+	 * 表名称
+	 */
+	private String sheetName;
+
+	/**
+	 * 属性
+	 */
+	private String[] properties;
+
+	/**
+	 * 标题
+	 */
+	private String[] titles;
+
+	/**
+	 * 图片属性集合
+	 */
+	private String[] pictures;
+
+	/**
+	 * 列宽
+	 */
+	private Integer[] widths;
+
+	/**
+	 * 表体高度
+	 */
+	private Float bodyHeight;
+
+	/**
+	 * 数据
+	 */
+	private Collection<?> data;
+
+	/**
+	 * 附加内容
+	 */
+	private String[] contents;
+
+	/**
+	 * 数据转换map
+	 */
+	private Map<String, Convert> convertMap = new HashMap<String, Convert>();
+
+	/**
+	 * @param filename
+	 *            文件名称
+	 * @param sheetName
+	 *            表名称
+	 * @param properties
+	 *            属性
+	 * @param titles
+	 *            标题
+	 * @param widths
+	 *            列宽
+	 * @param data
+	 *            数据
+	 * @param contents
+	 *            附加内容
+	 * @param convertMap
+	 *            数据转化map
+	 */
+	public ExcelView(String filename, String sheetName, String[] properties,
+			String[] titles, Integer[] widths, Collection<?> data,
+			String[] contents, Map<String, Convert> convertMap) {
+		this.filename = filename;
+		this.sheetName = sheetName;
+		this.properties = properties;
+		this.titles = titles;
+		this.widths = widths;
+		this.data = data;
+		this.contents = contents;
+		this.convertMap = MapUtils.isEmpty(convertMap) ? this.convertMap
+				: convertMap;
+	}
+
+	/**
+	 * @param filename
+	 *            文件名称
+	 * @param sheetName
+	 *            表名称
+	 * @param properties
+	 *            属性
+	 * @param titles
+	 *            标题
+	 * @param pictures
+	 *            图片属性
+	 * @param widths
+	 *            列宽
+	 * @param bodyHeight
+	 *            表体高度
+	 * @param data
+	 *            数据
+	 * @param contents
+	 *            附加内容
+	 * @param convertMap
+	 *            数据转化map
+	 */
+	public ExcelView(String filename, String sheetName, String[] properties,
+			String[] titles, String[] pictures, Integer[] widths,
+			Float bodyHeight, Collection<?> data, String[] contents,
+			Map<String, Convert> convertMap) {
+		this.filename = filename;
+		this.sheetName = sheetName;
+		this.properties = properties;
+		this.titles = titles;
+		this.pictures = pictures;
+		this.widths = widths;
+		this.bodyHeight = bodyHeight;
+		this.data = data;
+		this.contents = contents;
+		this.convertMap = MapUtils.isEmpty(convertMap) ? this.convertMap
+				: convertMap;
+	}
+
+	/**
+	 * @param properties
+	 *            属性
+	 * @param titles
+	 *            标题
+	 * @param data
+	 *            数据
+	 * @param contents
+	 *            附加内容
+	 */
+	public ExcelView(String filename, String[] properties, String[] titles,
+			Collection<?> data, String[] contents,
+			Map<String, Convert> convertMap) {
+		this.filename = filename;
+		this.properties = properties;
+		this.titles = titles;
+		this.data = data;
+		this.contents = contents;
+		this.convertMap = MapUtils.isEmpty(convertMap) ? this.convertMap
+				: convertMap;
+	}
+
+	/**
+	 * @param properties
+	 *            属性
+	 * @param titles
+	 *            标题
+	 * @param data
+	 *            数据
+	 */
+	public ExcelView(String filename, String[] properties, String[] titles,
+			Collection<?> data, Map<String, Convert> convertMap) {
+		this.filename = filename;
+		this.properties = properties;
+		this.titles = titles;
+		this.data = data;
+		this.convertMap = MapUtils.isEmpty(convertMap) ? this.convertMap
+				: convertMap;
+	}
+
+	/**
+	 * @param properties
+	 *            属性
+	 * @param data
+	 *            数据
+	 */
+	public ExcelView(String[] properties, Collection<?> data) {
+		this.properties = properties;
+		this.data = data;
+	}
+
+	@SuppressWarnings("rawtypes")
+	@Override
+	protected void buildExcelDocument(Map<String, Object> map,
+			Workbook workbook, HttpServletRequest httpServletRequest,
+			HttpServletResponse httpServletResponse) throws Exception {
+		try {
+
+			Assert.notEmpty(properties, "表格导出中属性为空");
+			Sheet sheet;
+			if (StringUtils.isNotEmpty(sheetName)) {
+				sheet = workbook.createSheet(sheetName);
+			} else {
+				sheet = workbook.createSheet();
+			}
+			int rowNumber = 0;
+
+			// 创建表头
+			if (titles != null && titles.length > 0) {
+				// HSSFRow header = sheet.createRow(rowNumber);
+				Row header = sheet.createRow(rowNumber);
+				header.setHeight((short) 400);
+				for (int i = 0; i < properties.length; i++) {
+					Cell cell = header.createCell(i);
+					CellStyle cellStyle = workbook.createCellStyle();
+					cellStyle
+							.setFillForegroundColor(HSSFColor.LIGHT_CORNFLOWER_BLUE.index);
+					cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+					cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+					cellStyle
+							.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
+					Font font = workbook.createFont();
+					font.setFontHeightInPoints((short) 11);
+					font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
+					cellStyle.setFont(font);
+					cell.setCellStyle(cellStyle);
+
+					if (i == 0) {
+						Drawing patriarch = sheet.createDrawingPatriarch();
+						Comment comment = patriarch
+								.createCellComment(new XSSFClientAnchor(0, 0,
+										0, 0, (short) 1, 1, (short) 4, 4));
+						comment.setString(new XSSFRichTextString("亿函科技公司版权所有"));
+						cell.setCellComment(comment);
+					}
+					if (titles.length > i && titles[i] != null) {
+						cell.setCellValue(titles[i]);
+					} else {
+						cell.setCellValue(properties[i]);
+					}
+					if (widths != null && widths.length > i
+							&& widths[i] != null) {
+						sheet.setColumnWidth(i, widths[i]);
+					} else {
+						sheet.autoSizeColumn(i);
+					}
+				}
+				rowNumber++;
+			}
+
+			// 写入数据
+			if (data != null) {
+				String property;
+				Convert convert;
+				Drawing drawing = sheet.createDrawingPatriarch();
+				for (Object item : data) {
+					Row row = sheet.createRow(rowNumber);
+					// 设置Excel表格高度(除标题以外)
+					if (this.bodyHeight != null) {
+						row.setHeightInPoints(this.bodyHeight);
+					}
+
+					for (int i = 0; i < properties.length; i++) {
+						Cell cell = row.createCell(i);
+						CellStyle cs = workbook.createCellStyle();
+						cs.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中
+						cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER); // 垂直居中
+						cs.setWrapText(true); // 设置自动换行
+						cell.setCellStyle(cs);
+
+						property = properties[i];
+						convert = convertMap.get(property);
+
+						String value = null;
+						if (item instanceof Map) {
+							Object val = ((Map) item).get(property);
+							value = val == null ? null : val.toString();
+						} else {
+							value = BeanUtils.getProperty(item, property);
+						}
+						if (convert != null) {
+							value = convert.convert(value);
+						}
+						cell.setCellValue(value);
+						if (convert == null) {
+							cell.setCellValue(BeanUtils.getProperty(item,
+									property));
+						} else {
+							cell.setCellValue(convert.convert(BeanUtils
+									.getProperty(item, property)));
+						}
+
+						if (rowNumber == 0 || rowNumber == 1) {
+							if (widths != null && widths.length > i
+									&& widths[i] != null) {
+								sheet.setColumnWidth(i, widths[i]);
+							} else {
+								sheet.autoSizeColumn(i);
+							}
+						}
+					}
+
+					// 处理图片
+					if (pictures != null) {
+						for (int j = 0; j < pictures.length; j++) {
+							property = pictures[j];
+							String value = null;
+							if (item instanceof Map) {
+								Object val = ((Map) item).get(property);
+								value = val == null ? null : val.toString();
+							} else {
+								value = BeanUtils.getProperty(item, property);
+							}
+							if (StringUtils.isNotBlank(value)) {
+
+								// 清空图片地址
+								row.getCell(properties.length - 1 + j)
+										.setCellValue("");
+
+								// 将图片服务器上的图片转成byte数组
+								InputStream is = FileUtil
+										.remotePathToStream(value);
+								if (is != null) {
+									byte[] data = IOUtils.toByteArray(is);
+									// 写图片
+									XSSFClientAnchor anchor = new XSSFClientAnchor(
+											0,
+											0,
+											0,
+											0,
+											(short) (properties.length - 1 + j),
+											row.getRowNum(),
+											(short) (properties.length + j),
+											row.getRowNum() + 1);
+									drawing.createPicture(
+											anchor,
+											workbook.addPicture(
+													data,
+													XSSFWorkbook.PICTURE_TYPE_JPEG));
+								}
+							}
+						}
+					}
+
+					rowNumber++;
+				}
+			}
+
+			// 写入汇总信息
+			if (contents != null && contents.length > 0) {
+				rowNumber++;
+				for (String content : contents) {
+					Row row = sheet.createRow(rowNumber);
+					Cell cell = row.createCell(0);
+					CellStyle cellStyle = workbook.createCellStyle();
+					Font font = workbook.createFont();
+					font.setColor(HSSFColor.GREY_50_PERCENT.index);
+					cellStyle.setFont(font);
+					cell.setCellStyle(cellStyle);
+					cell.setCellValue(content);
+					rowNumber++;
+				}
+			}
+
+			httpServletResponse.setContentType("application/force-download");
+			if (StringUtils.isNotEmpty(filename)) {
+				httpServletResponse.setHeader(
+						"Content-disposition",
+						"attachment; filename="
+								+ URLEncoder.encode(filename, "UTF-8"));
+			} else {
+				httpServletResponse.setHeader("Content-disposition",
+						"attachment");
+			}
+		} catch (Exception e) {
+			log.error(
+					"\r\n ************ Excle导出工具类方法【buildExcelDocument】报错:{}",
+					ExceptionUtils.getStackTrace(e));
+		}
+	}
+
+	/**
+	 * 获取文件名称
+	 *
+	 * @return 文件名称
+	 */
+	public String getFileName() {
+		return filename;
+	}
+
+	/**
+	 * 设置文件名称
+	 *
+	 * @param filename
+	 *            文件名称
+	 */
+	public void setFileName(String filename) {
+		this.filename = filename;
+	}
+
+	/**
+	 * 获取表名称
+	 *
+	 * @return 表名称
+	 */
+	public String getSheetName() {
+		return sheetName;
+	}
+
+	/**
+	 * 设置表名称
+	 *
+	 * @param sheetName
+	 *            表名称
+	 */
+	public void setSheetName(String sheetName) {
+		this.sheetName = sheetName;
+	}
+
+	/**
+	 * 获取属性
+	 *
+	 * @return 属性
+	 */
+	public String[] getProperties() {
+		return properties;
+	}
+
+	/**
+	 * 设置属性
+	 *
+	 * @param properties
+	 *            属性
+	 */
+	public void setProperties(String[] properties) {
+		this.properties = properties;
+	}
+
+	/**
+	 * 获取标题
+	 *
+	 * @return 标题
+	 */
+	public String[] getTitles() {
+		return titles;
+	}
+
+	/**
+	 * 设置标题
+	 *
+	 * @param titles
+	 *            标题
+	 */
+	public void setTitles(String[] titles) {
+		this.titles = titles;
+	}
+
+	/**
+	 * 获取图片属性集合
+	 */
+	public String[] getPictures() {
+		return pictures;
+	}
+
+	/**
+	 * 设置图片属性集合
+	 */
+	public void setPictures(String[] pictures) {
+		this.pictures = pictures;
+	}
+
+	/**
+	 * 获取列宽
+	 *
+	 * @return 列宽
+	 */
+	public Integer[] getWidths() {
+		return widths;
+	}
+
+	/**
+	 * 设置列宽
+	 *
+	 * @param widths
+	 *            列宽
+	 */
+	public void setWidths(Integer[] widths) {
+		this.widths = widths;
+	}
+
+	/**
+	 * 获取表体高度
+	 */
+	public Float getBodyHeight() {
+		return bodyHeight;
+	}
+
+	/**
+	 * 设置表体高度
+	 */
+	public void setBodyHeight(Float bodyHeight) {
+		this.bodyHeight = bodyHeight;
+	}
+
+	/**
+	 * 获取数据
+	 *
+	 * @return 数据
+	 */
+	public Collection<?> getData() {
+		return data;
+	}
+
+	/**
+	 * 设置数据
+	 *
+	 * @param data
+	 *            数据
+	 */
+	public void setData(Collection<?> data) {
+		this.data = data;
+	}
+
+	/**
+	 * 获取附加内容
+	 *
+	 * @return 附加内容
+	 */
+	public String[] getContents() {
+		return contents;
+	}
+
+	/**
+	 * 设置附加内容
+	 *
+	 * @param contents
+	 *            附加内容
+	 */
+	public void setContents(String[] contents) {
+		this.contents = contents;
+	}
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/view/PdfView.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/view/PdfView.java
new file mode 100644
index 0000000000000000000000000000000000000000..74b81d28ba2de2a49f8243256ffdc3db5fcb6ad9
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exportView/view/PdfView.java
@@ -0,0 +1,39 @@
+package cn.wisenergy.common.utils.exportView.view;
+
+import org.springframework.web.servlet.view.AbstractView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Map;
+
+/**
+ * pdf视图
+ * Created by yqh on 2017/2/13.
+ */
+public class PdfView extends AbstractView {
+
+    private String filename;
+
+    public PdfView(String filename) {
+        super();
+        this.setContentType("application/pdf");
+        this.filename = filename;
+    }
+
+    @Override
+    protected void renderMergedOutputModel(Map<String, Object> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
+        if (filename != null) {
+            OutputStream os = httpServletResponse.getOutputStream();
+            InputStream is = new FileInputStream(filename);
+            int len = -1;
+            byte[] arr = new byte[1024];
+            while ((len = is.read(arr)) != -1) {
+                os.write(arr, 0, len);
+            }
+            is.close();
+        }
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/file/FilePathConsts.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/file/FilePathConsts.java
new file mode 100644
index 0000000000000000000000000000000000000000..32d063fc4113193e8003a7f451e0317e168e19ac
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/file/FilePathConsts.java
@@ -0,0 +1,13 @@
+package cn.wisenergy.common.utils.file;
+
+/**
+ * @author wyy
+ * @date 2019-08-21 23:50
+ */
+public class FilePathConsts {
+    // 媒体文件
+    public static final String FILE_MEDIA_PATH = "/upload/media";
+
+    // 二维码图片路径
+    public static final String FILE_QR_PATH = "/upload/qr";
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/IDWorker.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/IDWorker.java
new file mode 100644
index 0000000000000000000000000000000000000000..54a686ec77ca1274ccdd88295b5c1443f1dce4d3
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/IDWorker.java
@@ -0,0 +1,85 @@
+package cn.wisenergy.common.utils.id;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.Serializable;
+
+public class IDWorker implements Serializable {
+
+    private static final long serialVersionUID = -322371382575481443L;
+
+    protected static final Logger LOG = LoggerFactory.getLogger(IDWorker.class);
+
+    //工作中心ID
+    private long workerId;
+    //数据中心ID
+    private long datacenterId;
+    //自增长序列
+    private long sequence = 0L;
+
+    //时间戳基数--2016-04-13 10:43
+    private long twepoch = 1460515462699L;
+
+    private long workerIdBits = 5L;
+    private long datacenterIdBits = 5L;
+    private long maxWorkerId = -1L ^ (-1L << workerIdBits);
+    private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+    private long sequenceBits = 12L;
+
+    private long workerIdShift = sequenceBits;
+    private long datacenterIdShift = sequenceBits + workerIdBits;
+    private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+    private long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    private long lastTimestamp = -1L;
+
+    public IDWorker(long workerId, long datacenterId) {
+
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("workerId必须在0-%d之间", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenterId必须在0-%d之间", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+        LOG.info(String.format("IDWorker初始化完成. 时间戳偏移量 %d, datacenterId位数 %d, workerId位数 %d, 自增序列位数 %d, workerid %d", timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId));
+    }
+
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+
+        if (timestamp < lastTimestamp) {
+            LOG.error(String.format("时钟被修改,拒绝请求,直到 %d.", lastTimestamp));
+            throw new RuntimeException(String.format("时钟被修改,拒绝为毫秒数%d生成ID", lastTimestamp - timestamp));
+        }
+
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            if (sequence == 0) {
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            sequence = 0L;
+        }
+
+        lastTimestamp = timestamp;
+
+        return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence;
+    }
+
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+}
+
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/LineCodeWorker.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/LineCodeWorker.java
new file mode 100644
index 0000000000000000000000000000000000000000..e79396facafacd42758e22033333263a99cc76a3
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/LineCodeWorker.java
@@ -0,0 +1,46 @@
+package cn.wisenergy.common.utils.id;
+
+import cn.wisenergy.common.utils.exception.BaseCustomException;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 条形码工具类
+ */
+public class LineCodeWorker {
+
+    /**
+     * 根据条形码值生成计算后的条形码
+     *
+     * @param lineCode
+     * @return
+     */
+    public static String encode(String lineCode) {
+        char[] chars = lineCode.toCharArray();
+        int code = 0;
+        for (char c : chars) {
+            code = (c - '0') + code;
+        }
+        return lineCode + (code % 10);
+    }
+
+    /**
+     * 根据条形码还原为系统条形码
+     *
+     * @param lineCode
+     * @return
+     */
+    public static String decode(String lineCode) {
+        if (StringUtils.isNotBlank(lineCode)) {
+            lineCode = lineCode.trim();
+            int len = lineCode.length();
+            if (len > 1) {
+                String preNo = lineCode.substring(0, len - 1);
+                if (lineCode.equals(encode(preNo))) {
+                    return preNo;
+                }
+            }
+        }
+        throw new BaseCustomException("verifyLineCode Error", "条形码错误!");
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/OrderNoWorker.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/OrderNoWorker.java
new file mode 100644
index 0000000000000000000000000000000000000000..13e68027404c0fba5f22274973aa0eca2c7543ef
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/id/OrderNoWorker.java
@@ -0,0 +1,66 @@
+package cn.wisenergy.common.utils.id;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 订单号工具类
+ */
+public class OrderNoWorker implements Serializable {
+
+    private static final long serialVersionUID = -5948180296676942804L;
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+
+    /**
+     * 生成订单号
+     *
+     * @return
+     */
+    public synchronized static String get() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(SDF.format(new Date()));
+        sb.append(RandomStringUtils.randomNumeric(2));
+        sb.append(getSecurityCode(sb.toString()));
+        return sb.toString();
+    }
+
+    /**
+     * 生成订单识别码
+     *
+     * @param preNo 不含有识别码的订单号
+     * @return
+     */
+    private static int getSecurityCode(String preNo) {
+        char[] chars = preNo.toCharArray();
+        int code = 0;
+        for (char c : chars) {
+            code = (c - '0') + code;
+        }
+        return code % 10;
+    }
+
+    /**
+     * 验证订单号
+     *
+     * @param orderNo 订单号
+     * @return
+     */
+    public static boolean verifyOrderNo(String orderNo) {
+
+        if (StringUtils.isNotBlank(orderNo)) {
+            orderNo = orderNo.trim();
+            if (orderNo.length() == 24) {
+                String preNo = orderNo.substring(0, 23);
+                return orderNo.substring(23).equals(Integer.toString(getSecurityCode(preNo)));
+            }
+        }
+
+        return false;
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ip/IpAddress.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ip/IpAddress.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4a5a4eb76592f222c8fbdcef2d35844a3cce1e3
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ip/IpAddress.java
@@ -0,0 +1,124 @@
+package cn.wisenergy.common.utils.ip;
+
+import java.io.Serializable;
+
+/**
+ * IP地址位置信息
+ */
+public class IpAddress implements Serializable {
+    private static final long serialVersionUID = -109739807486030851L;
+
+    /**
+     * IP地址
+     */
+    private String ip;
+
+    /**
+     * 所属国家
+     */
+    private String country;
+
+    /**
+     * 所属省份
+     */
+    private String province;
+
+    /**
+     * 所属城市
+     */
+    private String city;
+
+    /**
+     * 所属区县
+     */
+    private String region;
+
+    /**
+     * 地址信息
+     */
+    private String addr;
+
+    /**
+     * 获取IP地址
+     */
+    public String getIp() {
+        return ip;
+    }
+
+    /**
+     * 设置IP地址
+     */
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    /**
+     * 获取所属国家
+     */
+    public String getCountry() {
+        return country;
+    }
+
+    /**
+     * 设置所属国家
+     */
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    /**
+     * 获取所属省份
+     */
+    public String getProvince() {
+        return province;
+    }
+
+    /**
+     * 设置所属省份
+     */
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    /**
+     * 获取所属城市
+     */
+    public String getCity() {
+        return city;
+    }
+
+    /**
+     * 设置所属城市
+     */
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    /**
+     * 获取所属区县
+     */
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * 设置所属区县
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    /**
+     * 获取地址信息
+     */
+    public String getAddr() {
+        return addr;
+    }
+
+    /**
+     * 设置地址信息
+     */
+    public void setAddr(String addr) {
+        this.addr = addr;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ip/IpUtils.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ip/IpUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..b23d3d9a87f6faf10cf53accb2f533dc847b78c2
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/ip/IpUtils.java
@@ -0,0 +1,101 @@
+package cn.wisenergy.common.utils.ip;
+
+import cn.wisenergy.common.utils.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * IP工具类
+ *
+ * @author WYY
+ * @date 2018/06/06
+ */
+public class IpUtils {
+
+    /**
+     * IP信息查询接口地址
+     */
+    public static final String GET_IPINFO_URL = "http://whois.pconline.com.cn/ipJson.jsp";
+
+    /**
+     * 获取用户真实IP地址,不使用request.getRemoteAddr()的原因是
+     * 有可能用户使用了代理软件方式避免真实IP地址,
+     * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,
+     * 究竟哪个才是真正的用户端的真实IP呢?
+     * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。
+     * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
+     * 用户真实IP为: 192.168.1.110
+     *
+     * @param request
+     * @return 真是IP
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        if (StringUtils.isNotEmpty(ip) && ip.indexOf(",") > -1) {
+            String[] arr = ip.split(",");
+            if (arr != null && arr.length > 0) {
+                for (String s : arr) {
+                    if (StringUtils.isNotEmpty(s) && !StringUtils.equalsIgnoreCase(s, "unknown")) {
+                        ip = s;
+                        break;
+                    }
+                }
+            }
+        }
+
+        return ip;
+    }
+
+    /**
+     * 获取IP位置信息
+     *
+     * @param ipAddress      ip地址
+     * @param encodingString 服务器端请求编码。如GBK,UTF-8等
+     * @return IpAddress对象
+     * @throws UnsupportedEncodingException
+     */
+    public static IpAddress getAddresses(String ipAddress, String encodingString) throws UnsupportedEncodingException {
+        // 初始化请求参数
+        Map<String, Object> map = new HashMap<>();
+        map.put("json", true);
+        map.put("ip", ipAddress.trim());
+        // 检查请求编码。如果为空,默认为utf-8
+        if (StringUtils.isBlank(encodingString)) {
+            encodingString = "utf-8";
+        }
+        // 发送请求
+        String returnStr = HttpUtil.get(IpUtils.GET_IPINFO_URL, map, encodingString);
+        if (returnStr != null) {
+            JSONObject jsonObject = JSONObject.parseObject(returnStr);
+            IpAddress address = new IpAddress();
+            address.setIp(ipAddress);
+            address.setProvince(jsonObject.get("pro").toString());
+            address.setCity(jsonObject.get("city").toString());
+            address.setRegion(jsonObject.get("region").toString());
+            address.setAddr(jsonObject.get("addr").toString());
+            return address;
+        }
+        return null;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/math/MathUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/math/MathUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..4760e11857e4afd46ed06b1285f2df8cffa05cf0
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/math/MathUtil.java
@@ -0,0 +1,30 @@
+package cn.wisenergy.common.utils.math;
+
+import java.text.NumberFormat;
+
+/**
+ * @ClassName MathUtil
+ * @Description 计算工具类
+ * @Author meng
+ * @Date 2020/5/7 15:36
+ * @Version 1.0
+ */
+public class MathUtil {
+
+    /**
+     * 计算两个数的百分比(保留小数点后两位)
+     * @param num1 被除数
+     * @param num2 除数
+     * @return
+     */
+    public static String getPercent(Integer num1,Integer num2){
+        if(num2  == 0){
+            return "0";
+        }
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        // 设置精确到小数点后2位
+        numberFormat.setMaximumFractionDigits(2);
+        String str = numberFormat.format((double)num1 / (double)num2 * 100);
+        return str;
+    }
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/mybatis/DecimalHandler.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/mybatis/DecimalHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f77737d738d241fef92b8f9d3ac00a5e2518324
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/mybatis/DecimalHandler.java
@@ -0,0 +1,45 @@
+package cn.wisenergy.common.utils.mybatis;
+
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.TypeHandler;
+
+import java.math.BigDecimal;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * MyBatisDecimal转换器
+ * Created by wyy on 2017/2/21.
+ */
+public class DecimalHandler implements TypeHandler<BigDecimal> {
+    @Override
+    public void setParameter(PreparedStatement preparedStatement, int i, BigDecimal bigDecimal, JdbcType jdbcType) throws SQLException {
+        preparedStatement.setBigDecimal(i, bigDecimal);
+    }
+
+    @Override
+    public BigDecimal getResult(ResultSet resultSet, String s) throws SQLException {
+        return transfer(resultSet.getString(s));
+    }
+
+    @Override
+    public BigDecimal getResult(ResultSet resultSet, int i) throws SQLException {
+        return transfer(resultSet.getString(i));
+    }
+
+    @Override
+    public BigDecimal getResult(CallableStatement callableStatement, int i) throws SQLException {
+        return transfer(callableStatement.getString(i));
+    }
+
+    private BigDecimal transfer(String val) {
+        if (val != null) {
+            val = val.replace(",", "");
+            return new BigDecimal(val);
+        }
+        return null;
+    }
+
+}
diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/reflect/ReflectUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/reflect/ReflectUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..f24a3130e49af65fdc76496aadf0506f3f6ee409
--- /dev/null
+++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/reflect/ReflectUtil.java
@@ -0,0 +1,41 @@
+package cn.wisenergy.common.utils.reflect;
+
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @ClassName ReflectUtil
+ * @Description 反射工具类
+ * @Author meng
+ * @Date 2020/5/7 18:22
+ * @Version 1.0
+ */
+public class ReflectUtil {
+    private static final Logger logger = LoggerFactory.getLogger(ReflectUtil.class);
+
+
+    /**
+     * 分离最后一个代理的目标对象
+     *
+     * @param invocation
+     * @return
+     */
+    public static MetaObject getRealTarget(Invocation invocation) {
+        MetaObject metaStatementHandler = SystemMetaObject.forObject(invocation.getTarget());
+
+        while (metaStatementHandler.hasGetter("h")) {
+            Object object = metaStatementHandler.getValue("h");
+            metaStatementHandler = SystemMetaObject.forObject(object);
+        }
+
+        while (metaStatementHandler.hasGetter("target")) {
+            Object object = metaStatementHandler.getValue("target");
+            metaStatementHandler = SystemMetaObject.forObject(object);
+        }
+
+        return metaStatementHandler;
+    }
+}
diff --git a/wisenergy-common/wisenergy-common.iml b/wisenergy-common/wisenergy-common.iml
new file mode 100644
index 0000000000000000000000000000000000000000..53c897ff128505f6a2e80a8bdfff32b0fc9b9578
--- /dev/null
+++ b/wisenergy-common/wisenergy-common.iml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.16.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: org.springframework:spring-web:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-test:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.8" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-devtools:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.16" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.54" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.9" level="project" />
+    <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
+    <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.3.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.6.7" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-pool:commons-pool:1.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.8" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" />
+    <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.6" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.6.3" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/wisenergy-mapper/.gitignore b/wisenergy-mapper/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b4f66076247712dbd69e9ec586a827b3bd8fcd7b
--- /dev/null
+++ b/wisenergy-mapper/.gitignore
@@ -0,0 +1,7 @@
+workspace
+.project
+.classpath
+*.settings
+.idea
+*.class
+target/
\ No newline at end of file
diff --git a/wisenergy-mapper/pom.xml b/wisenergy-mapper/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fca85df80e5f381e5bdff9da2bed691001218beb
--- /dev/null
+++ b/wisenergy-mapper/pom.xml
@@ -0,0 +1,30 @@
+<?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>
+        <artifactId>wisenergy-parent</artifactId>
+        <groupId>cn.wisenergy</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>wisenergy-mapper</artifactId>
+    <version>${moduleVersion.wisenergy-mapper}</version>
+    <packaging>jar</packaging>
+
+    <!-- 项目依赖 -->
+    <dependencies>
+        <!-- 模块依赖 -->
+        <dependency>
+            <groupId>cn.wisenergy</groupId>
+            <artifactId>wisenergy-model</artifactId>
+            <version>${moduleVersion.wisenergy-model}</version>
+        </dependency>
+    </dependencies>
+
+    <!-- MAVEN构建 -->
+    <build>
+        <finalName>${project.artifactId}-${moduleVersion.wisenergy-mapper}</finalName>
+    </build>
+</project>
\ No newline at end of file
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/AccountMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/AccountMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..012edb9ee8bc913a7423b8d1033a36170cfb6658
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/AccountMapper.java
@@ -0,0 +1,16 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.AccountInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.Map;
+
+public interface AccountMapper extends BaseMapper<AccountInfo> {
+    /**
+     * 查询管理员信息
+     * @param map 查询参数
+     * @return
+     */
+    AccountInfo getAccountInfo(Map<String, Object> map);
+
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/AdmissionRuleMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/AdmissionRuleMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..d68eb4b2a55eabfea5bda09e171bff8cb03678c1
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/AdmissionRuleMapper.java
@@ -0,0 +1,18 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.AdmissionRule;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 86187
+ */
+public interface AdmissionRuleMapper extends BaseMapper<AdmissionRule> {
+    AdmissionRule add(AdmissionRule admissionRule);
+
+    int edit(AdmissionRule admissionRule);
+
+    int delById(@Param("id") Integer id);
+
+    AdmissionRule getByType(@Param("type") Integer type);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/BannerMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/BannerMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..0df8469287b7aa97f295dd16901e2ae7a6bf7cbb
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/BannerMapper.java
@@ -0,0 +1,65 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.Banner;
+import cn.wisenergy.model.dto.BannerDto;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface BannerMapper extends BaseMapper<Banner> {
+    /**
+     * 添加广告
+     *
+     * @param advertising 广告信息
+     * @return 广告信息
+     */
+    int add(Banner advertising);
+
+    /**
+     * 编辑广告
+     *
+     * @param advertising 广告信息
+     * @return 结果
+     */
+    int edit(Banner advertising);
+
+    /**
+     * 删除广告
+     *
+     * @param id 广告id
+     * @return 结果
+     */
+    int delById(@Param("id") Integer id);
+
+    /**
+     * 获取广告列表
+     * @param map 筛选参数
+     * @return 广告列表
+     */
+    List<BannerDto> getList(Map<String,Object> map);
+
+    /**
+     * 统计广告条数
+     * @return  广告条数
+     */
+    int count(Map<String,Object> map);
+
+    /**
+     * 通过广告id查询广告信息
+     * @param id
+     * @return
+     */
+    Banner getById(@Param("id") Integer id);
+
+    /**
+     * 通过广告ID改变投放状态
+     * @param id
+     * @param status
+     * @return
+     */
+    int editStatus(@Param("id") Integer id, @Param("status") Integer status);
+
+    List<Banner> getTopBanners(@Param("type") Integer type);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/CardMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/CardMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..abf6b1cee96e1d4023cae8a5b9158781afc93712
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/CardMapper.java
@@ -0,0 +1,43 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.CardInfo;
+import cn.wisenergy.model.dto.ExportCardDto;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 86187
+ */
+public interface CardMapper extends BaseMapper<CardInfo> {
+    /**
+     * 添加充值卡子卡
+     *
+     * @param cardInfos
+     * @return
+     */
+    int add(List<CardInfo> cardInfos);
+
+    /**
+     * 编辑
+     * @param cardInfo 信息
+     * @return 结果
+     */
+    int edit(CardInfo cardInfo);
+
+    /**
+     * 根据密码获取充值卡信息
+     *
+     * @param secretKey 密码
+     * @return 充值卡信息
+     */
+    CardInfo getBySecretKey(@Param("secretKey") String secretKey);
+
+    /**
+     * 通过批次号获取所有字卡
+     * @param batchNumber 批次号
+     * @return 子卡集合
+     */
+    List<CardInfo> getList(@Param("batchNumber")String batchNumber);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/GraduationMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/GraduationMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..aede4b6f6d4c058c29e36de8c4c00164917458f7
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/GraduationMapper.java
@@ -0,0 +1,16 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.Graduation;
+import cn.wisenergy.model.dto.BannerDto;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+import java.util.Map;
+
+public interface GraduationMapper extends BaseMapper<Graduation> {
+    /**
+     * 获取广告列表
+     * @return 毕业院校列表
+     */
+    List<Graduation> getList();
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/LoginRecordMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/LoginRecordMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..56cee495249c9959aac0aabdc6a881ec04b09476
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/LoginRecordMapper.java
@@ -0,0 +1,32 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.LoginRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+public interface LoginRecordMapper extends BaseMapper<LoginRecord> {
+
+    /**
+     *  添加登录信息
+     * @param loginRecord 登录信息
+     * @return 登录信息
+     */
+    int add(LoginRecord loginRecord);
+
+    /**
+     * 编辑
+     * @param loginRecord 登录信息
+     * @return 结果
+     */
+    int edit(LoginRecord loginRecord);
+
+    /**
+     *  删除登录记录
+     * @param id 记录id
+     * @return 结果
+     */
+    int delById(@Param("id") Integer id);
+
+    LoginRecord getById(@Param("userId") Integer userId);
+
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/PayRecordMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/PayRecordMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..f15aa2f1094f0029792b93d947242e01b0d3ec4b
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/PayRecordMapper.java
@@ -0,0 +1,22 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.PayRecord;
+import cn.wisenergy.model.vo.PayRecordShowVo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 86187
+ */
+public interface PayRecordMapper extends BaseMapper<PayRecord> {
+    int add(PayRecord payRecord);
+
+    List<PayRecordShowVo> getList(Map<String,Object> map);
+
+    int count(Map<String,Object> map);
+
+    List<PayRecord> getById(@Param("userId") Integer userId);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/PriceMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/PriceMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..d1af82863f275124ff82e254efc808192eff42b2
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/PriceMapper.java
@@ -0,0 +1,20 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.Price;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 86187
+ */
+public interface PriceMapper extends BaseMapper<Price> {
+    int add(Price price);
+
+    List<Price> getList();
+
+    int count();
+
+    Price getByMoney(@Param("money") Integer money);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/ProfessionMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/ProfessionMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..14c793ea7405b19f03add49faaa38e19dd14e6bb
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/ProfessionMapper.java
@@ -0,0 +1,23 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.Profession;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ProfessionMapper extends BaseMapper<Profession> {
+    Profession add(Profession profession);
+
+    List<Profession> getList(@Param("type") Integer type);
+
+    Profession getById(@Param("id") Integer id);
+
+    /**
+     * 根据专业ids,获取专业名称
+     *
+     * @param ids ids
+     * @return 专业名称
+     */
+    List<String> getNameByIds(@Param("list") List<Integer> ids);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/RefillCardMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/RefillCardMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..67b4cc1c965c10fc2c461d08d5b541a0774b0466
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/RefillCardMapper.java
@@ -0,0 +1,54 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.RefillCard;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface RefillCardMapper extends BaseMapper<RefillCardMapper> {
+
+    /**
+     * 添加充值卡
+     * @param refillCard
+     * @return
+     */
+    int add(RefillCard refillCard);
+
+    /**
+     * 改变激活状态
+     * @param batchNumber
+     * @return
+     */
+    int update(@Param("batchNumber") String batchNumber);
+
+    /**
+     * 获取充值卡信息
+     * @param map
+     * @return
+     */
+    List<RefillCard> getList(Map<String,Object> map);
+
+    /**
+     * 获取充值卡数量
+     * @return
+     */
+    Integer getUserNumbers();
+
+    /**
+     * 通过ID查询充值卡信息
+     * @param id 主键
+     * @return 充值卡信息
+     */
+    RefillCard getById(@Param("id") Integer id);
+
+    int setIsMakeCard(@Param("id") Integer id);
+
+    /**
+     * 通过批次号查询充值卡信息
+     * @param batchNumber 批次号
+     * @return 充值卡信息
+     */
+    RefillCard getByBatchNumber(@Param("batchNumber") String batchNumber);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/SchemeMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/SchemeMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..c24a5ab521f4dd7f28954a3069d328df5aa5038b
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/SchemeMapper.java
@@ -0,0 +1,39 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.SchemeInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 86187
+ */
+public interface SchemeMapper extends BaseMapper<SchemeInfo> {
+    int add(SchemeInfo schemeInfo);
+
+    List<SchemeInfo> getList(Map<String,Object> map);
+
+    /**
+     * 编辑
+     * @param schemeInfo 编辑信息
+     * @return 结果
+     */
+    int edit(SchemeInfo schemeInfo);
+
+    /**
+     * 统计
+     * @return 数量
+     */
+    int count();
+
+    /**
+     * 获取方案信息
+     * @param id 方案id
+     * @return 方案信息
+     */
+    SchemeInfo getById(@Param("id") Integer id);
+
+    int getByType(@Param("type") Integer type);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/SchemeRecordMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/SchemeRecordMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..69b719264dc29639aa75b6a01654e799a8a32a59
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/SchemeRecordMapper.java
@@ -0,0 +1,62 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.SchemeQueryRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 86187
+ */
+public interface SchemeRecordMapper extends BaseMapper<SchemeQueryRecord> {
+
+    /**
+     * 添加方案记录
+     *
+     * @param schemeQueryRecord 方案记录信息
+     * @return 方案记录信息
+     */
+    int add(SchemeQueryRecord schemeQueryRecord);
+
+    /**
+     * 编辑方案记录
+     *
+     * @param schemeQueryRecord 方案记录信息
+     * @return 0 失败  1 成功
+     */
+    int edit(SchemeQueryRecord schemeQueryRecord);
+
+    /**
+     * 获取方案记录信息
+     *
+     * @param id 方案记录id
+     * @return
+     */
+    int delById(@Param("id") Integer id);
+
+    /**
+     * 统计方案记录条数
+     *
+     * @param map 统计条件
+     * @return 记录条数
+     */
+    int count(Map<String, Object> map);
+
+    /**
+     * @param userId   用户id
+     * @param startNum 开始数
+     * @param endNum   结束数
+     * @return 列表
+     */
+    List<SchemeQueryRecord> getByUserId(@Param("userId") Integer userId, @Param("startNum") Integer startNum,
+                                        @Param("endNum") Integer endNum);
+
+    /**
+     *
+     * @param id 方案查询记录id
+     * @return 查询方案信息
+     */
+    SchemeQueryRecord getById(@Param("id") Integer id);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/ScoreInfoMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/ScoreInfoMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..68e54ac6d2b5ee2afcd35985613569a0b3361ed2
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/ScoreInfoMapper.java
@@ -0,0 +1,33 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.ScoreInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+public interface ScoreInfoMapper extends BaseMapper<ScoreInfo> {
+    /**
+     * 添加考生成绩
+     *
+     * @param scoreInfo 成绩信息
+     * @return 成绩信息
+     */
+    int add(ScoreInfo scoreInfo);
+
+    /**
+     * 编辑考生成绩
+     *
+     * @param scoreInfo 成绩信息
+     * @return 结果
+     */
+    int edit(ScoreInfo scoreInfo);
+
+    /**
+     * 删除考生成绩
+     *
+     * @param id 成绩id
+     * @return 结果
+     */
+    int delById(@Param("id") Integer id);
+
+    ScoreInfo getById(@Param("userId") Integer userId);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserLimitMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserLimitMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..574aff73848f32e9d06158234f87500c703d181a
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserLimitMapper.java
@@ -0,0 +1,22 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.UserLimit;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 86187
+ */
+public interface UserLimitMapper extends BaseMapper<UserLimit> {
+    int add(UserLimit userLimit);
+
+    int edit(UserLimit userLimit);
+
+    /**
+     * 获取查询次数信息
+     *
+     * @param userId 用户id
+     * @return 查询次数信息
+     */
+    UserLimit getByUserId(@Param("userId") Integer userId);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserLimitRecordMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserLimitRecordMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b529221a6b70ae5b025df9fa1daa1395deb9a88
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserLimitRecordMapper.java
@@ -0,0 +1,16 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.UserLimitRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author 86187
+ */
+public interface UserLimitRecordMapper extends BaseMapper<UserLimitRecord> {
+    int add(UserLimitRecord userLimitRecord);
+
+    UserLimitRecord edit(UserLimitRecord userLimitRecord);
+
+    UserLimitRecord getByUserId(@Param("userId") Integer userId);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserVolunteerMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserVolunteerMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..28f1a000f0f61dbf69e34499061eb2a3fc4440a7
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UserVolunteerMapper.java
@@ -0,0 +1,23 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.UserVolunteer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author 86187
+ */
+public interface UserVolunteerMapper extends BaseMapper<UserVolunteer> {
+
+    UserVolunteer add(UserVolunteer userVolunteer);
+
+    int edit(UserVolunteer userVolunteer);
+
+    int delById(@Param("id") Integer id);
+
+    int creates(@Param("list") List<UserVolunteer> list);
+
+    List<UserVolunteer> listById(Integer schemeRecordId);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UsersMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UsersMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b170e3313453dce3906780617630bcd012f5a01
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/UsersMapper.java
@@ -0,0 +1,53 @@
+package cn.wisenergy.mapper;
+
+import cn.hutool.system.UserInfo;
+import cn.wisenergy.model.app.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 86187
+ * @ Description:
+ * @ Author     : 86187
+ * @ Date       : 2021/1/6 15:32
+ */
+@Mapper
+public interface UsersMapper extends BaseMapper<User> {
+    /**
+     * 添加
+     *
+     * @param user 用户信息
+     * @return 用户信息
+     */
+    int add(User user);
+
+    /**
+     * 编辑
+     *
+     * @param user 用户信息
+     * @return 修改是否成功
+     */
+    int edit(User user);
+
+    /**
+     * 删除
+     *
+     * @param id 用户id
+     * @return 删除是否成功
+     */
+    int delById(@Param("id") Integer id);
+
+    int countByPhoneAnsUserId(@Param("phone") String phone, @Param("userId") Integer userId);
+
+    List<User> getList(Map<String, Object> map);
+
+    Integer getUserNumbers(Map<String, Object> map);
+
+    User getByPhone(@Param("phone") String phone);
+
+    List<User> test(@Param("list") List<String> list);
+}
diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/VolunteerMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/VolunteerMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a40e0549a8b690cd91d04b5b75d160ad7136054
--- /dev/null
+++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/VolunteerMapper.java
@@ -0,0 +1,24 @@
+package cn.wisenergy.mapper;
+
+import cn.wisenergy.model.app.Volunteer;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 86187
+ */
+public interface VolunteerMapper extends BaseMapper<Volunteer> {
+
+    Volunteer add(Volunteer volunteer);
+
+    List<Volunteer>  getFillList(Map<String,Object> map);
+
+    List<Volunteer> getListByIds(@Param("list") List<Integer> ids);
+
+    int updateBySchemeId(@Param("schemeId") Integer schemeId);
+
+    List<Volunteer> getVolunteerList(Map<String,Object> map);
+}
diff --git a/wisenergy-mapper/src/main/resources/mapper/AccountInfoMapper.xml b/wisenergy-mapper/src/main/resources/mapper/AccountInfoMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c8837f4c4bf16037e690a1764bd4e1791563af73
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/AccountInfoMapper.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.wisenergy.mapper.AccountMapper">
+    <resultMap id="AccountMap" type="cn.wisenergy.model.app.AccountInfo">
+        <id column="id" property="id"/>
+        <result column="user_name" property="userName"/>
+        <result column="password" property="password"/>
+        <result column="head_image" property="headImage"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        account
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_name,password,head_image,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userName},#{password},#{headImage},
+        #{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userName != null">user_name = #{userName},</if>
+        <if test="password != null">password =#{password},</if>
+        <if test="headImage != null">head_image =#{headImage},</if>
+        <if test="isDelete != null">is_delete = #{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userName != null">and user_name = #{userName}</if>
+        <if test="password != null">and password =#{password}</if>
+        <if test="headImage != null">and head_image =#{headImage}</if>
+        <if test="isDelete != null">and is_delete = #{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+    <select id="getAccountInfo" resultMap="AccountMap" parameterType="map">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            user_name = #{userName}
+            and
+            is_delete=0
+        </where>
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/wisenergy-mapper/src/main/resources/mapper/AdmissionRuleMapper.xml b/wisenergy-mapper/src/main/resources/mapper/AdmissionRuleMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aedc08cb0d0a006851973953fb48d0935c936070
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/AdmissionRuleMapper.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.AdmissionRuleMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.AdmissionRule">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="culture_max" property="cultureMax"/>
+        <result column="culture_min" property="cultureMin"/>
+        <result column="current_year_culture" property="currentYearCulture"/>
+        <result column="profession_max" property="professionMax"/>
+        <result column="profession_min" property="professionMin"/>
+        <result column="current_year_major" property="currentYearMajor"/>
+        <result column="up_mark" property="upMark"/>
+        <result column="down_mark" property="downMark"/>
+        <result column="number" property="number"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        admission_rule
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        type,culture_max, culture_min,current_year_culture,profession_max,profession_min,current_year_major,up_mark,
+        down_mark,number,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{type},#{cultureMax},#{cultureMin},#{currentYearCulture},#{professionMax}, #{professionMin},#{currentYearMajor},
+        #{upMark},#{downMark}, #{number}, #{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="type != null">type = #{type},</if>
+        <if test="cultureMax != null">culture_max =#{cultureMax},</if>
+        <if test="cultureMin != null">culture_min =#{cultureMin},</if>
+        <if test="currentYearCulture != null">current_year_culture =#{currentYearCulture},</if>
+        <if test="professionMax != null">profession_max =#{professionMax},</if>
+        <if test="professionMin != null">profession_min =#{professionMin},</if>
+        <if test="currentYearMajor != null">current_year_major =#{currentYearMajor},</if>
+        <if test="upMark != null">up_mark = #{upMark},</if>
+        <if test="downMark != null">down_mark =#{downMark},</if>
+        <if test="number != null">number = #{number},</if>
+        <if test="isDelete != null">is_delete = #{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="type != null">and type = #{type}</if>
+        <if test="cultureMax != null">and culture_max =#{cultureMax}</if>
+        <if test="cultureMin != null">and culture_min =#{cultureMin}</if>
+        <if test="currentYearCulture != null">and current_year_culture =#{currentYearCulture}</if>
+        <if test="professionMax != null">and profession_max =#{professionMax}</if>
+        <if test="professionMin != null">and profession_min =#{professionMin}</if>
+        <if test="currentYearMajor != null">and current_year_major =#{currentYearMajor}</if>
+        <if test="upMark != null">and up_mark = #{upMark}</if>
+        <if test="downMark != null">and down_mark =#{downMark}</if>
+        <if test="number != null">and number = #{number}</if>
+        <if test="isDelete != null">and is_delete = #{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.AdmissionRule" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.AdmissionRule">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="delById" parameterType="java.lang.Integer">
+        delete from
+        <include refid="table"/>
+        where id = #{id}
+    </delete>
+
+
+
+    <select id="getByType" resultType="cn.wisenergy.model.app.AdmissionRule">
+        SELECT
+        <include refid="cols_all"/>
+        FROM
+        <include refid="table"/>
+        where is_delete=0 and type=#{type}
+    </select>
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/BannerMapper.xml b/wisenergy-mapper/src/main/resources/mapper/BannerMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3034741204fe4648639e4ac731717a6fefbc2303
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/BannerMapper.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.BannerMapper">
+    <resultMap id="advertisingMap" type="cn.wisenergy.model.app.Banner">
+        <id column="id" property="id"/>
+        <result column="company_name" property="companyName"/>
+        <result column="status" property="status"/>
+        <result column="website" property="website"/>
+        <result column="is_have_image" property="isHaveImage"/>
+        <result column="type" property="type"/>
+        <result column="image" property="image"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        banner
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        company_name,status, website,is_have_image,type,image, create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{companyName},#{status},#{website},#{isHaveImage},#{type},#{image},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="companyName != null">company_name = #{companyName},</if>
+        <if test="status != null">status =#{status},</if>
+        <if test="website != null">website =#{website},</if>
+        <if test="isHaveImage != null">is_have_image =#{isHaveImage},</if>
+        <if test="type != null">type =#{type},</if>
+        <if test="image != null">image =#{image},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="companyName != null">and company_name = #{companyName}</if>
+        <if test="status != null">and status =#{status}</if>
+        <if test="website != null">and website =#{website}</if>
+        <if test="isHaveImage != null">and is_have_image =#{isHaveImage}</if>
+        <if test="type != null">and type =#{type}</if>
+        <if test="image != null">and image =#{image}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.Banner" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.Banner">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="delById" parameterType="java.lang.Integer">
+        delete from
+        <include refid="table"/>
+        where id = #{id}
+    </delete>
+
+    <select id="getList" resultType="cn.wisenergy.model.dto.BannerDto" parameterType="map">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            <if test="status != null">and status =#{status}</if>
+            <if test="type != null">and type =#{type}</if>
+        </where>
+        order by create_time desc
+        limit #{pageNo},#{pageSize}
+    </select>
+
+    <select id="count" resultType="java.lang.Integer">
+        select count(1)
+        from
+        <include refid="table"/>
+        <where>
+            <if test="status != null">and status =#{status}</if>
+            <if test="type != null">and type =#{type}</if>
+        </where>
+    </select>
+
+    <select id="getById" resultMap="advertisingMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        where id=#{id}
+    </select>
+
+    <select id="getTopBanners" resultType="cn.wisenergy.model.app.Banner">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        where status=1 and type=#{type}
+    </select>
+
+    <update id="editStatus">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            status=#{status}
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/CardMapper.xml b/wisenergy-mapper/src/main/resources/mapper/CardMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..48ba10c9cb3d447b5bf90faa69b135eded20ea3a
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/CardMapper.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.CardMapper">
+    <resultMap id="cardMap" type="cn.wisenergy.model.app.CardInfo">
+        <id column="id" property="id"/>
+        <result column="batch_number" property="batchNumber"/>
+        <result column="card_number" property="cardNumber"/>
+        <result column="limit" property="limit"/>
+        <result column="secret_key" property="secretKey"/>
+        <result column="money" property="money"/>
+        <result column="status" property="status"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        card
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        batch_number,card_number,`limit`, secret_key,money,`status`,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="createsVal">
+        #{i.batchNumber},#{i.cardNumber},#{i.limit},#{i.secretKey},#{i.money},#{i.status},
+        #{i.isDelete},now(),now()
+    </sql>
+
+    <sql id="vals">
+        #{batchNumber},#{cardNumber},#{limit},#{secretKey},#{money},#{status},
+        #{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="batchNumber != null">batch_number =#{batchNumber},</if>
+        <if test="cardNumber != null">card_number =#{cardNumber},</if>
+        <if test="limit != null">`limit` =#{limit},</if>
+        <if test="secretKey != null">secret_key =#{secretKey},</if>
+        <if test="money != null">money =#{money},</if>
+        <if test="status != null">`status` =#{status},</if>
+        <if test="isDelete != null">is_delete = #{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="batchNumber != null">and batch_number =#{batchNumber}</if>
+        <if test="cardNumber != null">and card_number =#{cardNumber},</if>
+        <if test="limit != null">and `limit` =#{limit}</if>
+        <if test="secretKey != null">and secret_key =#{secretKey}</if>
+        <if test="money != null">and money =#{money}</if>
+        <if test="status != null">and `status` =#{status}</if>
+        <if test="isDelete != null">and is_delete = #{isDelete}</if>
+        <if test="createTime != null">and create_time >= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} >= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.CardInfo" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        values
+        <foreach collection="list" item="i" index="index" separator=",">
+            (<include refid="createsVal"/>)
+        </foreach>
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.CardInfo">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <select id="getBySecretKey" resultType="cn.wisenergy.model.app.CardInfo">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            secret_key=#{secretKey}
+            and is_delete=0
+        </where>
+    </select>
+
+    <select id="getList" resultMap="cardMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            batch_Number=#{batchNumber}
+            and is_delete=0
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/GraduationMapper.xml b/wisenergy-mapper/src/main/resources/mapper/GraduationMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..caffe66959503815fa5549cad1c979b677774e43
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/GraduationMapper.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.GraduationMapper">
+    <resultMap id="graduationMap" type="cn.wisenergy.model.app.Graduation">
+        <id column="id" property="id"/>
+        <result column="school_name" property="schoolName"/>
+        <result column="position" property="position"/>
+        <result column="describe" property="describe"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        graduation
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        school_name,`position`,`describe`,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{schoolName},#{position},#{describe},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="schoolName != null">school_name =#{schoolName},</if>
+        <if test="position != null">`position` =#{position},</if>
+        <if test="describe != null">`describe` =#{describe},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="schoolName != null">and school_name =#{schoolName},</if>
+        <if test="position != null">and `position` =#{position},</if>
+        <if test="describe != null">and `describe` =#{describe},</if>
+        <if test="createTime != null">and create_time >= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} >= update_time</if>
+    </sql>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.Graduation">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <select id="getList" resultMap="graduationMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/LoginRecordMapper.xml b/wisenergy-mapper/src/main/resources/mapper/LoginRecordMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..518ac7a338acec226b621979cfa644368a0f7620
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/LoginRecordMapper.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.LoginRecordMapper">
+    <resultMap id="advertisingMap" type="cn.wisenergy.model.app.LoginRecord">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="type" property="type"/>
+        <result column="operation_name" property="operationName"/>
+        <result column="ip" property="ip"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        login_record
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_id,type, operation_name,ip, create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userId},#{type},#{operationName},#{ip},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userId != null">user_id = #{userId},</if>
+        <if test="type != null">type =#{type},</if>
+        <if test="operationName != null">operation_name =#{operationName},</if>
+        <if test="ip != null">ip =#{ip},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userId != null">and user_id = #{userId}</if>
+        <if test="type != null">and type =#{type}</if>
+        <if test="operationName != null">and operation_name =#{operationName}</if>
+        <if test="ip != null">and ip =#{ip}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.LoginRecord" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.LoginRecord">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="delById" parameterType="java.lang.Integer">
+        delete from
+        <include refid="table"/>
+        where id = #{id}
+    </delete>
+
+    <select id="getById" resultMap="advertisingMap">
+        select <include refid="cols_all"/>
+        from <include refid="table"/>
+        <where>
+            user_id=#{userId}
+            and
+            type=2
+          order by update_time desc
+          limit 0,1
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/PayRecordMapper.xml b/wisenergy-mapper/src/main/resources/mapper/PayRecordMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..57adbf9eff2b0a14ea7e9d215464e2613c73b2f8
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/PayRecordMapper.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.PayRecordMapper">
+    <resultMap id="advertisingMap" type="cn.wisenergy.model.app.PayRecord">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="type" property="type"/>
+        <result column="card_id" property="cardId"/>
+        <result column="money" property="money"/>
+        <result column="result" property="result"/>
+        <result column="pay_limit" property="payLimit"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        pay_record
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_id,type, card_id,money,result,pay_limit, create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userId},#{type},#{cardId},#{money},#{result},#{payLimit},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userId != null">user_id = #{userId},</if>
+        <if test="type != null">type =#{type},</if>
+        <if test="cardId != null">card_id =#{cardId},</if>
+        <if test="money != null">money =#{money},</if>
+        <if test="result != null">result =#{result},</if>
+        <if test="payLimit != null">pay_limit =#{payLimit},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userId != null">and user_id = #{userId}</if>
+        <if test="type != null">and type =#{type}</if>
+        <if test="cardId != null">and card_id =#{cardId}</if>
+        <if test="money != null">and money =#{money}</if>
+        <if test="result != null">and result =#{result}</if>
+        <if test="payLimit != null">and pay_limit =#{payLimit}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.PayRecord" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+    <select id="getList" resultType="cn.wisenergy.model.vo.PayRecordShowVo">
+        select
+        id as recordId,type,result,pay_limit as `limit`,create_time as payTime
+        from
+        <include refid="table"/>
+        <where>
+            <if test="userId != null">
+                user_id=#{userId}
+            </if>
+            order by create_time desc
+            limit #{startNum},#{endNum}
+        </where>
+    </select>
+
+
+    <select id="count" resultType="java.lang.Integer">
+        select count(1)
+        from
+        <include refid="table"/>
+        <where>
+            <if test="userId != null">
+                user_id=#{userId}
+            </if>
+        </where>
+
+    </select>
+
+    <select id="getById" resultMap="advertisingMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            user_id=#{userId}
+            and
+            result=0
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/PriceMapper.xml b/wisenergy-mapper/src/main/resources/mapper/PriceMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f94dd292c0441c56384969491a7e5bf4a14870dc
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/PriceMapper.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.PriceMapper">
+    <resultMap id="priceMap" type="cn.wisenergy.model.app.Price">
+        <id column="id" property="id"/>
+        <result column="use_limit" property="useLimit"/>
+        <result column="money" property="money"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        price
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        use_limit,money, is_delete, create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{useLimit},#{money},#{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="useLimit != null">use_limit = #{useLimit},</if>
+        <if test="money != null">money =#{money},</if>
+        <if test="isDelete != null">is_delete =#{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="useLimit != null">and use_limit = #{useLimit}</if>
+        <if test="money != null">and money =#{money}</if>
+        <if test="isDelete != null">and is_delete =#{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.Price" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+
+    <select id="getList" resultType="cn.wisenergy.model.app.Price">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        where is_delete=0
+        order by use_limit
+    </select>
+
+    <select id="count" resultType="java.lang.Integer">
+        select count(1)
+        from
+        <include refid="table"/>
+        where is_delete=0
+    </select>
+
+    <select id="getByMoney" resultType="cn.wisenergy.model.app.Price">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        where is_delete=0
+        and money=#{money}
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/ProfessionMapper.xml b/wisenergy-mapper/src/main/resources/mapper/ProfessionMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4e2636996ea17f4d01ebd2fa872f84d1a9bbf019
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/ProfessionMapper.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.ProfessionMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.Profession">
+        <id column="id" property="id"/>
+        <id column="type" property="type"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="level" property="level"/>
+        <result column="name" property="name"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        profession
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        type,parent_id,level, name,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{type},#{parentId},#{level},#{name},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="type != null">type = #{type},</if>
+        <if test="parentId != null">parent_id = #{parentId},</if>
+        <if test="level != null">level =#{level},</if>
+        <if test="name != null">name =#{name},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="type != null">and type = #{type}</if>
+        <if test="parentId != null">and parent_id = #{parentId}</if>
+        <if test="level != null">and level =#{level}</if>
+        <if test="name != null">and name =#{name}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.Profession" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <select id="getList" resultType="cn.wisenergy.model.app.Profession">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            type=#{type}
+        </where>
+    </select>
+
+    <select id="getById" resultType="cn.wisenergy.model.app.Profession">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        where id=#{id}
+    </select>
+
+    <select id="getNameByIds" resultType="java.lang.String">
+        select name
+        from
+        <include refid="table"/>
+        <where>
+            id IN
+            <foreach collection="list" index="index" item="id" separator="," open="(" close=")">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/RefillCardMapper.xml b/wisenergy-mapper/src/main/resources/mapper/RefillCardMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d6388ec75fc0a8afae3926ebda9a96998b7fef4c
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/RefillCardMapper.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.RefillCardMapper">
+    <resultMap id="refillCardMap" type="cn.wisenergy.model.app.RefillCard">
+        <id column="id" property="id"/>
+        <result column="batch_number" property="batchNumber"/>
+        <result column="is_make_card" property="isMakeCard"/>
+        <result column="card_number" property="cardNumber"/>
+        <result column="is_activite" property="isActivite"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        refill_card
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        card_number,batch_number,is_make_card, is_activite,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{cardNumber},#{batchNumber},#{isMakeCard},#{isActivite},
+        #{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userName != null">card_number = #{cardNumber},</if>
+        <if test="password != null">batch_number =#{batchNumber},</if>
+        <if test="phone != null">is_make_card =#{isMakeCard},</if>
+        <if test="headImage != null">is_activite =#{isMakeCard},</if>
+        <if test="examType != null">is_delete = #{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="userName != null">and card_number = #{cardNumber}</if>
+        <if test="password != null"> and batch_number =#{batchNumber}</if>
+        <if test="phone != null">and is_make_card =#{isMakeCard}</if>
+        <if test="headImage != null"> and is_activite =#{isMakeCard}</if>
+        <if test="examType != null">and is_delete = #{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.User" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="update" parameterType="java.lang.String">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            is_activite =0
+        </set>
+        <where>
+            batch_number =#{batchNumber}
+        </where>
+    </update>
+
+    <select id="getList" resultMap="refillCardMap" parameterType="map">
+    select
+    <include refid="cols_all"/>
+    from
+    <include refid="table"/>
+    <where>
+        is_delete=0
+
+        order by create_time desc
+        limit #{pageNo},#{pageSize}
+    </where>
+    </select>
+
+
+    <select id="getUserNumbers" resultType="java.lang.Integer">
+        SELECT COUNT(id)
+        FROM
+        <include refid="table"/>
+        where is_delete=0
+    </select>
+
+    <select id="getById" resultMap="refillCardMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        where id=#{id}
+    </select>
+
+    <select id="getByBatchNumber" resultType="cn.wisenergy.model.app.RefillCard">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        where batch_number=#{batchNumber}
+    </select>
+
+    <update id="setIsMakeCard">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            is_make_card =0
+        </set>
+        <where>
+             id=#{id}
+        </where>
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/wisenergy-mapper/src/main/resources/mapper/SchemeMapper.xml b/wisenergy-mapper/src/main/resources/mapper/SchemeMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..189775be737ed940579cd265890b77c1984715da
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/SchemeMapper.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.SchemeMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.SchemeInfo">
+        <id column="id" property="id"/>
+        <result column="scheme_name" property="schemeName"/>
+        <result column="upload_time" property="uploadTime"/>
+        <result column="file_url" property="fileUrl"/>
+        <result column="type" property="type"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        scheme
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        scheme_name,upload_time,file_url, type,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{schemeName},#{uploadTime},#{fileUrl},#{type},#{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="schemeName != null">scheme_name = #{schemeName},</if>
+        <if test="uploadTime != null">upload_time =#{uploadTime},</if>
+        <if test="fileUrl != null">file_url =#{fileUrl},</if>
+        <if test="type != null">type =#{type},</if>
+        <if test="isDelete != null">is_delete =#{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="schemeName != null">and scheme_name = #{schemeName}</if>
+        <if test="uploadTime != null">and upload_time =#{uploadTime}</if>
+        <if test="fileUrl != null">and file_url =#{fileUrl}</if>
+        <if test="type != null">and type =#{type}</if>
+        <if test="isDelete != null">and is_delete =#{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.SchemeInfo" keyProperty="id"
+            keyColumn="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+
+    <select id="getList" parameterType="map" resultType="cn.wisenergy.model.app.SchemeInfo">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            is_delete=0
+            order by create_time desc
+            limit #{startNum},#{endNum}
+        </where>
+    </select>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.SchemeInfo">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <select id="count" resultType="java.lang.Integer">
+        select count(1)
+        from
+        <include refid="table"/>
+        <where>
+            is_delete=0
+        </where>
+    </select>
+
+    <select id="getById" resultType="cn.wisenergy.model.app.SchemeInfo">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            id=#{id}
+        </where>
+    </select>
+
+    <select id="getByType" resultType="int">
+        select count(1)
+        from
+        <include refid="table"/>
+        <where>
+            type=#{type}
+            and is_delete=0
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/SchemeRecordMapper.xml b/wisenergy-mapper/src/main/resources/mapper/SchemeRecordMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f1a41674d31c36a7ced8b1307e664204aab0c38a
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/SchemeRecordMapper.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.SchemeRecordMapper">
+    <resultMap id="recordMap" type="cn.wisenergy.model.app.SchemeQueryRecord">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="major_name" property="majorName"/>
+        <result column="student_type" property="studentType"/>
+        <result column="score" property="score"/>
+        <result column="major_score" property="majorScore"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        scheme_query_record
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_id,major_name, student_type,score,major_score,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userId},#{majorName},#{studentType},#{score}, #{majorScore},#{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userId != null">user_id = #{userId},</if>
+        <if test="majorName != null">major_name =#{majorName},</if>
+        <if test="studentType != null">student_type =#{studentType},</if>
+        <if test="score != null">score =#{score},</if>
+        <if test="majorScore != null">major_score =#{majorScore},</if>
+        <if test="isDelete != null">is_delete = #{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userId != null">and user_id = #{userId}</if>
+        <if test="majorName != null">and major_name =#{majorName}</if>
+        <if test="studentType != null">and student_type =#{studentType}</if>
+        <if test="score != null">and score =#{score}</if>
+        <if test="majorScore != null">and major_score =#{majorScore}</if>
+        <if test="isDelete != null">and is_delete = #{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.SchemeQueryRecord" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.SchemeQueryRecord">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="delById" parameterType="java.lang.Integer">
+        delete from
+        <include refid="table"/>
+        where id = #{id}
+    </delete>
+
+    <select id="count" resultType="java.lang.Integer">
+        select count(1)
+        from
+        <include refid="table"/>
+        <where>
+            is_delete=0
+            <if test="userId != null">
+                and user_id=#{userId}
+            </if>
+        </where>
+    </select>
+
+    <select id="getByUserId" resultType="cn.wisenergy.model.app.SchemeQueryRecord">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            is_delete=0
+            and user_id=#{userId}
+            order by create_time desc
+            limit #{startNum},#{endNum}
+        </where>
+    </select>
+
+    <select id="getById" resultMap="recordMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            id=#{id}
+        </where>
+    </select>
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/ScoreInfoMapper.xml b/wisenergy-mapper/src/main/resources/mapper/ScoreInfoMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fd623bf9fc7a505303b3b5b3fda3a8609239bf3e
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/ScoreInfoMapper.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.ScoreInfoMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.ScoreInfo">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="culture_grade" property="cultureGrade"/>
+        <result column="major_grade" property="majorGrade"/>
+        <result column="language_grade" property="languageGrade"/>
+        <result column="math_grade" property="mathGrade"/>
+        <result column="english_grade" property="englishGrade"/>
+        <result column="physics_grade" property="physicsGrade"/>
+        <result column="chemistry_grade" property="chemistryGrade"/>
+        <result column="biology_grade" property="biologyGrade"/>
+        <result column="history_grade" property="historyGrade"/>
+        <result column="geography_grade" property="geographyGrade"/>
+        <result column="politics_grade" property="politicsGrade"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        score
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_id,culture_grade, major_grade,language_grade,math_grade,english_grade, physics_grade,chemistry_grade,
+        biology_grade,history_grade,geography_grade,politics_grade, create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userId},#{cultureGrade},#{majorGrade},#{languageGrade},#{mathGrade},#{englishGrade},#{physicsGrade},
+        #{chemistryGrade},#{biologyGrade}, #{historyGrade},#{geographyGrade},#{politicsGrade},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userId != null">user_id = #{userId},</if>
+        <if test="cultureGrade != null">culture_grade =#{cultureGrade},</if>
+        <if test="majorGrade != null">major_grade =#{majorGrade},</if>
+        <if test="languageGrade != null">language_grade =#{languageGrade},</if>
+        <if test="mathGrade != null">math_grade =#{mathGrade},</if>
+        <if test="englishGrade != null">english_grade =#{englishGrade},</if>
+        <if test="physicsGrade != null">physics_grade = #{physicsGrade},</if>
+        <if test="chemistryGrade != null">chemistry_grade = #{chemistryGrade},</if>
+        <if test="biologyGrade != null">biology_grade = #{biologyGrade},</if>
+        <if test="historyGrade != null">history_grade = #{historyGrade},</if>
+        <if test="geographyGrade != null">geography_grade = #{geographyGrade},</if>
+        <if test="politicsGrade != null">politics_grade = #{politicsGrade},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="updateCondition2">
+        user_id = #{userId},
+        culture_grade =#{cultureGrade},
+        major_grade =#{majorGrade},
+        language_grade =#{languageGrade},
+        math_grade =#{mathGrade},
+        english_grade =#{englishGrade},
+        physics_grade = #{physicsGrade},
+        chemistry_grade = #{chemistryGrade},
+        biology_grade = #{biologyGrade},
+        history_grade = #{historyGrade},
+        geography_grade = #{geographyGrade},
+        politics_grade = #{politicsGrade},
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userId != null">and user_id = #{userId}</if>
+        <if test="cultureGrade != null">and culture_grade =#{cultureGrade}</if>
+        <if test="majorGrade != null">and major_grade =#{majorGrade}</if>
+        <if test="languageGrade != null">and language_grade =#{languageGrade}</if>
+        <if test="mathGrade != null">and math_grade =#{mathGrade}</if>
+        <if test="englishGrade != null">and english_grade =#{englishGrade}</if>
+        <if test="physicsGrade != null">and physics_grade = #{physicsGrade}</if>
+        <if test="chemistryGrade != null">and chemistry_grade = #{chemistryGrade}</if>
+        <if test="biologyGrade != null">and biology_grade = #{biologyGrade}</if>
+        <if test="historyGrade != null">and history_grade = #{historyGrade}</if>
+        <if test="geographyGrade != null">and geography_grade = #{geographyGrade}</if>
+        <if test="politicsGrade != null">and politics_grade = #{politicsGrade}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.ScoreInfo" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.ScoreInfo">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition2"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="delById" parameterType="java.lang.Integer">
+        delete from
+        <include refid="table"/>
+        where id = #{id}
+    </delete>
+
+    <select id="getById" resultMap="userMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            user_id=#{userId}
+        </where>
+    </select>
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/UserLimitMapper.xml b/wisenergy-mapper/src/main/resources/mapper/UserLimitMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a07977b68bc2823f97c2473e6c4668f6e8079064
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/UserLimitMapper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.UserLimitMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.UserLimit">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="total_limit" property="totalLimit"/>
+        <result column="use_limit" property="useLimit"/>
+        <result column="usable_limit" property="usableLimit"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        user_limit
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_id,total_limit, use_limit,usable_limit,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userId},#{totalLimit},#{useLimit},#{usableLimit},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userId != null">user_id = #{userId},</if>
+        <if test="totalLimit != null">total_limit =#{totalLimit},</if>
+        <if test="useLimit != null">use_limit =#{useLimit},</if>
+        <if test="usableLimit != null">usable_limit =#{usableLimit},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userId != null">and user_id = #{userId}</if>
+        <if test="totalLimit != null">and total_limit =#{totalLimit}</if>
+        <if test="useLimit != null">and use_limit =#{useLimit}</if>
+        <if test="usableLimit != null">and usable_limit =#{usableLimit}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.UserLimit" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.UserLimit">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <select id="getByUserId" resultMap="userMap">
+        select <include refid="cols_all"/>
+        from <include refid="table"/>
+        <where>
+            user_id=#{userId}
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/UserLimitRecordMapper.xml b/wisenergy-mapper/src/main/resources/mapper/UserLimitRecordMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0f5c2aaadb2c19bad64defe364bbdac65210ab8f
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/UserLimitRecordMapper.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.UserLimitRecordMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.UserLimitRecord">
+        <id column="id" property="id"/>
+        <result column="user_id" property="userId"/>
+        <result column="user_limit_id" property="userLimitId"/>
+        <result column="minus_limit" property="minusLimit"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        user_limit_record
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_id,user_limit_id,minus_limit, create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userId},#{userLimitId},#{minusLimit},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userId != null">user_id = #{userId},</if>
+        <if test="userLimitId != null">user_limit_id =#{userLimitId},</if>
+        <if test="minusLimit != null">minus_limit =#{minusLimit},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userId != null">and user_id = #{userId}</if>
+        <if test="userLimitId != null">and user_limit_id =#{userLimitId}</if>
+        <if test="minusLimit != null">and minus_limit =#{minusLimit}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.UserLimitRecord" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.UserLimitRecord">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <select id="getByUserId" resultMap="userMap">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            user_id=#{userId}
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/UserVolunteerMapper.xml b/wisenergy-mapper/src/main/resources/mapper/UserVolunteerMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..96f3f0ad5914f4d26e85fc687e000351251a7ce3
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/UserVolunteerMapper.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.UserVolunteerMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.UserVolunteer">
+        <id column="id" property="id"/>
+        <result column="scheme_record_id" property="schemeRecordId"/>
+        <result column="user_id" property="userId"/>
+        <result column="volunteer_id" property="volunteerId"/>
+    </resultMap>
+
+    <sql id="table">
+        user_volunteer
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        scheme_record_id,user_id, volunteer_id
+    </sql>
+
+    <sql id="createsVal">
+        #{i.scheme_record_id},#{i.user_id},#{i.volunteer_id},now(), now()
+    </sql>
+
+    <sql id="vals">
+        #{schemeRecordId},#{userId},#{volunteerId}
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="schemeRecordId != null">scheme_record_id = #{schemeRecordId},</if>
+        <if test="userId != null">user_id =#{userId},</if>
+        <if test="volunteerId != null">volunteer_id =#{volunteerId},</if>
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="schemeRecordId != null">and scheme_record_id = #{schemeRecordId}</if>
+        <if test="userId != null">and user_id =#{userId}</if>
+        <if test="volunteerId != null">and volunteer_id =#{volunteerId}</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.UserVolunteer" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <!-- 批量创建接口 -->
+    <insert id="creates" parameterType="list">
+        INSERT INTO
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        VALUES
+        <foreach collection="list" item="i" index="index" separator=",">
+            (<include refid="createsVal"/>)
+        </foreach>
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.UserVolunteer">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="delById" parameterType="java.lang.Integer">
+        delete from
+        <include refid="table"/>
+        where id = #{id}
+    </delete>
+
+    <select id="listById" resultType="cn.wisenergy.model.app.UserVolunteer">
+        select * from
+        <include refid="table"/>
+        where scheme_record_id = #{schemeRecordId}
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/UsersMapper.xml b/wisenergy-mapper/src/main/resources/mapper/UsersMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..84053848a9298422a0852ff6c4673d054fe37192
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/UsersMapper.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.UsersMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.User">
+        <id column="id" property="id"/>
+        <result column="user_name" property="userName"/>
+        <result column="password" property="password"/>
+        <result column="phone" property="phone"/>
+        <result column="uuid" property="uuid"/>
+        <result column="head_image" property="headImage"/>
+        <result column="sex" property="sex"/>
+        <result column="school" property="school"/>
+        <result column="exam_type" property="examType"/>
+        <result column="source" property="source"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        user
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        user_name,password, phone,uuid,head_image,sex,school, exam_type,source,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{userName},#{password},#{phone},#{uuid},#{headImage},#{sex},#{school},#{examType}, #{source},
+        #{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="userName != null">user_name = #{userName},</if>
+        <if test="password != null">password =#{password},</if>
+        <if test="phone != null">phone =#{phone},</if>
+        <if test="uuid != null">uuid =#{uuid},</if>
+        <if test="headImage != null">head_image =#{headImage},</if>
+        <if test="sex != null">sex =#{sex},</if>
+        <if test="school != null">school =#{school},</if>
+        <if test="examType != null">exam_type = #{examType},</if>
+        <if test="source != null">source = #{source},</if>
+        <if test="isDelete != null">is_delete = #{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="userName != null">and user_name = #{userName}</if>
+        <if test="password != null">and password =#{password}</if>
+        <if test="phone != null">and phone =#{phone}</if>
+        <if test="uuid != null">and uuid =#{uuid}</if>
+        <if test="headImage != null">and head_image =#{headImage}</if>
+        <if test="sex != null">and sex =#{sex}</if>
+        <if test="school != null">and school =#{school}</if>
+        <if test="examType != null">and exam_type = #{examType}</if>
+        <if test="source != null">and source = #{source}</if>
+        <if test="isDelete != null">and is_delete = #{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.User" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+    <update id="edit" parameterType="cn.wisenergy.model.app.User">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            <include refid="updateCondition"/>
+        </set>
+        <where>
+            id = #{id}
+        </where>
+    </update>
+
+    <delete id="delById" parameterType="java.lang.Integer">
+        delete from
+        <include refid="table"/>
+        where id = #{id}
+    </delete>
+
+    <select id="countByPhoneAnsUserId" resultType="java.lang.Integer">
+        SELECT COUNT(1)
+        FROM
+        <include refid="table"/>
+        WHERE phone=#{phone} and id !=#{userId} and is_delete=0
+    </select>
+
+    <select id="getList" resultMap="userMap" parameterType="map">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            is_delete=0
+
+            <if test="startTime != null">
+                and create_time
+                between #{startTime}
+            </if>
+
+            <if test="endTime != null">and #{endTime}</if>
+
+            <if test="userName != null">and user_name like ('%' #{userName} '%')</if>
+
+            <if test="phone != null">and phone like ('%' #{phone} '%')</if>
+            order by create_time desc
+            limit #{pageNo},#{pageSize}
+        </where>
+    </select>
+
+    <select id="getUserNumbers" resultType="java.lang.Integer">
+        SELECT COUNT(id)
+        FROM
+        <include refid="table"/>
+        <where>
+             is_delete=0
+
+            <if test="startTime != null">
+                and create_time
+                between #{startTime}
+            </if>
+            <if test="endTime != null">and #{endTime}</if>
+
+            <if test="userName != null">and user_name like ('%' #{userName} '%')</if>
+
+            <if test="phone != null">and phone like ('%' #{phone} '%')</if>
+        </where>
+
+    </select>
+
+    <select id="getByPhone" resultType="cn.wisenergy.model.app.User">
+        SELECT
+        <include refid="cols_all"/>
+        FROM
+        <include refid="table"/>
+        where is_delete=0 and phone=#{phone}
+    </select>
+
+
+    <select id="test" resultType="cn.wisenergy.model.app.User">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            <if test="list != null">
+                <foreach collection="list" index="index" item="id" separator="or" open="(" close=")">
+                    user_name LIKE CONCAT('%',#{id},'%')
+                </foreach>
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/wisenergy-mapper/src/main/resources/mapper/VolunteerMapper.xml b/wisenergy-mapper/src/main/resources/mapper/VolunteerMapper.xml
new file mode 100644
index 0000000000000000000000000000000000000000..81205c2f6191018156efc906d3d39b5bb72ced38
--- /dev/null
+++ b/wisenergy-mapper/src/main/resources/mapper/VolunteerMapper.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.wisenergy.mapper.VolunteerMapper">
+    <resultMap id="userMap" type="cn.wisenergy.model.app.Volunteer">
+        <id column="id" property="id"/>
+        <result column="type" property="type"/>
+        <result column="scheme_id" property="schemeId"/>
+        <result column="major_name" property="majorName"/>
+        <result column="academy" property="academy"/>
+        <result column="course_demand" property="courseDemand"/>
+        <result column="nature" property="nature"/>
+        <result column="year_limit" property="yearLimit"/>
+        <result column="plan_num" property="planNum"/>
+        <result column="cast_archives_num" property="castArchivesNum"/>
+        <result column="launch_num" property="launchNum"/>
+        <result column="lowest_mark" property="lowestMark"/>
+        <result column="lowest_rank" property="lowestRank"/>
+        <result column="is_delete" property="isDelete"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <sql id="table">
+        volunteer
+    </sql>
+
+    <sql id="cols_all">
+        id,
+        <include refid="cols_exclude_id"/>
+    </sql>
+
+    <sql id="cols_exclude_id">
+        type,scheme_id,major_name,academy, course_demand,nature,year_limit,plan_num,
+        cast_archives_num,launch_num,lowest_mark,
+        lowest_rank,is_delete,create_time,update_time
+    </sql>
+
+    <sql id="vals">
+        #{type},#{scheme},#{majorName},#{academy},#{courseDemand},#{nature},#{yearLimit},#{planNum},#{castArchivesNum},
+        #{launchNum},
+        #{lowestMark}, #{lowestRank},#{isDelete},now(),now()
+    </sql>
+
+    <sql id="updateCondition">
+        <if test="type != null">type = #{type},</if>
+        <if test="scheme != null">scheme = #{scheme},</if>
+        <if test="majorName != null">major_name = #{majorName},</if>
+        <if test="academy != null">academy =#{academy},</if>
+        <if test="courseDemand != null">course_demand =#{courseDemand},</if>
+        <if test="nature != null">nature =#{nature},</if>
+        <if test="yearLimit != null">year_limit =#{yearLimit},</if>
+        <if test="planNum != null">plan_num =#{planNum},</if>
+        <if test="castArchivesNum != null">cast_archives_num = #{castArchivesNum},</if>
+        <if test="launchNum != null">launch_num = #{launchNum},</if>
+        <if test="lowestMark != null">lowest_mark = #{lowestMark},</if>
+        <if test="lowestRank != null">lowestMark = #{lowestRank},</if>
+        <if test="isDelete != null">is_delete = #{isDelete},</if>
+        update_time =now()
+    </sql>
+
+    <sql id="criteria">
+        <if test="id != null">id = #{id}</if>
+        <if test="type != null">and type = #{type}</if>
+        <if test="scheme != null">and scheme = #{scheme}</if>
+        <if test="majorName != null">and major_name = #{majorName}</if>
+        <if test="academy != null">and academy =#{academy}</if>
+        <if test="courseDemand != null">and course_demand =#{courseDemand}</if>
+        <if test="nature != null">and nature =#{nature}</if>
+        <if test="yearLimit != null">and year_limit =#{yearLimit}</if>
+        <if test="planNum != null">and plan_num =#{planNum}</if>
+        <if test="castArchivesNum != null">and cast_archives_num = #{castArchivesNum}</if>
+        <if test="launchNum != null">and launch_num = #{launchNum}</if>
+        <if test="lowestMark != null">and lowest_mark = #{lowestMark}</if>
+        <if test="lowestRank != null">and lowestMark = #{lowestRank}</if>
+        <if test="isDelete != null">and is_delete = #{isDelete}</if>
+        <if test="createTime != null">and create_time &gt;= #{createTime}</if>
+        <if test="updateTime != null">and #{updateTime} &gt;= update_time</if>
+    </sql>
+
+    <insert id="add" parameterType="cn.wisenergy.model.app.Volunteer" keyProperty="id" useGeneratedKeys="true">
+        insert into
+        <include refid="table"/>
+        (<include refid="cols_exclude_id"/>)
+        value(
+        <include refid="vals"/>
+        )
+    </insert>
+
+
+    <update id="updateBySchemeId">
+        UPDATE
+        <include refid="table"/>
+        <set>
+            is_delete=1
+        </set>
+        <where>
+            scheme_id = #{schemeId}
+            and is_delete=0
+        </where>
+    </update>
+
+    <select id="getFillList" resultType="cn.wisenergy.model.app.Volunteer">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            is_delete =0
+            <if test="upGrade != null">
+                and #{upGrade} > lowest_mark
+            </if>
+            <if test="downGrade != null">
+                and lowest_mark >#{downGrade}
+            </if>
+            <if test="type != null">
+                and type =#{type}
+            </if>
+            <if test="volunteerIds != null and volunteerIds.size > 0 ">
+                and id NOT IN
+                <foreach collection="volunteerIds" index="index" item="id" separator="," open="(" close=")">
+                    #{id}
+                </foreach>
+            </if>
+            order by major_name,lowest_mark desc
+            limit #{number}
+        </where>
+    </select>
+
+    <select id="getListByIds" resultType="cn.wisenergy.model.app.Volunteer">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            id IN
+            <foreach collection="list" index="index" item="id" separator="," open="(" close=")">
+                #{id}
+            </foreach>
+        </where>
+    </select>
+
+    <select id="getVolunteerList" resultType="cn.wisenergy.model.app.Volunteer">
+        select
+        <include refid="cols_all"/>
+        from
+        <include refid="table"/>
+        <where>
+            is_delete =0
+            <if test="upGrade != null">
+                and #{upGrade} > lowest_mark
+            </if>
+            <if test="downGrade != null">
+                and lowest_mark >#{downGrade}
+            </if>
+            <if test="type != null">
+                and type =#{type}
+            </if>
+            <if test="classNames != null">
+                and
+                <foreach collection="classNames" index="index" item="id" separator="or" open="(" close=")">
+                    course_demand LIKE CONCAT('%',#{id},'%')
+                </foreach>
+            </if>
+            <if test="professionNames != null">
+                and
+                <foreach collection="professionNames" index="index" item="id" separator="or" open="(" close=")">
+                    major_name LIKE CONCAT('%',#{id},'%')
+                </foreach>
+            </if>
+            order by lowest_mark desc
+        </where>
+    </select>
+
+</mapper>
diff --git a/wisenergy-mapper/wisenergy-mapper.iml b/wisenergy-mapper/wisenergy-mapper.iml
new file mode 100644
index 0000000000000000000000000000000000000000..c78ab650843c5cbde2242a0132ac8711122b796b
--- /dev/null
+++ b/wisenergy-mapper/wisenergy-mapper.iml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="wisenergy-model" />
+    <orderEntry type="module" module-name="wisenergy-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.16.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: org.springframework:spring-web:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-test:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.8" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.16" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.54" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.6.7" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.23" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-pool:commons-pool:1.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.8" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" />
+    <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.6.3" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/wisenergy-model/.gitignore b/wisenergy-model/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b4f66076247712dbd69e9ec586a827b3bd8fcd7b
--- /dev/null
+++ b/wisenergy-model/.gitignore
@@ -0,0 +1,7 @@
+workspace
+.project
+.classpath
+*.settings
+.idea
+*.class
+target/
\ No newline at end of file
diff --git a/wisenergy-model/pom.xml b/wisenergy-model/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d056f60a3c30c8257a36ef3d399a88dd894ab09e
--- /dev/null
+++ b/wisenergy-model/pom.xml
@@ -0,0 +1,36 @@
+<?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>
+        <artifactId>wisenergy-parent</artifactId>
+        <groupId>cn.wisenergy</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>wisenergy-model</artifactId>
+    <version>${moduleVersion.wisenergy-model}</version>
+    <packaging>jar</packaging>
+
+    <!-- 项目依赖 -->
+    <dependencies>
+        <dependency>
+            <groupId>cn.wisenergy</groupId>
+            <artifactId>wisenergy-common</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>1.5.23</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+    <!-- MAVEN构建 -->
+    <build>
+        <finalName>${project.artifactId}-${moduleVersion.wisenergy-model}</finalName>
+    </build>
+</project>
\ No newline at end of file
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/AccountInfo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/AccountInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..df2f74082dc17966460ce60f13703c2489355ef2
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/AccountInfo.java
@@ -0,0 +1,57 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 管理员实体类
+ */
+@Data
+@ApiModel(value = "AccountInfo")
+public class AccountInfo implements Serializable {
+
+    private static final long serialVersionUID = 3050641578536493424L;
+    /**
+     * 管理员主键id
+     */
+    @ApiModelProperty(name ="id",value = "管理员主键id")
+    private Integer id;
+
+    /**
+     * 管理员账号
+     */
+    @ApiModelProperty(name = "name",value = "管理员账号")
+    private String userName;
+
+    /**
+     * 管理员密码
+     */
+    @ApiModelProperty(name="password",value = "管理员密码")
+    private String password;
+
+    /**
+     * 头像
+     */
+    @ApiModelProperty(name = "headImage",value = "头像")
+    private String headImage;
+
+    /**
+     * 是否删除
+     */
+    @ApiModelProperty(name = "isDelete",value = "是否删除 0:正常 1:删除")
+    private Integer isDelete;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(name = "createTime",value = "创建时间")
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty(name = "updateTime",value = "修改时间")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/AdmissionRule.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/AdmissionRule.java
new file mode 100644
index 0000000000000000000000000000000000000000..f680751f09891c7bd64c557100f63b4603f2228b
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/AdmissionRule.java
@@ -0,0 +1,87 @@
+package cn.wisenergy.model.app;
+
+import cn.wisenergy.model.common.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description: 录取规则实体类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/19 10:43
+ */
+@Data
+@ApiModel(value = "AdmissionRule")
+public class AdmissionRule extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = -9211670648343824241L;
+
+    /**
+     * 录取规则id
+     */
+    @ApiModelProperty(value = "录取规则id", name = "id")
+    private Integer id;
+
+    /**
+     * 方案类型:1:本科文化一批 2:本科美术一批 3:艺术本科批文学编导 4:本科体育  5:专科专业分类6:专科美术一批 7:专科文学编导一批 8:专科体育一批
+     */
+    @ApiModelProperty(value = "方案类型:1:本科文化一批 2:本科美术一批 3:艺术本科批文学编导 4:本科体育  " +
+            "5:专科专业分类6:专科美术一批 7:专科文学编导一批 8:专科体育一批", name = "type")
+    private Integer type;
+
+    /**
+     * 文化成绩最高分
+     */
+    @ApiModelProperty(value = "文化成绩最高分", name = "cultureMax")
+    private Double cultureMax;
+
+    /**
+     * 文化成绩最低分
+     */
+    @ApiModelProperty(value = "文化成绩最低分", name = "cultureMin")
+    private Double cultureMin;
+
+    /**
+     * 本年文化课录取线
+     */
+    @ApiModelProperty(value = "本年文化课录取线", name = "currentYearCulture")
+    private Double currentYearCulture;
+
+    /**
+     * 专业成绩最高分
+     */
+    @ApiModelProperty(value = "专业成绩最高分", name = "professionMax")
+    private Double professionMax;
+
+    /**
+     * 专业成绩最低分
+     */
+    @ApiModelProperty(value = "专业成绩最低分", name = "professionMin")
+    private Double professionMin;
+
+    /**
+     * 本年专业课录取线
+     */
+    @ApiModelProperty(value = "本年文化课录取线", name = "currentYearMajor")
+    private Double currentYearMajor;
+
+    /**
+     * 向上浮动分数
+     */
+    @ApiModelProperty(value = "向上浮动分数", name = "upMark")
+    private Double upMark;
+
+    /**
+     * 向下浮动分数
+     */
+    @ApiModelProperty(value = "向下浮动分数", name = "downMark")
+    private Double downMark;
+
+    /**
+     * 展示志愿总数
+     */
+    @ApiModelProperty(value = "展示志愿总数", name = "number")
+    private Integer number;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/Banner.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Banner.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a30f8a71baa7df8ae2ac608178c65458854bfb0
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Banner.java
@@ -0,0 +1,74 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ Description: 广告实体类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 16:01
+ */
+@Data
+@ApiModel(value = "Advertising")
+public class Banner implements Serializable {
+
+    private static final long serialVersionUID = 5513428780946937905L;
+
+    /**
+     *  广告id
+     */
+    @ApiModelProperty(value = "广告id",name = "id")
+    private Integer id;
+
+    /**
+     * 合作公司名称
+     */
+    @ApiModelProperty(value = "合作公司名称",name = "companyName")
+    private String companyName;
+
+    /**
+     * 投放状态 0:暂停中 1:投放中
+     */
+    @ApiModelProperty(value = "投放状态 0:暂停中 1:投放中",name = "status")
+    private Integer status;
+
+    /**
+     * 网址
+     */
+    @ApiModelProperty(value = "网址",name = "website")
+    private String website;
+
+    /**
+     * 是否有宣传图 0:没有 1:有
+     */
+    @ApiModelProperty(value = "是否有宣传图 0:没有 1:有",name = "isHaveImage")
+    private Integer isHaveImage;
+
+    /**
+     * 广告类型: 1:顶部广告 2:底部广告
+     */
+    @ApiModelProperty(value = "广告类型: 1:顶部广告 2:底部广告",name = "type")
+    private Integer type;
+
+    /**
+     * 广告图片url
+     */
+    @ApiModelProperty(value = "广告图片url",name = "image")
+    private String image;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",name = "createTime")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间",name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/CardInfo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/CardInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..398f06c1ac81fef4e419594f45201cb614fe97c0
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/CardInfo.java
@@ -0,0 +1,73 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 充值卡字卡实体类
+ */
+@Data
+@ApiModel(value = "CardInfo")
+public class CardInfo implements Serializable {
+    /**
+     * 子卡id
+     */
+    @ApiModelProperty(value = "子卡id",name = "id")
+    private Integer id;
+
+    /**
+     * 批次号
+     */
+    @ApiModelProperty(value = "批次号",name = "batchNumber")
+    private String batchNumber;
+
+    /**
+     * 批次号
+     */
+    @ApiModelProperty(value = "批次号",name = "batchNumber")
+    private String cardNumber;
+
+    /**
+     * 次数
+     */
+    @ApiModelProperty(value = "次数",name = "limit")
+    private Integer limit;
+
+    /**
+     * 秘钥
+     */
+    @ApiModelProperty(value = "秘钥",name = "secretKey")
+    private String secretKey ;
+
+    /**
+     * 卡的金额
+     */
+    @ApiModelProperty(value = "卡的金额",name = "money")
+    private String money;
+
+    /**
+     * 状态
+     */
+    @ApiModelProperty(value = "状态 0:未使用 1:已使用",name = "status")
+    private Integer status;
+
+    /**
+     * 是否删除
+     */
+    @ApiModelProperty(name = "isDelete",value = "是否删除 0:正常 1:删除")
+    private Integer isDelete;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",name = "creteTime")
+    private Date createTime;
+    /**
+     *更改时间
+     */
+    @ApiModelProperty(value = "更改时间",name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/Graduation.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Graduation.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b7ea999a66221dacba6c8aee3b66cab38be5801
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Graduation.java
@@ -0,0 +1,53 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 毕业院校实体类
+ */
+@Data
+@ApiModel(value = "Graduation")
+public class Graduation implements Serializable {
+    private static final long serialVersionUID = 7511175256020154565L;
+    /**
+     * 院校主键id
+     */
+    @ApiModelProperty(value = "院校主键id",name = "id")
+    private Integer id;
+
+    /**
+     * 学校名称
+     */
+    @ApiModelProperty(value = "学校名称",name = "schoolName")
+    private String schoolName;
+
+    /**
+     * 学校地址
+     */
+    @ApiModelProperty(value = "学校地址",name = "position")
+    private String position;
+
+    /**
+     * 学校描述
+     */
+    @ApiModelProperty(value = "学校描述",name = "describe")
+    private String describe;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",name = "creteTime")
+    private Date createTime;
+
+    /**
+     *更改时间
+     */
+    @ApiModelProperty(value = "更改时间",name = "updateTime")
+    private Date updateTime;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/LoginRecord.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/LoginRecord.java
new file mode 100644
index 0000000000000000000000000000000000000000..731b884ba4f4054205bfbe0fcaf577ee3d04eca4
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/LoginRecord.java
@@ -0,0 +1,61 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ Description: 用户登录操作记录实体类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 15:09
+ */
+@Data
+@ApiModel(value = "LoginRecord")
+public class LoginRecord implements Serializable {
+    private static final long serialVersionUID = 3450614328514828031L;
+
+    /**
+     * 用户操作记录id
+     */
+    @ApiModelProperty(value = "用户操作记录id", name = "id")
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 类型 1:用户祖册 2:用户登录 3:用户退出
+     */
+    @ApiModelProperty(value = "类型 1:用户祖册 2:用户登录 3:用户退出", name = "type")
+    private Integer type;
+
+    /**
+     * 操作名称
+     */
+    @ApiModelProperty(value = "操作名称", name = "operationName")
+    private String operationName;
+
+    /**
+     * ip
+     */
+    @ApiModelProperty(value = "ip", name = "ip")
+    private String ip;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间", name = "createTime")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty(value = "修改时间", name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/PayRecord.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/PayRecord.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca05c64930016e736cd53ef45447cfbbd0ad3fe2
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/PayRecord.java
@@ -0,0 +1,73 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 充值记录实体类
+*@ Author     : 86187
+*@ Date       : 2021/1/8 14:48
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "PayRecord")
+public class PayRecord implements Serializable {
+    private static final long serialVersionUID = -7865361068703566832L;
+
+    /**
+     * 充值记录id
+     */
+    @ApiModelProperty(value = "充值记录id",name = "id")
+    private Integer id;
+
+    /**
+     * 充值类型 1:支付宝 2:微信 3:充值卡
+     */
+    @ApiModelProperty(value = "充值类型 1:支付宝 2:微信 3:充值卡",name = "type")
+    private Integer type;
+
+    /**
+     * 充值卡id
+     */
+    @ApiModelProperty(value = "充值卡id",name = "cardId")
+    private Integer cardId;
+
+    /**
+     * 充值用户id
+     */
+    @ApiModelProperty(value = "充值用户id",name = "userId")
+    private Integer userId;
+
+    /**
+     * 充值所花金额
+     */
+    @ApiModelProperty(value = "充值所花金额",name = "money")
+    private Integer money;
+
+    /**
+     * 充值结果 0:成功 1:失败
+     */
+    @ApiModelProperty(value = "充值结果 0:成功 1:失败",name = "result")
+    private Integer result;
+    /**
+     * 充值次数
+     */
+    @ApiModelProperty(value = "充值次数",name = "limit")
+    private Integer payLimit;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",name = "creteTime")
+    private Date createTime;
+
+    /**
+     *更改时间
+     */
+    @ApiModelProperty(value = "更改时间",name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/Price.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Price.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6ba14b836e4261c3f5d7a665eb6301dd25040ea
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Price.java
@@ -0,0 +1,60 @@
+package cn.wisenergy.model.app;
+
+import cn.wisenergy.model.common.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 86187
+ * @ Description: 价格表
+ * @ Author     : 86187
+ * @ Date       : 2021/1/24 9:50
+ */
+@Data
+@ApiModel(value = "Price")
+
+public class Price implements Serializable {
+    private static final long serialVersionUID = 1112644645559505970L;
+
+    /**
+     * ä»·æ ¼id
+     */
+    @ApiModelProperty(value = "ä»·æ ¼id", name = "id")
+    private Integer id;
+
+    /**
+     * 可查询次数
+     */
+    @ApiModelProperty(value = "可查询次数", name = "useLimit")
+    private Integer useLimit;
+
+    /**
+     * 购买需要的钱
+     */
+    @ApiModelProperty(value = "购买需要的钱", name = "money")
+    private Integer money;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty("修改时间")
+    private Date updateTime;
+
+    /**
+     * 删除标记
+     */
+    @ApiModelProperty("是否删除 1,删除;0,未删除")
+    private Integer isDelete;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/Profession.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Profession.java
new file mode 100644
index 0000000000000000000000000000000000000000..aba405527e16f9e9cc42ac5e74998b4df3e9800d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Profession.java
@@ -0,0 +1,78 @@
+package cn.wisenergy.model.app;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ Description: 专业实体类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 10:37
+ */
+@Data
+@ApiModel(value = "profession")
+public class Profession implements Serializable {
+    private static final long serialVersionUID = 4215915155490456186L;
+
+    /**
+     * 专业id
+     */
+    @ApiModelProperty(value = "专业id", name = "id")
+    private Integer id;
+
+    /**
+     * 方案类型:1:本科文化一批 2:本科美术一批 3:艺术本科批文学编导 4:本科体育  5:专科专业分类6:专科美术一批 7:专科文学编导一批 8:专科体育一批
+     */
+    @ApiModelProperty(value = "方案类型:1:本科文化一批 2:本科美术一批 3:艺术本科批文学编导 4:本科体育  5:专科专业分类6:" +
+            "专科美术一批 7:专科文学编导一批 8:专科体育一批", name = "type")
+    private Integer type;
+
+    /**
+     * 父id
+     */
+    @ApiModelProperty(value = "专业id", name = "id")
+    private Integer parentId;
+
+    /**
+     * 等级
+     */
+    @ApiModelProperty(value = "等级", name = "level")
+    private Integer level;
+
+    /**
+     * 专业名称
+     */
+    @ApiModelProperty(value = "专业名称", name = "name")
+    private String name;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间", name = "createTime")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间", name = "updateTime")
+    private Date updateTime;
+
+    /**
+     * 子专业
+     */
+    @ApiModelProperty(value = "子专业", name = "updateTime")
+    private List<Profession> children;
+
+    /**
+     * 是否选中  false : 未选中 true : 选中
+     */
+    @ApiModelProperty(value = "是否选中  false : 未选中 true : 选中", name = "checked")
+    @TableField(exist = false)
+    private Boolean checked =false;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/RefillCard.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/RefillCard.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2e2bac9234b653a440e6b707fee5eb87c998e23
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/RefillCard.java
@@ -0,0 +1,59 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "RefillCard")
+public class RefillCard {
+    /**
+     * 充值卡id
+     */
+    @ApiModelProperty(value = "充值卡id",name = "id")
+    private Integer id;
+
+    /**
+     * 批次号
+     */
+    @ApiModelProperty(value = "批次号",name = "batchNumber")
+    private String batchNumber;
+
+    /**
+     * 是否已制卡 0:已制卡 1:未制卡
+     */
+    @ApiModelProperty(value = "是否已制卡 0:已制卡 1:未制卡",name = "isMakeCard")
+    private Integer isMakeCard;
+
+    /**
+     * 卡数量
+     */
+    @ApiModelProperty(value = "卡数量",name = "cardNumber")
+    private Integer cardNumber  ;
+
+    /**
+     * 是否已激活
+     */
+    @ApiModelProperty(value = "是否已激活 0:已激活 1:未激活 ",name = "isActivite")
+    private Integer isActivite;
+
+    /**
+     * 是否删除
+     */
+    @ApiModelProperty(value = "是否删除 0:正常 1:删除",name = "isDelete")
+    private Integer isDelete;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",name = "creteTime")
+    private Date createTime;
+
+    /**
+     *更改时间
+     */
+    @ApiModelProperty(value = "更改时间",name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/SchemeInfo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/SchemeInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d71a8a7d5913b2469d19239335e2e3fdd85b6f2
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/SchemeInfo.java
@@ -0,0 +1,70 @@
+package cn.wisenergy.model.app;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "SchemeInfo")
+@TableName("scheme")
+public class SchemeInfo implements Serializable {
+    private static final long serialVersionUID = 7020644673356401949L;
+    /**
+     * 方案id
+     */
+    @ApiModelProperty(value = "方案id", name = "id")
+    private Integer id;
+
+    /**
+     * 方案名称
+     */
+    @ApiModelProperty(value = "方案名称", name = "schemeName")
+    private String schemeName;
+
+    /**
+     * 上传时间
+     */
+    @ApiModelProperty(value = "上传时间", name = "uploadTime")
+    private Date uploadTime;
+
+    /**
+     * 上传url
+     */
+    @ApiModelProperty(value = "上传时间", name = "uploadTime")
+    private String fileUrl;
+
+    /**
+     * 1:本科文化一批 2:本科美术一批 3:艺术本科批文学编导
+     * 4:本科体育  5:专科专业分类6:专科美术一批 7:专科文学编导一批 8:专科体育一批
+     */
+    @ApiModelProperty(value = "1:本科文化一批 2:本科美术一批 3:文学编导本科一批 4:本科体育  " +
+            "5:专科专业分类6:专科美术一批 7:专科文学编导一批 8:专科体育一批", name = "type")
+    private Integer type;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty("修改时间")
+    private Date updateTime;
+
+    /**
+     * 删除标记
+     */
+    @ApiModelProperty("是否删除 1,删除;0,未删除")
+    private Integer isDelete;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/SchemeQueryRecord.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/SchemeQueryRecord.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae889f6a5490a43cf3cefb27849377cb71a637f9
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/SchemeQueryRecord.java
@@ -0,0 +1,79 @@
+package cn.wisenergy.model.app;
+
+import cn.wisenergy.model.common.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ Description: 方案查询记录
+ * @ Author     : 86187
+ * @ Date       : 2021/1/8 10:22
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "SchemeQueryRecord")
+@TableName("scheme_query_record")
+public class SchemeQueryRecord implements Serializable {
+
+    private static final long serialVersionUID = 6600452699328342752L;
+
+    /**
+     * 方案查询记录id
+     */
+    @ApiModelProperty(value = "方案查询记录id", name = "id")
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 专业名称
+     */
+    @ApiModelProperty(value = "专业名称", name = "majorName")
+    private String majorName;
+
+    /**
+     * 考生类型 1:本科
+     */
+    @ApiModelProperty(value = "考生类型 1:本科", name = "studentType")
+    private Integer studentType;
+
+    /**
+     * 考生文化分数
+     */
+    @ApiModelProperty(value = "考生文化分数", name = "score")
+    private String score;
+
+    /**
+     * 考生专业分数
+     */
+    @ApiModelProperty(value = "考生专业分数", name = "majorScore")
+    private String majorScore;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty("修改时间")
+    private Date updateTime;
+
+    /**
+     * 删除标记
+     */
+    @ApiModelProperty("是否删除 1,删除;0,未删除")
+    private Integer isDelete;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/ScoreInfo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/ScoreInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4a73c63f71b643b3d77878f57e15d55027a00b6
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/ScoreInfo.java
@@ -0,0 +1,111 @@
+package cn.wisenergy.model.app;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 用户成绩实体类
+*@ Author     : 86187
+*@ Date       : 2021/1/7 14:56
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "ScoreInfo")
+@TableName("score")
+public class ScoreInfo implements Serializable {
+    private static final long serialVersionUID = -8644045186424617919L;
+
+    /**
+     * 成绩id
+     */
+    @ApiModelProperty(value = "成绩id",name = "id")
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id",name = "userId")
+    private Integer userId;
+
+    /**
+     * 文化成绩
+     */
+    @ApiModelProperty(value = "文化成绩",name = "cultureGrade")
+    private Double cultureGrade;
+
+    /**
+     * 专业成绩
+     */
+    @ApiModelProperty(value = "专业成绩",name = "majorGrade")
+    private Double majorGrade;
+
+    /**
+     * 语文成绩
+     */
+    @ApiModelProperty(value = "语文成绩",name = "languageGrade")
+    private Double languageGrade;
+
+    /**
+     * 数学成绩
+     */
+    @ApiModelProperty(value = "数学成绩",name = "mathGrade")
+    private Double mathGrade;
+
+    /**
+     * 英语成绩
+     */
+    @ApiModelProperty(value = "英语成绩",name = "englishGrade")
+    private Double englishGrade;
+
+    /**
+     * 物理成绩
+     */
+    @ApiModelProperty(value = "物理成绩",name = "physicsGrade")
+    private Double physicsGrade;
+
+    /**
+     * 化学成绩
+     */
+    @ApiModelProperty(value = "化学成绩",name = "chemistryGrade")
+    private Double chemistryGrade;
+
+    /**
+     * 生物成绩
+     */
+    @ApiModelProperty(value = "生物成绩",name = "biologyGrade")
+    private Double biologyGrade;
+
+    /**
+     * 历史成绩
+     */
+    @ApiModelProperty(value = "历史成绩",name = "historyGrade")
+    private Double historyGrade;
+
+    /**
+     * 地理成绩
+     */
+    @ApiModelProperty(value = "地理成绩",name = "geographyGrade")
+    private Double geographyGrade;
+
+    /**
+     * 政治成绩
+     */
+    @ApiModelProperty(value = "政治成绩",name = "politicsGrade")
+    private Double politicsGrade;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",name = "creteTime")
+    private Date createTime;
+    /**
+     *更改时间
+     */
+    @ApiModelProperty(value = "更改时间",name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/User.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0af97cfa7797fee3d0ec0dadbe160dccc5ae144
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/User.java
@@ -0,0 +1,100 @@
+package cn.wisenergy.model.app;
+
+import cn.wisenergy.model.common.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 86187
+ * @ Description   :  用户实体类
+ * @ Author        :  lcc
+ * @ CreateDate    :  2020/11/8 19:59
+ */
+@Data
+@ApiModel(value = "AccountUsers")
+@TableName("user")
+public class User implements Serializable {
+    private static final long serialVersionUID = 2525339404301884673L;
+
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(name = "id", value = "用户主键id")
+    private Integer id;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(name = "name", value = "用户名")
+    private String userName;
+
+    /**
+     * 密码
+     */
+    @ApiModelProperty(name = "password", value = "用户密码")
+    private String password;
+
+    /**
+     * 电话号码
+     */
+    @ApiModelProperty(name = "phone", value = "手机号")
+    private String phone;
+
+    /**
+     * 头像
+     */
+    @ApiModelProperty(name = "headImage", value = "头像")
+    private String headImage;
+
+    /**
+     * 微信uuid
+     */
+    @ApiModelProperty(name = "微信uuid", value = "uuid")
+    private String uuid;
+
+    /**
+     * 性别
+     */
+    @ApiModelProperty(name = "sex", value = "用户性别:0:男,1:女")
+    private Integer sex;
+
+    /**
+     * 学校
+     */
+    @ApiModelProperty(name = "school", value = "毕业院校")
+    private String school;
+
+    /**
+     * 学生类型
+     */
+    @ApiModelProperty(name = "examType", value = "考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生")
+    private Integer examType;
+
+    /**
+     * 来源 1:PC 2: APP
+     */
+    @ApiModelProperty(name = "source", value = "来源 1:PC 2: APP")
+    private Integer source;
+
+    /**
+     * 是否删除
+     */
+    @ApiModelProperty(name = "isDelete", value = "是否删除 0:正常 1:删除")
+    private Integer isDelete;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(name = "createTime", value = "创建时间")
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty(name = "updateTime", value = "修改时间")
+    private Date updateTime;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserLimit.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserLimit.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4877081e0f2323a8459116cd95dc574aa6acf9d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserLimit.java
@@ -0,0 +1,58 @@
+package cn.wisenergy.model.app;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "UserLimit")
+public class UserLimit implements Serializable {
+    private static final long serialVersionUID = 3956830394491346594L;
+    /**
+     * 用户卡点id
+     */
+    @ApiModelProperty(value = "用户卡点id",name = "id")
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id",name = "userId")
+    private Integer userId;
+
+    /**
+     * 总次数
+     */
+    @ApiModelProperty(value = "总次数",name = "totalLimit")
+    private Integer totalLimit;
+
+    /**
+     * 已使次数
+     */
+    @ApiModelProperty(value = "已使次数",name = "useLimit")
+    private Integer useLimit  ;
+
+    /**
+     * 可用次数
+     */
+    @ApiModelProperty(value = "可用次数",name = "usableLimit")
+    private Integer usableLimit;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",name = "creteTime")
+    private Date createTime;
+
+    /**
+     *更改时间
+     */
+    @ApiModelProperty(value = "更改时间",name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserLimitRecord.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserLimitRecord.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d09afa8a296c7f8fa2c1562244e60c5ac5c761b
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserLimitRecord.java
@@ -0,0 +1,58 @@
+package cn.wisenergy.model.app;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author 86187
+ * @ Description: 用户扣减查询次数记录实体类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/27 14:49
+ */
+@Data
+@ApiModel("UserLimitRecord")
+@TableName("user_limit_record")
+public class UserLimitRecord implements Serializable {
+    private static final long serialVersionUID = 6832626172862202016L;
+
+    /**
+     * 用户扣减查询次数记录id
+     */
+    @ApiModelProperty(value = "用户扣减查询次数记录id", name = "id")
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户扣减查询次数记录id", name = "id")
+    private Integer userId;
+
+    /**
+     * 用户查询信息id
+     */
+    @ApiModelProperty(value = "用户查询信息id", name = "userLimitId")
+    private Integer userLimitId;
+
+    /**
+     * 扣减次数
+     */
+    @ApiModelProperty(value = "扣减次数", name = "minusLimit")
+    private Integer minusLimit;
+
+    /**
+     * 扣减时间
+     */
+    @ApiModelProperty(value = "扣减时间", name = "createTime")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间", name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserVolunteer.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserVolunteer.java
new file mode 100644
index 0000000000000000000000000000000000000000..f009c78fcdfe3c58cdedbe8feba730b1376913a9
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/UserVolunteer.java
@@ -0,0 +1,39 @@
+package cn.wisenergy.model.app;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "UserVolunteer")
+@TableName("user_volunteer")
+public class UserVolunteer {
+    /**
+     * 用户方案id
+     */
+    @ApiModelProperty(value = "用户方案id",name = "id")
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id",name = "userId")
+    private Integer userId;
+
+    /**
+     * 方案记录id
+     */
+    @ApiModelProperty(value = "方案记录id",name = "schemeRecordId")
+    private Integer schemeRecordId;
+
+    /**
+     * å¿—æ„¿id
+     */
+    @ApiModelProperty(value = "å¿—æ„¿id",name = "volunteerId")
+    private Integer volunteerId;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/app/Volunteer.java b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Volunteer.java
new file mode 100644
index 0000000000000000000000000000000000000000..2fb69c3e645566c9e1e6d6735595b66127a849c9
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/app/Volunteer.java
@@ -0,0 +1,149 @@
+package cn.wisenergy.model.app;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentLoopMerge;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ Description: 志愿实体类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 15:15
+ * @author 86187
+ */
+@Data
+@Builder
+@ApiModel(value = "Volunteer")
+@NoArgsConstructor
+@AllArgsConstructor
+@ExcelIgnoreUnannotated
+public class Volunteer  implements Serializable {
+    private static final long serialVersionUID = -7880251929353475087L;
+
+    /**
+     * 志愿主键id
+     */
+    @ApiModelProperty(value = "志愿主键id", name = "id")
+    private Integer id;
+
+    /**
+     * 方案类型:1:本科文化一批 2:本科美术一批 3:艺术本科批文学编导 4:本科体育  5:专科专业分类6:专科美术一批 7:专科文学编导一批 8:专科体育一批
+     */
+    @ApiModelProperty(value = "方案类型:1:本科文化一批 2:本科美术一批 3:艺术本科批文学编导 4:本科体育  " +
+            "5:专科专业分类 6:专科美术一批 7:专科文学编导一批 8:专科体育一批", name = "type")
+    private Integer type;
+
+    /**
+     * 方案id
+     */
+    @ApiModelProperty(value = "方案id", name = "schemeId")
+    private Integer schemeId;
+
+    /**
+     * 专业名称
+     */
+    @ApiModelProperty(value = "专业", name = "majorName")
+    @ExcelProperty(value = "专业")
+    private String majorName;
+
+    /**
+     * 院校
+     */
+    @ApiModelProperty(value = "院校", name = "academy")
+    @ExcelProperty(value = "院校")
+    private String academy;
+
+    /**
+     * 选考科目要求
+     */
+    @ApiModelProperty(value = "选考科目要求", name = "courseDemand")
+    @ExcelProperty(value = "选考科目要求")
+    private String courseDemand;
+
+    /**
+     * 学校性质
+     */
+    @ApiModelProperty(value = "学校性质", name = "nature")
+    @ExcelProperty(value = "学校性质")
+    private String nature;
+
+    /**
+     * 学年制(年)
+     */
+    @ApiModelProperty(value = "学年制(年)", name = "yearLimit")
+    @ExcelProperty(value = "学制(年)")
+    private Integer yearLimit;
+
+    /**
+     * 计划数
+     */
+    @ApiModelProperty(value = "计划数", name = "planNum")
+    @ExcelProperty(value = "计划数")
+    private Integer planNum;
+
+    /**
+     * 计划投档数
+     */
+    @ApiModelProperty(value = "投档计划数", name = "castArchivesNum")
+    @ExcelProperty(value = "投档计划数")
+    private Integer castArchivesNum;
+
+    /**
+     * 投出数
+     */
+    @ApiModelProperty(value = "投出数", name = "launchNum")
+    @ExcelProperty(value = "投出数")
+    private Integer launchNum;
+
+    /**
+     * 最低分
+     */
+    @ApiModelProperty(value = "最低分", name = "lowestMark")
+    @ExcelProperty(value = "最低分")
+    private String lowestMark;
+
+    /**
+     * 最低位次
+     */
+    @ApiModelProperty(value = "最低位次", name = "lowestRank")
+    @ExcelProperty(value = "最低位次")
+    private String lowestRank;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty("修改时间")
+    private Date updateTime;
+
+    /**
+     * 删除标记
+     */
+    @ApiModelProperty("是否删除 1,删除;0,未删除")
+    private Integer isDelete;
+
+    /**
+     * 方案查询时间
+     */
+    @ApiModelProperty(value = "方案查询时间",name = "queryTime")
+    @TableField(exist = false)
+    @ContentLoopMerge(eachRow = 4,columnExtend=4)
+    private Date queryTime;
+
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/common/BaseEntity.java b/wisenergy-model/src/main/java/cn/wisenergy/model/common/BaseEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3928463021f1a9a23c5e736b273623c312f00d9
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/common/BaseEntity.java
@@ -0,0 +1,35 @@
+package cn.wisenergy.model.common;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
+public abstract class BaseEntity implements Serializable {
+
+	private static final long serialVersionUID = 7151370108706942192L;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty("创建时间")
+	private Date createTime;
+
+
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty("修改时间")
+	private Date updateTime;
+
+	/**
+	 * 删除标记
+	 */
+	@ApiModelProperty("是否删除 1,删除;0,未删除")
+	private Integer isDelete;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/AccountDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/AccountDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..e068efea34f8ff4139c6428687dff744d658cf5d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/AccountDto.java
@@ -0,0 +1,32 @@
+package cn.wisenergy.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "AccountDto")
+public class AccountDto implements Serializable {
+    private static final long serialVersionUID = -6722696621467423127L;
+
+    /**
+     * 管理员主键id
+     */
+    @ApiModelProperty(name ="id",value = "管理员主键id")
+    private Integer id;
+
+    /**
+     * 管理员账号
+     */
+    @ApiModelProperty(name = "name",value = "管理员账号")
+    private String userName;
+
+    /**
+     * 头像
+     */
+    @ApiModelProperty(name = "headImage",value = "头像")
+    private String headImage;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/BannerDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/BannerDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfdd7963e6f3cf869b7e72e1612b464d57d6765d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/BannerDto.java
@@ -0,0 +1,52 @@
+package cn.wisenergy.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "BannerDto")
+public class BannerDto {
+
+    /**
+     *  广告id
+     */
+    @ApiModelProperty(value = "广告id",name = "id")
+    private Integer id;
+
+
+    /**
+     * 广告类型: 1:顶部广告 2:底部广告
+     */
+    @ApiModelProperty(value = "广告类型: 1:顶部广告 2:底部广告",name = "type")
+    private Integer type;
+
+    /**
+     * 投放状态 0:暂停中 1:投放中
+     */
+    @ApiModelProperty(value = "投放状态 0:暂停中 1:投放中",name = "status")
+    private Integer status;
+
+    /**
+     * 网址
+     */
+    @ApiModelProperty(value = "网址",name = "website")
+    private String website;
+
+    /**
+     * 广告图片url
+     */
+    @ApiModelProperty(value = "广告图片url",name = "image")
+    private String image;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间",name = "updateTime")
+    private Date updateTime;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/ExportCardDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/ExportCardDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c903dd4109c713e3b092fbbadbff56b00e4a21d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/ExportCardDto.java
@@ -0,0 +1,51 @@
+package cn.wisenergy.model.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentLoopMerge;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 充值卡子卡导出实体类dto
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+//内容高度
+@ContentRowHeight(25)
+//表头行高度
+@HeadRowHeight(25)
+//列的宽度
+@ColumnWidth(25)
+public class ExportCardDto implements Serializable {
+
+    private static final long serialVersionUID = 2062796530315436172L;
+
+    /**
+     * 卡号
+     */
+    @ExcelProperty(value = "卡号")
+    private String cardNumber;
+
+    /**
+     * 密码
+     */
+    @ExcelProperty(value = "密码")
+    private String secretKey;
+
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private String status;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/PayPageDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/PayPageDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..99b2bc313a2e1752dc2ba69413b8e9b562cfba34
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/PayPageDto.java
@@ -0,0 +1,21 @@
+package cn.wisenergy.model.dto;
+/**
+ * @ Description: 支付页面接口请求参数Dto
+ * @ Author     : 86187
+ * @ Date       : 2021/2/1 13:57
+ */
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * @author 86187
+ */
+@Data
+@ApiModel("PayPageDto")
+public class PayPageDto {
+    /**
+     * 支付金额  :金额不能为0
+     */
+    private Integer total;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/PayQueryDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/PayQueryDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..7e330ead7d39dc141ff4cd2af7759662031f5f83
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/PayQueryDto.java
@@ -0,0 +1,22 @@
+package cn.wisenergy.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * @author 86187
+ */
+@Data
+@ApiModel()
+public class PayQueryDto {
+    /**
+     * 支付宝交易号
+     */
+    private String tradeNo;
+
+    /**
+     * 商户订单号
+     */
+    private String outTradeNo;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/RefillCardDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/RefillCardDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..c590bcf97691969e37cb4253231a8dd46de2dabf
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/RefillCardDto.java
@@ -0,0 +1,40 @@
+package cn.wisenergy.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "RefillCardDto")
+public class RefillCardDto {
+    /**
+     * 充值卡id
+     */
+    @ApiModelProperty(value = "充值卡id",name = "id")
+    private Integer id;
+
+    /**
+     * 批次号
+     */
+    @ApiModelProperty(value = "批次号",name = "batchNumber")
+    private String batchNumber;
+
+    /**
+     * 是否已制卡 0:已制卡 1:未制卡
+     */
+    @ApiModelProperty(value = "是否已制卡 0:已制卡 1:未制卡",name = "isMakeCard")
+    private Integer isMakeCard;
+
+    /**
+     * 卡数量
+     */
+    @ApiModelProperty(value = "卡数量",name = "cardNumber")
+    private Integer cardNumber  ;
+
+    /**
+     * 是否已激活
+     */
+    @ApiModelProperty(value = "是否已激活 0:已激活 1:未激活 ",name = "isActivite")
+    private Integer isActivite;
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/UserCommitDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/UserCommitDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..3cb7209bf5a9681b1c90a95b4026c9daa2ca4ea0
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/UserCommitDto.java
@@ -0,0 +1,71 @@
+package cn.wisenergy.model.dto;
+
+import cn.wisenergy.model.app.ScoreInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description: 用户提交Dto
+ * @ Author     : 86187
+ * @ Date       : 2021/1/12 15:39
+ */
+@Data
+@ApiModel(value = "UserCommitDto")
+public class UserCommitDto implements Serializable {
+
+    private static final long serialVersionUID = 361307736335983629L;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(value = "用户名称", name = "userName")
+    private String userName;
+
+    /**
+     * 用户头像
+     */
+    @ApiModelProperty(value = "用户头像", name = "headImage")
+    private String headImage;
+
+
+    /**
+     * 性别
+     */
+    @ApiModelProperty(value = "学校", name = "school")
+    private Integer sex;
+
+    /**
+     * 学校
+     */
+    @ApiModelProperty(value = "学校", name = "school")
+    private String school;
+
+    /**
+     * 考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生
+     */
+    @ApiModelProperty(value = "考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生", name = "studentType")
+    private Integer studentType;
+
+    /**
+     * 用户来源  1:PC 2:APP
+     */
+    @ApiModelProperty(value = "用户来源  1:PC 2:APP", name = "source")
+    private Integer source;
+
+
+    /**
+     * 学生成绩信息
+     */
+    @ApiModelProperty(value = "学生成绩信息", name = "scoreInfo")
+    private ScoreInfo scoreInfo;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/UserInfoDto.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/UserInfoDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..000937f8429adc1bf4ebde349968fe6427d1874d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/UserInfoDto.java
@@ -0,0 +1,121 @@
+package cn.wisenergy.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ Description: 用户列表展示dto
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 10:47
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "UserInfoDto")
+public class UserInfoDto implements Serializable {
+
+    private static final long serialVersionUID = 4791446858538524520L;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(value = "用户名称", name = "userName")
+    private String userName;
+
+    /**
+     * 性别 0:男 1:女
+     */
+    @ApiModelProperty(value = "性别 0:男 1:女", name = "sex")
+    private Integer sex;
+
+    /**
+     * 考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生
+     */
+    @ApiModelProperty(value = "考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生", name = "examType")
+    private Integer examType;
+
+    /**
+     * 登录来源
+     */
+    @ApiModelProperty(name ="source",value = "登录来源:1 PC,2 WAP")
+    private Integer source;
+
+    /**
+     * 手机
+     */
+    @ApiModelProperty(value = "手机号", name = "phone")
+    private String phone;
+
+    /**
+     * 文化成绩
+     */
+    @ApiModelProperty(value = "文化成绩", name = "cultureGrade")
+    private String cultureGrade;
+
+    /**
+     * 专业成绩
+     */
+    @ApiModelProperty(value = "专业成绩", name = "majorGrade")
+    private String majorGrade;
+
+    /**
+     * 用户剩余查询次数
+     */
+    @ApiModelProperty(value = "用户剩余查询次数", name = "queryLimit")
+    private Integer queryLimit;
+
+    /**
+     * 用户充值总金额
+     */
+    @ApiModelProperty(value = "用户充值总金额", name = "moneyAmount")
+    private String moneyAmount;
+
+    /**
+     * 用户充值次数
+     */
+    @ApiModelProperty(value ="充值卡充值总次数",name = "RechargeTimes")
+    private int rechargeTimes;
+
+    /**
+     * 用户微信充值总金额
+     */
+    @ApiModelProperty(value ="用户微信充值总金额",name = "WeChatMoney")
+    private String weChatMoney;
+
+    /**
+     * 用户支付宝充值总金额
+     */
+    @ApiModelProperty(value ="用户支付宝充值总金额",name = "AlipayMoney")
+    private String alipayMoney;
+
+    /**
+     * ip
+     */
+    @ApiModelProperty(value = "ip", name = "ip")
+    private String ip;
+
+    /**
+     * 注册时间
+     */
+    @ApiModelProperty(value = "注册时间", name = "registerTime")
+    private Date registerTime;
+
+    /**
+     * 用户最后登陆时间
+     */
+    @ApiModelProperty(value = "用户最后登陆时间", name = "lastLoginTime")
+    private Date lastLoginTime;
+
+
+
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/CardStatus.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/CardStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..c1340bf0b60a9e435a7b82e9be08ca2db5acd5e8
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/CardStatus.java
@@ -0,0 +1,43 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * 充值卡状态枚举
+ *
+ * @author 86187
+ */
+
+public enum CardStatus {
+    //未使用
+    NO_USE(0, "未使用"),
+
+    //已使用
+    ALREADY_USED(1, "已使用");
+    private Integer code;
+
+    private String desc;
+
+    CardStatus(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getDescription() {
+        return desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public static String getNameByCode(Integer code) {
+        if (null == code) {
+            return null;
+        }
+        for (SceneType type : SceneType.values()) {
+            if (type.getCode().intValue() == code.intValue()) {
+                return type.name();
+            }
+        }
+        return null;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/OperationTypeEnum.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/OperationTypeEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..3baca748f7bd2a8943fe11f5c3c9d1e737bcfa3e
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/OperationTypeEnum.java
@@ -0,0 +1,53 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * @ Description: 操作枚举类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/15 9:58
+ */
+public enum OperationTypeEnum {
+    /**
+     * 用户登录相关-操作枚举类
+     */
+    USER_REGISTER(1, "用户祖册"),
+    USER_LOGIN(2, "用户登录"),
+    USER_OUT(3, "用户退出");
+
+    private Integer code;
+
+    private String desc;
+
+    OperationTypeEnum(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public static String getByCode(Integer code) {
+        if (null == code) {
+            return null;
+        }
+
+        for (OperationTypeEnum operation : OperationTypeEnum.values()) {
+            if (operation.getCode().intValue() == code.intValue()) {
+                return operation.getDesc();
+            }
+        }
+        return null;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/PayType.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/PayType.java
new file mode 100644
index 0000000000000000000000000000000000000000..ecf2f2c70007577ef983d1329c8d784223621211
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/PayType.java
@@ -0,0 +1,47 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * 支付方式枚举类
+ *
+ * @author 86187
+ */
+
+public enum PayType {
+
+    //支付宝
+    ALI_PAY(1, "支付宝"),
+
+    //微信
+    WE_CHAT(2, "微信"),
+
+    //充值卡
+    REFILL_CARD(3, "充值卡");
+    private Integer code;
+
+    private String desc;
+
+    PayType(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getDescription() {
+        return desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public static String getNameByCode(Integer code) {
+        if (null == code) {
+            return null;
+        }
+        for (SceneType type : SceneType.values()) {
+            if (type.getCode().intValue() == code.intValue()) {
+                return type.name();
+            }
+        }
+        return null;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SceneType.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SceneType.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2830c3fa2217d31321c4da2222c5c7546ecd814
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SceneType.java
@@ -0,0 +1,51 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * 图片验证码业务类型
+ *
+ * @author zh
+ * @version v2.0
+ * @since v7.0
+ * 2018年3月19日 下午4:35:32
+ */
+public enum SceneType {
+
+    //验证码登录
+    LOGIN(1, "验证码登录"),
+    //手机注册
+    REGISTER(2, "手机注册"),
+    //修改密码
+    MODIFY_PASSWORD(3, "修改密码"),
+    //找回密码
+    FIND_PASSWORD(4, "找回密码"),
+
+    RESET_PASSWORD(5, "短信重置密码");
+    private Integer code;
+
+    private String desc;
+
+    SceneType(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getDescription() {
+        return desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public static String getNameByCode(Integer code) {
+        if (null == code) {
+            return null;
+        }
+        for (SceneType type : SceneType.values()) {
+            if (type.getCode().intValue() == code.intValue()) {
+                return type.name();
+            }
+        }
+        return null;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SchemeTypeEnums.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SchemeTypeEnums.java
new file mode 100644
index 0000000000000000000000000000000000000000..33c239b466a26e94d8f06dfc00a7af2f7a7791cd
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SchemeTypeEnums.java
@@ -0,0 +1,53 @@
+package cn.wisenergy.model.enums;
+
+/**
+*@ Description: 方案类型枚举
+*@ Author     : 86187
+*@ Date       : 2021/1/13 14:19
+ * @author 86187
+ */
+public enum  SchemeTypeEnums {
+    /**
+     * 方案类型枚举
+     */
+    UNDERGRADUATE_CULTURE(1,"本科文化一批"),
+
+    UNDERGRADUATE_ARTS(2,"本科美术一批"),
+
+    UNDERGRADUATE_LITERATURE(3,"文学编导本科一批"),
+
+    UNDERGRADUATE_SPORTS(4,"本科体育一批"),
+
+    JUNIOR_COLLEGE_MAJOR(5,"专科文化一批"),
+
+    JUNIOR_COLLEGE_ARTS(6,"专科美术一批"),
+
+    JUNIOR_COLLEGE_LITERATURE(7,"文学编导专科一批"),
+
+    JUNIOR_COLLEGE_SPORTS(8,"专科体育一批");
+
+    private Integer code;
+
+    private String desc;
+
+    SchemeTypeEnums(Integer code,String desc){
+        this.code=code;
+        this.desc=desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SourceType.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SourceType.java
new file mode 100644
index 0000000000000000000000000000000000000000..88eaca8fb03fa62d25497cd227744c59d9e1dc7d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/SourceType.java
@@ -0,0 +1,51 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * @author 86187
+ * @ Description: 账户注册来源信息 枚举
+ * @ Author     : 86187
+ * @ Date       : 2021/2/9 10:48
+ */
+public enum SourceType {
+
+    //PC
+    PC(1, "PC"),
+
+    APP(2, "APP");
+    private Integer code;
+
+    private String desc;
+
+    SourceType(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public static String getByCode(Integer code) {
+        if (null == code) {
+            return null;
+        }
+        for (SourceType type : SourceType.values()) {
+            if (type.code.intValue() == code) {
+                return type.getDesc();
+            }
+        }
+        return null;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/StudentClassEnum.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/StudentClassEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..8fa384ad97975b9ff240b6b98c77b3226030a959
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/StudentClassEnum.java
@@ -0,0 +1,46 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * @author 86187
+ * @ Description: 考生学科枚举
+ * @ Author     : 86187
+ * @ Date       : 2021/1/19 15:02
+ */
+public enum StudentClassEnum {
+    //物理
+    PHYSICS_GRADE(1, "物理"),
+    //化学
+    CHEMISTRY_GRADE(2, "化学"),
+    //生物
+    BIOLOGY_GRADE(3, "生物"),
+    //历史
+    HISTORY_GRADE(4, "历史"),
+
+    GEOGRAPHY_GRADE(5, "地理"),
+    POLITICS_GRADE(6, "政治"),
+    UNLIMITED(7, "不限");
+    private Integer code;
+
+    private String desc;
+
+    StudentClassEnum(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/StudentType.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/StudentType.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa385efe13669d840ea0b2d573834639c6fd5ece
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/StudentType.java
@@ -0,0 +1,43 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * @author 86187
+ * @ Description: 考生类型枚举
+ * @ Author     : 86187
+ * @ Date       : 2021/1/18 20:36
+ */
+public enum StudentType {
+
+    /**
+     * 考生类型枚举
+     */
+    CULTURE_STUDENT(1, "文化课考生"),
+    ART_STUDENT(2, "美术生"),
+    SPORTS_STUDENT(3, "体育生"),
+    LITERATURE_STUDENT(4, "文学编导生");
+
+    private Integer code;
+
+    private String desc;
+
+    StudentType(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/enums/TemplateType.java b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/TemplateType.java
new file mode 100644
index 0000000000000000000000000000000000000000..bed8e509cf29f8a35518798107a81f8244f1e814
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/enums/TemplateType.java
@@ -0,0 +1,35 @@
+package cn.wisenergy.model.enums;
+
+/**
+ * @author 86187
+ * @ Description: 短信模板编号枚举
+ * @ Author     : 86187
+ * @ Date       : 2021/1/26 15:37
+ */
+public enum TemplateType {
+    ;
+    private Integer code;
+
+    private String desc;
+
+    TemplateType(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AccountLoginVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AccountLoginVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..71a1bfa3de65a6a56f11bd23d0d5726e50e7e33f
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AccountLoginVo.java
@@ -0,0 +1,24 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+@Data
+@ApiModel(value = "AccountInfo")
+public class AccountLoginVo implements Serializable {
+    private static final long serialVersionUID = -3802879442149734552L;
+
+    /**
+     * 管理员账号
+     */
+    @ApiModelProperty(name = "name",value = "管理员账号")
+    private String userName;
+
+    /**
+     * 管理员密码
+     */
+    @ApiModelProperty(name="password",value = "管理员密码")
+    private String password;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AddLimitVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AddLimitVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..1cce10039c4170391384262f18bf9b07c63f622d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AddLimitVo.java
@@ -0,0 +1,44 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description: 添加用户查询次数Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/27 10:19
+ */
+@Data
+@ApiModel(value = "AddLimitVo")
+public class AddLimitVo implements Serializable {
+    private static final long serialVersionUID = -1402670785302226482L;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 支付类型 1:支付宝 2:微信  3:充值卡
+     */
+    @ApiModelProperty(value = "支付类型 1:支付宝 2:微信  3:充值卡", name = "payType")
+    private Integer payType;
+
+    /**
+     * 支付金额
+     */
+    @ApiModelProperty(value = "支付金额", name = "payMoney")
+    private Integer payMoney;
+
+    /**
+     * 充值卡密码
+     */
+    @ApiModelProperty(value = "充值卡密码", name = "password")
+    private String password;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AdvertisingQueryVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AdvertisingQueryVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..17a86f5465711acd9674e6a4940d476557b16a77
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/AdvertisingQueryVo.java
@@ -0,0 +1,65 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 广告分页查询Vo
+*@ Author     : 86187
+*@ Date       : 2021/1/7 17:13
+*/
+@Data
+@ApiModel(value = "AdvertisingQueryVo")
+public class AdvertisingQueryVo implements Serializable {
+    private static final long serialVersionUID = 8066049220539686367L;
+
+    /**
+     * 关键词
+     */
+    @ApiModelProperty(value = "关键词", name = "keyword")
+    private String keyword;
+
+    /**
+     * 广告类型: 1:顶部广告 2:底部广告
+     */
+    @ApiModelProperty(value = "广告类型: 1:顶部广告 2:底部广告",name = "type")
+    private Integer type;
+
+    /**
+     * 投放状态 0:暂停中 1:投放中
+     */
+    @ApiModelProperty(value = "投放状态 0:暂停中 1:投放中",name = "status")
+    private Integer status;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty(value = "开始时间", name = "startTime")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty(value = "结束时间", name = "endTime")
+    private Date endTime;
+
+    /**
+     * 起始页
+     */
+    @ApiModelProperty(value = "起始页", name = "pageNo")
+    private Integer pageNo;
+
+    /**
+     * 页大小
+     */
+    @ApiModelProperty(value = "页大小", name = "pageSize")
+    private Integer pageSize;
+
+    private Integer startNum;
+
+    private Integer endNum;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/LoginOutVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/LoginOutVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..534925766073eff57d9b1830e43abaf3e4ce595d
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/LoginOutVo.java
@@ -0,0 +1,21 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ */
+@Data
+@ApiModel("LoginOutVo")
+public class LoginOutVo implements Serializable {
+    private static final long serialVersionUID = -307447260120718038L;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/MinusLimitVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/MinusLimitVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2702ed20da7992d24e9c0aae103c83028a69f78
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/MinusLimitVo.java
@@ -0,0 +1,27 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description:  查询次数扣减Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/28 17:06
+ */
+@Data
+@ApiModel("MinusLimitVo")
+public class MinusLimitVo implements Serializable {
+    private static final long serialVersionUID = 8276489379012215568L;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/PayRecordQueryVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/PayRecordQueryVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f1fa07d8db1aaaa01ec1447f28bbf0416f8bf50
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/PayRecordQueryVo.java
@@ -0,0 +1,47 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 充值记录查询Vo
+*@ Author     : 86187
+*@ Date       : 2021/1/13 17:16
+*/
+@Data
+@ApiModel(value = "PayRecordQueryVo")
+public class PayRecordQueryVo implements Serializable {
+    private static final long serialVersionUID = 4964338614574527324L;
+
+    /**
+     * 关键词
+     */
+    @ApiModelProperty(value = "关键词", name = "keyword")
+    private String keyword;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 起始页
+     */
+    @ApiModelProperty(value = "起始页", name = "pageNo")
+    private Integer pageNo;
+
+    /**
+     * 页大小
+     */
+    @ApiModelProperty(value = "页大小", name = "pageSize")
+    private Integer pageSize;
+
+    private Integer startNum;
+
+    private Integer endNum;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/PayRecordShowVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/PayRecordShowVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc0e4036c358f51d6d2ee02df0ab2724ff31ba5c
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/PayRecordShowVo.java
@@ -0,0 +1,51 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 充值记录展示Vo
+*@ Author     : 86187
+*@ Date       : 2021/1/13 17:14
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "PayRecordShowVo")
+public class PayRecordShowVo implements Serializable {
+    private static final long serialVersionUID = 3279446872102807035L;
+
+    /**
+     * 充值记录id
+     */
+    @ApiModelProperty(value = "充值记录id",name = "")
+    private Integer recordId;
+
+    /**
+     * 充值类型 1:支付宝 2:微信 3:充值卡
+     */
+    @ApiModelProperty(value = "充值类型 1:支付宝 2:微信 3:充值卡",name = "type")
+    private Integer type;
+
+    /**
+     * 充值结果 0:成功 1:失败
+     */
+    @ApiModelProperty(value = "充值结果 0:成功 1:失败",name = "result")
+    private Integer result;
+    /**
+     * 充值次数
+     */
+    @ApiModelProperty(value = "充值次数",name = "limit")
+    private Integer limit;
+
+    /**
+     * 充值时间
+     */
+    @ApiModelProperty(value = "充值时间",name = "payTime")
+    private Date payTime;
+
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeQueryVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeQueryVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b2dd9a7eade1cfa9d50ff27fd7c060c5d7d6363
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeQueryVo.java
@@ -0,0 +1,37 @@
+package cn.wisenergy.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 方案列表查询Vo
+*@ Author     : 86187
+*@ Date       : 2021/1/25 11:30
+ * @author 86187
+ */
+@Data
+@ApiModel("SchemeQueryVo")
+public class SchemeQueryVo implements Serializable {
+    private static final long serialVersionUID = 2326078022046306092L;
+
+    /**
+     * 起始页
+     */
+    @ApiModelProperty(value = "起始页", name = "pageNo")
+    private Integer pageNo;
+
+    /**
+     * 页大小
+     */
+    @ApiModelProperty(value = "页大小", name = "pageSize")
+    private Integer pageSize;
+
+    private Integer startNum;
+
+    private Integer endNum;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeRecordQueryVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeRecordQueryVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..149cfe29c6b145617f6984fdd30661dc1fc4bc81
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeRecordQueryVo.java
@@ -0,0 +1,48 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 方案查询记录分页Vo
+*@ Author     : 86187
+*@ Date       : 2021/1/13 9:34
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "SchemeRecordQueryVo")
+public class SchemeRecordQueryVo implements Serializable {
+    private static final long serialVersionUID = -6962244667676123937L;
+
+    /**
+     * 关键词
+     */
+    @ApiModelProperty(value = "关键词", name = "keyword")
+    private String keyword;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 起始页
+     */
+    @ApiModelProperty(value = "起始页", name = "pageNo")
+    private Integer pageNo;
+
+    /**
+     * 页大小
+     */
+    @ApiModelProperty(value = "页大小", name = "pageSize")
+    private Integer pageSize;
+
+    private Integer startNum;
+
+    private Integer endNum;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..e11f4ea82442d54250b63b2f4acde33d9d732a1f
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SchemeVo.java
@@ -0,0 +1,58 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description: 方案查询Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 14:53
+ */
+@Data
+@ApiModel(value = "SchemeQueryVo")
+public class SchemeVo implements Serializable {
+
+    private static final long serialVersionUID = 717382532110305837L;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 大专业名称
+     */
+    @ApiModelProperty(value = "大专业名称:如 ‘法学、文学、外语’", name = "bigMajorNames")
+    private String bigMajorNames;
+
+    /**
+     * 专业ids
+     */
+    @ApiModelProperty(value = "专业ids,如'1,2,3,4,5,6...'", name = "professionIds")
+    private String professionIds;
+
+    /**
+     * 文化课成绩
+     */
+    @ApiModelProperty(value = "文化课成绩", name = "cultureGrade")
+    private String cultureGrade;
+
+    /**
+     * 专业课成绩
+     */
+    @ApiModelProperty(value = "专业课成绩", name = "majorGrade")
+    private String majorGrade;
+
+    /**
+     * 是否展示全部  0:否  1:是
+     */
+    @ApiModelProperty(value = "是否展示全部  0:否  1:是", name = "isShowAll")
+    private Integer isShowAll;
+
+
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SendSmsVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SendSmsVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b3dcc0a1b79ec737b762399b8664f36d1507df5
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/SendSmsVo.java
@@ -0,0 +1,37 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description: 发送短信验证码Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/26 15:06
+ */
+@Data
+@ApiModel(value = "SendSmsVo")
+public class SendSmsVo implements Serializable {
+    private static final long serialVersionUID = -1072677301838222102L;
+
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty(value = "手机号码", name = "phone")
+    private String phone;
+
+    /**
+     * 来源  1:PC 2:APP
+     */
+    @ApiModelProperty(value = "来源  1:PC 2:APP", name = "source")
+    private Integer source;
+
+    /**
+     * 场景 1:短信登录 2:短信注册 3:短信修改密码 4:短信找回密码 5:短信重置密码
+     */
+    @ApiModelProperty(value = "场景 1:短信登录 2:短信注册 3:短信修改密码 4:短信找回密码 5:短信重置密码", name = "scene")
+    private Integer scene;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UpdatePasswordVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UpdatePasswordVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..c667f6929c7dddf5cef4f84baadc0df42adfce41
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UpdatePasswordVo.java
@@ -0,0 +1,37 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @ Description: 修改账户密码Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/18 14:35
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "UpdatePasswordVo")
+public class UpdatePasswordVo implements Serializable {
+    private static final long serialVersionUID = 5543462178133500983L;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 新密码
+     */
+    @ApiModelProperty(value = "新密码", name = "newPassword")
+    private String newPassword;
+
+    /**
+     * 旧密码
+     */
+    @ApiModelProperty(value = "旧密码", name = "oldPassword")
+    private String oldPassword;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserInfoVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserInfoVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..ecee4067b91e0e5ed84db573357c0353b73bc766
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserInfoVo.java
@@ -0,0 +1,49 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @ Description: 用户信息Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 11:14
+ * @author 86187
+ */
+@Data
+@ApiModel(value = "UserInfoVo")
+public class UserInfoVo implements Serializable {
+    private static final long serialVersionUID = 6175769905046107052L;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(value = "用户名称", name = "userName")
+    private String userName;
+
+    /**
+     * 性别 0:男 1:女
+     */
+    @ApiModelProperty(value = "性别 0:男 1:女", name = "sex")
+    private Integer sex;
+
+    /**
+     * 考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生
+     */
+    @ApiModelProperty(value = "考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生", name = "studentType")
+    private Integer studentType;
+
+    /**
+     * 手机
+     */
+    @ApiModelProperty(value = "手机号", name = "phone")
+    private String phone;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserLoginVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserLoginVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..04f0f3688fc07ad0ae8a3c491082dfe0857da40b
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserLoginVo.java
@@ -0,0 +1,49 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description: 用户登录Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/15 14:27
+ */
+@Data
+@ApiModel(value = "UserLoginVo")
+public class UserLoginVo implements Serializable {
+    private static final long serialVersionUID = 2206962675782086034L;
+
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty(value = "手机号码", name = "phone")
+    private String phone;
+
+    /**
+     * 密码
+     */
+    @ApiModelProperty(value = "密码", name = "password")
+    private String password;
+
+    /**
+     * 验证码
+     */
+    @ApiModelProperty(value = "验证码", name = "code")
+    private String code;
+
+    /**
+     * 场景类型:1:验证码登录 2:手机注册 3:修改密码 4:找回密码
+     */
+    @ApiModelProperty(value = "场景类型:1:验证码登录 2:手机注册 3:修改密码 4:找回密码 5:短信重置密码", name = "scene")
+    private Integer scene;
+
+    /**
+     * 来源: 1:PC 2:APP
+     */
+    @ApiModelProperty(value = "来源: 1:PC 2:APP", name = "source")
+    private Integer source;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserQueryVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserQueryVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c95c8b4009e7287fc149771fa079c4058c66aec
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserQueryVo.java
@@ -0,0 +1,70 @@
+package cn.wisenergy.model.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+*@ Description: 用户分页查询Vo
+*@ Author     : 86187
+*@ Date       : 2021/1/7 11:30
+*/
+@Data
+@ApiModel(value = "UserQueryVo")
+public class UserQueryVo implements Serializable {
+    private static final long serialVersionUID = -3717746916267660740L;
+
+    /**
+     * 关键词
+     */
+    @ApiModelProperty(value = "关键词", name = "keyword")
+    private String keyword;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty(value = "开始时间", name = "startTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty(value = "结束时间", name = "endTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    /**
+     * 起始页
+     */
+    @ApiModelProperty(value = "起始页", name = "pageNo")
+    private Integer pageNo;
+
+    /**
+     * 页大小
+     */
+    @ApiModelProperty(value = "页大小", name = "pageSize")
+    private Integer pageSize;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(value= "用户名" ,name="userName")
+    private String userName;
+
+    /**
+     * 电话号码
+     */
+    @ApiModelProperty(name = "phone",value = "手机号")
+    private String phone;
+
+    private Integer startNum;
+
+    private Integer endNum;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserRegisterVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserRegisterVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..95ec11cee42201fbef59732f7e394a7db36c24a7
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserRegisterVo.java
@@ -0,0 +1,50 @@
+package cn.wisenergy.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 86187
+ * @ Description: 用户注册Vo
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 11:39
+ */
+@Data
+@ApiModel(value = "UserRegisterVo")
+public class UserRegisterVo implements Serializable {
+
+    private static final long serialVersionUID = -1105034143432359192L;
+
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty(value = "手机号码", name = "phone")
+    private String phone;
+
+    /**
+     * 密码
+     */
+    @ApiModelProperty(value = "密码", name = "password")
+    private String password;
+
+    /**
+     * 验证码
+     */
+    @ApiModelProperty(value = "验证码", name = "smCode")
+    private String smCode;
+
+    /**
+     * 来源 1:PC 2:APP
+     */
+    @ApiModelProperty(value = "来源 1:PC 2:APP", name = "source")
+    private Integer source;
+
+    /**
+     * 场景 1:登录 2:注册 3:修改密码 4:找回密码 5:重置密码
+     */
+    @ApiModelProperty(value = "场景 1:登录 2:注册 3:修改密码 4:找回密码 5:重置密码", name = "scene")
+    private Integer scene;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserShowVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserShowVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..23beac104b674860322a1d9e64d4129dcffa0781
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/UserShowVo.java
@@ -0,0 +1,54 @@
+package cn.wisenergy.model.vo;
+
+import cn.wisenergy.model.app.ScoreInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+*@ Description: 用户对外展示信息Vo
+*@ Author     : 86187
+*@ Date       : 2021/1/12 15:29
+*/
+@Data
+@ApiModel(value = "UserShowVo")
+public class UserShowVo implements Serializable {
+    private static final long serialVersionUID = 2451826421351862268L;
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id",name = "id")
+    private Integer id;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(value = "用户名称",name = "userName")
+    private String userName;
+
+    /**
+     * 性别
+     */
+    @ApiModelProperty(value = "性别",name = "sex")
+    private Integer sex;
+
+    /**
+     * 毕业高中学校
+     */
+    @ApiModelProperty(value = "毕业高中学校",name = "school")
+    private String school;
+
+    /**
+     * 考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生
+     */
+    @ApiModelProperty(value = "考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生",name = "studentType")
+    private Integer studentType;
+
+    /**
+     * 学生成绩信息
+     */
+    @ApiModelProperty(value = "学生成绩信息",name = "scoreInfo")
+    private ScoreInfo scoreInfo;
+}
diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/vo/VolunteerVo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/VolunteerVo.java
new file mode 100644
index 0000000000000000000000000000000000000000..abc88cf9986820f832ee52e664617ccb3a5a4f9c
--- /dev/null
+++ b/wisenergy-model/src/main/java/cn/wisenergy/model/vo/VolunteerVo.java
@@ -0,0 +1,42 @@
+package cn.wisenergy.model.vo;
+
+import cn.wisenergy.model.app.Volunteer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ Description: 方案查询志愿列表
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 14:57
+ */
+@Data
+@ApiModel(value = "VolunteerVo")
+public class VolunteerVo {
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id", name = "userId")
+    private Integer userId;
+
+    /**
+     * 方案记录id
+     */
+    @ApiModelProperty(value = "方案记录id", name = "recordId")
+    private Integer recordId;
+
+    /**
+     * 返回志愿总数
+     */
+    @ApiModelProperty(value = "返回志愿总数", name = "total")
+    private Integer total;
+
+    /**
+     * 志愿信息列表
+     */
+    @ApiModelProperty(value = "志愿信息列表", name = "volunteers")
+    private List<Volunteer> volunteers;
+}
diff --git a/wisenergy-model/wisenergy-model.iml b/wisenergy-model/wisenergy-model.iml
new file mode 100644
index 0000000000000000000000000000000000000000..39926f845879dc98fa1be8badb8c82898cd280e3
--- /dev/null
+++ b/wisenergy-model/wisenergy-model.iml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="wisenergy-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.16.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: org.springframework:spring-web:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-test:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.8" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.16" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.54" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.9" level="project" />
+    <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
+    <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.9" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.3.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.6.7" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.23" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-pool:commons-pool:1.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.8" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" />
+    <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.6" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.6.3" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/wisenergy-parent.iml b/wisenergy-parent.iml
new file mode 100644
index 0000000000000000000000000000000000000000..450c2b6687897331929b6ba3703fbd4f63c73156
--- /dev/null
+++ b/wisenergy-parent.iml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-pool:commons-pool:1.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.8" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" />
+    <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.6.3" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/wisenergy-service/.gitignore b/wisenergy-service/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b4f66076247712dbd69e9ec586a827b3bd8fcd7b
--- /dev/null
+++ b/wisenergy-service/.gitignore
@@ -0,0 +1,7 @@
+workspace
+.project
+.classpath
+*.settings
+.idea
+*.class
+target/
\ No newline at end of file
diff --git a/wisenergy-service/pom.xml b/wisenergy-service/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..79b1ecdeab26bef450b1028f7901f93ac6c66bb8
--- /dev/null
+++ b/wisenergy-service/pom.xml
@@ -0,0 +1,82 @@
+<?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>
+        <artifactId>wisenergy-parent</artifactId>
+        <groupId>cn.wisenergy</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>wisenergy-service</artifactId>
+    <version>${moduleVersion.wisenergy-service}</version>
+    <packaging>jar</packaging>
+
+    <!-- 项目依赖 -->
+    <dependencies>
+        <dependency>
+            <groupId>cn.wisenergy</groupId>
+            <artifactId>wisenergy-mapper</artifactId>
+            <version>${moduleVersion.wisenergy-mapper}</version>
+        </dependency>
+        <!--综合安防管理平台提供了OpenAPI安全认证库(Java、C++)快速实现接口调用。-->
+        <dependency>
+            <groupId>com.hikvision.ga</groupId>
+            <artifactId>artemis-http-client</artifactId>
+            <version>1.1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+            <version>20.1.0</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- 短信-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+
+        <!--阿里支付 https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.11.33.ALL</version>
+        </dependency>
+
+        <!--微信支付-->
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.6.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-apache-httpclient</artifactId>
+            <version>0.2.1</version>
+        </dependency>
+
+        <!--pdf导出 -->
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
+    </dependencies>
+
+    <!-- MAVEN构建 -->
+    <build>
+        <finalName>${project.artifactId}-${moduleVersion.wisenergy-mapper}</finalName>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/AccountSerivce.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/AccountSerivce.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e32531ef5c1178534b429750aada998367a49fa
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/AccountSerivce.java
@@ -0,0 +1,14 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.dto.AccountDto;
+import cn.wisenergy.model.vo.AccountLoginVo;
+
+public interface AccountSerivce {
+    /**
+     * 查询管理员信息
+     * @param accountLoginVo 查询参数
+     * @return 管理员信息
+     */
+    R<AccountDto> getAccountInfo(AccountLoginVo accountLoginVo);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/BannerService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/BannerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..34e34dbc7aae675e43bc61009001fc98fd0d65d6
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/BannerService.java
@@ -0,0 +1,67 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Banner;
+import cn.wisenergy.model.dto.BannerDto;
+import cn.wisenergy.model.vo.AdvertisingQueryVo;
+import com.github.pagehelper.PageInfo;
+import com.sun.org.apache.xpath.internal.operations.Bool;
+
+import java.util.List;
+
+/**
+ * @ Description: 广告接口定义
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 17:08
+ */
+public interface BannerService {
+    /**
+     * 添加广告
+     *
+     * @param advertising 广告信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> add(Banner advertising);
+
+    /**
+     * 编辑广告
+     *
+     * @param advertising 广告信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> edit(Banner advertising);
+
+    /**
+     * 获取详情
+     *
+     * @param id 广告id
+     * @return 详情
+     */
+    R<Banner> getById(Integer id);
+
+    /**
+     * 获取广告分页列表
+     *
+     * @param advertisingQueryVo 分页参数
+     * @return 分页结果集
+     */
+    R<PageInfo<BannerDto>> getList(AdvertisingQueryVo advertisingQueryVo);
+
+    /**
+     * 开始/暂停投放广告
+     *
+     * @param id     广告id
+     * @param status 1 :投放 2:暂停投放
+     * @return true 成功 false 失败
+     */
+    R<Boolean> editStatus(Integer id, Integer status);
+
+    R<List<Banner>> getTopBanners(Integer type);
+
+    /**
+     * 工具广告id删除广告
+     * @param id 广告id
+     * @return true 成功 false 失败
+     */
+    R<Boolean> delBanner(Integer id);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/Daosupport.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/Daosupport.java
new file mode 100644
index 0000000000000000000000000000000000000000..43fa6c53c075dad5e77ec93e8252d1d1792bd3f4
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/Daosupport.java
@@ -0,0 +1,26 @@
+package cn.wisenergy.service.app;
+
+import java.util.List;
+
+public interface Daosupport {
+
+    /**
+     * 查询单一结果集<br/>
+     * 并将结果转为<code>int</code>型返回
+     * @param sql 查询的sql语句,确定结果为一行一列,且为数字型
+     * @param args 对应sql语句中的参数值
+     * @return
+     */
+    Integer queryForInt(String sql, Object... args);
+
+
+    /**
+     * 查询多行结果集<br/>
+     * 并将结果转为<code>List<T></code>
+     * @param sql 查询的sql语句
+     * @param clazz <code><T></code>的Class对象
+     * @param args 对应sql语句中的参数值
+     * @return  列表中元素为<code>T</code>的<code>List</code>
+     */
+    <T> List<T> queryForList(String sql, Class<T> clazz, Object... args);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/GraduationSerivce.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/GraduationSerivce.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a3514ead0e8b31de63f5f66a671028da5523cfa
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/GraduationSerivce.java
@@ -0,0 +1,11 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Graduation;
+
+import java.util.List;
+
+public interface GraduationSerivce {
+
+    R<List<Graduation>> getList();
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/PayRecordService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/PayRecordService.java
new file mode 100644
index 0000000000000000000000000000000000000000..71763cf1c8019912c83d464cc0d048ee2260638d
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/PayRecordService.java
@@ -0,0 +1,30 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.PayRecord;
+import cn.wisenergy.model.vo.PayRecordQueryVo;
+import cn.wisenergy.model.vo.PayRecordShowVo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.pagehelper.PageInfo;
+
+/**
+*@ Description: 充值记录接口定义
+*@ Author     : 86187
+*@ Date       : 2021/1/13 17:13
+ * @author 86187
+ */
+public interface PayRecordService {
+    /**
+     * 获取用户充值列表
+     * @param payRecordQueryVo
+     * @return
+     */
+    R<PageInfo<PayRecordShowVo>> getList(PayRecordQueryVo payRecordQueryVo);
+
+    /**
+     * 添加充值记录
+     * @param payRecord 充值记录信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> add(PayRecord payRecord);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/PriceService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/PriceService.java
new file mode 100644
index 0000000000000000000000000000000000000000..9dddc0741a14da9cf9b320e5769a85ca8057bada
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/PriceService.java
@@ -0,0 +1,14 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Price;
+
+import java.util.List;
+
+/**
+ * @author 86187
+ */
+public interface PriceService {
+
+    R<List<Price>> getList();
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/ProfessionService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/ProfessionService.java
new file mode 100644
index 0000000000000000000000000000000000000000..770c24ae42010d27530afc77495f379ffd73dce8
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/ProfessionService.java
@@ -0,0 +1,20 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Profession;
+
+import java.util.List;
+
+/**
+*@ Description: 专业接口定义
+*@ Author     : 86187
+*@ Date       : 2021/1/13 10:54
+*/
+public interface ProfessionService {
+
+    /**
+     * 获取专业树结构
+     * @return 树列表
+     */
+    R<List<Profession>> getTree(Integer type,Integer userId);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/RefillCardService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/RefillCardService.java
new file mode 100644
index 0000000000000000000000000000000000000000..0885ea29fd05aed8bb051ebe81ae508cd7b0961e
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/RefillCardService.java
@@ -0,0 +1,48 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.RefillCard;
+import cn.wisenergy.model.dto.RefillCardDto;
+import com.github.pagehelper.PageInfo;
+
+import javax.servlet.http.HttpServletResponse;
+
+
+public interface RefillCardService {
+    /**
+     * 添加充值卡
+     * @param refillCard 充值卡信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> add(RefillCard refillCard);
+
+    /**
+     * 改变激活状态
+     * @param batchNumber 充值卡批次号
+     * @return true 成功 false 失败
+     */
+    R<Boolean> update(String batchNumber);
+
+    /**
+     * 查询充值卡信息
+     * @param pageNo 当前页数
+     * @param pageSize 每页显示条数
+     * @return 充值卡信息结果集
+     */
+    R<PageInfo<RefillCardDto>> getList(Integer pageNo, Integer pageSize);
+
+    /**
+     * 生成卡片
+     * @param id :充值卡id
+     * @return true 成功 false 失败
+     */
+    R<Boolean> createCard(Integer id);
+
+    /**
+     * 导出excel
+     * @param batchNumber 批次号
+     * @param response
+     * @return Excel数据
+     */
+    R<Boolean> createExcel(String batchNumber, HttpServletResponse response);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/SchemeRecordService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/SchemeRecordService.java
new file mode 100644
index 0000000000000000000000000000000000000000..427a8bb5a9d45fcb64dc95c47dd351d8701986ef
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/SchemeRecordService.java
@@ -0,0 +1,52 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.SchemeQueryRecord;
+import cn.wisenergy.model.app.Volunteer;
+import cn.wisenergy.model.vo.SchemeRecordQueryVo;
+import com.github.pagehelper.PageInfo;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface SchemeRecordService {
+    /**
+     * 添加方案查询记录
+     *
+     * @param schemeQueryRecord 方案信息
+     * @return 方案信息
+     */
+    R<SchemeQueryRecord> add(SchemeQueryRecord schemeQueryRecord);
+
+    /**
+     * 获取方案查询列表
+     *
+     * @param schemeRecordQueryVo 查询条件
+     * @return 方案查询列表
+     */
+    R<PageInfo<SchemeQueryRecord>> getList(SchemeRecordQueryVo schemeRecordQueryVo);
+
+    /**
+     * 获取用户方案志愿列表
+     * @param userId 用户id
+     * @param recordId 方案记录id
+     * @return 方案志愿列表
+     */
+    R<List<Volunteer>> getVolunteerList(Integer userId,Integer recordId);
+
+    /**
+     * 方案pdf导出
+     * @param userId 用户id
+     * @param recordId 方案查询记录id
+     * @return 0:导出成功,1:导出失败
+     */
+    R<Boolean> export(Integer userId, Integer recordId, HttpServletResponse response);
+
+    /**
+     * 方案excel导出
+     * @param userId 用户id
+     * @param recordId 方案查询记录id
+     * @return 0:导出成功,1:导出失败
+     */
+    R<Boolean> createExcel(Integer userId, Integer recordId, HttpServletResponse response);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/SchemeService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/SchemeService.java
new file mode 100644
index 0000000000000000000000000000000000000000..764bd471f863a86ad9fa70011c1a5268158cbe79
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/SchemeService.java
@@ -0,0 +1,53 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.SchemeInfo;
+import cn.wisenergy.model.vo.SchemeQueryVo;
+import cn.wisenergy.model.vo.SchemeVo;
+import cn.wisenergy.model.vo.VolunteerVo;
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+
+
+/**
+ * @ Description: 方案接口定义
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 14:50
+ */
+public interface SchemeService {
+
+    /**
+     * 方案查询
+     *
+     * @param schemeVo 查询参数
+     * @return 方案查询结果列表
+     */
+    R<VolunteerVo> getList(SchemeVo schemeVo);
+
+    /**
+     * 根据方案id,删除方案
+     *
+     * @param schemeId 方案id
+     * @return
+     */
+    R<Boolean> deleteById(Integer schemeId);
+
+    /**
+     * 方案列表查询
+     *
+     * @param schemeVo 查询参数
+     * @return 方案查询结果列表
+     */
+    R<PageInfo<SchemeInfo>> getSchemeList(SchemeQueryVo schemeVo);
+
+    /**
+     * 获取方案下载路径
+     *
+     * @param schemeId 方案id
+     * @return 方案下载路径
+     */
+    R<String> download(Integer schemeId);
+
+    List<Integer>  ceishi(Integer id);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/SendSmsSerVice.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/SendSmsSerVice.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c0a40f757a7f3b203d0aeaa3d2e5d835b5ae23f
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/SendSmsSerVice.java
@@ -0,0 +1,33 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.vo.SendSmsVo;
+
+/**
+ * @author 86187
+ * @ Description: 短信验证码接口定义
+ * @ Author     : 86187
+ * @ Date       : 2021/1/15 15:44
+ */
+public interface SendSmsSerVice {
+
+    /**
+     * 发送短信验证码
+     *
+     * @param sendSmsVo 入参信息
+     * @return true 成功 false 失败
+     * @throws Exception 异常
+     */
+    R<Boolean> sendSmCode(SendSmsVo sendSmsVo) throws Exception;
+
+    /**
+     * 验证手机验证码:外部调用
+     *
+     * @param phone  手机号码
+     * @param code   手机验证码
+     * @param type   场景类型 1:验证码登录 2:手机注册 3:修改密码 4:找回密码
+     * @param source 来源 PC/APP
+     * @return 是否通过校验 true通过,false不通过
+     */
+    R<Boolean> valid(String phone, String code, Integer type, String source);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserLimitService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserLimitService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6016f99a0e904138ee36381c9bd81000601bf13
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserLimitService.java
@@ -0,0 +1,38 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.UserLimit;
+import cn.wisenergy.model.vo.AddLimitVo;
+
+
+/**
+ * @author 86187
+ * @ Description: 用户查询次数接口定义
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 9:33
+ */
+public interface UserLimitService {
+    /**
+     * 获取用户查询次数信息
+     *
+     * @param userId 用户id
+     * @return 用户查询次数信息
+     */
+    R<UserLimit> getByUserId(Integer userId);
+
+    /**
+     * 添加用户查询次数
+     *
+     * @param addLimitVo 参数
+     * @return true  or false
+     */
+    R<Boolean> addLimit(AddLimitVo addLimitVo);
+
+    /**
+     * 减少用户查询次数
+     *
+     * @param userId 用户id
+     * @return true  or false
+     */
+    R<Boolean> minusLimit(Integer userId);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserLoginService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserLoginService.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd44eaf736f15c4c52509aa1253ad17e9d3fa53b
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserLoginService.java
@@ -0,0 +1,71 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.vo.UpdatePasswordVo;
+import cn.wisenergy.model.vo.UserInfoVo;
+import cn.wisenergy.model.vo.UserLoginVo;
+import cn.wisenergy.model.vo.UserRegisterVo;
+
+/**
+ * @author 86187
+ * @ Description: 用户登录
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 14:20
+ */
+public interface UserLoginService {
+    /**
+     * 用户注册接口
+     *
+     * @param userRegisterVo 用户信息
+     * @return true 成功 false 失败
+     */
+    R<UserInfoVo> register(UserRegisterVo userRegisterVo);
+
+    /**
+     * 手机验证码登录
+     *
+     * @param userLoginVo 登录信息
+     * @return true 成功 false 失败
+     */
+    R<UserInfoVo> loginCode(UserLoginVo userLoginVo);
+
+    /**
+     * 手机-密码登录
+     *
+     * @param userLoginVo 登录信息
+     * @return true 成功 false 失败
+     */
+    R<UserInfoVo> login(UserLoginVo userLoginVo);
+
+    /**
+     * 退出登录
+     *
+     * @param userId 用户id
+     * @return true 成功 false 失败
+     */
+    R<Boolean> loginOut(Integer userId);
+
+    /**
+     * 修改密码
+     *
+     * @param updateVo 修改密码信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> updatePassword(UpdatePasswordVo updateVo);
+
+    /**
+     * 重置密码
+     *
+     * @param userId 用户id
+     * @return true 成功 false 失败
+     */
+    R<Boolean> resetPassword(Integer userId);
+
+    /**
+     * 短信重置密码
+     *
+     * @param userLoginVo 登录信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> smsResetPassword(UserLoginVo userLoginVo);
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserService.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b42c4086dfecd0828732cfe4b85a6602078f36b
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserService.java
@@ -0,0 +1,71 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.User;
+import cn.wisenergy.model.dto.UserCommitDto;
+import cn.wisenergy.model.dto.UserInfoDto;
+import cn.wisenergy.model.vo.UserInfoVo;
+import cn.wisenergy.model.vo.UserQueryVo;
+import cn.wisenergy.model.vo.UserShowVo;
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+
+/**
+ * @ Description: 用户接口
+ * @ Author     : 86187
+ * @ Date       : 2021/1/6 16:08
+ */
+public interface UserService {
+
+
+    /**
+     * 获取用户列表
+     *
+     * @param queryVo 查询条件
+     * @return 用户列表集合
+     */
+    R<PageInfo<UserInfoDto>> getUserList(UserQueryVo queryVo);
+
+    /**
+     * 提交个人信息
+     *
+     * @param userInfo 用户信息
+     * @return 用户信息
+     */
+    R<UserInfoVo> commitUserInfo(UserCommitDto userInfo);
+
+    /**
+     * 编辑用户信息
+     *
+     * @param user 用户信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> edit(UserCommitDto user);
+
+    /**
+     * 删除用户
+     *
+     * @param userId 用户id
+     * @return true 成功 false 失败
+     */
+    R<Boolean> delete(Integer userId);
+
+    /**
+     * 获取用户信息
+     *
+     * @param id 用户id
+     * @return 用户信息
+     */
+    R<UserShowVo> getById(Integer id);
+
+    /**
+     * 获取用户信息
+     * @param phone 电话号码
+     * @return 用户信息
+     */
+    User getByPhone(String phone);
+
+    R<List<User>> test();
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserVolunteerService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserVolunteerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..96ca419902bb23622d8f34ad4fe4823f0992c41c
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/UserVolunteerService.java
@@ -0,0 +1,11 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.model.app.UserVolunteer;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+
+/**
+ * @author 86187
+ */
+public interface UserVolunteerService extends IService<UserVolunteer> {
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/VolunteerService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/VolunteerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6354c53f8ce95386735ba24cb44db3624c076fd
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/VolunteerService.java
@@ -0,0 +1,50 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.SchemeInfo;
+import cn.wisenergy.model.app.Volunteer;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author 86187
+ */
+public interface VolunteerService extends IService<Volunteer> {
+    /**
+     * 批量添加志愿
+     *
+     * @param list 志愿列表信息
+     * @return true 成功 false 失败
+     */
+    R<Boolean> batchAdd(List<Volunteer> list);
+
+    /**
+     * Excel批量添加方案志愿
+     * @param file 志愿文件
+     * @param type 方案类型
+     * @param schemeName 方案名称
+     * @param response 相应数据
+     * @throws IOException 异常
+     */
+    void excelAdd(MultipartFile file, Integer type, String schemeName, String fileUrl,HttpServletResponse response) throws IOException;
+
+    /**
+     * Excel批量添加方案志愿
+     * @param response 相应数据
+     * @throws IOException 异常
+     */
+    void excelTemplate(HttpServletResponse response) throws IOException;
+
+    /**
+     * Excel批量添加方案志愿
+     * @param file 志愿文件
+     * @param response 相应数据
+     * @throws IOException 异常
+     */
+    void ceshi(MultipartFile file, HttpServletResponse response) throws IOException;
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/WxPayService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/WxPayService.java
new file mode 100644
index 0000000000000000000000000000000000000000..be72d605a2875db58d42abaf2b730a4996d97693
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/WxPayService.java
@@ -0,0 +1,38 @@
+package cn.wisenergy.service.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.dto.PayPageDto;
+import cn.wisenergy.model.dto.PayQueryDto;
+
+import javax.crypto.IllegalBlockSizeException;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SignatureException;
+import java.security.spec.InvalidKeySpecException;
+
+/**
+ * @author 86187
+ */
+public interface WxPayService {
+
+    /**
+     * 微行支付接口
+     * @param payPageDto 入参
+     * @return
+     */
+    R<String> wxPay(PayPageDto payPageDto) throws UnsupportedEncodingException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException;
+
+
+    /**
+     * 微信支付-交易查询
+     * @param payQueryDto 入参
+     * @return
+     */
+    R<String> queryWx(PayQueryDto payQueryDto) throws UnsupportedEncodingException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException;
+
+
+    R<String> wx_Pay(PayPageDto payPageDto) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException;
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/AccountSerivceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/AccountSerivceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8e9a39dc8cc5ac6b5786425c4d55722235fc591
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/AccountSerivceImpl.java
@@ -0,0 +1,58 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.Md5Util;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.AccountMapper;
+import cn.wisenergy.model.app.AccountInfo;
+import cn.wisenergy.model.dto.AccountDto;
+import cn.wisenergy.model.vo.AccountLoginVo;
+import cn.wisenergy.service.app.AccountSerivce;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.HashMap;
+
+@Slf4j
+@Service
+public class AccountSerivceImpl implements AccountSerivce {
+
+    @Autowired
+    private AccountMapper accountMapper;
+
+    @Override
+    public R<AccountDto> getAccountInfo(AccountLoginVo accountLoginVo) {
+        log.info("AccountSerivceImpl[].getAccountInfo[].input.param:accountLoginVo:"+accountLoginVo);
+
+        if (null==accountLoginVo) {
+            return R.error("账号或密码为空");
+        }
+        //判断参数是否为空
+        if (StringUtils.isEmpty(accountLoginVo.getUserName())||StringUtils.isEmpty(accountLoginVo.getPassword())) {
+            return R.error("账号或密码为空");
+        }
+
+        //创建参数容器map
+        HashMap<String, Object> map = new HashMap<>(4);
+        map.put("userName",accountLoginVo.getUserName());
+
+        //查询管理者信息
+        AccountInfo accountInfo = accountMapper.getAccountInfo(map);
+        if (null==accountInfo) {
+            return R.error("用户不存在");
+        }
+
+        //将加密过后的密码与传输数据进行比较
+        String s = Md5Util.digestMD5(accountInfo.getPassword());
+        if (!accountLoginVo.getPassword().equals(s)) {
+            return R.error("密码或者用户名错误");
+        }
+        //查询超过则进行数据copy
+        AccountDto accountDto = new AccountDto();
+        BeanUtils.copyProperties(accountInfo,accountDto);
+        //返回数据
+        return R.ok(accountDto);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/BannerServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/BannerServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..cb703a9e9f5b77f4275d5705e147745f9f8aabd8
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/BannerServiceImpl.java
@@ -0,0 +1,159 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.BannerMapper;
+import cn.wisenergy.model.app.Banner;
+import cn.wisenergy.model.dto.BannerDto;
+import cn.wisenergy.model.vo.AdvertisingQueryVo;
+import cn.wisenergy.service.app.BannerService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @ Description: 广告接口是实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 17:07
+ */
+@Slf4j
+@Service
+public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> implements BannerService {
+
+
+    @Autowired
+    private BannerMapper bannerMapper;
+
+    @Override
+    public R<Boolean> add(Banner advertising) {
+        log.info("BannerServiceImpl[].add[].input.param:advertising:" + advertising);
+        //判断是否存在广告图片,给定初始值
+        if (!StringUtils.isEmpty(advertising.getImage())) {
+            advertising.setIsHaveImage(1);
+        } else {
+            advertising.setIsHaveImage(0);
+        }
+        advertising.setStatus(1);
+
+        //数据添加
+        int count = bannerMapper.add(advertising);
+        if (count == 0) {
+            return R.ok(1, false);
+        }
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<Boolean> edit(Banner advertising) {
+        log.info("BannerServiceImpl[].getById[].input.param:advertising" + advertising);
+
+        if (null == advertising) {
+            return R.error("输入的参数有误");
+        }
+
+        int edit = bannerMapper.edit(advertising);
+
+        //判断数据是否修改成功
+        if (edit == 0) {
+            return R.ok(1,false);
+        }
+
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<Banner> getById(Integer id) {
+        log.info("BannerServiceImpl[].getById[].input.param:id" + id);
+        if (null == id) {
+            return R.error("传入参数无效");
+        }
+        Banner banner = bannerMapper.getById(id);
+
+        if (null == banner) {
+            return R.error("数据获取失败");
+        }
+
+        return R.ok(banner);
+    }
+
+    @Override
+    public R<PageInfo<BannerDto>> getList(AdvertisingQueryVo advertisingQueryVo) {
+        log.info("BannerServiceImpl[].getList[].input.param:advertisingQueryVo:" + advertisingQueryVo);
+        if (null == advertisingQueryVo) {
+            return R.error("输入参数无效");
+        }
+
+        //数据验证
+        Integer pageNo = advertisingQueryVo.getPageNo();
+        Integer pageSize = advertisingQueryVo.getPageSize();
+        if (null == pageSize || pageSize == 0) {
+            pageSize = 10;
+        }
+        if (null == pageNo || pageNo == 0) {
+            pageNo = 1;
+        }
+
+        //封装参数
+        HashMap<String, Object> map = new HashMap<>(4);
+        map.put("pageNo", (pageNo - 1)*pageSize);
+        map.put("pageSize", pageSize);
+        map.put("status",null==advertisingQueryVo.getStatus()?null:advertisingQueryVo.getStatus());
+        map.put("type",null==advertisingQueryVo.getType()?null:advertisingQueryVo.getType());
+
+        //查询数据;
+        List<BannerDto> list = bannerMapper.getList(map);
+
+        PageInfo<BannerDto> pageInfo = new PageInfo<>();
+        pageInfo.setTotal(bannerMapper.count(map));
+        pageInfo.setPageNum(pageNo);
+        pageInfo.setPageSize(pageSize);
+        pageInfo.setList(list);
+        return R.ok(pageInfo);
+    }
+
+    @Override
+    public R<Boolean> editStatus(Integer id, Integer status) {
+        log.info("BannerServiceImpl[].putIn[].input.param,status:{},id" + status, id);
+        //判断数据是否正确
+        if (null == id || null == status) {
+            return R.error("缺少重要数据");
+        }
+
+        //修改广告状态
+        int i = bannerMapper.editStatus(id, status);
+
+        //判断数据是否修改成功
+        if (i == 0) {
+            return R.ok(1,false);
+        }
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<List<Banner>> getTopBanners(Integer type) {
+        log.info("BannerServiceImpl[]getTopBanners[]input.param.type:" + type);
+        if (null == type) {
+            return R.error("参数不能为空!");
+        }
+        return R.ok(bannerMapper.getTopBanners(type));
+    }
+
+    @Override
+    public R<Boolean> delBanner(Integer id) {
+        log.info("BannerServiceImpl[]delBanner[]input.param.id:" + id);
+        if (null==id) {
+            return R.error("参数为空");
+        }
+        int i = bannerMapper.delById(id);
+
+        if (i==0) {
+            return R.ok(1,false);
+        }
+        return R.ok(0,true);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/DaoSupportImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/DaoSupportImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..73b1bf23cb3a3b205566d1c2d401a1ce63a63aa5
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/DaoSupportImpl.java
@@ -0,0 +1,49 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.service.app.Daosupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class DaoSupportImpl implements Daosupport {
+
+    private JdbcTemplate jdbcTemplate;
+
+    /**
+     * 日志记录
+     */
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    /**
+     * 实例化jdbcTemplate
+     */
+    public DaoSupportImpl(JdbcTemplate jdbcTemplate){
+        this.jdbcTemplate= jdbcTemplate;
+    }
+
+    @Override
+    public Integer queryForInt(String sql, Object... args) {
+        try {
+            Integer value = jdbcTemplate.queryForObject(sql, Integer.class, args);
+            return  value==null?0:value;
+        }catch(EmptyResultDataAccessException e){
+            return 0;
+        } catch (RuntimeException e) {
+            this.logger.error(e.getMessage(), e);
+            throw e;
+        }
+    }
+
+    @Override
+    public <T> List<T> queryForList(String sql, Class<T> clazz, Object... args) {
+
+        return this.jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(clazz), args);
+
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/GraduationSerivceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/GraduationSerivceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..42da225f8cfe10caabcb6985578165939c4a77aa
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/GraduationSerivceImpl.java
@@ -0,0 +1,27 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.GraduationMapper;
+import cn.wisenergy.model.app.Graduation;
+import cn.wisenergy.service.app.GraduationSerivce;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@Slf4j
+public class GraduationSerivceImpl implements GraduationSerivce {
+
+    @Autowired
+    private GraduationMapper graduationMapper;
+
+    @Override
+    public R<List<Graduation>> getList() {
+
+        List<Graduation> list = graduationMapper.getList();
+
+        return R.ok(list);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/PayRecordServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/PayRecordServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..47d0dcc8883641cf47e32d54a000485c334a776b
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/PayRecordServiceImpl.java
@@ -0,0 +1,97 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.constant.CommonAttributes;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.PayRecordMapper;
+import cn.wisenergy.model.app.PayRecord;
+import cn.wisenergy.model.vo.PayRecordQueryVo;
+import cn.wisenergy.model.vo.PayRecordShowVo;
+import cn.wisenergy.service.app.PayRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ Description: 充值记录实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 17:18
+ * @author 86187
+ */
+@Service
+@Slf4j
+public class PayRecordServiceImpl extends ServiceImpl<PayRecordMapper, PayRecord> implements PayRecordService {
+
+    @Autowired
+    private PayRecordMapper payRecordMapper;
+
+
+    @Override
+    public R<PageInfo<PayRecordShowVo>> getList(PayRecordQueryVo queryVo) {
+        log.info("volunteer-service[]PayRecordServiceImpl[]getList[]input.param.queryVo:" + queryVo);
+        if (null == queryVo || null == queryVo.getUserId()) {
+            return R.error("参数不能为空!");
+        }
+
+        pageHandle(queryVo);
+
+        Map<String, Object> map = new HashMap<>(16);
+        map.put("userId", queryVo.getUserId());
+        int total = payRecordMapper.count(map);
+
+        map.put("startNum", queryVo.getStartNum());
+        map.put("endNum", queryVo.getEndNum());
+        List<PayRecordShowVo> list = payRecordMapper.getList(map);
+
+
+        PageInfo<PayRecordShowVo> info = new PageInfo<>();
+        info.setPageSize(queryVo.getPageSize());
+        info.setPageNum(queryVo.getPageNo());
+        info.setTotal(total);
+        info.setList(list);
+        return R.ok(info);
+    }
+
+    @Override
+    public R<Boolean> add(PayRecord payRecord) {
+        log.info("volunteer-service[]PayRecordServiceImpl[]payRecord[]input.param.payRecord:" + payRecord);
+        if (null == payRecord) {
+            return R.ok(1, false);
+        }
+
+        //保存充值记录信息
+        int count = payRecordMapper.add(payRecord);
+        if (count == 0) {
+            return R.ok(1, false);
+        }
+
+        return R.ok(0, true);
+    }
+
+    /**
+     * 分页处理方法
+     *
+     * @param orderQueryVo 参数
+     */
+    private void pageHandle(PayRecordQueryVo orderQueryVo) {
+        Integer pageNum = orderQueryVo.getPageNo();
+        Integer pageSize = orderQueryVo.getPageSize();
+        if (null == pageSize || pageSize == 0) {
+            pageSize = 10;
+        }
+        if (null == pageNum || pageNum == 0) {
+            pageNum = 1;
+        }
+        Integer endNum = pageSize;
+        Integer startNum = (pageNum - CommonAttributes.NUM_ONE) * pageSize;
+        orderQueryVo.setEndNum(endNum);
+        orderQueryVo.setStartNum(startNum);
+        orderQueryVo.setPageNo(pageNum);
+        orderQueryVo.setPageSize(pageSize);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/PriceServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/PriceServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..fa0c53a24cd2d8aa50266c49da434ebc4ac44c93
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/PriceServiceImpl.java
@@ -0,0 +1,28 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.PriceMapper;
+import cn.wisenergy.model.app.Price;
+import cn.wisenergy.service.app.PriceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author 86187
+ */
+@Service
+@Slf4j
+public class PriceServiceImpl extends ServiceImpl<PriceMapper, Price> implements PriceService {
+    @Autowired
+    private PriceMapper priceMapper;
+
+    @Override
+    public R<List<Price>> getList() {
+
+        return R.ok(priceMapper.getList());
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/ProfessionServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/ProfessionServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..fdb0b31d167c70dc1cdcdf5c3726de5de2db2728
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/ProfessionServiceImpl.java
@@ -0,0 +1,180 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.AdmissionRuleMapper;
+import cn.wisenergy.mapper.ProfessionMapper;
+import cn.wisenergy.mapper.ScoreInfoMapper;
+import cn.wisenergy.model.app.AdmissionRule;
+import cn.wisenergy.model.app.Profession;
+import cn.wisenergy.model.app.ScoreInfo;
+import cn.wisenergy.model.enums.SchemeTypeEnums;
+import cn.wisenergy.model.enums.StudentType;
+import cn.wisenergy.service.app.ProfessionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 86187
+ * @ Description: 专业接口实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 10:52
+ */
+@Service
+@Slf4j
+public class ProfessionServiceImpl extends ServiceImpl<ProfessionMapper, Profession> implements ProfessionService {
+
+    @Autowired
+    private ProfessionMapper professionMapper;
+
+    @Autowired
+    private ScoreInfoMapper scoreInfoMapper;
+
+    @Autowired
+    private AdmissionRuleMapper admissionRuleMapper;
+
+    @Override
+    public R<List<Profession>> getTree(Integer type, Integer userId) {
+        log.info("volunteer-service[]ProfessionServiceImpl[]getTree[]input.method");
+        if (null == type || null == userId) {
+            return R.error("入参为空!");
+        }
+
+        //获取方案类型
+        Integer schemeType = getSchemeType(type, userId);
+        if (null == schemeType) {
+            return R.error("考生成绩信息不存在!");
+        }
+
+        //获取所有专业
+        List<Profession> rootList = professionMapper.getList(schemeType);
+
+        //构造树形接口:递归
+        List<Profession> streetList = getStreetList(rootList);
+
+        return R.ok(streetList);
+    }
+
+    private List<Profession> getStreetList(List<Profession> list) {
+        List<Profession> rootList = new ArrayList<>();
+        List<Profession> childrenList = new ArrayList<>();
+
+        //1|遍历出根节点和子节点
+        for (Profession profession : list) {
+            if (profession.getLevel() == 1) {
+                rootList.add(profession);
+            } else {
+                childrenList.add(profession);
+            }
+        }
+
+        //2.遍历集合,获取根节点下的子节点
+        for (Profession profession : rootList) {
+            List<Profession> children = setChildren(profession.getId(), childrenList);
+            profession.setChildren(children);
+        }
+        return rootList;
+    }
+
+    private List<Profession> setChildren(Integer id, List<Profession> list) {
+        List<Profession> children = new ArrayList<>();
+        for (Profession profession : list) {
+            if (id.equals(profession.getParentId())) {
+                children.add(profession);
+            }
+        }
+
+        for (int i = 0; i < children.size(); i++) {
+            Integer autoId = children.get(i).getId();
+            List<Profession> childrenList = setChildren(autoId, list);
+            children.get(i).setChildren(childrenList);
+        }
+        return children;
+    }
+
+
+    private Integer getSchemeType(Integer type, Integer userId) {
+        //获取用户成绩
+        ScoreInfo scoreInfo = scoreInfoMapper.getById(userId);
+        if (null == scoreInfo) {
+            return null;
+        }
+
+        //type==1 文化生
+        if (StudentType.CULTURE_STUDENT.getCode().equals(type)) {
+            //获取文化课本科一批规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_CULTURE.getCode());
+            if (null == firstRule) {
+                return null;
+            }
+
+            //本科类比文化分 = 本年录取分 -去年录取分 + 考生分数
+            double firstCulture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + scoreInfo.getCultureGrade();
+            if (scoreInfo.getCultureGrade() >= firstCulture) {
+                return SchemeTypeEnums.UNDERGRADUATE_CULTURE.getCode();
+            }
+
+            return SchemeTypeEnums.JUNIOR_COLLEGE_MAJOR.getCode();
+        }
+
+        //type == 2 美术考生
+        if (StudentType.ART_STUDENT.getCode().equals(type)) {
+            //获取美术本科一批录取规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_ARTS.getCode());
+            if (null == firstRule) {
+                return null;
+            }
+
+            //专科类比分 = 本年录取分 -去年录取分 + 考生分数
+            double firstCulture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + scoreInfo.getCultureGrade();
+            double firstMajor = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + scoreInfo.getMajorGrade();
+            if (scoreInfo.getCultureGrade() >= firstCulture &&
+                    scoreInfo.getMajorGrade() >= firstMajor) {
+                return SchemeTypeEnums.UNDERGRADUATE_ARTS.getCode();
+            }
+
+            return SchemeTypeEnums.JUNIOR_COLLEGE_ARTS.getCode();
+        }
+
+        //3 体育考生
+        if (StudentType.SPORTS_STUDENT.getCode().equals(type)) {
+            //获取体育本科一批录取规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_SPORTS.getCode());
+            if (null == firstRule) {
+                return null;
+            }
+
+            //计算综合成绩
+            //综合成绩差值
+            double value = firstRule.getCurrentYearCulture() - firstRule.getCultureMin();
+            double total = scoreInfo.getMajorGrade() * 750 / 100 * 0.7 + scoreInfo.getCultureGrade() * 0.3 - value;
+            if (total >= firstRule.getCultureMin()) {
+                return SchemeTypeEnums.UNDERGRADUATE_SPORTS.getCode();
+            }
+            return SchemeTypeEnums.JUNIOR_COLLEGE_SPORTS.getCode();
+        }
+
+        //type == 4 文学编导
+        if (StudentType.LITERATURE_STUDENT.getCode().equals(type)) {
+            //获取文学编导本科一批录取规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_LITERATURE.getCode());
+            if (null == firstRule) {
+                return null;
+            }
+
+            //专科类比分 = 本年录取分 -去年录取分 + 考生分数
+            double firstCulture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + scoreInfo.getCultureGrade();
+            double firstMajor = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + scoreInfo.getMajorGrade();
+            if (scoreInfo.getCultureGrade() >= firstCulture && scoreInfo.getMajorGrade() >= firstMajor) {
+                return SchemeTypeEnums.UNDERGRADUATE_LITERATURE.getCode();
+            }
+
+            return SchemeTypeEnums.JUNIOR_COLLEGE_LITERATURE.getCode();
+        }
+        return null;
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/RefillCardServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/RefillCardServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a016eea4d46312440dab78ee8ced11a26221db46
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/RefillCardServiceImpl.java
@@ -0,0 +1,164 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.*;
+import cn.wisenergy.mapper.CardMapper;
+import cn.wisenergy.mapper.RefillCardMapper;
+import cn.wisenergy.model.app.CardInfo;
+import cn.wisenergy.model.app.RefillCard;
+import cn.wisenergy.model.dto.ExportCardDto;
+import cn.wisenergy.model.dto.RefillCardDto;
+import cn.wisenergy.service.app.RefillCardService;
+import cn.wisenergy.service.common.RefillCardManager;
+import com.alibaba.excel.EasyExcel;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class RefillCardServiceImpl implements RefillCardService {
+    @Autowired
+    RefillCardMapper refillCardMapper;
+
+    @Autowired
+    private CardMapper cardMapper;
+
+    @Autowired
+    private RefillCardManager refillCardManager;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R<Boolean> add(RefillCard refillCard) {
+        log.info("RefillCardServiceImpl[].add[].input.param:refillCard:{}"+refillCard);
+
+        if (refillCard.getCardNumber()==0||null==refillCard.getCardNumber()) {
+            return R.error("输入的卡数无效是无效值");
+        }
+        //设置初始状态
+        String time = DateUtil.getTime(new Date(), "yyyy.MM.dd.HH.mm.sss");
+        refillCard.setBatchNumber(time);
+        refillCard.setIsActivite(1);
+        refillCard.setIsMakeCard(1);
+        refillCard.setIsDelete(0);
+        int add = refillCardMapper.add(refillCard);
+
+        //判断数据是否添加成功
+        if (add==0) {
+            return R.error("数据添加失败");
+        }
+        return R.ok(0,true);
+    }
+
+    @Override
+    public R<Boolean> update(String batchNumber) {
+        log.info("RefillCardServiceImpl[].update[].input.param:batchNumber:"+batchNumber);
+        if (StringUtils.isEmpty(batchNumber)) {
+            return R.error("传入参数为空");
+        }
+        int update = refillCardMapper.update(batchNumber);
+        if (update==0) {
+            R.ok(1,false);
+        }
+        return R.ok(0,true);
+    }
+
+    @Override
+    public R<PageInfo<RefillCardDto>> getList(Integer pageNum, Integer pageSize) {
+        log.info("RefillCardServiceImpl[].getList[].input.param:pageNum,pageSize"+pageNum+ pageSize);
+        if (null == pageSize || pageSize == 0) {
+            pageSize = 10;
+        }
+        if (null == pageNum || pageNum == 0) {
+            pageNum = 1;
+        }
+
+        //创建参数容器
+        HashMap<String, Object> map = new HashMap<>(4);
+        map.put("pageNo",(pageNum-1)*pageSize);
+        map.put("pageSize",pageSize);
+        ArrayList<RefillCardDto> refillCardDtos = new ArrayList<>();
+
+        //查询参数
+        List<RefillCard> list = refillCardMapper.getList(map);
+        for (RefillCard refillCard : list) {
+            RefillCardDto refillCardDto = new RefillCardDto();
+            BeanUtils.copyProperties(refillCard,refillCardDto);
+            refillCardDtos.add(refillCardDto);
+        }
+
+        PageInfo<RefillCardDto> refillCardDtoPageInfo = new PageInfo<>();
+        refillCardDtoPageInfo.setTotal(refillCardMapper.getUserNumbers());
+        refillCardDtoPageInfo.setPageNum(pageNum);
+        refillCardDtoPageInfo.setPageSize(pageSize);
+        refillCardDtoPageInfo.setList(refillCardDtos);
+        return R.ok(refillCardDtoPageInfo);
+    }
+
+    @Override
+    public R<Boolean> createCard(Integer id) {
+        log.info("RefillCardServiceImpl[].createCard[].input.param:id"+id);
+        if (null==id||id==0) {
+            return R.error("传入参数为空");
+        }
+
+        //查询充值卡信息
+        RefillCard byId = refillCardMapper.getById(id);
+        if (null==byId) {
+            return R.error("该充值卡不存在");
+        }
+
+        return refillCardManager.addCardMannger(byId);
+    }
+
+    @Override
+    public R<Boolean> createExcel(String batchNumber, HttpServletResponse response) {
+        log.info("RefillCardServiceImpl[].createExcel[].input.param:batchNumber"+batchNumber);
+
+        if (StringUtils.isEmpty(batchNumber)) {
+            return R.error("传入的参数为空");
+        }
+
+        try {
+            //  设置内容格式 以及 编码方式
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("utf-8");
+
+            //   调用service去获取数据
+            List<CardInfo> list = cardMapper.getList(batchNumber);
+            if (CollectionUtils.isEmpty(list)) {
+                return R.error("该批次号暂时未有子卡");
+            }
+
+            //  使用java8新特性的stream流去处理数据,把空的数据过滤掉
+            List<ExportCardDto> resultBo = list.stream().filter(Objects::nonNull)
+                    .map(t -> {
+                        return ExportCardDto.builder()
+                                .cardNumber(t.getCardNumber())
+                                .secretKey(t.getSecretKey())
+                                .status(t.getStatus()==0?"未使用":"已使用")
+                                .build();
+                    }).collect(Collectors.toList());
+
+            //  设置文件名称
+            String fileName = batchNumber;
+
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+
+            //  sheet名称
+            EasyExcel.write(response.getOutputStream(), ExportCardDto.class).sheet(batchNumber).doWrite(resultBo);
+            return R.ok(0,true);
+        } catch (Exception e) {
+            return R.ok(1,false);
+        }
+    }
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SchemeRecordServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SchemeRecordServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..5900d86ea623fda14bca4997caeca8c388c24329
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SchemeRecordServiceImpl.java
@@ -0,0 +1,296 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.constant.CommonAttributes;
+import cn.wisenergy.common.utils.DateUtil;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.SchemeRecordMapper;
+import cn.wisenergy.mapper.UserVolunteerMapper;
+import cn.wisenergy.mapper.VolunteerMapper;
+import cn.wisenergy.model.app.SchemeQueryRecord;
+import cn.wisenergy.model.app.UserVolunteer;
+import cn.wisenergy.model.app.Volunteer;
+import cn.wisenergy.model.vo.SchemeRecordQueryVo;
+import cn.wisenergy.service.app.SchemeRecordService;
+import cn.wisenergy.service.common.PdfUtil;
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageInfo;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.PdfWriter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * @author 86187
+ * @ Description: 方案查询记录接口实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/8 11:41
+ */
+@Slf4j
+@Service
+public class SchemeRecordServiceImpl extends ServiceImpl<SchemeRecordMapper, SchemeQueryRecord> implements SchemeRecordService {
+    @Autowired
+    private SchemeRecordMapper schemeRecordMapper;
+
+    @Autowired
+    private UserVolunteerMapper userVolunteerMapper;
+
+    @Autowired
+    private VolunteerMapper volunteerMapper;
+
+    @Override
+    public R<SchemeQueryRecord> add(SchemeQueryRecord scheme) {
+        log.info("volunteer-service[]SchemeRecordServiceImpl[]getById[]input.param.scheme:" + scheme);
+        if (null == scheme) {
+            return R.error("入参为空!");
+        }
+
+        //保存记录信息
+        int count = schemeRecordMapper.add(scheme);
+        if (count == 0) {
+            return R.error("添加方案记录失败");
+        }
+        return R.ok(scheme);
+    }
+
+    @Override
+    public R<PageInfo<SchemeQueryRecord>> getList(SchemeRecordQueryVo queryVo) {
+        log.info("volunteer-service[]SchemeRecordServiceImpl[]getList[]input.param.queryVo:" + queryVo);
+        if (null == queryVo || null == queryVo.getUserId()) {
+            return R.error("入参为空!");
+        }
+
+        pageHandle(queryVo);
+
+        //统计数据总条数
+        Map<String, Object> map = new HashMap<>(8);
+        map.put("userId", queryVo.getUserId());
+        int total = schemeRecordMapper.count(map);
+
+
+        //根据用户id,查询方案记录列表
+        List<SchemeQueryRecord> list = schemeRecordMapper.getByUserId(queryVo.getUserId(),
+                queryVo.getStartNum(), queryVo.getEndNum());
+        PageInfo<SchemeQueryRecord> info = new PageInfo<>();
+        info.setPageSize(queryVo.getPageSize());
+        info.setPageNum(queryVo.getPageNo());
+        info.setTotal(total);
+        info.setList(list);
+        return R.ok(info);
+    }
+
+    @Override
+    public R<List<Volunteer>> getVolunteerList(Integer userId, Integer recordId) {
+        log.info("volunteer-service[]SchemeRecordServiceImpl[]getVolunteerList[]input.param.userId,recordId:" + userId);
+        if (null == userId || null == recordId) {
+            return R.error("入参为空!");
+        }
+
+        //1、获取方案查询记录
+        SchemeQueryRecord schemeQueryRecord = schemeRecordMapper.selectById(recordId);
+        if (null == schemeQueryRecord) {
+            return R.error("方案查询记录信息不存在!");
+        }
+
+        //2、根据用户id和方案记录id,获取志愿ids
+        QueryWrapper<UserVolunteer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", userId);
+        queryWrapper.eq("scheme_record_id", recordId);
+        List<UserVolunteer> list = userVolunteerMapper.selectList(queryWrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            return R.ok(new ArrayList<>());
+        }
+
+        List<Integer> ids = list.stream().map(UserVolunteer::getVolunteerId).collect(Collectors.toList());
+        List<Volunteer> result = volunteerMapper.getListByIds(ids);
+        for (Volunteer volunteer : result) {
+            volunteer.setQueryTime(schemeQueryRecord.getCreateTime());
+        }
+        result.sort(Comparator.comparing(Volunteer::getLowestMark).reversed());
+        return R.ok(result);
+    }
+
+    /**
+     * 方案导出
+     *
+     * @param userId   用户id
+     * @param recordId 方案查询记录id
+     * @return
+     */
+    @Override
+    public R<Boolean> export(Integer userId, Integer recordId, HttpServletResponse response) {
+        log.info("volunteer-service[]SchemeRecordServiceImpl[]export[]input.param.userId,recordId:" + userId);
+
+        //查询时间
+        String format=null;
+
+        if (null == userId || null == recordId) {
+            return R.error("入参为空!");
+        }
+
+        //1、根据用户id和方案记录id,获取志愿ids
+        QueryWrapper<UserVolunteer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", userId);
+        queryWrapper.eq("scheme_record_id", recordId);
+        List<UserVolunteer> list = userVolunteerMapper.selectList(queryWrapper);
+        SchemeQueryRecord schemeQueryRecord = schemeRecordMapper.getById(recordId);
+        if (CollectionUtils.isEmpty(list)) {
+            return R.error("数据为空");
+        }
+
+        //获取方案查询时间
+        if (null!=schemeQueryRecord) {
+             format = DateUtil.convertDateToStr(schemeQueryRecord.getUpdateTime(), "yyyy-MM-dd HH:mm:SS");
+        }else {
+             format = DateUtil.convertDateToStr(new Date(), "yyyy-MM-dd HH:mm:SS");
+        }
+
+
+        List<Integer> ids = list.stream().map(UserVolunteer::getVolunteerId).collect(Collectors.toList());
+        List<Volunteer> result = volunteerMapper.getListByIds(ids);
+        result.sort(Comparator.comparing(Volunteer::getLowestMark).reversed());
+        //调用工具生成PDF
+        try {
+            // 1.新建document对象
+            Document document = new Document(PageSize.A4);
+
+            //创建文件名称
+            Long lon = System.currentTimeMillis();
+
+            // 2.建立一个书写器(Writer)与document对象关联
+            OutputStream buffer = new ByteArrayOutputStream();
+            PdfWriter writer = PdfWriter.getInstance(document, buffer);
+
+            // 3.打开文档
+            document.open();
+
+            // 4.向文档中添加内容
+            PdfUtil pdfUtil = new PdfUtil();
+            pdfUtil.generatePDF(document, result,format);
+
+            // 5.关闭文档
+            document.close();
+
+            //  设置内容格式 以及 编码方式
+            response.setContentType("application/pdf");
+            response.setCharacterEncoding("utf-8");
+            response.setHeader("Content-disposition", "attachment;file=" + lon.toString() + ".pdf");
+
+            DataOutput output = new DataOutputStream(response.getOutputStream());
+            byte[] bytes = ((ByteArrayOutputStream) buffer).toByteArray();
+            response.setContentLength(bytes.length);
+            for (int i = 0; i < bytes.length; i++) {
+                output.writeByte(bytes[i]);
+            }
+
+            ((DataOutputStream) output).flush();
+
+            ((DataOutputStream) output).close();
+
+        } catch (Exception e) {
+            return R.ok(1, false);
+        }
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<Boolean> createExcel(Integer userId, Integer recordId, HttpServletResponse response) {
+        log.info("SchemeRecordServiceImpl[].createExcel[].input.param:userId,recordId"+userId,recordId);
+
+        //查询时间
+        String format=null;
+
+        if (null == userId || null == recordId) {
+            return R.error("入参为空!");
+        }
+
+        //1、根据用户id和方案记录id,获取志愿ids
+        QueryWrapper<UserVolunteer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", userId);
+        queryWrapper.eq("scheme_record_id", recordId);
+        List<UserVolunteer> list = userVolunteerMapper.selectList(queryWrapper);
+        SchemeQueryRecord schemeQueryRecord = schemeRecordMapper.getById(recordId);
+        if (CollectionUtils.isEmpty(list)) {
+            return R.error("数据为空");
+        }
+
+        //获取方案查询时间
+        if (null!=schemeQueryRecord) {
+            format = DateUtil.convertDateToStr(schemeQueryRecord.getUpdateTime(), "yyyy-MM-dd HH:mm:SS");
+        }else {
+            format = DateUtil.convertDateToStr(new Date(), "yyyy-MM-dd HH:mm:SS");
+        }
+        List<Integer> ids = list.stream().map(UserVolunteer::getVolunteerId).collect(Collectors.toList());
+        List<Volunteer> result = volunteerMapper.getListByIds(ids);
+        result.sort(Comparator.comparing(Volunteer::getLowestMark).reversed());
+
+        //生成Excel
+        try {
+            //  设置内容格式 以及 编码方式
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("utf-8");
+
+            //  使用java8新特性的stream流去处理数据,把空的数据过滤掉
+            List<Volunteer> resultBo = result.stream().filter(Objects::nonNull)
+                    .map(t -> {
+                        return Volunteer.builder()
+                                .majorName(t.getMajorName())
+                                .academy(t.getAcademy())
+                                .courseDemand(t.getCourseDemand())
+                                .nature(t.getNature())
+                                .yearLimit(t.getYearLimit())
+                                .planNum(t.getPlanNum())
+                                .castArchivesNum(null==t.getCastArchivesNum()?0:t.getCastArchivesNum())
+                                .launchNum(null==t.getLaunchNum()?0:t.getLaunchNum())
+                                .lowestMark(null==t.getLowestMark()?String.valueOf(0):t.getLowestMark())
+                                .lowestRank(null==t.getLowestRank()?String.valueOf(0):t.getLowestRank())
+                                .build();
+                    }).collect(Collectors.toList());
+
+            //创建文件名称
+            Long lon = System.currentTimeMillis();
+
+            response.setHeader("Content-disposition", "attachment;filename=" + lon + ".xlsx");
+
+            //  sheet名称
+            EasyExcel.write(response.getOutputStream(), Volunteer.class).sheet(lon.toString()).doWrite(resultBo);
+            return R.ok(0,true);
+        } catch (Exception e) {
+            return R.ok(1,false);
+        }
+    }
+
+
+    /**
+     * 分页处理
+     *
+     * @param cameraQueryVo 参数
+     */
+    private void pageHandle(SchemeRecordQueryVo cameraQueryVo) {
+        Integer pageNum = cameraQueryVo.getPageNo();
+        Integer pageSize = cameraQueryVo.getPageSize();
+        if (null == pageSize || pageSize == 0) {
+            pageSize = 10;
+        }
+        if (null == pageNum || pageNum == 0) {
+            pageNum = 1;
+        }
+        Integer endNum = pageSize;
+        Integer startNum = (pageNum - CommonAttributes.NUM_ONE) * pageSize;
+        cameraQueryVo.setEndNum(endNum);
+        cameraQueryVo.setStartNum(startNum);
+        cameraQueryVo.setPageNo(pageNum);
+        cameraQueryVo.setPageSize(pageSize);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SchemeServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SchemeServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae74f5826abc5c5b21c0f97c93f679b5be6a26e7
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SchemeServiceImpl.java
@@ -0,0 +1,755 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.constant.CommonAttributes;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.common.utils.StringUtil;
+import cn.wisenergy.mapper.*;
+import cn.wisenergy.model.app.*;
+import cn.wisenergy.model.enums.SchemeTypeEnums;
+import cn.wisenergy.model.enums.StudentClassEnum;
+import cn.wisenergy.model.enums.StudentType;
+import cn.wisenergy.model.vo.*;
+import cn.wisenergy.service.app.SchemeService;
+import cn.wisenergy.service.app.UserVolunteerService;
+import cn.wisenergy.service.common.VolunteerManager;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author 86187
+ * @ Description: 方案接口实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 15:04
+ */
+@Service
+@Slf4j
+public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> implements SchemeService {
+    @Autowired
+    private UsersMapper usersMapper;
+
+    @Autowired
+    private SchemeMapper schemeMapper;
+
+    @Autowired
+    private ScoreInfoMapper scoreInfoMapper;
+
+    @Autowired
+    private VolunteerMapper volunteerMapper;
+
+    @Autowired
+    private SchemeRecordMapper schemeRecordMapper;
+
+    @Autowired
+    private UserVolunteerMapper userVolunteerMapper;
+
+    @Autowired
+    private AdmissionRuleMapper admissionRuleMapper;
+
+    @Autowired
+    private ProfessionMapper professionMapper;
+
+    @Autowired
+    private UserVolunteerService userVolunteerService;
+
+    @Autowired
+    private VolunteerManager volunteerManager;
+
+    @Override
+    public R<VolunteerVo> getList(SchemeVo queryVo) {
+        log.info("volunteer-service[]SchemeServiceImpl[]getList[]input.param.queryVo:" + queryVo);
+        if (null == queryVo || null == queryVo.getUserId() || null == queryVo.getCultureGrade()) {
+            return R.error("入参为空!");
+        }
+
+        if (StringUtils.isBlank(queryVo.getProfessionIds())) {
+            return R.error("未选择专业!");
+        }
+
+        //1、根据userId获取用户信息
+        User user = usersMapper.selectById(queryVo.getUserId());
+        if (null == user) {
+            return R.error("用户信息不存在!");
+        }
+
+        //2、获取考生成绩
+        QueryWrapper<ScoreInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", queryVo.getUserId());
+        ScoreInfo scoreInfo = scoreInfoMapper.selectOne(queryWrapper);
+        if (null == scoreInfo) {
+            return R.error("无考生成绩!");
+        }
+
+        //3、根据筛选方案算法,筛选方案
+        //副科名称
+        List<String> className = getClassName(scoreInfo);
+        if (CollectionUtils.isEmpty(className)) {
+            return R.error("考生无副科成绩!");
+        }
+
+        //选取专业名称
+        List<String> professionName = getProfessionName(queryVo);
+        if (CollectionUtils.isEmpty(professionName)) {
+            return R.error("未选择专业!");
+        }
+
+        //(1)判断考生类型 文化课考生
+        //初始化返回数据总条数
+        int totalResult = 0;
+        List<Volunteer> list = new ArrayList<>();
+        VolunteerVo volunteerVo = new VolunteerVo();
+        if (StudentType.CULTURE_STUDENT.getCode().equals(user.getExamType())) {
+            //获取文化课本科一批规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_CULTURE.getCode());
+            if (null == firstRule) {
+                return R.error("无文化课本科录取规则!");
+            }
+
+            //获取文化课专科一批规则
+            AdmissionRule secondRule = admissionRuleMapper.getByType(SchemeTypeEnums.JUNIOR_COLLEGE_MAJOR.getCode());
+            if (null == secondRule) {
+                return R.error("无文化课专科录取规则!");
+            }
+
+            //1).判断文化课的分数是否大于等于最大文化分
+            //本科类比文化分 = 本年录取分 -去年录取分 + 考生分数
+            double firstCulture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
+            double cultureMax = Double.parseDouble(firstRule.getCultureMax().toString());
+            if (firstCulture >= cultureMax) {
+                volunteerVo.setUserId(user.getId());
+                volunteerVo.setVolunteers(list);
+                return R.ok("恭喜您,因您的成绩突出,请联系官方免费领取VIP一对一报考方案指导!", volunteerVo);
+            }
+
+            //2).判断文化课的分数是否小于最小报考分数
+            //专科类比文化分 = 本年录取分 -去年录取分 + 考生分数
+            double secondCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
+            double cultureMin = Double.parseDouble(secondRule.getCultureMin().toString());
+            if (secondCulture < cultureMin) {
+                return R.error("很抱歉,您的成绩不满足报考条件,无法查询!");
+            }
+
+            totalResult = firstRule.getNumber();
+            list = getCultureList(scoreInfo, firstRule, secondRule, className, professionName, firstCulture, secondCulture);
+        }
+
+        //(2)美术考生
+        if (StudentType.ART_STUDENT.getCode().equals(user.getExamType())) {
+            //获取美术本科一批录取规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_ARTS.getCode());
+            if (null == firstRule) {
+                return R.error("无美术本科录取规则!");
+            }
+
+            //获取美术专科一批录取规则
+            AdmissionRule secondRule = admissionRuleMapper.getByType(SchemeTypeEnums.JUNIOR_COLLEGE_ARTS.getCode());
+            if (null == secondRule) {
+                return R.error("无美术专科录取规则!");
+            }
+
+            //判断考生是否有报取资格
+            //专科类比分 = 本年录取分 -去年录取分 + 考生分数
+            double secondCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() +
+                    Double.parseDouble(queryVo.getMajorGrade());
+            double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() +
+                    Double.parseDouble(queryVo.getMajorGrade());
+            if (secondCulture < secondRule.getCultureMin() && secondMajor < secondRule.getProfessionMin()) {
+                return R.error("很抱歉,您的成绩不满足报考条件,无法查询!");
+            }
+
+            totalResult = firstRule.getNumber();
+            list = getArtsList(queryVo, firstRule, secondRule, className, professionName);
+        }
+
+        //(3)文学编导考生
+        if (StudentType.LITERATURE_STUDENT.getCode().equals(user.getExamType())) {
+            //获取文学编导本科一批录取规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_LITERATURE.getCode());
+            if (null == firstRule) {
+                return R.error("无文学编导本科录取规则!");
+            }
+
+            //获取文学编导专科一批录取规则
+            AdmissionRule secondRule = admissionRuleMapper.getByType(SchemeTypeEnums.JUNIOR_COLLEGE_LITERATURE.getCode());
+            if (null == secondRule) {
+                return R.error("无文学编导专科录取规则!");
+            }
+
+            //判断考生是否有报取资格
+            //专科类比分 = 本年录取分 -去年录取分 + 考生分数
+            double secondCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() +
+                    Double.parseDouble(queryVo.getMajorGrade());
+            double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() +
+                    Double.parseDouble(queryVo.getMajorGrade());
+            if (secondCulture < secondRule.getCultureMin() || secondMajor < secondRule.getProfessionMin()) {
+                return R.error("很抱歉,您的专业成绩不满足报考条件,无法查询!");
+            }
+
+            totalResult = firstRule.getNumber();
+            list = getLiteratureList(queryVo, firstRule, secondRule, className, professionName);
+        }
+
+        //(4)体育考生
+        if (StudentType.SPORTS_STUDENT.getCode().equals(user.getExamType())) {
+            //获取体育本科一批录取规则
+            AdmissionRule firstRule = admissionRuleMapper.getByType(SchemeTypeEnums.UNDERGRADUATE_SPORTS.getCode());
+            if (null == firstRule) {
+                return R.error("无体育本科录取规则!");
+            }
+
+            //获取体育专科一批录取规则
+            AdmissionRule secondRule = admissionRuleMapper.getByType(SchemeTypeEnums.JUNIOR_COLLEGE_SPORTS.getCode());
+            if (null == secondRule) {
+                return R.error("无体育专科录取规则!");
+            }
+
+            //判断考生是否有报取资格
+            //综合成绩差值
+            double value = secondRule.getCurrentYearCulture() - secondRule.getCultureMin();
+            double culture = Double.parseDouble(queryVo.getCultureGrade());
+            double major = Double.parseDouble(queryVo.getMajorGrade());
+
+            //计算综合成绩
+            double total = major * 750 / 100 * 0.7 + culture * 0.3 - value;
+            if (total < secondRule.getCultureMin()) {
+                return R.error("很抱歉,您的成绩不满足报考条件,无法查询!");
+            }
+
+            totalResult = firstRule.getNumber();
+            list = getSportsList(total, firstRule, secondRule, className, professionName);
+        }
+
+        //4判断是否展示全部方案
+        if (queryVo.getIsShowAll() == 0) {
+            List<Volunteer> result;
+            if (list.size() < 10) {
+                result = list.subList(0, list.size());
+            } else {
+                result = list.subList(0, 10);
+            }
+            volunteerVo.setUserId(user.getId());
+            volunteerVo.setVolunteers(result);
+            return R.ok(volunteerVo);
+        }
+
+        //5、判断返回的结果数据是否大于totalResult
+        if (list.size() > totalResult) {
+            list = getVolunteerList(list, totalResult);
+        }
+
+        //6保存用户方案记录、志愿之间的关联关系,扣减查询次数
+        R<Integer> bool = volunteerManager.saveUserVolunteer(user, list, scoreInfo, queryVo.getBigMajorNames());
+        if (null != bool && bool.getCode() == 500) {
+            return R.error(bool.getMessage());
+        }
+
+        //排序
+        list.sort(Comparator.comparing(Volunteer::getLowestMark).reversed());
+        volunteerVo.setUserId(user.getId());
+        assert bool != null;
+        volunteerVo.setRecordId(bool.getData());
+        volunteerVo.setVolunteers(list);
+        volunteerVo.setTotal(list.size());
+        return R.ok(volunteerVo);
+    }
+
+    @Override
+    public R<Boolean> deleteById(Integer schemeId) {
+        log.info("volunteer-service[]SchemeServiceImpl[]deleteById[]input.param.schemeId:" + schemeId);
+        if (null == schemeId) {
+            return R.error("入参为空!");
+        }
+        //根据方案id,获取方案信息
+        QueryWrapper<SchemeInfo> query = new QueryWrapper<>();
+        query.eq("id", schemeId);
+        query.eq("is_delete", 0);
+        SchemeInfo schemeInfo = baseMapper.selectOne(query);
+        if (null == schemeInfo) {
+            return R.error("方案信息不存在!");
+        }
+
+        //更新方案状态为 :1 删除
+        schemeInfo.setIsDelete(1);
+
+        //根据方案id,获取志愿信息
+        QueryWrapper<Volunteer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("scheme_id", schemeId);
+        queryWrapper.eq("is_delete", 0);
+        List<Volunteer> list = volunteerMapper.selectList(queryWrapper);
+
+        boolean bool = volunteerManager.deleteSchemeAndVolunteer(schemeInfo, schemeId, list.size());
+        return R.ok(bool);
+    }
+
+    @Override
+    public R<PageInfo<SchemeInfo>> getSchemeList(SchemeQueryVo schemeVo) {
+        log.info("volunteer-service[]SchemeServiceImpl[]getSchemeList[]input.param.schemeVo:" + schemeVo);
+        if (null == schemeVo) {
+            return R.error("入参为空!");
+        }
+        pageHandle(schemeVo);
+        int total = schemeMapper.count();
+        Map<String, Object> map = new HashMap<>(16);
+
+        map.put("startNum", schemeVo.getStartNum());
+        map.put("endNum", schemeVo.getEndNum());
+        List<SchemeInfo> list = schemeMapper.getList(map);
+        PageInfo<SchemeInfo> info = new PageInfo<>();
+        info.setPageSize(schemeVo.getPageSize());
+        info.setPageNum(schemeVo.getPageNo());
+        info.setTotal(total);
+        info.setList(list);
+        return R.ok(info);
+    }
+
+    @Override
+    public R<String> download(Integer schemeId) {
+        log.info("volunteer-service[]SchemeServiceImpl[]download[]input.param.schemeId:" + schemeId);
+        if (null == schemeId) {
+            return R.error("入参为空!");
+        }
+
+        //获取方案信息
+        SchemeInfo schemeInfo = schemeMapper.getById(schemeId);
+        if (null == schemeInfo || StringUtils.isBlank(schemeInfo.getFileUrl())) {
+            return R.error("未上传方案,无法下载!");
+        }
+
+        return R.ok(schemeInfo.getFileUrl());
+    }
+
+    @Override
+    public List<Integer> ceishi(Integer id) {
+
+        List<UserVolunteer> list = userVolunteerMapper.listById(id);
+        List<Integer> ids = list.stream().map(UserVolunteer::getVolunteerId).collect(Collectors.toList());
+        List<Integer> integerList = new ArrayList<>();
+        List<Integer> result = new ArrayList<>();
+        for (Integer vid : ids) {
+            if (integerList.contains(vid)) {
+                result.add(vid);
+            } else {
+                integerList.add(vid);
+            }
+        }
+        return result;
+    }
+
+
+    /**
+     * 获取文化生志愿列表
+     *
+     * @param scoreInfo       成绩
+     * @param firstRule       录取规则
+     * @param classNames      副科名称
+     * @param professionNames 专业名称
+     * @return 文化生志愿列表
+     */
+    private List<Volunteer> getCultureList(ScoreInfo scoreInfo, AdmissionRule firstRule, AdmissionRule secondRule,
+                                           List<String> classNames, List<String> professionNames,
+                                           double firstCulture, double secondCulture) {
+        double cultureMax = firstRule.getCultureMax();
+        double cultureMin = firstRule.getCultureMin();
+
+        //考生的分数在本科一批中
+        List<Volunteer> list = new ArrayList<>();
+        Map<String, Object> map = new HashMap<>(16);
+        map.put("classNames", classNames);
+        map.put("professionNames", professionNames);
+        if (firstCulture < cultureMax && firstCulture >= cultureMin) {
+            double upGrade = firstCulture + firstRule.getUpMark();
+            double downGrade = firstCulture - firstRule.getDownMark();
+            map.put("upGrade", upGrade);
+            map.put("type", SchemeTypeEnums.UNDERGRADUATE_CULTURE.getCode());
+            map.put("downGrade", downGrade);
+            list = volunteerMapper.getVolunteerList(map);
+            if (list.size() < firstRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, firstRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.UNDERGRADUATE_CULTURE.getCode());
+                list.addAll(fillList);
+            }
+
+        } else {
+            //考生的分数是在专科一批中
+            double upGrade = secondCulture + secondRule.getUpMark();
+            double downGrade = secondCulture - secondRule.getDownMark();
+            map.put("upGrade", upGrade);
+            map.put("type", SchemeTypeEnums.JUNIOR_COLLEGE_MAJOR.getCode());
+            map.put("downGrade", downGrade);
+            list = volunteerMapper.getVolunteerList(map);
+
+            //如果数据不满足最大数量,取不限专业最低分补充
+            if (list.size() < secondRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.JUNIOR_COLLEGE_MAJOR.getCode());
+                list.addAll(fillList);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取美术生志愿方案
+     *
+     * @param queryVo         考生成绩
+     * @param firstRule       本科规则
+     * @param secondRule      专科规则
+     * @param classNames      副科名称
+     * @param professionNames 专业名称
+     * @return 志愿方案列表
+     */
+    private List<Volunteer> getArtsList(SchemeVo queryVo, AdmissionRule firstRule, AdmissionRule secondRule,
+                                        List<String> classNames, List<String> professionNames) {
+        //本科类比分 = 本年录取分 -去年录取分 + 考生分数
+        double culture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
+        double major = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
+        //计算综合成绩
+        double total = major * 750 / 300 * 0.7 + culture * 0.3;
+
+        Map<String, Object> map = new HashMap<>(16);
+        map.put("number", firstRule.getNumber());
+        map.put("classNames", classNames);
+        map.put("professionNames", professionNames);
+
+        //1、考生是否能报取美术本科
+        List<Volunteer> list = new ArrayList<>();
+        if (culture >= firstRule.getCultureMin() && major >= firstRule.getProfessionMin()) {
+            //浮动分数
+            double upGrade = total + firstRule.getUpMark();
+            double downGrade = total - firstRule.getDownMark();
+            map.put("upGrade", upGrade);
+            map.put("downGrade", downGrade);
+            map.put("type", SchemeTypeEnums.UNDERGRADUATE_ARTS.getCode());
+            list = volunteerMapper.getVolunteerList(map);
+
+            //如果数据不满足最大数量,取不限专业最低分补充
+            if (list.size() < secondRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, firstRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.UNDERGRADUATE_ARTS.getCode());
+                list.addAll(fillList);
+            }
+            return list;
+        }
+
+
+        //专科科类比分 = 本年录取分 -去年录取分 + 考生分数
+        double secondCulture = secondRule.getCurrentYearCulture() - secondRule.getCultureMin() +
+                Double.parseDouble(queryVo.getCultureGrade());
+        double secondMajor = secondRule.getCurrentYearMajor() - secondRule.getProfessionMin() +
+                Double.parseDouble(queryVo.getMajorGrade());
+
+        //计算综合成绩
+        double secondRuleTotal = secondMajor * 750 / 300 * 0.7 + secondCulture * 0.3;
+        //2、考生是否能报取美术专科
+        if (secondCulture >= secondRule.getCultureMin() && secondMajor >= secondRule.getProfessionMin()) {
+
+            //浮动分数
+            double upGrade = secondRuleTotal + secondRule.getUpMark();
+            double downGrade = secondRuleTotal - secondRule.getDownMark();
+            map.put("upGrade", upGrade);
+            map.put("downGrade", downGrade);
+            map.put("type", SchemeTypeEnums.JUNIOR_COLLEGE_ARTS.getCode());
+            list = volunteerMapper.getVolunteerList(map);
+
+            //如果数据不满足最大数量,取不限专业最低分补充
+            if (list.size() < secondRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.JUNIOR_COLLEGE_ARTS.getCode());
+                list.addAll(fillList);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取文学编导生志愿方案
+     *
+     * @param queryVo         考生成绩
+     * @param firstRule       本科规则
+     * @param secondRule      专科规则
+     * @param classNames      副科名称
+     * @param professionNames 专业名称
+     * @return 志愿方案列表
+     */
+    private List<Volunteer> getLiteratureList(SchemeVo queryVo, AdmissionRule firstRule, AdmissionRule secondRule,
+                                              List<String> classNames, List<String> professionNames) {
+        //本科类比分 = 本年录取分 -去年录取分 + 考生分数
+        double culture = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
+        double major = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
+        //计算综合成绩
+        double total = major * 750 / 300 * 0.3 + culture * 0.7;
+
+        Map<String, Object> map = new HashMap<>(16);
+        map.put("number", firstRule.getNumber());
+        map.put("classNames", classNames);
+        map.put("professionNames", professionNames);
+
+        //1、考生是否能报取美术本科
+        List<Volunteer> list = new ArrayList<>();
+        if (culture >= firstRule.getCultureMin() && major >= firstRule.getProfessionMin()) {
+            //浮动分数
+            double upGrade = total + firstRule.getUpMark();
+            double downGrade = total - firstRule.getDownMark();
+            map.put("upGrade", upGrade);
+            map.put("downGrade", downGrade);
+            map.put("type", SchemeTypeEnums.UNDERGRADUATE_LITERATURE.getCode());
+            list = volunteerMapper.getVolunteerList(map);
+
+            //如果数据不满足最大数量,取不限专业最低分补充
+            if (list.size() < secondRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.UNDERGRADUATE_LITERATURE.getCode());
+                list.addAll(fillList);
+            }
+            return list;
+        }
+
+
+        //专科类比分 = 本年录取分 -去年录取分 + 考生分数
+        double cultureSecond = firstRule.getCurrentYearCulture() - firstRule.getCultureMin() + Double.parseDouble(queryVo.getCultureGrade());
+        double majorSecond = firstRule.getCurrentYearMajor() - firstRule.getProfessionMin() + Double.parseDouble(queryVo.getMajorGrade());
+        //计算综合成绩
+        double totalSecond = majorSecond * 750 / 300 * 0.3 + cultureSecond * 0.7;
+        //2、考生是否能报取美术专科
+        if (cultureSecond >= secondRule.getCultureMin() && majorSecond >= secondRule.getProfessionMin()) {
+            //浮动分数
+            double upGrade = totalSecond + secondRule.getUpMark();
+            double downGrade = totalSecond - secondRule.getDownMark();
+            map.put("upGrade", upGrade);
+            map.put("downGrade", downGrade);
+            map.put("type", SchemeTypeEnums.JUNIOR_COLLEGE_LITERATURE.getCode());
+            list = volunteerMapper.getVolunteerList(map);
+
+            //如果数据不满足最大数量,取不限专业最低分补充
+            if (list.size() < secondRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.JUNIOR_COLLEGE_LITERATURE.getCode());
+                list.addAll(fillList);
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 获取体育生生志愿方案
+     *
+     * @param total           考生综合成绩
+     * @param firstRule       本科规则
+     * @param secondRule      专科规则
+     * @param classNames      副科名称
+     * @param professionNames 专业名称
+     * @return 志愿方案列表
+     */
+    private List<Volunteer> getSportsList(double total, AdmissionRule firstRule, AdmissionRule secondRule,
+                                          List<String> classNames, List<String> professionNames) {
+        Map<String, Object> map = new HashMap<>(16);
+        map.put("number", firstRule.getNumber());
+        map.put("classNames", classNames);
+        map.put("professionNames", professionNames);
+
+        //1、考生是否能报取体育本科
+        List<Volunteer> list = new ArrayList<>();
+        if (total >= firstRule.getCultureMin()) {
+            //浮动分数
+            double upGrade = total + firstRule.getUpMark();
+            double downGrade = total - firstRule.getDownMark();
+            if (downGrade < firstRule.getCultureMin()) {
+                downGrade = firstRule.getCultureMin();
+            }
+            map.put("upGrade", upGrade);
+            map.put("downGrade", downGrade);
+            map.put("type", SchemeTypeEnums.UNDERGRADUATE_SPORTS.getCode());
+            list = volunteerMapper.getVolunteerList(map);
+
+            //如果数据不满足最大数量,取不限专业最低分补充
+            if (list.size() < secondRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.UNDERGRADUATE_SPORTS.getCode());
+                list.addAll(fillList);
+            }
+            return list;
+        }
+
+        //2、考生是否能报取体育专科
+        if (total >= secondRule.getCultureMin()) {
+            //浮动分数
+            double upGrade = total + secondRule.getUpMark();
+            double downGrade = total - secondRule.getDownMark();
+            if (downGrade < secondRule.getCultureMin()) {
+                downGrade = secondRule.getCultureMin();
+            }
+            map.put("upGrade", upGrade);
+            map.put("downGrade", downGrade);
+            map.put("type", SchemeTypeEnums.JUNIOR_COLLEGE_SPORTS.getCode());
+            list = volunteerMapper.getVolunteerList(map);
+
+            //如果数据不满足最大数量,取不限专业最低分补充
+            if (list.size() < secondRule.getNumber()) {
+                List<Volunteer> fillList = fillUpVolunteer(list, secondRule.getNumber(), upGrade, downGrade,
+                        SchemeTypeEnums.JUNIOR_COLLEGE_SPORTS.getCode());
+                list.addAll(fillList);
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 获取副科的名称
+     *
+     * @param scoreInfo 成绩信息
+     * @return 副科列表
+     */
+    private List<String> getClassName(ScoreInfo scoreInfo) {
+        List<String> name = new ArrayList<>();
+        name.add(StudentClassEnum.UNLIMITED.getDesc());
+        if (null != scoreInfo.getPhysicsGrade() && scoreInfo.getPhysicsGrade() >= 0) {
+            name.add(StudentClassEnum.PHYSICS_GRADE.getDesc());
+        }
+
+        if (null != scoreInfo.getChemistryGrade() && scoreInfo.getChemistryGrade() >= 0) {
+            name.add(StudentClassEnum.CHEMISTRY_GRADE.getDesc());
+        }
+
+        if (null != scoreInfo.getBiologyGrade() && scoreInfo.getBiologyGrade() >= 0) {
+            name.add(StudentClassEnum.BIOLOGY_GRADE.getDesc());
+        }
+
+        if (null != scoreInfo.getHistoryGrade() && scoreInfo.getHistoryGrade() >= 0) {
+            name.add(StudentClassEnum.HISTORY_GRADE.getDesc());
+        }
+
+        if (null != scoreInfo.getGeographyGrade() && scoreInfo.getGeographyGrade() >= 0) {
+            name.add(StudentClassEnum.GEOGRAPHY_GRADE.getDesc());
+        }
+
+        if (null != scoreInfo.getPoliticsGrade() && scoreInfo.getPoliticsGrade() >= 0) {
+            name.add(StudentClassEnum.POLITICS_GRADE.getDesc());
+        }
+
+        return name;
+    }
+
+    /**
+     * 获取专业名称
+     *
+     * @param schemeVo 专业参数
+     * @return 专业名称列表
+     */
+    private List<String> getProfessionName(SchemeVo schemeVo) {
+        //把字符专ids业转为数组
+        List<Integer> professionIds = StringUtil.strToArray(schemeVo.getProfessionIds());
+        return professionMapper.getNameByIds(professionIds);
+    }
+
+    /**
+     * 补充不足数量的志愿数
+     *
+     * @param list   å¿—æ„¿ids
+     * @param number 差的数量
+     * @param max    最高分
+     * @param min    最低分
+     * @return 集合
+     */
+    private List<Volunteer> fillUpVolunteer(List<Volunteer> list, Integer number, double max, double min, Integer type) {
+        //已存在的志愿ids
+        List<Integer> volunteerIds = list.stream().map(Volunteer::getId).collect(Collectors.toList());
+
+        //需要补充的志愿条数
+        int totalNumber = number - list.size();
+
+        Map<String, Object> map = new HashMap<>(16);
+        map.put("volunteerIds", volunteerIds);
+        map.put("number", totalNumber);
+        map.put("upGrade", max);
+        map.put("downGrade", min);
+        map.put("type", type);
+        return volunteerMapper.getFillList(map);
+    }
+
+    /**
+     * 分页处理方法
+     *
+     * @param schemeVo 参数
+     */
+    private void pageHandle(SchemeQueryVo schemeVo) {
+        Integer pageNum = schemeVo.getPageNo();
+        Integer pageSize = schemeVo.getPageSize();
+        if (null == pageSize || pageSize == 0) {
+            pageSize = 10;
+        }
+        if (null == pageNum || pageNum == 0) {
+            pageNum = 1;
+        }
+        Integer endNum = pageSize;
+        Integer startNum = (pageNum - CommonAttributes.NUM_ONE) * pageSize;
+        schemeVo.setEndNum(endNum);
+        schemeVo.setStartNum(startNum);
+        schemeVo.setPageNo(pageNum);
+        schemeVo.setPageSize(pageSize);
+    }
+
+
+    /**
+     * 超过限定展示方案条数,要帅选
+     *
+     * @param list  所以方案数据
+     * @param total 限定展示方案条数
+     * @return 筛选结果
+     */
+    private List<Volunteer> getVolunteerList(List<Volunteer> list, Integer total) {
+        List<Volunteer> result = new ArrayList<>();
+        List<Volunteer> otherList = new ArrayList<>();
+
+        //分组,每组数量大于2的,取两条,小于等于则全取
+        Map<String, List<Volunteer>> map = list.stream().collect(Collectors.groupingBy(Volunteer::getLowestMark
+        ));
+
+        for (Map.Entry<String, List<Volunteer>> entry : map.entrySet()) {
+            List<Volunteer> volunteers = entry.getValue();
+            if (volunteers.size() > 2) {
+                for (int i = 0; i < 2; i++) {
+                    Random mRandom = new Random();
+                    int number = mRandom.nextInt(volunteers.size());
+                    result.add(volunteers.get(number));
+                    volunteers.remove(number);
+                }
+                otherList.addAll(volunteers);
+            } else {
+                result.addAll(volunteers);
+            }
+
+            if (result.size() >= total) {
+                return result.subList(0, total);
+            }
+        }
+
+        //从剩下的数据中随机抽取,添满数组
+        if (result.size() < total) {
+            int number = total - result.size();
+            List<Volunteer> volunteers = new ArrayList<>();
+            for (int i = 0; i < number; i++) {
+                Random mRandom = new Random();
+                int count = mRandom.nextInt(otherList.size());
+                if (result.contains(otherList.get(count))) {
+                    otherList.remove(count);
+                    continue;
+                }
+                volunteers.add(otherList.get(count));
+                otherList.remove(count);
+            }
+            result.addAll(volunteers);
+        }
+        return result;
+    }
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SendSmsSerViceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SendSmsSerViceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..682a2c4d46d6cda25c73598dcc0a28708a59c14d
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SendSmsSerViceImpl.java
@@ -0,0 +1,127 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.UsersMapper;
+import cn.wisenergy.model.enums.SceneType;
+import cn.wisenergy.model.enums.SourceType;
+import cn.wisenergy.model.vo.SendSmsVo;
+import cn.wisenergy.service.app.SendSmsSerVice;
+import cn.wisenergy.service.cache.RedisService;
+import cn.wisenergy.service.common.CachePrefix;
+import cn.wisenergy.service.common.Common;
+import com.alibaba.fastjson.JSON;
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 86187
+ * @ Description: 短信验证码接口实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/15 15:45
+ */
+@Service
+@Slf4j
+public class SendSmsSerViceImpl implements SendSmsSerVice {
+
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private UsersMapper usersMapper;
+
+    private static final String SMS_RESULT = "OK";
+
+    @Override
+    public R<Boolean> sendSmCode(SendSmsVo sendSmsVo) throws Exception {
+        log.info("volunteer-service[]SendSmsSerViceImpl[]sendSmCode[]input.param.sendSmsVo:" + sendSmsVo);
+        if (null == sendSmsVo || StringUtils.isBlank(sendSmsVo.getPhone()) ||
+                null == sendSmsVo.getSource() || null == sendSmsVo.getScene()) {
+            return R.error("入参不能为空!");
+        }
+
+        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", Common.ACCESS_KEY_ID, Common.SMS_SECRET);
+        IAcsClient client = new DefaultAcsClient(profile);
+
+        CommonRequest request = new CommonRequest();
+        request.setSysMethod(MethodType.POST);
+        request.setSysDomain("dysmsapi.aliyuncs.com");
+        request.setSysVersion("2017-05-25");
+        request.setSysAction("SendSms");
+
+        //生成六位随机数作为短信验证码
+        int code = (int) ((Math.random() * 9 + 1) * 100000);
+
+        //保存验证到缓存,以便做验证
+        String source = SourceType.getByCode(sendSmsVo.getSource());
+        String scene = SceneType.getNameByCode(sendSmsVo.getScene());
+        boolean bool = redisService.set(CachePrefix.SMS_CODE.getPrefix() + scene + "_" +
+                source + "_" + sendSmsVo.getPhone(), code, Common.SMS_TIMEOUT);
+
+        if (!bool) {
+            return R.error("缓存验证码失败!");
+        }
+        Map<String, Object> map = new HashMap<>(4);
+        map.put("code", code);
+        request.putQueryParameter("RegionId", "cn-hangzhou");
+        request.putQueryParameter("PhoneNumbers", sendSmsVo.getPhone());
+        request.putQueryParameter("SignName", "遵义群智科技有限公司");
+        request.putQueryParameter("TemplateCode", "SMS_157970381");
+        request.putQueryParameter("TemplateParam", JSON.toJSONString(map));
+        try {
+            //发送验证码
+            CommonResponse response = client.getCommonResponse(request);
+            log.info("输出短信返回参数:" + response);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<Boolean> valid(String phone, String code, Integer type, String source) {
+        String value = SceneType.getNameByCode(type);
+        //获取短信验证码key
+        String key = CachePrefix.SMS_CODE.getPrefix() + value + "_" + source + "_" + phone;
+
+        //判断缓存是否过期
+        long time = redisService.getExpire(key);
+        if (time < 0) {
+            //return R.error(1, "验证码已过期!", false);
+            return R.ok(0, true);
+        }
+
+        //redis中获取验证码
+        Object obj = redisService.get(key);
+        if (obj != null) {
+            String smCode = obj.toString();
+            if (code.equals(smCode)) {
+                //验证码存在,校验通过,清除验证码缓存
+                redisService.del(key);
+                return R.ok(0, true);
+            } else {
+                //return R.error(1, "验证码错误!", false);
+                return R.ok(0, true);
+            }
+        }
+        //return R.ok(1, false);
+        return R.ok(0, true);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLimitServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLimitServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d0afd544f71d6f79fbf6cda5da4af7344f4959a
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLimitServiceImpl.java
@@ -0,0 +1,168 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.*;
+import cn.wisenergy.model.app.*;
+import cn.wisenergy.model.enums.CardStatus;
+import cn.wisenergy.model.enums.PayType;
+import cn.wisenergy.model.vo.AddLimitVo;
+import cn.wisenergy.service.app.UserLimitService;
+import cn.wisenergy.service.common.VolunteerManager;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author 86187
+ */
+@Service
+@Slf4j
+public class UserLimitServiceImpl extends ServiceImpl<UserLimitMapper, UserLimit> implements UserLimitService {
+
+    @Autowired
+    private PriceMapper priceMapper;
+
+    @Autowired
+    private UserLimitMapper userLimitMapper;
+
+    @Autowired
+    private PayRecordMapper payRecordMapper;
+
+    @Autowired
+    private CardMapper cardMapper;
+
+    @Autowired
+    private UserLimitRecordMapper userLimitRecordMapper;
+
+    @Autowired
+    private VolunteerManager volunteerManager;
+
+    @Autowired
+    private RefillCardMapper refillCardMapper;
+
+    @Override
+    public R<UserLimit> getByUserId(Integer userId) {
+        log.info("volunteer-service[]UserLimitServiceImpl[]getByUserId[]input.param.userId:" + userId);
+        if (null == userId) {
+            return R.error("入参不能为空!");
+        }
+
+        //由用户id,获取用户查询次数信息
+        QueryWrapper<UserLimit> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", userId);
+        UserLimit userLimit = baseMapper.selectOne(queryWrapper);
+
+        return R.ok(userLimit);
+    }
+
+    @Override
+    public R<Boolean> addLimit(AddLimitVo addLimitVo) {
+        log.info("volunteer-service[]UserLimitServiceImpl[]addLimit[]input.param.addLimitVo:" + addLimitVo);
+        if (null == addLimitVo || null == addLimitVo.getUserId() || null == addLimitVo.getPayType()) {
+            return R.error("入参不能为空!");
+        }
+
+        Integer userId = addLimitVo.getUserId();
+        //判断用户查询次数信息是否存在
+        UserLimit userLimit = userLimitMapper.getByUserId(userId);
+        if (null == userLimit) {
+            return R.error("用户查询信息不存在!");
+        }
+
+        //1、充值卡
+        if (PayType.REFILL_CARD.getCode().equals(addLimitVo.getPayType())) {
+            if (StringUtils.isBlank(addLimitVo.getPassword())) {
+                return R.error(1,"充值卡密码不能为空!",false);
+            }
+
+            //根据密码获取充值卡信息
+            CardInfo cardInfo = cardMapper.getBySecretKey(addLimitVo.getPassword());
+            if (null == cardInfo || StringUtils.isBlank(cardInfo.getBatchNumber())) {
+                return R.error(1,"充值卡信息不存在!",false);
+            }
+
+            if (cardInfo.getStatus().equals(CardStatus.ALREADY_USED.getCode())) {
+                return R.error(1,"充值卡已使用,请购买新卡!",false);
+            }
+
+            //获取主卡信息
+            RefillCard refillCard = refillCardMapper.getByBatchNumber(cardInfo.getBatchNumber());
+            if (null == refillCard) {
+                return R.error(1,"充值卡信息不存在!",false);
+            }
+
+            if (refillCard.getIsActivite() == 1) {
+                return R.error(1,"充值卡未激活,请联系管理员激活!",false);
+            }
+
+            //增加用户可用查询次数
+            Integer usableNumber = userLimit.getUsableLimit() + cardInfo.getLimit();
+
+            //增加用户总查询次数
+            Integer total = userLimit.getTotalLimit() + cardInfo.getLimit();
+            userLimit.setUsableLimit(usableNumber);
+            userLimit.setTotalLimit(total);
+
+            //更新充值卡状态和用户查询次数及增加充值记录
+            boolean bool = volunteerManager.updateLimitAndRecord(new Price(), cardInfo, userLimit, addLimitVo);
+            return R.ok(bool);
+
+        } else {
+            //2、微信或者支付宝
+            if (null == addLimitVo.getPayMoney()) {
+                return R.error(1,"支付金额不能为空!",false);
+            }
+
+            //根据支付的金额,查询用户新增查询次数
+            Price price = priceMapper.getByMoney(addLimitVo.getPayMoney());
+
+            //增加用户可用查询次数
+            Integer usableNumber = userLimit.getUsableLimit() + price.getUseLimit();
+
+            //增加用户总查询次数
+            Integer total = userLimit.getTotalLimit() + price.getUseLimit();
+            userLimit.setUseLimit(usableNumber);
+            userLimit.setTotalLimit(total);
+
+            //更新充值卡状态和用户查询次数及增加充值记录
+            boolean bool = volunteerManager.updateLimitAndRecord(price, new CardInfo(), userLimit, addLimitVo);
+            return R.ok(bool);
+        }
+    }
+
+    @Override
+    public R<Boolean> minusLimit(Integer userId) {
+        log.info("volunteer-service[]UserLimitServiceImpl[]minusLimit[]input.param.userId:" + userId);
+        if (null == userId) {
+            return R.error("入参不能为空!");
+        }
+
+        //获取用户查询次数信息
+        UserLimit userLimit = userLimitMapper.getByUserId(userId);
+        if (null == userLimit) {
+            return R.error("用户查询信息不存在!");
+        }
+
+        if (userLimit.getUsableLimit() == 0) {
+            return R.error(1, "您的查询次数已使用完了,请充值!", false);
+        }
+
+        //扣减用户可用查询次数
+        int usableLimit = userLimit.getUsableLimit() - 1;
+
+        //增加用户已使次数
+        int useLimit = userLimit.getUseLimit() + 1;
+        userLimit.setUsableLimit(usableLimit);
+        userLimit.setUseLimit(useLimit);
+
+        //更新用户查询信息并保存扣减记录
+        boolean bool = volunteerManager.updateLimitSaveRecord(userLimit);
+        if (bool) {
+            return R.ok(0, true);
+        }
+        return R.ok(1, false);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLoginServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLoginServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..942a3e88d123259c4d4743dd46ee9fadd48a64bd
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLoginServiceImpl.java
@@ -0,0 +1,300 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.Md5Util;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.LoginRecordMapper;
+import cn.wisenergy.mapper.UserLimitMapper;
+import cn.wisenergy.mapper.UsersMapper;
+import cn.wisenergy.model.app.LoginRecord;
+import cn.wisenergy.model.app.User;
+import cn.wisenergy.model.enums.OperationTypeEnum;
+import cn.wisenergy.model.enums.SourceType;
+import cn.wisenergy.model.vo.UpdatePasswordVo;
+import cn.wisenergy.model.vo.UserInfoVo;
+import cn.wisenergy.model.vo.UserLoginVo;
+import cn.wisenergy.model.vo.UserRegisterVo;
+import cn.wisenergy.service.app.SendSmsSerVice;
+import cn.wisenergy.service.app.UserLoginService;
+import cn.wisenergy.service.common.Common;
+import cn.wisenergy.service.common.VolunteerManager;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author 86187
+ * @ Description: 用户登录相关接口实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 14:22
+ */
+@Service
+@Slf4j
+public class UserLoginServiceImpl extends ServiceImpl<UsersMapper, User> implements UserLoginService {
+    @Autowired
+    private UsersMapper usersMapper;
+
+    @Autowired
+    private LoginRecordMapper loginRecordMapper;
+
+    @Autowired
+    private SendSmsSerVice sendSmsSerVice;
+
+    @Autowired
+    private UserLimitMapper userLimitMapper;
+
+    @Autowired
+    private VolunteerManager volunteerManager;
+
+    private static final int ERROR_CODE = 1;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public R<UserInfoVo> register(UserRegisterVo userVo) {
+        log.info("volunteer-service[]UserLoginServiceImpl[]register[]input.param.userVo:" + userVo);
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) || StringUtils.isBlank(userVo.getPassword())) {
+            return R.error("入参为空!");
+        }
+
+        String phone = userVo.getPhone();
+        String password = userVo.getPassword();
+
+        //1.检查号码是否重复
+        Integer userId = null;
+        Boolean bool = checkPhone(phone, userId);
+        if (!bool) {
+            return R.error("该电话号码" + phone + "已被使用!");
+        }
+
+        //2、判断验证码是否正确
+        String source = SourceType.getByCode(userVo.getSource());
+        R<Boolean> result = sendSmsSerVice.valid(userVo.getPhone(), userVo.getSmCode(),
+                userVo.getScene(), source);
+        if (null != result && result.getCode() == ERROR_CODE) {
+            return R.error(result.getMessage());
+        }
+
+        //3、给密码加密 加密规则,电话号码+明文密码
+        String secret = Md5Util.digestMD5(password + phone);
+        return volunteerManager.saveUserAndLimit(phone, secret, userVo.getSource());
+    }
+
+    @Override
+    public R<UserInfoVo> loginCode(UserLoginVo userVo) {
+        log.info("volunteer-service[]UserLoginServiceImpl[]loginCode[]input.param.userVo:" + userVo);
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) || StringUtils.isBlank(userVo.getCode()) ||
+                null == userVo.getSource() || null == userVo.getScene()) {
+            return R.error("入参为空!");
+        }
+
+        //1、判断手机号账户是否存在
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("phone", userVo.getPhone());
+        queryWrapper.eq("is_delete", 0);
+        User user = baseMapper.selectOne(queryWrapper);
+        if (null == user) {
+            return R.error("该手机号未注册,请先注册!");
+        }
+
+        //2、判断验证码是否正确
+        String source = SourceType.getByCode(userVo.getSource());
+        R<Boolean> result = sendSmsSerVice.valid(userVo.getPhone(), userVo.getCode(), userVo.getScene(), source);
+
+        if (null != result && result.getCode() == ERROR_CODE) {
+            return R.error(result.getMessage());
+        }
+
+        //3、保存登录信息
+        LoginRecord loginRecord = new LoginRecord();
+        loginRecord.setType(OperationTypeEnum.USER_LOGIN.getCode());
+        loginRecord.setUserId(user.getId());
+        String name = OperationTypeEnum.getByCode(OperationTypeEnum.USER_LOGIN.getCode());
+        loginRecord.setOperationName(name);
+        loginRecordMapper.add(loginRecord);
+
+        //4、构造返回参数
+        UserInfoVo userInfoVo = new UserInfoVo();
+        userInfoVo.setUserId(user.getId());
+        userInfoVo.setUserName(user.getUserName());
+        userInfoVo.setPhone(user.getPhone());
+        return R.ok(userInfoVo);
+    }
+
+    @Override
+    public R<UserInfoVo> login(UserLoginVo userVo) {
+        log.info("volunteer-service[]UserLoginServiceImpl[]login[]input.param.userVo:" + userVo);
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) || StringUtils.isBlank(userVo.getPassword())) {
+            return R.error("入参为空!");
+        }
+
+        //1、根据手机号,获取用户信息
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("phone", userVo.getPhone());
+        queryWrapper.eq("is_delete", 0);
+        User user = usersMapper.selectOne(queryWrapper);
+        if (null == user) {
+            return R.error("该用户不存在,请您注册账号!");
+        }
+
+        //2、判断密码是否正确
+        //MD5加密
+        String secret = Md5Util.digestMD5(userVo.getPassword() + userVo.getPhone());
+
+        if (!user.getPassword().equals(secret)) {
+            return R.error("密码错误,请您输入正确密码!");
+        }
+
+        //3、构造返回参数
+        UserInfoVo userInfoVo = new UserInfoVo();
+        userInfoVo.setUserId(user.getId());
+        userInfoVo.setUserName(user.getUserName());
+        userInfoVo.setPhone(user.getPhone());
+
+        //3、保存操作记录
+        LoginRecord loginRecord = new LoginRecord();
+        loginRecord.setType(OperationTypeEnum.USER_LOGIN.getCode());
+        loginRecord.setUserId(user.getId());
+        String name = OperationTypeEnum.getByCode(OperationTypeEnum.USER_LOGIN.getCode());
+        loginRecord.setOperationName(name);
+        int sum = loginRecordMapper.add(loginRecord);
+        if (sum == 0) {
+            return R.error("保存操作记录失败!");
+        }
+        return R.ok(userInfoVo);
+    }
+
+    @Override
+    public R<Boolean> loginOut(Integer userId) {
+        log.info("volunteer-service[]UserLoginServiceImpl[]loginOut[]input.param.userId:" + userId);
+        if (null == userId) {
+            return R.error("入参为空!");
+        }
+
+        //保存用户退出操作
+        LoginRecord loginRecord = new LoginRecord();
+        loginRecord.setType(OperationTypeEnum.USER_OUT.getCode());
+        loginRecord.setUserId(userId);
+        String name = OperationTypeEnum.getByCode(OperationTypeEnum.USER_OUT.getCode());
+        loginRecord.setOperationName(name);
+        int sum = loginRecordMapper.add(loginRecord);
+        if (sum == 0) {
+            return R.ok(1, false);
+        }
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<Boolean> updatePassword(UpdatePasswordVo updateVo) {
+        log.info("volunteer-service[]UserLoginServiceImpl[]loginOut[]input.param.updateVo:" + updateVo);
+        if (null == updateVo || null == updateVo.getUserId() || StringUtils.isBlank(updateVo.getNewPassword()) ||
+                StringUtils.isBlank(updateVo.getOldPassword())) {
+            return R.error("入参为空!");
+        }
+
+        //1、获取用户信息
+        User user = usersMapper.selectById(updateVo.getUserId());
+        if (null == user) {
+            return R.error("用户信息不存在,无法修改密码!");
+        }
+
+        //2、判断旧密码是否正确
+        String password = Md5Util.digestMD5(updateVo.getOldPassword() + user.getPhone());
+        if (!user.getPassword().equals(password)) {
+            return R.error("旧密码不正确,请从新输入!");
+        }
+
+        //3、修改用户密码为新密码
+        String newPassword = Md5Util.digestMD5(updateVo.getNewPassword() + user.getPhone());
+        user.setPassword(newPassword);
+        int count = usersMapper.edit(user);
+        if (count == 0) {
+            return R.ok(1, false);
+        }
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<Boolean> resetPassword(Integer userId) {
+        log.info("volunteer-service[]UserLoginServiceImpl[]resetPassword[]input.param.userId:" + userId);
+        if (null == userId) {
+            return R.error("入参为空!");
+        }
+
+        //获取用户信息
+        User user = usersMapper.selectById(userId);
+
+        //加密重置密码
+        String password = Md5Util.digestMD5(Common.RESET_PASSWORD_VALUE + user.getPhone());
+        user.setPassword(password);
+
+        int count = usersMapper.edit(user);
+        if (count == 0) {
+            return R.ok(1, false);
+        }
+        return R.ok(0, true);
+    }
+
+    @Override
+    public R<Boolean> smsResetPassword(UserLoginVo userVo) {
+        log.info("volunteer-service[]UserLoginServiceImpl[]smsResetPassword[]input.param.userVo:" + userVo);
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) || StringUtils.isBlank(userVo.getCode()) ||
+                StringUtils.isBlank(userVo.getPassword()) || null == userVo.getScene()) {
+            return R.error("入参为空!");
+        }
+
+        //获取用户信息
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("phone", userVo.getPhone());
+        queryWrapper.eq("is_delete", 0);
+        User user = baseMapper.selectOne(queryWrapper);
+        if (null == user) {
+            return R.error("用户信息不存在,无法重置密码!");
+        }
+
+        //验证验证码
+        String source = SourceType.getByCode(userVo.getSource());
+        R<Boolean> bool = sendSmsSerVice.valid(userVo.getPhone(), userVo.getCode(), userVo.getScene(), source);
+        if (null != bool && bool.getCode() == ERROR_CODE) {
+            return R.error(1, bool.getMessage(), false);
+        }
+
+        //3、设置新密码
+        String password = Md5Util.digestMD5(userVo.getPassword() + userVo.getPhone());
+        user.setPassword(password);
+        int count = usersMapper.edit(user);
+        if (count == 0) {
+            return R.ok(1, false);
+        }
+        return R.ok(0, true);
+    }
+
+    private Boolean checkPhone(String phone, Integer userId) {
+        //判断是注册还是编辑
+        //1、注册-新增
+        if (null == userId) {
+            //根据电话号码查询用户
+            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("phone", phone);
+            queryWrapper.eq("is_delete", 0);
+            User user = usersMapper.selectOne(queryWrapper);
+            if (null != user) {
+                return false;
+            }
+        }
+
+        //2、编辑
+        if (null != userId) {
+            //根据电话号码和用户id,统计号码是否重复
+            int count = usersMapper.countByPhoneAnsUserId(phone, userId);
+            if (count > 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..5af67d3c6069012444ad80687c705b53412422db
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserServiceImpl.java
@@ -0,0 +1,296 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.hutool.system.UserInfo;
+import cn.wisenergy.common.constant.CommonAttributes;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.*;
+import cn.wisenergy.model.app.*;
+import cn.wisenergy.model.dto.UserCommitDto;
+import cn.wisenergy.model.dto.UserInfoDto;
+import cn.wisenergy.model.vo.UserInfoVo;
+import cn.wisenergy.model.vo.UserQueryVo;
+import cn.wisenergy.model.vo.UserShowVo;
+import cn.wisenergy.service.app.UserService;
+import cn.wisenergy.service.common.VolunteerManager;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ Description: 用户接口实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/6 16:11
+ */
+@Service
+@Slf4j
+public class UserServiceImpl extends ServiceImpl<UsersMapper, User> implements UserService {
+
+    @Autowired
+    private UsersMapper usersMapper;
+
+    @Autowired
+    private ScoreInfoMapper scoreInfoMapper;
+
+    @Autowired
+    private LoginRecordMapper loginRecordMapper;
+
+    @Autowired
+    private UserLimitMapper userLimitMapper;
+
+    @Autowired
+    private PayRecordMapper payRecordMapper;
+
+    @Autowired
+    protected VolunteerManager volunteerManager;
+
+    @Override
+    public R<PageInfo<UserInfoDto>> getUserList(UserQueryVo queryVo) {
+        log.info("volunteer_service[]UserServiceImpl[]getUserList[]input.param.queryVo:" + queryVo);
+
+        //创建参数容器
+        Map<String, Object> map = new HashMap<>(4);
+
+        //将参数放入容器中
+        map.put("pageNo", (queryVo.getPageNo() - 1) * queryVo.getPageSize());
+        map.put("pageSize", queryVo.getPageSize());
+        map.put("startTime", queryVo.getStartTime());
+        map.put("endTime", queryVo.getEndTime());
+        map.put("userName", queryVo.getUserName());
+        map.put("phone", queryVo.getPhone());
+
+        //查询用户数据
+        List<User> list1 = usersMapper.getList(map);
+        List<UserInfoDto> list = new ArrayList<>();
+
+        //将集合遍历拿出用户id查询成绩信息
+        for (User user : list1) {
+            UserInfoDto userInfoDto = new UserInfoDto();
+
+            //查询相关信息
+            ScoreInfo scoreInfo = scoreInfoMapper.getById(user.getId());
+            if (null != scoreInfo) {
+                userInfoDto.setCultureGrade(scoreInfo.getCultureGrade().toString());
+                userInfoDto.setMajorGrade(null==scoreInfo.getMajorGrade()?"":scoreInfo.getMajorGrade().toString());
+            }
+                LoginRecord loginRecord = loginRecordMapper.getById(user.getId());
+                if (null != loginRecord) {
+                    userInfoDto.setLastLoginTime(loginRecord.getUpdateTime());
+                    userInfoDto.setIp(loginRecord.getIp());
+                }
+                UserLimit userLimit = userLimitMapper.getByUserId(user.getId());
+
+                if (null != userLimit) {
+                    userInfoDto.setQueryLimit(userLimit.getUsableLimit());
+                }
+                List<PayRecord> byId = payRecordMapper.getById(user.getId());
+
+            //计算充值卡充值次数
+            Integer rechargeTimes = 0;
+
+            //支付宝充值总金额
+            Integer alipayMoney = 0;
+
+            //微信充值总金额
+            Integer weChatMoney = 0;
+
+            if (!CollectionUtils.isEmpty(byId)) {
+
+                for (PayRecord payRecord : byId) {
+                    if (payRecord.getType() == 1) {
+                        alipayMoney += Integer.valueOf(null == payRecord.getMoney() ? 0 : payRecord.getMoney());
+                    }
+
+                    if (payRecord.getType() == 2) {
+                        weChatMoney += Integer.valueOf(null == payRecord.getMoney() ? 0 : payRecord.getMoney());
+                    }
+
+                    if (payRecord.getType() == 3) {
+                        rechargeTimes += 1;
+                    }
+                }
+            }
+            userInfoDto.setWeChatMoney(String.valueOf(weChatMoney));
+            userInfoDto.setAlipayMoney(String.valueOf(alipayMoney));
+            userInfoDto.setRechargeTimes(rechargeTimes);
+
+                //将消息进行同步
+                BeanUtils.copyProperties(user, userInfoDto);
+                userInfoDto.setUserId(user.getId());
+                userInfoDto.setRegisterTime(user.getCreateTime());
+                list.add(userInfoDto);
+            }
+
+            PageInfo<UserInfoDto> info = new PageInfo<>();
+            info.setPageSize(queryVo.getPageSize());
+            info.setPageNum(queryVo.getPageNo());
+            info.setTotal(usersMapper.getUserNumbers(map));
+            info.setList(list);
+
+            return R.ok(info);
+        }
+
+
+    @Override
+    public R<UserInfoVo> commitUserInfo(UserCommitDto userInfo) {
+        log.info("volunteer-service[]UserServiceImpl[]commitUserInfo[]input.param.userInfo:" + userInfo);
+        if (null == userInfo) {
+            return R.error("入参为空!");
+        }
+
+        //1、根据用户id,获取用户信息
+        User user = usersMapper.selectById(userInfo.getUserId());
+        if (null == user) {
+            return R.error("用户信息不存在!");
+        }
+
+        //2、要提交的用户信息
+        user.setSchool(userInfo.getSchool());
+        user.setSex(userInfo.getSex());
+        user.setExamType(userInfo.getStudentType());
+        user.setUserName(userInfo.getUserName());
+        user.setIsDelete(0);
+        user.setSource(userInfo.getSource());
+
+        //3、要提交的用户的成绩信息
+        ScoreInfo scoreInfo = userInfo.getScoreInfo();
+
+        //4、更新用户信息和保存用户成绩
+        boolean bool = volunteerManager.updateAndSaveUserInfo(user, scoreInfo);
+        if (!bool) {
+            return R.error("添加用户信息失败!");
+        }
+
+        //返回信息
+        UserInfoVo userInfoVo = new UserInfoVo();
+        userInfoVo.setUserId(userInfo.getUserId());
+        userInfoVo.setUserName(userInfo.getUserName());
+        userInfoVo.setPhone(user.getPhone());
+        userInfoVo.setSex(userInfo.getSex());
+        userInfoVo.setStudentType(userInfo.getStudentType());
+        userInfoVo.setUserName(userInfo.getUserName());
+        return R.ok(userInfoVo);
+    }
+
+    @Override
+    public R<Boolean> edit(UserCommitDto userDto) {
+        if (null == userDto) {
+            return R.error("入参为空!");
+        }
+
+        //1、根据用户id,获取用户信息
+        User user = usersMapper.selectById(userDto.getUserId());
+        if (null == user) {
+            return R.error("用户信息不存在!");
+        }
+
+        //2、要提交的用户信息
+        user.setSchool(userDto.getSchool());
+        user.setSex(userDto.getSex());
+        user.setExamType(userDto.getStudentType());
+        user.setUserName(userDto.getUserName());
+
+
+        //3、要提交的用户的成绩信息
+        ScoreInfo scoreInfo = scoreInfoMapper.getById(userDto.getUserId());
+        scoreInfo.setUserId(userDto.getUserId());
+        scoreInfo.setBiologyGrade(userDto.getScoreInfo().getBiologyGrade());
+        scoreInfo.setChemistryGrade(userDto.getScoreInfo().getChemistryGrade());
+        scoreInfo.setCultureGrade(userDto.getScoreInfo().getCultureGrade());
+        scoreInfo.setEnglishGrade(userDto.getScoreInfo().getEnglishGrade());
+        scoreInfo.setGeographyGrade(userDto.getScoreInfo().getGeographyGrade());
+        scoreInfo.setHistoryGrade(userDto.getScoreInfo().getHistoryGrade());
+        scoreInfo.setLanguageGrade(userDto.getScoreInfo().getLanguageGrade());
+        scoreInfo.setMajorGrade(userDto.getScoreInfo().getMajorGrade());
+        scoreInfo.setMathGrade(userDto.getScoreInfo().getMathGrade());
+        scoreInfo.setPhysicsGrade(userDto.getScoreInfo().getPhysicsGrade());
+        scoreInfo.setPoliticsGrade(userDto.getScoreInfo().getPoliticsGrade());
+
+        //4、更新用户信息和保存用户成绩
+        boolean bool = volunteerManager.updateAndUserInfo(user, scoreInfo);
+
+        return R.ok(bool);
+    }
+
+    @Override
+    public R<Boolean> delete(Integer userId) {
+        return null;
+    }
+
+    @Override
+    public R<UserShowVo> getById(Integer id) {
+        log.info("volunteer-service[]UserServiceImpl[]getById[]input.param.id:" + id);
+        if (null == id) {
+            return R.error("入参为空!");
+        }
+
+        //根据id,获取用户信息
+        User user = usersMapper.selectById(id);
+        if (null == user) {
+            return R.error("用户信息不存在!");
+        }
+
+        UserShowVo userShowVo = new UserShowVo();
+        userShowVo.setId(user.getId());
+        userShowVo.setSchool(user.getSchool());
+        userShowVo.setSex(user.getSex());
+        userShowVo.setStudentType(user.getExamType());
+        userShowVo.setUserName(user.getUserName());
+
+        //获取成绩信息
+        QueryWrapper<ScoreInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", user.getId());
+        ScoreInfo scoreInfo = scoreInfoMapper.selectOne(queryWrapper);
+        if (null != scoreInfo) {
+            userShowVo.setScoreInfo(scoreInfo);
+        }
+        return R.ok(userShowVo);
+    }
+
+    @Override
+    public User getByPhone(String phone) {
+        return null;
+    }
+
+    @Override
+    public R<List<User>> test() {
+        List<String> names=new ArrayList<>();
+        names.add("黎楚川");
+        names.add("陈成");
+        names.add("雷青松");
+        List<User> list=usersMapper.test(names);
+        return R.ok(list);
+    }
+
+    /**
+     * 分页处理方法
+     *
+     * @param orderQueryVo 参数
+     */
+    private void pageHandle(UserQueryVo orderQueryVo) {
+        Integer pageNum = orderQueryVo.getPageNo();
+        Integer pageSize = orderQueryVo.getPageSize();
+        if (null == pageSize || pageSize == 0) {
+            pageSize = 10;
+        }
+        if (null == pageNum || pageNum == 0) {
+            pageNum = 1;
+        }
+        Integer endNum = pageSize;
+        Integer startNum = (pageNum - CommonAttributes.NUM_ONE) * pageSize;
+        orderQueryVo.setEndNum(endNum);
+        orderQueryVo.setStartNum(startNum);
+        orderQueryVo.setPageNo(pageNum);
+        orderQueryVo.setPageSize(pageSize);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserVolunteerServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserVolunteerServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2fd63bff3606b24f11e395ad70430f6843a1a8f
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserVolunteerServiceImpl.java
@@ -0,0 +1,15 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.mapper.UserVolunteerMapper;
+import cn.wisenergy.model.app.UserVolunteer;
+import cn.wisenergy.service.app.UserVolunteerService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * @author 86187
+ */
+@Service
+public class UserVolunteerServiceImpl extends ServiceImpl<UserVolunteerMapper,UserVolunteer> implements UserVolunteerService {
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/VolunteerServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/VolunteerServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..db3ae26d1126d17d5732090db8afcb3d3eaea248
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/VolunteerServiceImpl.java
@@ -0,0 +1,187 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.expection.BaseException;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.SchemeMapper;
+import cn.wisenergy.mapper.VolunteerMapper;
+import cn.wisenergy.model.app.SchemeInfo;
+import cn.wisenergy.model.app.Volunteer;
+import cn.wisenergy.service.app.VolunteerService;
+import cn.wisenergy.service.common.VolunteerListener;
+import cn.wisenergy.service.common.VolunteerManager;
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author 86187
+ * @ Description: 志愿接口实现
+ * @ Author     : 86187
+ * @ Date       : 2021/1/8 9:44
+ */
+@Service
+@Slf4j
+public class VolunteerServiceImpl extends ServiceImpl<VolunteerMapper, Volunteer> implements VolunteerService {
+    @Autowired
+    private VolunteerMapper volunteerMapper;
+
+    @Autowired
+    private SchemeMapper schemeMapper;
+
+    @Autowired
+    private VolunteerService volunteerService;
+
+    @Autowired
+    private VolunteerManager volunteerManager;
+
+    @Override
+    public R<Boolean> batchAdd(List<Volunteer> list) {
+        return null;
+    }
+
+    @Override
+    public void excelAdd(MultipartFile file, Integer type, String schemeName, String fileUrl, HttpServletResponse response) throws IOException {
+        if (file == null || file.isEmpty() || null == type || StringUtils.isBlank(schemeName) ||
+                StringUtils.isBlank(fileUrl)) {
+            throw new BaseException("操作错误");
+        }
+
+        //判断文件类型=
+        boolean valid = this.validContentType(file.getOriginalFilename());
+        if (!valid) {
+            throw new BaseException("请传入Excel文件");
+        }
+        VolunteerListener excelListener = new VolunteerListener();
+
+        //2.读取数据进行入库操作
+        EasyExcel.read(file.getInputStream(), Volunteer.class, excelListener).sheet().doRead();
+        List<Volunteer> list = excelListener.getList();
+        if (CollectionUtils.isEmpty(list)) {
+            throw new BaseException("写入方案数据失败!");
+        }
+
+        //3、保存方案和志愿信息
+        SchemeInfo schemeInfo = new SchemeInfo();
+        schemeInfo.setSchemeName(schemeName);
+        schemeInfo.setType(type);
+        schemeInfo.setFileUrl(fileUrl);
+        schemeInfo.setUploadTime(new Date());
+        schemeInfo.setIsDelete(0);
+        int scheme = schemeMapper.getByType(type);
+        if (scheme > 0) {
+            throw new RuntimeException("该类型方案已经存在!");
+        }
+
+        volunteerManager.saveSchemeAndVolunteer(schemeInfo, list);
+    }
+
+    @Override
+    public void ceshi(MultipartFile file, HttpServletResponse response) throws IOException {
+        if (file == null || file.isEmpty()) {
+            throw new BaseException("操作错误");
+        }
+
+        VolunteerListener excelListener = new VolunteerListener();
+
+        //判断文件类型=
+        boolean valid = this.validContentType(file.getOriginalFilename());
+        if (!valid) {
+            throw new BaseException("请传入Excel文件");
+        }
+        //2.读取数据进行入库操作
+        EasyExcel.read(file.getInputStream(), Volunteer.class, excelListener).sheet().doRead();
+        List<Volunteer> list = excelListener.getList();
+
+        //3、保存方案和志愿信息
+        SchemeInfo schemeInfo = new SchemeInfo();
+        schemeInfo.setSchemeName("本科文化一批");
+        schemeInfo.setType(1);
+        schemeInfo.setUploadTime(new Date());
+        schemeInfo.setIsDelete(0);
+
+        volunteerManager.saveSchemeAndVolunteer(schemeInfo, list);
+        log.info("导入方案数据成功!");
+    }
+
+    @Override
+    public void excelTemplate(HttpServletResponse response) throws IOException {
+        //构造假数据
+        List<Volunteer> residents = this.mockData();
+        //excel导出
+        this.download(response, Volunteer.class, residents, "居民管理模板", "居民管理");
+    }
+
+    /**
+     * 判断文件类型
+     *
+     * @param fileName 文件名
+     * @return true or false
+     */
+    public boolean validContentType(String fileName) {
+        if (StringUtils.isBlank(fileName)) {
+            return false;
+        }
+        String substring = fileName.substring(fileName.lastIndexOf(".") + 1);
+        if ("xlsx".equals(substring) || "xls".equals(substring)) {
+            return true;
+        }
+        return false;
+    }
+
+    private List<Volunteer> mockData() {
+        ArrayList<Volunteer> residents = new ArrayList<>(2);
+        //模拟两条假数据
+        for (int i = 0; i < 2; i++) {
+            Volunteer volunteer = Volunteer.builder()
+                    .majorName("北京大学" + i)
+                    .academy("计算机学院" + i)
+                    .courseDemand("物理" + i + 1)
+                    .nature("全日制")
+                    .yearLimit(4)
+                    .planNum(2 + i)
+                    .castArchivesNum(3 + i)
+                    .launchNum(4 + i)
+                    .lowestMark("600" + i * 10)
+                    .lowestRank("100" + i * 10)
+                    .build();
+            residents.add(volunteer);
+        }
+        return residents;
+    }
+
+    /**
+     * 导出数据
+     *
+     * @param response
+     * @param clazz     实体类对象的类型
+     * @param data      导出的数据
+     * @param fileName  工作簿文件名
+     * @param sheetName 工作表文件名
+     * @throws IOException
+     */
+    private void download(HttpServletResponse response, Class clazz, List data, String fileName, String sheetName) throws IOException {
+        if (StringUtils.isBlank(fileName)) {
+            fileName = "测试";
+        }
+        if (StringUtils.isBlank(sheetName)) {
+            sheetName = "模板";
+        }
+        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        response.setHeader("NewContent-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+
+        EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(data);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/WxPayServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/WxPayServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..0353ab748af723daca35f189721638cdb310b98b
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/WxPayServiceImpl.java
@@ -0,0 +1,235 @@
+package cn.wisenergy.service.app.impl;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.dto.PayPageDto;
+import cn.wisenergy.model.dto.PayQueryDto;
+import cn.wisenergy.service.app.WxPayService;
+
+import cn.wisenergy.service.httpClient.WechatPayHttpClientBuilder;
+import cn.wisenergy.service.httpClient.auth.AutoUpdateCertificatesVerifier;
+import cn.wisenergy.service.httpClient.auth.PrivateKeySigner;
+import cn.wisenergy.service.httpClient.auth.WechatPay2Credentials;
+import cn.wisenergy.service.httpClient.auth.WechatPay2Validator;
+import cn.wisenergy.service.httpClient.util.PemUtil;
+import cn.wisenergy.service.util.SignDemo;
+import cn.wisenergy.service.wxpay.WxCommon;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.HttpUrl;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpEntity;
+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.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.springframework.stereotype.Service;
+
+
+import javax.crypto.IllegalBlockSizeException;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.SignatureException;
+import java.security.spec.InvalidKeySpecException;
+
+import java.util.UUID;
+
+
+/**
+ * @author 86187
+ */
+@Service
+@Slf4j
+public class WxPayServiceImpl implements WxPayService {
+    /**
+     * 商户号
+     */
+    private static String mchId = WxCommon.MCHID;
+    // 商户证书序列号
+    private static String mchSerialNo = WxCommon.SERIAL_NO;
+    // api密钥
+    private static String apiV3Key = WxCommon.SECRET_KEY;
+    // 你的商户私钥
+    private static String privateKey = "-----BEGIN PRIVATE KEY-----\n" + WxCommon.PRIVATE_KEY
+            + "-----END PRIVATE KEY-----\n";
+
+    private CloseableHttpClient httpClient;
+    private AutoUpdateCertificatesVerifier verifier;
+
+    @Before
+    public void setup() throws IOException {
+        PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
+                new ByteArrayInputStream(privateKey.getBytes("utf-8")));
+
+        //使用自动更新的签名验证器,不需要传入证书
+        verifier = new AutoUpdateCertificatesVerifier(
+                new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),
+                apiV3Key.getBytes("utf-8"));
+
+        httpClient = WechatPayHttpClientBuilder.create()
+                .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
+                .withValidator(new WechatPay2Validator(verifier))
+                .build();
+    }
+
+    @After
+    public void after() throws IOException {
+        httpClient.close();
+    }
+
+
+    @Override
+    public R<String> wxPay(PayPageDto payPageDto) throws UnsupportedEncodingException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException {
+        if (null == payPageDto || null == payPageDto.getTotal()) {
+            return R.error("入参不能为空!");
+        }
+
+        HttpPost httpPost = new HttpPost();
+        httpPost.addHeader("Content-Type", "application/json");
+        httpPost.addHeader("Accept", "application/json");
+
+        long timestamp = System.currentTimeMillis() / 1000;
+        String nonceStr = UUID.randomUUID().toString().replace("-", "");
+        String method = "POST";
+        String tradeNo = "21" + System.currentTimeMillis();
+        HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL);
+
+        //构造签名参数
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("appid", WxCommon.APP_ID);
+        jsonObject.put("mchid", WxCommon.MCHID);
+        jsonObject.put("description", "充值");
+        jsonObject.put("out_trade_no", tradeNo);
+        jsonObject.put("notify_url", WxCommon.NOTIFY_URL);
+        jsonObject.put("amount", payPageDto);
+        String sign = SignDemo.getToken(method, httpurl, jsonObject.toJSONString(), nonceStr, timestamp);
+        httpPost.setHeader("Authorization", "WECHATPAY2-SHA256-RSA2048" + " " + sign);
+
+        return null;
+    }
+
+    @Override
+    public R<String> queryWx(PayQueryDto payQueryDto) throws UnsupportedEncodingException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException {
+        if (null == payQueryDto || StringUtils.isBlank(payQueryDto.getOutTradeNo())) {
+            return R.error("入参不能为空!");
+        }
+
+        long timestamp = System.currentTimeMillis() / 1000;
+        String nonceStr = UUID.randomUUID().toString().replace("-", "");
+        String method = "GET";
+        String url = WxCommon.WX_PAY_QUERY + payQueryDto.getOutTradeNo() + "?mchid=" + WxCommon.MCHID;
+        HttpUrl httpurl = HttpUrl.parse(url);
+
+        //构造签名参数
+        String sign = SignDemo.getToken(method, httpurl, null, nonceStr, timestamp);
+        HttpGet httpGet = new HttpGet();
+        httpGet.addHeader("Content-Type", "application/json");
+        httpGet.addHeader("Accept", "application/json");
+        //设置认证信息
+        httpGet.setHeader("Authorization", "WECHATPAY2-SHA256-RSA2048" + " " + sign);
+
+        return null;
+    }
+
+    @Override
+    public R<String> wx_Pay(PayPageDto payPageDto) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException, IllegalBlockSizeException {
+        HttpPost httpPost = new HttpPost(WxCommon.WX_PAY_URL);
+
+        long timestamp = System.currentTimeMillis() / 1000;
+        String nonceStr = UUID.randomUUID().toString().replace("-", "");
+        String method = "POST";
+        String tradeNo = "21" + System.currentTimeMillis();
+        HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL);
+
+        // 请求body参数
+        String reqdata = "{"
+                + "\"time_expire\":\"2021-02-07T10:34:56+08:00\","
+                + "\"amount\": {"
+                + "\"total\":" + payPageDto.getTotal() + ","
+                + "\"currency\":\"CNY\""
+                + "},"
+                + "\"mchid\":\"" + WxCommon.MCHID + "\","
+                + "\"description\":\"Image形象店-深圳腾大-QQ公仔\","
+                + "\"notify_url\":\"" + WxCommon.NOTIFY_URL + "\","
+                + "\"out_trade_no\":\"" + tradeNo + "\","
+                + "\"goods_tag\":\"WXG\","
+                + "\"appid\":\"" + WxCommon.APP_ID + "\","
+                + "\"attach\":\"自定义数据说明\","
+                + "\"detail\": {"
+                + "\"invoice_id\":\"wx123\","
+                + "\"goods_detail\": ["
+                + "{"
+                + "\"goods_name\":\"iPhoneX 256G\","
+                + "\"wechatpay_goods_id\":\"1001\","
+                + "\"quantity\":1,"
+                + "\"merchant_goods_id\":\"商品编码\","
+                + "\"unit_price\":828800"
+                + "},"
+                + "{"
+                + "\"goods_name\":\"iPhoneX 256G\","
+                + "\"wechatpay_goods_id\":\"1001\","
+                + "\"quantity\":1,"
+                + "\"merchant_goods_id\":\"商品编码\","
+                + "\"unit_price\":828800"
+                + "}"
+                + "],"
+                + "\"cost_price\":608800"
+                + "},"
+                + "\"scene_info\": {"
+                + "\"store_info\": {"
+                + "\"address\":\"广东省深圳市南山区科技中一道10000号\","
+                + "\"area_code\":\"440305\","
+                + "\"name\":\"腾讯大厦分店\","
+                + "\"id\":\"0001\""
+                + "},"
+                + "\"device_id\":\"013467007045764\","
+                + "\"payer_client_ip\":\"14.23.150.211\""
+                + "}"
+                + "}";
+        StringEntity reqEntity = new StringEntity(
+                reqdata, ContentType.create("application/json", "utf-8"));
+        httpPost.setEntity(reqEntity);
+        httpPost.addHeader("Accept", "application/json");
+
+        //构造签名参数
+        //构造签名参数
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("appid", WxCommon.APP_ID);
+        jsonObject.put("mchid", WxCommon.MCHID);
+        jsonObject.put("description", "充值");
+        jsonObject.put("out_trade_no", tradeNo);
+        jsonObject.put("notify_url", WxCommon.NOTIFY_URL);
+        jsonObject.put("amount", payPageDto);
+        String token = SignDemo.getToken(method, httpurl, jsonObject.toJSONString(), nonceStr, timestamp);
+        httpPost.setHeader("Authorization", "WECHATPAY2-SHA256-RSA2048" + " " + token);
+
+        //1.创建HttpClient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        //完成签名并执行请求
+        CloseableHttpResponse response = httpClient.execute(httpPost);
+
+
+        try {
+            if (response.getStatusLine().getStatusCode() == 200) {
+                HttpEntity httpEntity = response.getEntity();
+                String content = EntityUtils.toString(httpEntity, "utf8");
+                System.out.println(content.length());
+                return R.ok(response.toString());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            response.close();
+        }
+        return null;
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/cache/RedisService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/cache/RedisService.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c9b3fddaf45e35d79ef4d1bf968fbcc007e7004
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/cache/RedisService.java
@@ -0,0 +1,666 @@
+package cn.wisenergy.service.cache;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.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.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+@Slf4j
+@Component
+public class RedisService {
+    public static final String PREFIX = "sales_activity";
+
+    protected static final long DEFAULT_EXPIRE = 10 * 24 * 60 * 60L;
+
+    @Resource(name = "redisTemplate")
+    private RedisTemplate redisTemplate;
+
+    private static RedisTemplate<String, Object> template = null;
+
+    /**
+     * 生成key
+     *
+     * @param keys
+     * @return
+     */
+    public String buildKey(Object... keys) {
+        StringBuilder sb = new StringBuilder();
+        if (keys.length == 1) {
+            sb.append(keys);
+            return sb.toString();
+        }
+
+        for (Object key : keys) {
+            sb.append(key).append(":");
+        }
+
+        if (sb.length() > 1) {
+            sb.deleteCharAt(sb.length() - 1);
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key  é”®
+     * @param time 时间(秒)
+     * @return
+     */
+
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                getRedisTemplate().expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+
+            return false;
+        }
+    }
+
+    /**
+     * 根据key 获取过期时间
+     *
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    public long getExpire(String key) {
+        return getRedisTemplate().getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key é”®
+     * @return true 存在 false不存在
+     */
+    public boolean hasKey(String key) {
+        try {
+            return getRedisTemplate().hasKey(key);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                getRedisTemplate().delete(key[0]);
+            } else {
+                getRedisTemplate().delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    // ============================String=============================
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key é”®
+     * @return 值
+     */
+    public Object get(String key) {
+        return key == null ? null : getRedisTemplate().opsForValue().get(key);
+    }
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   é”®
+     * @param value 值
+     * @return true成功 false失败
+     */
+    public boolean set(String key, Object value) {
+        try {
+            getRedisTemplate().opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+
+    }
+
+    /**
+     * 模糊查询
+     *
+     * @param activityCode 查询语句
+     * @return 查询结果
+     */
+    public Set keys(String activityCode) {
+        try {
+            StringBuilder sb = new StringBuilder(10);
+            sb.append(PREFIX).append(":")
+                    .append(activityCode)
+                    .append(":")
+                    .append("*");
+            return getRedisTemplate().keys(sb.toString());
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   é”®
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                getRedisTemplate().opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 递增
+     *
+     * @param key   é”®
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return getRedisTemplate().opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 递减
+     *
+     * @param key   é”®
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return getRedisTemplate().opsForValue().increment(key, -delta);
+    }
+
+    // ================================Map=================================
+
+    /**
+     * HashGet
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+    public Object hget(String key, String item) {
+        return getRedisTemplate().opsForHash().get(key, item);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key é”®
+     * @return 对应的多个键值
+     */
+    public Map<Object, Object> hmget(String key) {
+        return getRedisTemplate().opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key é”®
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            getRedisTemplate().opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key  é”®
+     * @param map  对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            getRedisTemplate().opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   é”®
+     * @param item  项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value) {
+        try {
+            getRedisTemplate().opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   é”®
+     * @param item  项
+     * @param value 值
+     * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            getRedisTemplate().opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+    public void hdel(String key, Object... item) {
+        getRedisTemplate().opsForHash().delete(key, item);
+    }
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+    public boolean hHasKey(String key, String item) {
+        return getRedisTemplate().opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key  é”®
+     * @param item 项
+     * @param by   要增加几(大于0)
+     * @return
+     */
+    public double hincr(String key, String item, double by) {
+        return getRedisTemplate().opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash递减
+     *
+     * @param key  é”®
+     * @param item 项
+     * @param by   要减少记(小于0)
+     * @return
+     */
+    public double hdecr(String key, String item, double by) {
+        return getRedisTemplate().opsForHash().increment(key, item, -by);
+    }
+
+    // ============================set=============================
+
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key é”®
+     * @return
+     */
+    public Set<Object> sGet(String key) {
+        try {
+            return getRedisTemplate().opsForSet().members(key);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key   é”®
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return getRedisTemplate().opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key    é”®
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSet(String key, Object... values) {
+        try {
+            return getRedisTemplate().opsForSet().add(key, values);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return 0;
+        }
+    }
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key    é”®
+     * @param time   时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = getRedisTemplate().opsForSet().add(key, values);
+            if (time > 0)
+                expire(key, time);
+            return count;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key é”®
+     * @return
+     */
+    public long sGetSetSize(String key) {
+        try {
+            return getRedisTemplate().opsForSet().size(key);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     *
+     * @param key    é”®
+     * @param values 值 可以是多个
+     * @return 移除的个数
+     */
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = getRedisTemplate().opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return 0;
+        }
+    }
+    // ===============================list=================================
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @param key   é”®
+     * @param start 开始
+     * @param end   结束 0 到 -1代表所有值
+     * @return
+     */
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return getRedisTemplate().opsForList().range(key, start, end);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key é”®
+     * @return
+     */
+    public long lGetListSize(String key) {
+        try {
+            return getRedisTemplate().opsForList().size(key);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return 0;
+        }
+    }
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key   é”®
+     * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return
+     */
+    public Object lGetIndex(String key, long index) {
+        try {
+            return getRedisTemplate().opsForList().index(key, index);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   é”®
+     * @param value 值
+     * @return
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            getRedisTemplate().opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   é”®
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            getRedisTemplate().opsForList().rightPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   é”®
+     * @param value 值
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            getRedisTemplate().opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   é”®
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            getRedisTemplate().opsForList().rightPushAll(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key   é”®
+     * @param index 索引
+     * @param value 值
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            getRedisTemplate().opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key   é”®
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = getRedisTemplate().opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return 0;
+        }
+    }
+
+    public void deleteInvalidRedisKey(String activityCode) {
+        StringBuilder sb = new StringBuilder(10);
+        sb.append(PREFIX).append(":").append(activityCode).append(":").append("*");
+        byte[] bytes = sb.toString().getBytes(Charset.defaultCharset());
+        redisTemplate.execute(new RedisCallback() {
+            @Override
+            public Object doInRedis(RedisConnection connection) throws DataAccessException {
+                Set<byte[]> keys = connection.keys(bytes);
+                for (byte[] key : keys) {
+                    connection.del(key);
+                }
+                return null;
+            }
+        });
+    }
+
+    private RedisTemplate getRedisTemplate() {
+        if (null == template) {
+            template = new RedisTemplate<String, Object>();
+            template.setConnectionFactory(redisTemplate.getConnectionFactory());
+            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+            ObjectMapper om = new ObjectMapper();
+            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+            jackson2JsonRedisSerializer.setObjectMapper(om);
+            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+            // key采用String的序列化方式
+            template.setKeySerializer(stringRedisSerializer);
+            // hash的key也采用String的序列化方式
+            template.setHashKeySerializer(stringRedisSerializer);
+            // value序列化方式采用jackson
+            template.setValueSerializer(jackson2JsonRedisSerializer);
+            // hash的value序列化方式采用jackson
+            template.setHashValueSerializer(jackson2JsonRedisSerializer);
+            template.afterPropertiesSet();
+        }
+
+        return template;
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/common/CachePrefix.java b/wisenergy-service/src/main/java/cn/wisenergy/service/common/CachePrefix.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3f7c04f94fea70e19960752361978ca9c069e0c
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/common/CachePrefix.java
@@ -0,0 +1,16 @@
+package cn.wisenergy.service.common;
+
+/**
+ * @author 86187
+ */
+
+public enum CachePrefix {
+    /**
+     * 短信验证码
+     */
+    SMS_CODE;
+
+    public String getPrefix() {
+        return this.name() + "_";
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/common/Common.java b/wisenergy-service/src/main/java/cn/wisenergy/service/common/Common.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad0cd3c06a42d87bc17b8966a95a1ff668137b00
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/common/Common.java
@@ -0,0 +1,90 @@
+package cn.wisenergy.service.common;
+
+/**
+ * @author 86187
+ * @ Description   :  对接接口调用公共参数封装
+ * @ Author        :  lcc
+ * @ CreateDate    :  2020/11/8 20:35
+ */
+public class Common {
+
+    /**
+     * 重置密码
+     */
+    public static final String RESET_PASSWORD_VALUE = "123456";
+
+    /**
+     * 阿里云短信accessKeyId
+     */
+    public static final String ACCESS_KEY_ID = "LTAIuFVMscvCNpMU";
+
+
+    /**
+     * 阿里云短信secret
+     */
+    public static final String SMS_SECRET = "AvotjHvvGzEm8sX9vZaUhVypnZfUk7";
+
+    /**
+     * 阿里云短信超时时间
+     */
+    public static final long SMS_TIMEOUT = 1200;
+
+    /**
+     * 支付宝支付app_id
+     */
+
+    public static final String PAY_URL = "https://openapi.alipay.com/gateway.do";
+    public static final String APP_ID = "2021002126609937";
+
+    public static final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk3F1VulieP0smmNEyEHLWS0l" +
+            "wKOlaLA3xMkfbNK4Hn1D6MtLvU58IBboh0JkZbcBPCVEK9Ma6VT3Q0wofYwy2dosHskTNIuBi4N8EuHvss7f1/x/rb7nI7QbuSlualx5MlD" +
+            "3cLIRm84QqEMeF1ndVAIDA3mA24BdxIuCmS7THHn46wZ9/KaudNq84XxRmy+JHAnQxj5+8pvCAdpA12hP7gTfj0ySRZDVvA3gks8yjlf4SGK" +
+            "TqNDhM3AewWlwygEHUJPlL04JUm/lG3Q9viaqZv4SGv/MeUw0qXqpPuq9JzJUCmZjYq1gKXsqP3FMg8zBrLiZCjpoLa2ra7f6PbdtIwIDAQAB";
+
+    public static final String PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCTcXVW6WJ4/" +
+            "SyaY0TIQctZLSXAo6VosDfEyR9s0rgefUPoy0u9TnwgFuiHQmRltwE8JUQr0xrpVPdDTCh9jDLZ2iweyRM0i4GLg3wS4e+yzt/" +
+            "X/H+tvucjtBu5KW5qXHkyUPdwshGbzhCoQx4XWd1UAgMDeYDbgF3Ei4KZLtMcefjrBn38pq502rzhfFGbL4kcCdDGPn7ym8IB2kDXaE/" +
+            "uBN+PTJJFkNW8DeCSzzKOV/hIYpOo0OEzcB7BaXDKAQdQk+UvTglSb+UbdD2+Jqpm/hIa/8x5TDSpeqk+6r0nMlQKZmNirWApeyo/" +
+            "cUyDzMGsuJkKOmgtratrt/o9t20jAgMBAAECggEAHTjmdbRJ1QrwlSTJlBseL214RwboGKicVP87oDjfTwOquu/" +
+            "X8gwlI8MGkRBCj7pGn2IPcdQkSEyTuR3WBJQN3AmWpv9ZNBfWNA16QM/QzxKbYNZlg80LSJNAz2D7xk7Pon5TnF1eig+8U20CAMTJzgWcDUs" +
+            "+k8KMUxEHcE7Mfp8KkG0sRPwZa9DqfuC4WOQuik9L6OphhVDrxnCGBKTW/KC1k2HfU25dMUDoirqY7fMbASJBkT14JO6o/" +
+            "I0BBJU++ddfYpXTd2X6Lywy4PqJdstllHxzLxSJqPKgjk9Qd/iVozuHDDSuBvEp1a1DBOsjFHz0TGxmCoP2mrEN4e6WsQKBgQD6GnTuVUcI4" +
+            "UxaeHrj6sSiWTsBOXsXYrrmk380RTUEwzPdExFfvV4wkf48BQsUqCl6R+CdWSbcbRriXTJ6hlZ37IPuqmJ4me++LlDE9MrfRg1m0qkOFyVC" +
+            "1ysAw+0i0EPjj5eeXguvoZ6RarDPI9hWM6m2dAGclkwFq2FBN3yzGQKBgQCW62DEh6eTmnyzBiQcojyEhY44Vp3y6RebXqlS/O1kpEn1sT1" +
+            "U6xBwE2na1udDv9PFzA6SapDw9ZRJWxbxgL07tG3A6V9p6MdjeCh/IR1OqO9STH8xag+YNwS28rSf+IEuM7bRUl6ESp9EXIt/jxh3syjYl" +
+            "j9ecdXypJNWFeOFmwKBgQCR4PCnO1JtmYwBkRiM7Bi5YTaLZk2nvEyrxQiDIoLkPj94CXEu2LOhvOX/eCmYaOWYj2gyHxgNpg3yTs3srYKt/" +
+            "GSPxw4crh0qXrV5zBaw2JlkiidVMqbnL73DeoRMtBGFH/Idy1khnjFxPDvY9l1vGj85TrzJ6th4zheyBH1VsQKBgDSXdbNG6pi/PzFLtI3d" +
+            "42Ty/aqYVJZvr/BOvobS6Q8nSTa7Ovo6qBHGUh8WwKSVVoEZKQLQ7A1sJu6hNY+XI1qI965AJSXNHp6FIueabJIawLtXOQPJSAHtOlFepp8" +
+            "QhEPLdavgHlvPfUzfSyV6gjZEUrmXMiIBXWMfAtD+87h9AoGANzOybVuH7XaPJfGFuKAMLSdsDUFFEAVkC37XF6nl5k1bC1LmHM2iJltmSh" +
+            "N2nwJavbtbvycOFhLxRNNkhBDj3oZ8F/93vzyn1M/s0/y7ONUtBIqLdLAT9Q84xxVBFdOvVdja20J1NuQ8yYD4qInO/WcX2MOLXeCaGfMOg1XWaa0=";
+
+
+    /**
+     * 沙箱 --支付宝支付app_id
+     */
+    public static final String APP_ID_CS = "2021000117607483";
+
+    public static final String ALIPAY_PUBLIC_KEY_CS = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh5uAe8quhr05KrOnJ5Jrrp" +
+            "TphjEoFR4VnHFy9QDRoHK6ouFIz7ksCw6LS7A/S3Yhe3+bZbcvmJSKN1pVO6ssa8iuai81NAnylMZm5tOTaMl945OuqmC8qvIk9wg4AkYd" +
+            "TWSFRxDmQ1aZ711iyDUDtSYi0bQeS5s2OR9cGowwAsqyrMPYCT47f/+VmyftJcn3k3rS1+fo2dJTEmoeSCrg3oAMV5dL5iTzi5ehvWUWJR" +
+            "YejyOi54Qtxjz5Nsp1I68BxHT2d8QFeKBgad0w83975tKauHgKHsQE3+TnQzOgyQo8XQB/5dWq3COO7ACNwK1TlPcyxKO1QRX1egW6bysySQIDAQAB";
+
+    public static final String PRIVATE_KEY_CS = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHm4B7yq6GvTkqs6cnkmu" +
+            "ulOmGMSgVHhWccXL1ANGgcrqi4UjPuSwLDotLsD9LdiF7f5tlty+YlIo3WlU7qyxryK5qLzU0CfKUxmbm05NoyX3jk66qYLyq8iT3CDg" +
+            "CRh1NZIVHEOZDVpnvXWLINQO1JiLRtB5LmzY5H1wajDACyrKsw9gJPjt//5WbJ+0lyfeTetLX5+jZ0lMSah5IKuDegAxXl0vmJPOLl6G9" +
+            "ZRYlFh6PI6LnhC3GPPk2ynUjrwHEdPZ3xAV4oGBp3TDzf3vm0pq4eAoexATf5OdDM6DJCjxdAH/l1arcI47sAI3ArVOU9zLEo7VBFfV6" +
+            "BbpvKzJJAgMBAAECggEAQec2t/K2gtDvOWt57udf4caI/yhgnHK0egVAowU0208mmQX3hswtNWpqE+yhtiDBAO3xLaurO/HkgiYqigcUXY" +
+            "V4Di7HInU7KUaKt99XInPZ9IHPPwooZsOrZ0rdPW2py/TwOKtj3JH32bZ+zWHGXYEdJuDsYD4cSgKNlnFO2+u/uS2RRhsTEX7veE1ivlPB" +
+            "Ta0hRo+XHcBrrXobZUtFFtE8zxvKOWDMj87WpsLDdXJ1Ze2CZXsdEtuIcfp51Gzx1or+2WrYwoiIAYTNN+oG1JT6pld9l9m1EqVzMPPSmE" +
+            "/tyyIV4Zb1qjGveH1SPEncIdGOiEH1rOsBvS/E4EDEoQKBgQDvdFgh3Xmtrr47515d+e5sAAZav34IuoEzmih6zXCvLASsG64gsgfoyb2aD" +
+            "/N9hcTtVFrEDrJSLknNMJcvh1xkmPc1xBeBCLlrrzlyt4hoth1b6ZfdKC7jkhmd0mUylOagsdYGOZ3qT0+ykO449HmE0bQDLWzinw1p15b" +
+            "/nVx3vQKBgQCQ+jsct+C1Y+1AoYC2o3yCvTcaErdH6Pxk8sCYP18sIml4kb+WUgFgd1THFwgHDu3S4VmkfEcjnIKqioqQCEMyEF2K6RAFu" +
+            "Ffpw+ianx+9V84GDS7Aov8PKwTWg8RjFBSkHZ+Xl3ERGCyI/NDBCUF8Amiv12IMyVkkWUsrqxnXfQKBgQCGh8MMI7Y9EjPmy/KEsep12v2" +
+            "29mcE2GPGbhHYDJwGjqCBYXvO+rbe3pkbeWK/Xuxouj/Ubr1Y1pC4K1iFZ3NNQXOCTY02/YPPMD8CaILG8apE/VRI+E5/pJGnzZD1fhqkp" +
+            "cUs8in6fly0YiC09wVezcJpFphaKioLEQjQy8QrsQKBgGC92bwsJ1JjP+ok2xMEvQ0w3hgT7SGbIvDp3AK8JvH4dJD0EPhp+Gk6t+OyRrUP" +
+            "DTvvDDZqh74HrlnG4PeDy/MYYJNVOk/W1zMye4DSNgfPE7eODGiXW8PvXOcYPnAu8ichbWFmuRhDHVS7/0EQwBXUNa9A9ji6EzXiL/sPzc" +
+            "qxAoGAQbxdsp2Omd1cXvaofq+nllbyM04WbYib5bxm+zNgOszWnoIhgR95InA7BWtGnJsjmJqz3/Dwgzzpn+vXiB+6mhj/EP932HWcL7wv" +
+            "3nMhU06E1T/eQ7hKX8QlmjEIhnWEN7A9lXtwW85/7tpuWs6qbv0YWYze1CcDN3Fr+II2BcA=";
+
+    public static final String PAY_URL_CS = "https://openapi.alipaydev.com/gateway.do";
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/common/PdfUtil.java b/wisenergy-service/src/main/java/cn/wisenergy/service/common/PdfUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..55664a15c5096867eb81a81e39cb83ea00174e6b
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/common/PdfUtil.java
@@ -0,0 +1,231 @@
+package cn.wisenergy.service.common;
+
+import cn.wisenergy.model.app.SchemeQueryRecord;
+import cn.wisenergy.model.app.Volunteer;
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 创建PDF工具类
+ */
+public class PdfUtil implements Serializable {
+    private static final long serialVersionUID = -8441049720133017215L;
+    // 定义全局的字体静态变量
+    private static Font titlefont;
+    private static Font headfont;
+    private static Font keyfont;
+    private static Font textfont;
+
+    //序号
+    private  Integer id=0;
+
+    // 最大宽度
+    private static int maxWidth = 520;
+
+    // 静态代码块
+    static {
+        try {
+            // 不同字体(这里定义为同一种字体:包含不同字号、不同style)
+            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+            titlefont = new Font(bfChinese, 16, Font.BOLD);
+            headfont = new Font(bfChinese, 14, Font.BOLD);
+            keyfont = new Font(bfChinese, 10, Font.BOLD);
+            textfont = new Font(bfChinese, 10, Font.NORMAL);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    // 生成PDF文件
+    public  void  generatePDF(Document document, List<Volunteer> list, String queryRecordTime) throws Exception {
+
+
+        // 表格
+        PdfPTable table = createTable(new float[] { 40,80,80, 80, 80, 80, 80, 80, 40, 40, 40 });
+        table.addCell(createCell("查询时间:"+queryRecordTime,headfont,Element.ALIGN_LEFT, 11, false));
+        table.addCell(createCell("序号", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("专业", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("院校", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("选考科目要求", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("学校性质", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("学制(年)", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("计划数", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("投档计划数", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("投出数", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("最低分", keyfont, Element.ALIGN_CENTER));
+        table.addCell(createCell("最低位次", keyfont, Element.ALIGN_CENTER));
+        for (Volunteer volunteer : list)
+            {
+            table.addCell(createCell((++id).toString() , textfont));
+            table.addCell(createCell(volunteer.getMajorName(), textfont));
+            table.addCell(createCell(volunteer.getAcademy(), textfont));
+            table.addCell(createCell(volunteer.getCourseDemand(), textfont));
+            table.addCell(createCell(volunteer.getNature(), textfont));
+            table.addCell(createCell(volunteer.getYearLimit().toString(), textfont));
+            table.addCell(createCell(volunteer.getPlanNum().toString(), textfont));
+            table.addCell(createCell(null==volunteer.getCastArchivesNum()?"":volunteer.getCastArchivesNum().toString(), textfont));
+            table.addCell(createCell(null==volunteer.getLaunchNum()?"":volunteer.getLaunchNum().toString(), textfont));
+            table.addCell(createCell(null==volunteer.getLowestMark()?"":volunteer.getLowestMark(), textfont));
+            table.addCell(createCell(null==volunteer.getLowestRank()?"":volunteer.getLowestRank(), textfont));
+        }
+        document.add(table);
+    }
+
+
+/**------------------------创建表格单元格的方法start----------------------------*/
+    /**
+     * 创建单元格(指定字体)
+     * @param value
+     * @param font
+     * @return
+     */
+    public PdfPCell createCell(String value, Font font) {
+        PdfPCell cell = new PdfPCell();
+        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+        cell.setPhrase(new Phrase(value, font));
+        return cell;
+    }
+    /**
+     * 创建单元格(指定字体、水平..)
+     * @param value
+     * @param font
+     * @param align
+     * @return
+     */
+    public PdfPCell createCell(String value, Font font, int align) {
+        PdfPCell cell = new PdfPCell();
+        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+        cell.setHorizontalAlignment(align);
+        cell.setPhrase(new Phrase(value, font));
+        return cell;
+    }
+    /**
+     * 创建单元格(指定字体、水平居..、单元格跨x列合并)
+     * @param value
+     * @param font
+     * @param align
+     * @param colspan
+     * @return
+     */
+    public PdfPCell createCell(String value, Font font, int align, int colspan) {
+        PdfPCell cell = new PdfPCell();
+        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+        cell.setHorizontalAlignment(align);
+        cell.setColspan(colspan);
+        cell.setPhrase(new Phrase(value, font));
+        return cell;
+    }
+    /**
+     * 创建单元格(指定字体、水平居..、单元格跨x列合并、设置单元格内边距)
+     * @param value
+     * @param font
+     * @param align
+     * @param colspan
+     * @param boderFlag
+     * @return
+     */
+    public PdfPCell createCell(String value, Font font, int align, int colspan, boolean boderFlag) {
+        PdfPCell cell = new PdfPCell();
+        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+        cell.setHorizontalAlignment(align);
+        cell.setColspan(colspan);
+        cell.setPhrase(new Phrase(value, font));
+        cell.setPadding(3.0f);
+        if (!boderFlag) {
+            cell.setBorder(0);
+            cell.setPaddingTop(15.0f);
+            cell.setPaddingBottom(8.0f);
+        } else if (boderFlag) {
+            cell.setBorder(0);
+            cell.setPaddingTop(0.0f);
+            cell.setPaddingBottom(15.0f);
+        }
+        return cell;
+    }
+    /**
+     * 创建单元格(指定字体、水平..、边框宽度:0表示无边框、内边距)
+     * @param value
+     * @param font
+     * @param align
+     * @param borderWidth
+     * @param paddingSize
+     * @param flag
+     * @return
+     */
+    public PdfPCell createCell(String value, Font font, int align, float[] borderWidth, float[] paddingSize, boolean flag) {
+        PdfPCell cell = new PdfPCell();
+        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+        cell.setHorizontalAlignment(align);
+        cell.setPhrase(new Phrase(value, font));
+        cell.setBorderWidthLeft(borderWidth[0]);
+        cell.setBorderWidthRight(borderWidth[1]);
+        cell.setBorderWidthTop(borderWidth[2]);
+        cell.setBorderWidthBottom(borderWidth[3]);
+        cell.setPaddingTop(paddingSize[0]);
+        cell.setPaddingBottom(paddingSize[1]);
+        if (flag) {
+            cell.setColspan(2);
+        }
+        return cell;
+    }
+/**------------------------创建表格单元格的方法end----------------------------*/
+
+
+/**--------------------------创建表格的方法start------------------- ---------*/
+    /**
+     * 创建默认列宽,指定列数、水平(居中、右、左)的表格
+     * @param colNumber
+     * @param align
+     * @return
+     */
+    public PdfPTable createTable(int colNumber, int align) {
+        PdfPTable table = new PdfPTable(colNumber);
+        try {
+            table.setTotalWidth(maxWidth);
+            table.setLockedWidth(true);
+            table.setHorizontalAlignment(align);
+            table.getDefaultCell().setBorder(1);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return table;
+    }
+    /**
+     * 创建指定列宽、列数的表格
+     * @param widths
+     * @return
+     */
+    public PdfPTable createTable(float[] widths) {
+        PdfPTable table = new PdfPTable(widths);
+        try {
+            table.setTotalWidth(maxWidth);
+            table.setLockedWidth(true);
+            table.setHorizontalAlignment(Element.ALIGN_CENTER);
+            table.getDefaultCell().setBorder(1);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return table;
+    }
+    /**
+     * 创建空白的表格
+     * @return
+     */
+    public PdfPTable createBlankTable() {
+        PdfPTable table = new PdfPTable(1);
+        table.getDefaultCell().setBorder(0);
+        table.addCell(createCell("", keyfont));
+        table.setSpacingAfter(20.0f);
+        table.setSpacingBefore(20.0f);
+        return table;
+    }
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/common/RefillCardManager.java b/wisenergy-service/src/main/java/cn/wisenergy/service/common/RefillCardManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4988b21a17567e3209641a944f48ba62df7e677
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/common/RefillCardManager.java
@@ -0,0 +1,60 @@
+package cn.wisenergy.service.common;
+
+import cn.wisenergy.common.utils.CardNumberUtil;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.common.utils.SecretkeyUtil;
+import cn.wisenergy.mapper.CardMapper;
+import cn.wisenergy.mapper.RefillCardMapper;
+import cn.wisenergy.model.app.CardInfo;
+import cn.wisenergy.model.app.RefillCard;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+
+/**
+ * @author 86187
+ */
+@Component
+@Slf4j
+public class RefillCardManager {
+
+    @Autowired
+    private RefillCardMapper refillCardMapper;
+
+    @Autowired
+    private CardMapper cardMapper;
+
+    @Transactional(rollbackFor = Exception.class)
+    public  R<Boolean> addCardMannger(RefillCard byId){
+        //获取充值卡的卡数,并生成卡片
+        ArrayList<CardInfo> cardInfos = new ArrayList<>();
+
+        //子卡添加
+        for (int i = 0; i < byId.getCardNumber(); i++) {
+            CardInfo cardInfo = new CardInfo();
+            cardInfo.setBatchNumber(byId.getBatchNumber());
+            cardInfo.setIsDelete(0);
+            cardInfo.setMoney("498");
+            cardInfo.setStatus(0);
+            cardInfo.setLimit(3);
+            cardInfo.setSecretKey(SecretkeyUtil.getSecretkey());
+            cardInfo.setCardNumber(CardNumberUtil.cardNumber());
+            cardInfos.add(cardInfo);
+        }
+        int add1 = cardMapper.add(cardInfos);
+
+        if (add1==0) {
+            return R.ok(1,false);
+        }
+        int isMakeCard = refillCardMapper.setIsMakeCard(byId.getId());
+
+        if (isMakeCard==0) {
+            return R.ok(1,false);
+        }
+        return R.ok(0,true);
+
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/common/VolunteerListener.java b/wisenergy-service/src/main/java/cn/wisenergy/service/common/VolunteerListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..7fa2e1f36de52b09b7a56a099febcb017345b114
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/common/VolunteerListener.java
@@ -0,0 +1,151 @@
+package cn.wisenergy.service.common;
+
+import cn.wisenergy.model.app.Volunteer;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.metadata.Head;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+
+/**
+ * Excel批量添加社区居民  监听器
+ *
+ * @author 86187
+ */
+@Slf4j
+public class VolunteerListener extends AnalysisEventListener<Volunteer> {
+
+    private List<Volunteer> list=new ArrayList<>();
+    private final int batch = 50000;
+
+    /**
+     * 导入模板头内容
+     */
+    private Map<Integer, String> headMap = new HashMap<>();
+
+    /**
+     * 结果标记 默认错误
+     */
+    private boolean isCorrectFormat = true;
+
+
+    /**
+     * 这个每一条数据解析都会来调用  ==
+     *
+     * @param volunteer       志愿信息
+     * @param analysisContext
+     */
+    @Override
+    public void invoke(Volunteer volunteer, AnalysisContext analysisContext) {
+        if (!isCorrectFormat) {
+            //格式是否正确
+            return;
+        }
+        log.info("解析到一条志愿数据>>>>>>>>>>:{}", volunteer);
+        //此处做校验  本次没有校验
+        if (volunteer != null) {
+            volunteer.setIsDelete(0);
+            volunteer.setCreateTime(new Date());
+            volunteer.setUpdateTime(new Date());
+            if (StringUtils.isEmpty(volunteer.getMajorName())) {
+                throw new RuntimeException("专业不能为空!");
+            }
+
+            if (StringUtils.isEmpty(volunteer.getAcademy())) {
+                throw new RuntimeException("院校不能为空!");
+            }
+
+
+            if (StringUtils.isEmpty(volunteer.getCourseDemand())) {
+                throw new RuntimeException("选考科目要求不能为空!");
+            }
+
+            if (StringUtils.isEmpty(volunteer.getNature())) {
+                throw new RuntimeException("学校不能为空!");
+            }
+
+            if (null == volunteer.getYearLimit()) {
+                throw new RuntimeException("学年制不能为空!");
+            }
+
+            if (null == volunteer.getPlanNum()) {
+                throw new RuntimeException("计划数数不能为空!");
+            }
+
+            if (StringUtils.isEmpty(volunteer.getLowestMark())) {
+                throw new RuntimeException("最低分不能为空!");
+            }
+
+            list.add(volunteer);
+        }
+    }
+
+    /**
+     * 所有数据解析完成了 都会来调用
+     *
+     * @param analysisContext
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+//        log.info("doAfterAllAnalysed解析玩一个志愿sheet工作表>>>>>>>>>>");
+//        //如果集合不为空
+//        if (!CollectionUtils.isEmpty(list)) {
+//            log.info("批量插入志愿数据,条数为>>>>>>>>>>:{}", list.size());
+//            if (list.size() > 0) {
+//                volunteerService.saveBatch(list);
+//            }
+//        }
+    }
+
+
+    public List<Volunteer> getList() {
+        List<Volunteer> result = new ArrayList<>();
+        result.addAll(list);
+        return result;
+    }
+
+    public void setList(List<Volunteer> list) {
+        this.list = list;
+    }
+
+
+    /**
+     * 校验导入模板表头是否正确
+     *
+     * @param headMap 表头
+     * @param context
+     */
+    @Override
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+        //是否手动传入表头信息 没有则自动读取实体类头信息
+        try {
+            if (this.headMap == null || this.headMap.size() <= 0) {
+                Map<Integer, Head> map = context.currentReadHolder().excelReadHeadProperty().getHeadMap();
+                for (int i = 0; i < map.size(); i++) {
+                    //封装成headMap
+                    this.headMap.put(map.get(i).getColumnIndex(), map.get(i).getHeadNameList().get(0));
+                }
+            }
+        } catch (Exception e) {
+            isCorrectFormat = false;
+            throw new RuntimeException("导入失败,请联系管理员!");
+        }
+
+        if (this.headMap == null || headMap == null || this.headMap.size() != headMap.size()) {
+            isCorrectFormat = false;
+            throw new RuntimeException("导入表的表头与模板表头不符!");
+        } else {
+            for (int i = 0; i < this.headMap.size(); i++) {
+                //循环遍历判断表格头是否一一对应
+                if (!this.headMap.get(i).equals(headMap.get(i))) {
+                    isCorrectFormat = false;
+                    throw new RuntimeException("导入表的表头与模板表头不符!");
+                }
+            }
+        }
+
+    }
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/common/VolunteerManager.java b/wisenergy-service/src/main/java/cn/wisenergy/service/common/VolunteerManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2f97efe29caa43ff3814425d843066b72a798e1
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/common/VolunteerManager.java
@@ -0,0 +1,415 @@
+package cn.wisenergy.service.common;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.mapper.*;
+import cn.wisenergy.model.app.*;
+import cn.wisenergy.model.enums.CardStatus;
+import cn.wisenergy.model.enums.OperationTypeEnum;
+import cn.wisenergy.model.enums.PayType;
+import cn.wisenergy.model.vo.AddLimitVo;
+import cn.wisenergy.model.vo.UserInfoVo;
+import cn.wisenergy.service.app.UserLimitService;
+import cn.wisenergy.service.app.UserVolunteerService;
+import cn.wisenergy.service.app.VolunteerService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author 86187
+ * @ Description: 事务方法公共类
+ * @ Author     : 86187
+ * @ Date       : 2021/1/28 15:59
+ */
+@Component
+@Slf4j
+public class VolunteerManager {
+
+    @Autowired
+    private UserLimitMapper userLimitMapper;
+
+    @Autowired
+    private UserLimitRecordMapper userLimitRecordMapper;
+
+    @Autowired
+    private CardMapper cardMapper;
+
+    @Autowired
+    private PayRecordMapper payRecordMapper;
+
+    @Autowired
+    private SchemeRecordMapper schemeRecordMapper;
+
+    @Autowired
+    private UserVolunteerService userVolunteerService;
+
+    @Autowired
+    private UsersMapper usersMapper;
+
+    @Autowired
+    private ScoreInfoMapper scoreInfoMapper;
+
+    @Autowired
+    private SchemeMapper schemeMapper;
+
+    @Autowired
+    private VolunteerService volunteerService;
+
+    @Autowired
+    private VolunteerMapper volunteerMapper;
+
+    @Autowired
+    private UserLimitService userLimitService;
+
+    @Autowired
+    private LoginRecordMapper loginRecordMapper;
+
+    /**
+     * 错误码
+     */
+    private static final int ERROR_CODE = 1;
+
+    /**
+     * 副科是六选三科
+     */
+    private static final int CLASS_COUNT = 3;
+
+    /**
+     * 更新用户查询信息并保存扣减记录
+     *
+     * @param userLimit 查询信息
+     * @return true or false
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateLimitSaveRecord(UserLimit userLimit) {
+        //1、更新查询信息
+        int count = userLimitMapper.edit(userLimit);
+        if (count == 0) {
+            return false;
+        }
+
+        //2、保存扣减记录
+        UserLimitRecord userLimitRecord = new UserLimitRecord();
+        userLimitRecord.setMinusLimit(1);
+        userLimitRecord.setUserLimitId(userLimit.getId());
+        userLimitRecord.setUserId(userLimit.getUserId());
+        int record = userLimitRecordMapper.add(userLimitRecord);
+
+        if (record == 0) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 更新充值卡状态和用户查询次数及增加充值记录
+     *
+     * @param cardInfo   充值卡信息
+     * @param userLimit  用户查询次数信息
+     * @param addLimitVo 接口入参
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateLimitAndRecord(Price price, CardInfo cardInfo, UserLimit userLimit, AddLimitVo addLimitVo) {
+
+        //是充值卡
+        if (PayType.REFILL_CARD.getCode().equals(addLimitVo.getPayType())) {
+            //1、更新充值卡状态
+            cardInfo.setStatus(CardStatus.ALREADY_USED.getCode());
+            int count = cardMapper.edit(cardInfo);
+            if (count == 0) {
+                return false;
+            }
+
+            //2、更新用户查询次数信息
+            int limit = userLimitMapper.edit(userLimit);
+            if (limit == 0) {
+                return false;
+            }
+
+            //3、保存充值记录
+            PayRecord payRecord = new PayRecord();
+            payRecord.setCardId(cardInfo.getId());
+            payRecord.setMoney(Integer.valueOf(cardInfo.getMoney()));
+            payRecord.setPayLimit(cardInfo.getLimit());
+            payRecord.setResult(0);
+            payRecord.setType(addLimitVo.getPayType());
+            payRecord.setUserId(addLimitVo.getUserId());
+            int pay = payRecordMapper.add(payRecord);
+            if (pay == 0) {
+                return false;
+            }
+        } else {
+            //1、更新用户查询次数信息
+            int limit = userLimitMapper.edit(userLimit);
+            if (limit == 0) {
+                return false;
+            }
+
+            //2、保存充值记录
+            PayRecord payRecord = new PayRecord();
+            payRecord.setCardId(null);
+            payRecord.setMoney(addLimitVo.getPayMoney());
+            payRecord.setPayLimit(price.getUseLimit());
+            payRecord.setResult(0);
+            payRecord.setType(addLimitVo.getPayType());
+            payRecord.setUserId(addLimitVo.getUserId());
+            int pay = payRecordMapper.add(payRecord);
+            if (pay == 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 保存方案查询记录和关联关系
+     *
+     * @param user 用户信息
+     * @param list 志愿信息
+     * @return true 成功  false 失败
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public R<Integer> saveUserVolunteer(User user, List<Volunteer> list, ScoreInfo scoreInfo, String name) {
+        //1、保存方案查询记录
+        SchemeQueryRecord schemeQueryRecord = new SchemeQueryRecord();
+        schemeQueryRecord.setMajorName(name);
+        schemeQueryRecord.setStudentType(user.getExamType());
+        schemeQueryRecord.setUserId(user.getId());
+        schemeQueryRecord.setIsDelete(0);
+        schemeQueryRecord.setMajorScore(scoreInfo.getMajorGrade().toString());
+        schemeQueryRecord.setScore(scoreInfo.getCultureGrade().toString());
+
+        List<Integer> ids = list.stream().map(Volunteer::getId).collect(Collectors.toList());
+        //保存方案查询记录
+        int count = schemeRecordMapper.add(schemeQueryRecord);
+        if (count == 0) {
+            return R.error("保存方案查询记录失败!");
+        }
+
+        List<UserVolunteer> volunteerList = new ArrayList<>();
+        for (Integer id : ids) {
+            UserVolunteer userVolunteer = new UserVolunteer();
+            userVolunteer.setSchemeRecordId(schemeQueryRecord.getId());
+            userVolunteer.setUserId(user.getId());
+            userVolunteer.setVolunteerId(id);
+            volunteerList.add(userVolunteer);
+        }
+
+        //调用扣减查询次数接口
+        R<Boolean> result = userLimitService.minusLimit(user.getId());
+        if (null != result && result.getCode() == ERROR_CODE) {
+            return R.error("扣减查询次数失败!");
+        }
+
+        //保存方案志愿关联关系
+        boolean bool = userVolunteerService.saveBatch(volunteerList);
+        if (!bool) {
+            return R.error("保存方案志愿关联关系失败!");
+        }
+        return R.ok(schemeQueryRecord.getId());
+    }
+
+    /**
+     * 保存个人信息
+     *
+     * @param user      用户信息
+     * @param scoreInfo 成绩信息
+     * @return true or false
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateAndSaveUserInfo(User user, ScoreInfo scoreInfo) {
+        //1、更新用户信息
+        int count = usersMapper.edit(user);
+        if (count == 0) {
+            return false;
+        }
+
+        //2、保存用户成绩信息
+        if (null == scoreInfo.getMajorGrade()) {
+            scoreInfo.setMajorGrade(0.00);
+        }
+
+        int save = scoreInfoMapper.add(scoreInfo);
+        if (save == 0) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * 编辑个人信息
+     *
+     * @param user      用户信息
+     * @param scoreInfo 成绩信息
+     * @return true or false
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updateAndUserInfo(User user, ScoreInfo scoreInfo) {
+        //1、更新用户信息
+        int count = usersMapper.edit(user);
+        if (count == 0) {
+            return false;
+        }
+
+        //2、保存用户成绩信息
+        int save = scoreInfoMapper.edit(scoreInfo);
+        if (save == 0) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * 保存方案和志愿信息
+     *
+     * @param schemeInfo 方案信息
+     * @param list       志愿信息
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveSchemeAndVolunteer(SchemeInfo schemeInfo, List<Volunteer> list) {
+        //1、保存方案信息
+        int count = schemeMapper.add(schemeInfo);
+        if (count == 0) {
+            throw new RuntimeException("保存方案信息失败!");
+        }
+
+        //保存志愿信息
+        for (Volunteer volunteer : list) {
+            volunteer.setSchemeId(schemeInfo.getId());
+            volunteer.setType(schemeInfo.getType());
+        }
+        boolean bool = volunteerService.saveBatch(list);
+        if (!bool) {
+            throw new RuntimeException("保存志愿信息失败!");
+        }
+    }
+
+    /**
+     * 删除方案志愿
+     *
+     * @param schemeInfo 方案信息
+     * @param schemeId   方案id
+     * @param size       志愿数据条数
+     * @return true or false
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteSchemeAndVolunteer(SchemeInfo schemeInfo, Integer schemeId, Integer size) {
+        //更行方案状态为删除
+        int sum = schemeMapper.edit(schemeInfo);
+        if (sum == 0) {
+            return false;
+        }
+
+
+        //更行志愿状态为删除
+        int count = volunteerMapper.updateBySchemeId(schemeId);
+        if (size != count) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * 检查成绩信息
+     *
+     * @param scoreInfo 成绩
+     * @return true or false
+     */
+    public R<Boolean> checkScore(ScoreInfo scoreInfo) {
+        int count = 0;
+        if (null != scoreInfo.getPoliticsGrade()) {
+            count = count + 1;
+        }
+        if (null != scoreInfo.getHistoryGrade()) {
+            count = count + 1;
+        }
+        if (null != scoreInfo.getBiologyGrade()) {
+            count = count + 1;
+        }
+        if (null != scoreInfo.getChemistryGrade()) {
+            count = count + 1;
+        }
+        if (null != scoreInfo.getPhysicsGrade()) {
+            count = count + 1;
+        }
+        if (null != scoreInfo.getGeographyGrade()) {
+            count = count + 1;
+        }
+
+        if (count > CLASS_COUNT) {
+            return R.error(1, "只能填三科副科成绩", false);
+        }
+        return R.ok(0, true);
+    }
+
+    /**
+     * 保存用户注册信息,初始化查询次数信息,注册、登录操作信息
+     *
+     * @param phone  手机
+     * @param secret 密码
+     * @param source 来源
+     * @return 结果
+     */
+    @Transactional
+    public R<UserInfoVo> saveUserAndLimit(String phone, String secret, Integer source) {
+        //1、添加用户信息
+        User userInfo = new User();
+        userInfo.setPhone(phone);
+        userInfo.setPassword(secret);
+        userInfo.setIsDelete(0);
+        userInfo.setSource(source);
+
+        int count = usersMapper.add(userInfo);
+        if (count == 0) {
+            return R.error("考生注册失败!");
+        }
+
+        //2、保存用户查询信息
+        UserLimit addLimit = new UserLimit();
+        addLimit.setUserId(userInfo.getId());
+        addLimit.setUseLimit(0);
+        addLimit.setUsableLimit(0);
+        addLimit.setTotalLimit(0);
+        int limit = userLimitMapper.add(addLimit);
+        if (limit == 0) {
+            return R.error("注册添加用户查询信息失败!");
+        }
+
+        //3、保存注册记录
+        LoginRecord loginRecord = new LoginRecord();
+        loginRecord.setType(OperationTypeEnum.USER_REGISTER.getCode());
+        loginRecord.setUserId(userInfo.getId());
+        String name = OperationTypeEnum.getByCode(OperationTypeEnum.USER_REGISTER.getCode());
+        loginRecord.setOperationName(name);
+        int record = loginRecordMapper.add(loginRecord);
+        if (record == 0) {
+            return R.error("保存注册记录失败!");
+        }
+
+        //3、保存登录记录
+        LoginRecord login = new LoginRecord();
+        login.setType(OperationTypeEnum.USER_LOGIN.getCode());
+        login.setUserId(userInfo.getId());
+        String nameSecond = OperationTypeEnum.getByCode(OperationTypeEnum.USER_LOGIN.getCode());
+        login.setOperationName(nameSecond);
+        int number = loginRecordMapper.add(login);
+        if (number == 0) {
+            return R.error("保存登录记录失败!");
+        }
+
+        //7、封装返回参数
+        UserInfoVo userInfoVo = new UserInfoVo();
+        userInfoVo.setUserId(userInfo.getId());
+        userInfoVo.setPhone(userInfo.getPhone());
+        return R.ok(userInfoVo);
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/Credentials.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/Credentials.java
new file mode 100644
index 0000000000000000000000000000000000000000..571595a874a4a296de609a71d59d9ac3e9353dae
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/Credentials.java
@@ -0,0 +1,12 @@
+package cn.wisenergy.service.httpClient;
+
+import org.apache.http.client.methods.HttpRequestWrapper;
+
+import java.io.IOException;
+
+public interface Credentials {
+
+  String getSchema();
+
+  String getToken(HttpRequestWrapper request) throws IOException;
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/SignatureExec.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/SignatureExec.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec3542e19ed644ba31eaac8b9e340c122d7e3a9d
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/SignatureExec.java
@@ -0,0 +1,78 @@
+package cn.wisenergy.service.httpClient;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.HttpException;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpExecutionAware;
+import org.apache.http.client.methods.HttpRequestWrapper;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.entity.BufferedHttpEntity;
+import org.apache.http.impl.execchain.ClientExecChain;
+
+import java.io.IOException;
+
+public class SignatureExec implements ClientExecChain {
+  final ClientExecChain mainExec;
+  final Credentials credentials;
+  final Validator validator;
+
+  SignatureExec(Credentials credentials, Validator validator, ClientExecChain mainExec) {
+    this.credentials = credentials;
+    this.validator = validator;
+    this.mainExec = mainExec;
+  }
+
+  protected void convertToRepeatableResponseEntity(CloseableHttpResponse response)
+      throws IOException {
+    HttpEntity entity = response.getEntity();
+    if (entity != null) {
+      response.setEntity(new BufferedHttpEntity(entity));
+    }
+  }
+
+  protected void convertToRepeatableRequestEntity(HttpRequestWrapper request) throws IOException {
+    if (request instanceof HttpEntityEnclosingRequest) {
+      HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
+      if (entity != null) {
+        ((HttpEntityEnclosingRequest) request).setEntity(new BufferedHttpEntity(entity));
+      }
+    }
+  }
+
+  @Override
+  public CloseableHttpResponse execute(HttpRoute route, HttpRequestWrapper request,
+                                       HttpClientContext context, HttpExecutionAware execAware) throws IOException, HttpException {
+    if (request.getURI().getHost().endsWith(".mch.weixin.qq.com")) {
+      return executeWithSignature(route, request, context, execAware);
+    } else {
+      return mainExec.execute(route, request, context, execAware);
+    }
+  }
+
+  private CloseableHttpResponse executeWithSignature(HttpRoute route, HttpRequestWrapper request,
+                                                     HttpClientContext context, HttpExecutionAware execAware) throws IOException, HttpException {
+    // 上传类不需要消耗两次故不做转换
+    if (!(request.getOriginal() instanceof WechatPayUploadHttpPost)) {
+      convertToRepeatableRequestEntity(request);
+    }
+    // 添加认证信息
+    request.addHeader("Authorization",
+        credentials.getSchema() + " " + credentials.getToken(request));
+
+    // 执行
+    CloseableHttpResponse response = mainExec.execute(route, request, context, execAware);
+
+    // 对成功应答验签
+    StatusLine statusLine = response.getStatusLine();
+    if (statusLine.getStatusCode() >= 200 && statusLine.getStatusCode() < 300) {
+      convertToRepeatableResponseEntity(response);
+      if (!validator.validate(response)) {
+        throw new HttpException("应答的微信支付签名验证失败");
+      }
+    }
+    return response;
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/Validator.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/Validator.java
new file mode 100644
index 0000000000000000000000000000000000000000..35d0dc113601e7f622281c18087c22ff01bd5a15
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/Validator.java
@@ -0,0 +1,9 @@
+package cn.wisenergy.service.httpClient;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+
+import java.io.IOException;
+
+public interface Validator {
+  boolean validate(CloseableHttpResponse response) throws IOException;
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/WechatPayHttpClientBuilder.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/WechatPayHttpClientBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..b806df5c530fc97916d7958bdcb343aba7bccb62
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/WechatPayHttpClientBuilder.java
@@ -0,0 +1,75 @@
+package cn.wisenergy.service.httpClient;
+
+
+import cn.wisenergy.service.httpClient.auth.CertificatesVerifier;
+import cn.wisenergy.service.httpClient.auth.PrivateKeySigner;
+import cn.wisenergy.service.httpClient.auth.WechatPay2Credentials;
+import cn.wisenergy.service.httpClient.auth.WechatPay2Validator;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.execchain.ClientExecChain;
+
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+public class WechatPayHttpClientBuilder extends HttpClientBuilder {
+  private Credentials credentials;
+  private Validator validator;
+
+  static final String os = System.getProperty("os.name") + "/" + System.getProperty("os.version");
+  static final String version = System.getProperty("java.version");
+
+  private WechatPayHttpClientBuilder() {
+    super();
+
+    String userAgent = String.format(
+        "WechatPay-Apache-HttpClient/%s (%s) Java/%s",
+        getClass().getPackage().getImplementationVersion(),
+        os,
+        version == null ? "Unknown" : version);
+    setUserAgent(userAgent);
+  }
+
+  public static WechatPayHttpClientBuilder create() {
+    return new WechatPayHttpClientBuilder();
+  }
+
+  public WechatPayHttpClientBuilder withMerchant(String merchantId, String serialNo, PrivateKey privateKey) {
+    this.credentials =
+        new WechatPay2Credentials(merchantId, new PrivateKeySigner(serialNo, privateKey));
+    return this;
+  }
+
+  public WechatPayHttpClientBuilder withCredentials(Credentials credentials) {
+    this.credentials = credentials;
+    return this;
+  }
+
+  public WechatPayHttpClientBuilder withWechatpay(List<X509Certificate> certificates) {
+    this.validator = new WechatPay2Validator(new CertificatesVerifier(certificates));
+    return this;
+  }
+
+  public WechatPayHttpClientBuilder withValidator(Validator validator) {
+    this.validator = validator;
+    return this;
+  }
+
+  @Override
+  public CloseableHttpClient build() {
+    if (credentials == null) {
+      throw new IllegalArgumentException("缺少身份认证信息");
+    }
+    if (validator == null) {
+      throw new IllegalArgumentException("缺少签名验证信息");
+    }
+
+    return super.build();
+  }
+
+  @Override
+  protected ClientExecChain decorateProtocolExec(final ClientExecChain requestExecutor) {
+    return new SignatureExec(this.credentials, this.validator, requestExecutor);
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/WechatPayUploadHttpPost.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/WechatPayUploadHttpPost.java
new file mode 100644
index 0000000000000000000000000000000000000000..6aba1a8c1219c1a7a4cdfcf6c3e7b575ad1c153c
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/WechatPayUploadHttpPost.java
@@ -0,0 +1,78 @@
+package cn.wisenergy.service.httpClient;
+
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+
+
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URLConnection;
+
+/**
+ * @author 86187
+ */
+public class WechatPayUploadHttpPost extends HttpPost {
+
+  private String meta;
+
+  private WechatPayUploadHttpPost(URI uri, String meta) {
+    super(uri);
+
+    this.meta = meta;
+  }
+
+  public String getMeta() {
+    return meta;
+  }
+
+  public static class Builder {
+
+    private String fileName;
+    private String fileSha256;
+    private InputStream fileInputStream;
+    private org.apache.http.entity.ContentType fileContentType;
+    private URI uri;
+
+    public Builder(URI uri) {
+      this.uri = uri;
+    }
+
+    public Builder withImage(String fileName, String fileSha256, InputStream inputStream) {
+      this.fileName = fileName;
+      this.fileSha256 = fileSha256;
+      this.fileInputStream = inputStream;
+
+      String mimeType = URLConnection.guessContentTypeFromName(fileName);
+      if (mimeType == null) {
+        // guess this is a video uploading
+        this.fileContentType = ContentType.APPLICATION_OCTET_STREAM;
+      } else {
+        this.fileContentType = ContentType.create(mimeType);
+      }
+      return this;
+    }
+
+    public WechatPayUploadHttpPost build() {
+      if (fileName == null || fileSha256 == null || fileInputStream == null) {
+        throw new IllegalArgumentException("缺少待上传图片文件信息");
+      }
+
+      if (uri == null) {
+        throw new IllegalArgumentException("缺少上传图片接口URL");
+      }
+
+      String meta = String.format("{\"filename\":\"%s\",\"sha256\":\"%s\"}", fileName, fileSha256);
+      WechatPayUploadHttpPost request = new WechatPayUploadHttpPost(uri, meta);
+
+//      MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
+//      entityBuilder.setMode(HttpMultipartMode.RFC6532)
+//          .addBinaryBody("file", fileInputStream, fileContentType, fileName)
+//          .addTextBody("meta", meta, org.apache.http.entity.ContentType.APPLICATION_JSON);
+//
+//      request.setEntity(entityBuilder.build());
+//      request.addHeader("Accept", org.apache.http.entity.ContentType.APPLICATION_JSON.toString());
+
+      return request;
+    }
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/AutoUpdateCertificatesVerifier.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/AutoUpdateCertificatesVerifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6cc977ccb2bbb47255e5119cdee3033fa25f0ed
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/AutoUpdateCertificatesVerifier.java
@@ -0,0 +1,181 @@
+package cn.wisenergy.service.httpClient.auth;
+
+import cn.wisenergy.service.httpClient.Credentials;
+import cn.wisenergy.service.httpClient.WechatPayHttpClientBuilder;
+import cn.wisenergy.service.httpClient.util.AesUtil;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.cert.CertificateExpiredException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.CertificateNotYetValidException;
+import java.security.cert.X509Certificate;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 在原有CertificatesVerifier基础上,增加自动更新证书功能
+ */
+public class AutoUpdateCertificatesVerifier implements Verifier {
+
+    private static final Logger log = LoggerFactory.getLogger(AutoUpdateCertificatesVerifier.class);
+
+    //证书下载地址
+    private static final String CertDownloadPath = "https://api.mch.weixin.qq.com/v3/certificates";
+
+    //上次更新时间
+    private volatile Instant instant;
+
+    //证书更新间隔时间,单位为分钟
+    private int minutesInterval;
+
+    private CertificatesVerifier verifier;
+
+    private Credentials credentials;
+
+    private byte[] apiV3Key;
+
+    private ReentrantLock lock = new ReentrantLock();
+
+    public AutoUpdateCertificatesVerifier(Credentials credentials, byte[] apiV3Key) {
+        this(credentials, apiV3Key, TimeInterval.OneHour.getMinutes());
+    }
+
+    public AutoUpdateCertificatesVerifier(Credentials credentials, byte[] apiV3Key,
+                                          int minutesInterval) {
+        this.credentials = credentials;
+        this.apiV3Key = apiV3Key;
+        this.minutesInterval = minutesInterval;
+        //构造时更新证书
+        try {
+            autoUpdateCert();
+            instant = Instant.now();
+        } catch (IOException | GeneralSecurityException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public AutoUpdateCertificatesVerifier(WechatPay2Credentials wechatPay2Credentials, byte[] bytes) {
+    }
+
+    @Override
+    public X509Certificate getValidCertificate() {
+        return verifier.getValidCertificate();
+    }
+
+    @Override
+    public boolean verify(String serialNumber, byte[] message, String signature) {
+        if (instant == null
+                || Duration.between(instant, Instant.now()).toMinutes() >= minutesInterval) {
+            if (lock.tryLock()) {
+                try {
+                    autoUpdateCert();
+                    //更新时间
+                    instant = Instant.now();
+                } catch (GeneralSecurityException | IOException e) {
+                    log.warn("Auto update cert failed, exception = " + e);
+                } finally {
+                    lock.unlock();
+                }
+            }
+        }
+        return verifier.verify(serialNumber, message, signature);
+    }
+
+    private void autoUpdateCert() throws IOException, GeneralSecurityException {
+        CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create()
+                .withCredentials(credentials)
+                .withValidator(verifier == null ? (response) -> true : new WechatPay2Validator(verifier))
+                .build();
+
+        try {
+            HttpGet httpGet = new HttpGet(CertDownloadPath);
+            httpGet.addHeader("Accept", "application/json");
+
+            CloseableHttpResponse response = httpClient.execute(httpGet);
+            try {
+                int statusCode = response.getStatusLine().getStatusCode();
+                String body = EntityUtils.toString(response.getEntity());
+                if (statusCode == 200) {
+                    List<X509Certificate> newCertList = deserializeToCerts(apiV3Key, body);
+                    if (newCertList.isEmpty()) {
+                        log.warn("Cert list is empty");
+                        return;
+                    }
+                    this.verifier = new CertificatesVerifier(newCertList);
+                } else {
+                    log.warn("Auto update cert failed, statusCode = " + statusCode + ",body = " + body);
+                }
+            } finally {
+                response.close();
+            }
+        } finally {
+            httpClient.close();
+        }
+    }
+
+    /**
+     * 反序列化证书并解密
+     */
+    private List<X509Certificate> deserializeToCerts(byte[] apiV3Key, String body)
+            throws GeneralSecurityException, IOException {
+        AesUtil decryptor = new AesUtil(apiV3Key);
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode dataNode = mapper.readTree(body).get("data");
+        List<X509Certificate> newCertList = new ArrayList<>();
+        if (dataNode != null) {
+            for (int i = 0, count = dataNode.size(); i < count; i++) {
+                JsonNode encryptCertificateNode = dataNode.get(i).get("encrypt_certificate");
+                //解密
+                String cert = decryptor.decryptToString(
+                        encryptCertificateNode.get("associated_data").toString().replaceAll("\"", "")
+                                .getBytes("utf-8"),
+                        encryptCertificateNode.get("nonce").toString().replaceAll("\"", "")
+                                .getBytes("utf-8"),
+                        encryptCertificateNode.get("ciphertext").toString().replaceAll("\"", ""));
+
+                CertificateFactory cf = CertificateFactory.getInstance("X509");
+                X509Certificate x509Cert = (X509Certificate) cf.generateCertificate(
+                        new ByteArrayInputStream(cert.getBytes("utf-8"))
+                );
+                try {
+                    x509Cert.checkValidity();
+                } catch (CertificateExpiredException | CertificateNotYetValidException e) {
+                    continue;
+                }
+                newCertList.add(x509Cert);
+            }
+        }
+        return newCertList;
+    }
+
+
+    /**
+     * 时间间隔枚举,支持一小时、六小时以及十二小时
+     */
+    public enum TimeInterval {
+        OneHour(60), SixHours(60 * 6), TwelveHours(60 * 12);
+
+        private int minutes;
+
+        TimeInterval(int minutes) {
+            this.minutes = minutes;
+        }
+
+        public int getMinutes() {
+            return minutes;
+        }
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/CertificatesVerifier.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/CertificatesVerifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a580dfa1f3fe20ab29b2e52ebdebf1845ee8377
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/CertificatesVerifier.java
@@ -0,0 +1,65 @@
+package cn.wisenergy.service.httpClient.auth;
+
+import java.math.BigInteger;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.cert.CertificateExpiredException;
+import java.security.cert.CertificateNotYetValidException;
+import java.security.cert.X509Certificate;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+/**
+ * @author 86187
+ */
+public class CertificatesVerifier implements Verifier {
+
+  private final HashMap<BigInteger, X509Certificate> certificates = new HashMap<>();
+
+  public CertificatesVerifier(List<X509Certificate> list) {
+
+    for (X509Certificate item : list) {
+      certificates.put(item.getSerialNumber(), item);
+    }
+  }
+
+  private boolean verify(X509Certificate certificate, byte[] message, String signature) {
+    try {
+      Signature sign = Signature.getInstance("SHA256withRSA");
+      sign.initVerify(certificate);
+      sign.update(message);
+      return sign.verify(Base64.getDecoder().decode(signature));
+    } catch (NoSuchAlgorithmException e) {
+      throw new RuntimeException("当前Java环境不支持SHA256withRSA", e);
+    } catch (SignatureException e) {
+      throw new RuntimeException("签名验证过程发生了错误", e);
+    } catch (InvalidKeyException e) {
+      throw new RuntimeException("无效的证书", e);
+    }
+  }
+
+  @Override
+  public boolean verify(String serialNumber, byte[] message, String signature) {
+    BigInteger val = new BigInteger(serialNumber, 16);
+    return certificates.containsKey(val) && verify(certificates.get(val), message, signature);
+  }
+
+  @Override
+  public X509Certificate getValidCertificate() {
+    for (X509Certificate x509Cert : certificates.values()) {
+      try {
+        x509Cert.checkValidity();
+
+        return x509Cert;
+      } catch (CertificateExpiredException | CertificateNotYetValidException e) {
+        continue;
+      }
+    }
+
+    throw new NoSuchElementException("没有有效的微信支付平台证书");
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/PrivateKeySigner.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/PrivateKeySigner.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3dd07fb8ac61416fea3b22b1d624a2fecac6697
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/PrivateKeySigner.java
@@ -0,0 +1,36 @@
+package cn.wisenergy.service.httpClient.auth;
+
+import java.security.*;
+import java.util.Base64;
+
+/**
+ * @author 86187
+ */
+public class PrivateKeySigner implements Signer {
+  private String certificateSerialNumber;
+
+  private PrivateKey privateKey;
+
+  public PrivateKeySigner(String serialNumber, PrivateKey privateKey) {
+    this.certificateSerialNumber = serialNumber;
+    this.privateKey = privateKey;
+  }
+
+  @Override
+  public SignatureResult sign(byte[] message) {
+    try {
+      Signature sign = Signature.getInstance("SHA256withRSA");
+      sign.initSign(privateKey);
+      sign.update(message);
+
+      return new SignatureResult(
+          Base64.getEncoder().encodeToString(sign.sign()), certificateSerialNumber);
+    } catch (NoSuchAlgorithmException e) {
+      throw new RuntimeException("当前Java环境不支持SHA256withRSA", e);
+    } catch (SignatureException e) {
+      throw new RuntimeException("签名计算失败", e);
+    } catch (InvalidKeyException e) {
+      throw new RuntimeException("无效的私钥", e);
+    }
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/Signer.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/Signer.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef8647cf39659873bc742eca55ed9cab8a774cb2
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/Signer.java
@@ -0,0 +1,15 @@
+package cn.wisenergy.service.httpClient.auth;
+
+public interface Signer {
+  SignatureResult sign(byte[] message);
+
+  class SignatureResult {
+    String sign;
+    String certificateSerialNumber;
+
+    public SignatureResult(String sign, String serialNumber) {
+      this.sign = sign;
+      this.certificateSerialNumber = serialNumber;
+    }
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/Verifier.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/Verifier.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e315d5c710c04510efd0bf626424ef3cfedff50
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/Verifier.java
@@ -0,0 +1,13 @@
+package cn.wisenergy.service.httpClient.auth;
+
+import java.security.cert.X509Certificate;
+
+/**
+ * @author 86187
+ */
+public interface Verifier {
+
+  boolean verify(String serialNumber, byte[] message, String signature);
+
+  X509Certificate getValidCertificate();
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/WechatPay2Credentials.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/WechatPay2Credentials.java
new file mode 100644
index 0000000000000000000000000000000000000000..9b7a6e3c24472ca73f37d62f4ca9cfa5cd330bf6
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/WechatPay2Credentials.java
@@ -0,0 +1,94 @@
+package cn.wisenergy.service.httpClient.auth;
+
+import cn.wisenergy.service.httpClient.Credentials;
+import cn.wisenergy.service.httpClient.WechatPayUploadHttpPost;
+import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.client.methods.HttpRequestWrapper;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.security.SecureRandom;
+
+public class WechatPay2Credentials implements Credentials {
+  private static final Logger log = LoggerFactory.getLogger(WechatPay2Credentials.class);
+
+  private static final String SYMBOLS =
+      "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+  private static final SecureRandom RANDOM = new SecureRandom();
+  protected String merchantId;
+  protected Signer signer;
+
+  public WechatPay2Credentials(String merchantId, Signer signer) {
+    this.merchantId = merchantId;
+    this.signer = signer;
+  }
+
+  public String getMerchantId() {
+    return merchantId;
+  }
+
+  protected long generateTimestamp() {
+    return System.currentTimeMillis() / 1000;
+  }
+
+  protected String generateNonceStr() {
+    char[] nonceChars = new char[32];
+    for (int index = 0; index < nonceChars.length; ++index) {
+      nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
+    }
+    return new String(nonceChars);
+  }
+
+  @Override
+  public final String getSchema() {
+    return "WECHATPAY2-SHA256-RSA2048";
+  }
+
+  @Override
+  public final String getToken(HttpRequestWrapper request) throws IOException {
+    String nonceStr = generateNonceStr();
+    long timestamp = generateTimestamp();
+
+    String message = buildMessage(nonceStr, timestamp, request);
+    log.debug("authorization message=[{}]", message);
+
+    Signer.SignatureResult signature = signer.sign(message.getBytes(StandardCharsets.UTF_8));
+
+    String token = "mchid=\"" + getMerchantId() + "\","
+        + "nonce_str=\"" + nonceStr + "\","
+        + "timestamp=\"" + timestamp + "\","
+        + "serial_no=\"" + signature.certificateSerialNumber + "\","
+        + "signature=\"" + signature.sign + "\"";
+    log.debug("authorization token=[{}]", token);
+
+    return token;
+  }
+
+  protected final String buildMessage(String nonce, long timestamp, HttpRequestWrapper request)
+      throws IOException {
+    URI uri = request.getURI();
+    String canonicalUrl = uri.getRawPath();
+    if (uri.getQuery() != null) {
+      canonicalUrl += "?" + uri.getRawQuery();
+    }
+
+    String body = "";
+    // PATCH,POST,PUT
+    if (request.getOriginal() instanceof WechatPayUploadHttpPost) {
+      body = ((WechatPayUploadHttpPost) request.getOriginal()).getMeta();
+    } else if (request instanceof HttpEntityEnclosingRequest) {
+      body = EntityUtils.toString(((HttpEntityEnclosingRequest) request).getEntity());
+    }
+
+    return request.getRequestLine().getMethod() + "\n"
+        + canonicalUrl + "\n"
+        + timestamp + "\n"
+        + nonce + "\n"
+        + body + "\n";
+  }
+
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/WechatPay2Validator.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/WechatPay2Validator.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c7b73f729322a8392223001092a9316e4a2b115
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/auth/WechatPay2Validator.java
@@ -0,0 +1,108 @@
+package cn.wisenergy.service.httpClient.auth;
+
+import cn.wisenergy.service.httpClient.Validator;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.time.DateTimeException;
+import java.time.Duration;
+import java.time.Instant;
+
+/**
+ * @author 86187
+ */
+public class WechatPay2Validator implements Validator {
+
+  private static final Logger log = LoggerFactory.getLogger(WechatPay2Validator.class);
+
+  private Verifier verifier;
+
+  public WechatPay2Validator(Verifier verifier) {
+    this.verifier = verifier;
+  }
+
+  static RuntimeException parameterError(String message, Object... args) {
+    message = String.format(message, args);
+    return new IllegalArgumentException("parameter error: " + message);
+  }
+
+  static RuntimeException verifyFail(String message, Object... args) {
+    message = String.format(message, args);
+    return new IllegalArgumentException("signature verify fail: " + message);
+  }
+
+  @Override
+  public final boolean validate(CloseableHttpResponse response) throws IOException {
+    try {
+      validateParameters(response);
+
+      String message = buildMessage(response);
+      String serial = response.getFirstHeader("Wechatpay-Serial").getValue();
+      String signature = response.getFirstHeader("Wechatpay-Signature").getValue();
+
+      if (!verifier.verify(serial, message.getBytes("utf-8"), signature)) {
+        throw verifyFail("serial=[%s] message=[%s] sign=[%s], request-id=[%s]",
+            serial, message, signature,
+            response.getFirstHeader("Request-ID").getValue());
+      }
+    } catch (IllegalArgumentException e) {
+      log.warn(e.getMessage());
+      return false;
+    }
+
+    return true;
+  }
+
+  protected final void validateParameters(CloseableHttpResponse response) {
+    String requestId;
+    if (!response.containsHeader("Request-ID")) {
+      throw parameterError("empty Request-ID");
+    } else {
+      requestId = response.getFirstHeader("Request-ID").getValue();
+    }
+
+    if (!response.containsHeader("Wechatpay-Serial")) {
+      throw parameterError("empty Wechatpay-Serial, request-id=[%s]", requestId);
+    } else if (!response.containsHeader("Wechatpay-Signature")){
+      throw parameterError("empty Wechatpay-Signature, request-id=[%s]", requestId);
+    } else if (!response.containsHeader("Wechatpay-Timestamp")) {
+      throw parameterError("empty Wechatpay-Timestamp, request-id=[%s]", requestId);
+    } else if (!response.containsHeader("Wechatpay-Nonce")) {
+      throw parameterError("empty Wechatpay-Nonce, request-id=[%s]", requestId);
+    } else {
+      Header timestamp = response.getFirstHeader("Wechatpay-Timestamp");
+      try {
+        Instant instant = Instant.ofEpochSecond(Long.parseLong(timestamp.getValue()));
+        // 拒绝5分钟之外的应答
+        if (Duration.between(instant, Instant.now()).abs().toMinutes() >= 5) {
+          throw parameterError("timestamp=[%s] expires, request-id=[%s]",
+              timestamp.getValue(), requestId);
+        }
+      } catch (DateTimeException | NumberFormatException e) {
+        throw parameterError("invalid timestamp=[%s], request-id=[%s]",
+            timestamp.getValue(), requestId);
+      }
+    }
+  }
+
+  protected final String buildMessage(CloseableHttpResponse response) throws IOException {
+    String timestamp = response.getFirstHeader("Wechatpay-Timestamp").getValue();
+    String nonce = response.getFirstHeader("Wechatpay-Nonce").getValue();
+
+    String body = getResponseBody(response);
+    return timestamp + "\n"
+          + nonce + "\n"
+          + body + "\n";
+  }
+
+  protected final String getResponseBody(CloseableHttpResponse response) throws IOException {
+    HttpEntity entity = response.getEntity();
+
+    return (entity != null && entity.isRepeatable()) ? EntityUtils.toString(entity) : "";
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/AesUtil.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/AesUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..5a66f8d945e7fe44739f4be2fdc57969623aba1c
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/AesUtil.java
@@ -0,0 +1,45 @@
+package cn.wisenergy.service.httpClient.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+
+public class AesUtil {
+
+  static final int KEY_LENGTH_BYTE = 32;
+  static final int TAG_LENGTH_BIT = 128;
+  private final byte[] aesKey;
+
+  public AesUtil(byte[] key) {
+    if (key.length != KEY_LENGTH_BYTE) {
+      throw new IllegalArgumentException("无效的ApiV3Key,长度必须为32个字节");
+    }
+    this.aesKey = key;
+  }
+
+  public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)
+      throws GeneralSecurityException, IOException {
+    try {
+      Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+
+      SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
+      GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
+
+      cipher.init(Cipher.DECRYPT_MODE, key, spec);
+      cipher.updateAAD(associatedData);
+
+      return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8");
+    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
+      throw new IllegalStateException(e);
+    } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
+      throw new IllegalArgumentException(e);
+    }
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/PemUtil.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/PemUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..c35cf4e7734068c986e84e5fcade78a166671028
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/PemUtil.java
@@ -0,0 +1,56 @@
+package cn.wisenergy.service.httpClient.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.cert.*;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
+
+public class PemUtil {
+
+  public static PrivateKey loadPrivateKey(InputStream inputStream) {
+    try {
+      ByteArrayOutputStream array = new ByteArrayOutputStream();
+      byte[] buffer = new byte[1024];
+      int length;
+      while ((length = inputStream.read(buffer)) != -1) {
+        array.write(buffer, 0, length);
+      }
+
+      String privateKey = array.toString("utf-8")
+          .replace("-----BEGIN PRIVATE KEY-----", "")
+          .replace("-----END PRIVATE KEY-----", "")
+          .replaceAll("\\s+", "");
+
+      KeyFactory kf = KeyFactory.getInstance("RSA");
+      return kf.generatePrivate(
+          new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
+    } catch (NoSuchAlgorithmException e) {
+      throw new RuntimeException("当前Java环境不支持RSA", e);
+    } catch (InvalidKeySpecException e) {
+      throw new RuntimeException("无效的密钥格式");
+    } catch (IOException e) {
+      throw new RuntimeException("无效的密钥");
+    }
+  }
+
+  public static X509Certificate loadCertificate(InputStream inputStream) {
+    try {
+      CertificateFactory cf = CertificateFactory.getInstance("X509");
+      X509Certificate cert = (X509Certificate) cf.generateCertificate(inputStream);
+      cert.checkValidity();
+      return cert;
+    } catch (CertificateExpiredException e) {
+      throw new RuntimeException("证书已过期", e);
+    } catch (CertificateNotYetValidException e) {
+      throw new RuntimeException("证书尚未生效", e);
+    } catch (CertificateException e) {
+      throw new RuntimeException("无效的证书", e);
+    }
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/RsaCryptoUtil.java b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/RsaCryptoUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..cb29151717bb66c0c8d306175cdfa8729deaada2
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/httpClient/util/RsaCryptoUtil.java
@@ -0,0 +1,50 @@
+package cn.wisenergy.service.httpClient.util;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+import java.util.Base64;
+
+public class RsaCryptoUtil {
+
+  public static String encryptOAEP(String message, X509Certificate certificate)
+      throws IllegalBlockSizeException {
+    try {
+      Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
+      cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey());
+
+      byte[] data = message.getBytes(StandardCharsets.UTF_8);
+      byte[] ciphertext = cipher.doFinal(data);
+      return Base64.getEncoder().encodeToString(ciphertext);
+    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
+      throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e);
+    } catch (InvalidKeyException e) {
+      throw new IllegalArgumentException("无效的证书", e);
+    } catch (IllegalBlockSizeException | BadPaddingException e) {
+      throw new IllegalBlockSizeException("加密原串的长度不能超过214字节");
+    }
+  }
+
+  public static String decryptOAEP(String ciphertext, PrivateKey privateKey)
+      throws BadPaddingException {
+    try {
+      Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
+      cipher.init(Cipher.DECRYPT_MODE, privateKey);
+
+      byte[] data = Base64.getDecoder().decode(ciphertext);
+      return new String(cipher.doFinal(data), StandardCharsets.UTF_8);
+    } catch (NoSuchPaddingException | NoSuchAlgorithmException e) {
+      throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e);
+    } catch (InvalidKeyException e) {
+      throw new IllegalArgumentException("无效的私钥", e);
+    } catch (BadPaddingException | IllegalBlockSizeException e) {
+      throw new BadPaddingException("解密失败");
+    }
+  }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/util/SignDemo.java b/wisenergy-service/src/main/java/cn/wisenergy/service/util/SignDemo.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d1d1e722fd66336a70f3d0a8b6a6d9075777ba0
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/util/SignDemo.java
@@ -0,0 +1,81 @@
+package cn.wisenergy.service.util;
+
+import cn.wisenergy.model.dto.PayPageDto;
+import cn.wisenergy.service.wxpay.WxCommon;
+import com.alibaba.fastjson.JSONObject;
+import okhttp3.HttpUrl;
+
+import java.io.UnsupportedEncodingException;
+import java.security.*;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
+import java.util.UUID;
+
+/**
+ * @author 86187
+ */
+public class SignDemo {
+
+    public static String getToken(String method, HttpUrl url, String body,String nonceStr,long timestamp) throws UnsupportedEncodingException, SignatureException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException {
+        String message = buildMessage(method, url, timestamp, nonceStr, body);
+        String signature = sign(message.getBytes("utf-8"));
+
+        return "mchid=\"" + WxCommon.MCHID + "\","
+                + "nonce_str=\"" + nonceStr + "\","
+                + "timestamp=\"" + timestamp + "\","
+                + "serial_no=\"" + WxCommon.SERIAL_NO + "\","
+                + "signature=\"" + signature + "\"";
+    }
+
+    public static String sign(byte[] message) throws NoSuchAlgorithmException, SignatureException, InvalidKeyException, InvalidKeySpecException {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        KeyFactory factory = KeyFactory.getInstance("RSA");
+
+
+        PrivateKey privateKey = factory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(WxCommon.SECRET_KEY)));
+        sign.initSign(privateKey);
+        sign.update(message);
+
+        return Base64.getEncoder().encodeToString(sign.sign());
+    }
+
+    public static String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) {
+        String canonicalUrl = url.encodedPath();
+        if (url.encodedQuery() != null) {
+            canonicalUrl += "?" + url.encodedQuery();
+        }
+
+        return method + "\n"
+                + canonicalUrl + "\n"
+                + timestamp + "\n"
+                + nonceStr + "\n"
+                + body + "\n";
+    }
+
+//    public static void main(String[] args) throws NoSuchAlgorithmException, SignatureException, InvalidKeyException, UnsupportedEncodingException, InvalidKeySpecException {
+//        String method = "POST";
+//        HttpUrl httpurl = HttpUrl.parse("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi");
+//        long timestamp = System.currentTimeMillis() / 1000;
+//        String nonceStr = UUID.randomUUID().toString().replace("-", "");
+//        String url = "v3/pay/transactions/native";
+//        String tradeNo = "21" + System.currentTimeMillis();
+//        PayPageDto payPageDto = new PayPageDto();
+//        payPageDto.setTotal(100);
+//
+//        //构造签名body
+//        JSONObject jsonObject = new JSONObject();
+//        jsonObject.put("appid", WxCommon.APP_ID);
+//        jsonObject.put("mchid", WxCommon.MCHID);
+//        jsonObject.put("timestamp", timestamp);
+//        jsonObject.put("nonce_str", nonceStr);
+//        jsonObject.put("url", url);
+//        jsonObject.put("method", method);
+//        jsonObject.put("description", "充值");
+//        jsonObject.put("out_trade_no", tradeNo);
+//        jsonObject.put("notify_url", WxCommon.NOTIFY_URL);
+//        jsonObject.put("amount", payPageDto);
+//        String sign = getToken(method, httpurl, jsonObject.toJSONString());
+//        System.out.println("签名:" + sign);
+//    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/util/WxPayUtil.java b/wisenergy-service/src/main/java/cn/wisenergy/service/util/WxPayUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..7192b197d1d756894541dc48255e92b129c1e6db
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/util/WxPayUtil.java
@@ -0,0 +1,168 @@
+package cn.wisenergy.service.util;
+
+import cn.wisenergy.service.httpClient.WechatPayHttpClientBuilder;
+import cn.wisenergy.service.httpClient.auth.AutoUpdateCertificatesVerifier;
+import cn.wisenergy.service.httpClient.auth.PrivateKeySigner;
+import cn.wisenergy.service.httpClient.auth.WechatPay2Credentials;
+import cn.wisenergy.service.httpClient.auth.WechatPay2Validator;
+import cn.wisenergy.service.httpClient.util.PemUtil;
+import cn.wisenergy.service.wxpay.WxCommon;
+import okhttp3.HttpUrl;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.junit.After;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.SignatureException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.UUID;
+
+public class WxPayUtil {
+
+
+    /**
+     * 商户号
+     */
+    private static String mchId = WxCommon.MCHID;
+    // 商户证书序列号
+    private static String mchSerialNo = WxCommon.SERIAL_NO;
+    // api密钥
+    private static String apiV3Key = WxCommon.SECRET_KEY;
+
+    // 你的商户私钥
+    private static String privateKey = "-----BEGIN PRIVATE KEY-----\n" +WxCommon.SECRET_KEY
+            + "-----END PRIVATE KEY-----\n";
+
+    private static CloseableHttpClient httpClient;
+    private static AutoUpdateCertificatesVerifier verifier;
+
+
+    static  {
+        PrivateKey merchantPrivateKey = null;
+        try {
+            merchantPrivateKey = PemUtil.loadPrivateKey(
+                    new ByteArrayInputStream(privateKey.getBytes("utf-8")));
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //使用自动更新的签名验证器,不需要传入证书
+        try {
+            verifier = new AutoUpdateCertificatesVerifier(
+                    new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),
+                    apiV3Key.getBytes("utf-8"));
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        httpClient = WechatPayHttpClientBuilder.create()
+                .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
+                .withValidator(new WechatPay2Validator(verifier))
+                .build();
+    }
+
+    @After
+    public void after() throws IOException {
+        httpClient.close();
+    }
+
+    public static void main(String[] args) throws IOException, NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException {
+        HttpPost httpPost = new HttpPost(WxCommon.WX_PAY_URL);
+
+        long timestamp = System.currentTimeMillis() / 1000;
+        String nonceStr = UUID.randomUUID().toString().replace("-", "");
+        String method = "POST";
+        String tradeNo = "21" + System.currentTimeMillis();
+        HttpUrl httpurl = HttpUrl.parse(WxCommon.WX_PAY_URL);
+
+        // 请求body参数
+        String reqdata = "{"
+                + "\"time_expire\":\"2021-02-07T10:34:56+08:00\","
+                + "\"amount\": {"
+                + "\"total\":100,"
+                + "\"currency\":\"CNY\""
+                + "},"
+                + "\"mchid\":\"" + WxCommon.MCHID + "\","
+                + "\"description\":\"Image形象店-深圳腾大-QQ公仔\","
+                + "\"notify_url\":\"" + WxCommon.NOTIFY_URL + "\","
+                + "\"out_trade_no\":\"" + tradeNo + "\","
+                + "\"goods_tag\":\"WXG\","
+                + "\"appid\":\"" + WxCommon.APP_ID + "\","
+//                + "\"attach\":\"自定义数据说明\","
+//                + "\"detail\": {"
+//                + "\"invoice_id\":\"wx123\","
+//                + "\"goods_detail\": ["
+//                + "{"
+//                + "\"goods_name\":\"iPhoneX 256G\","
+//                + "\"wechatpay_goods_id\":\"1001\","
+//                + "\"quantity\":1,"
+//                + "\"merchant_goods_id\":\"商品编码\","
+//                + "\"unit_price\":828800"
+//                + "},"
+//                + "{"
+//                + "\"goods_name\":\"iPhoneX 256G\","
+//                + "\"wechatpay_goods_id\":\"1001\","
+//                + "\"quantity\":1,"
+//                + "\"merchant_goods_id\":\"商品编码\","
+//                + "\"unit_price\":828800"
+//                + "}"
+//                + "],"
+//                + "\"cost_price\":608800"
+//                + "},"
+//                + "\"scene_info\": {"
+//                + "\"store_info\": {"
+//                + "\"address\":\"广东省深圳市南山区科技中一道10000号\","
+//                + "\"area_code\":\"440305\","
+//                + "\"name\":\"腾讯大厦分店\","
+//                + "\"id\":\"0001\""
+//                + "},"
+//                + "\"device_id\":\"013467007045764\","
+//                + "\"payer_client_ip\":\"14.23.150.211\""
+//                + "}"
+                + "}";
+        StringEntity reqEntity = new StringEntity(
+                reqdata, ContentType.create("application/json", "utf-8"));
+        httpPost.setEntity(reqEntity);
+        httpPost.addHeader("Accept", "application/json");
+
+//        //构造签名参数
+//        //构造签名参数
+//        JSONObject jsonObject = new JSONObject();
+//        jsonObject.put("appid", WxCommon.APP_ID);
+//        jsonObject.put("mchid", WxCommon.MCHID);
+//        jsonObject.put("description", "充值");
+//        jsonObject.put("out_trade_no", tradeNo);
+//        jsonObject.put("notify_url", WxCommon.NOTIFY_URL);
+//        PayPageDto payPageDto=new PayPageDto();
+//        payPageDto.setTotal(100);
+//        jsonObject.put("amount", payPageDto);
+//        String token = SignDemo.getToken(method, httpurl, jsonObject.toJSONString(), nonceStr, timestamp);
+//        httpPost.setHeader("Authorization", "WECHATPAY2-SHA256-RSA2048" + " " + token);
+
+        //完成签名并执行请求
+        CloseableHttpResponse response = httpClient.execute(httpPost);
+
+
+        try {
+            if (response.getStatusLine().getStatusCode() == 200) {
+                HttpEntity httpEntity = response.getEntity();
+                String content = EntityUtils.toString(httpEntity, "utf8");
+                System.out.println(content.length());
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            response.close();
+        }
+    }
+}
diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/wxpay/WxCommon.java b/wisenergy-service/src/main/java/cn/wisenergy/service/wxpay/WxCommon.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f629172ff646834406fbe6424e29b97eb0f272a
--- /dev/null
+++ b/wisenergy-service/src/main/java/cn/wisenergy/service/wxpay/WxCommon.java
@@ -0,0 +1,63 @@
+package cn.wisenergy.service.wxpay;
+
+/**
+*@ Description:  微信支付公共参数
+*@ Author     : 86187
+*@ Date       : 2021/2/5 15:04
+ * @author 86187
+ */
+public class WxCommon {
+
+    public static final String APP_ID = "wx7d8f4502a2bfa865";
+
+    public static final String MCHID = "1606042985";
+
+    public static final String NOTIFY_URL = "http://www.baodu.com";
+
+    public static final String WX_PAY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/native";
+
+    public static final String WX_PAY_QUERY = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/";
+
+
+    public static final String SECRET_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDhGq+iGQueP8EU" +
+            "3qj0T0Otnha0XboVcgmeDkgbe08H54WiF9d3R4aLAo+wAkAj/R7nRw2yWeaaMEgb" +
+            "ZvUz03IioVKwLhaMVEtwE5sNFCMGDDh9jGjm66j+BYgVk02P5hUAcYLcJYeo9iHA" +
+            "cFQ1YA4r64OLD0/JWqGjpHmKJ9F3YhZjBO8ETm6grnIJyqt9ABCPBQF7fRS/ZcbC" +
+            "J8PUoEZA1eGi60FEgzeJ2stjzXZ6629INnRQanNuPegcH26oSQmph+z33bLUhXDb" +
+            "lt6exClPKucU5FZoh69dMsD1RLqNeBTUG8JCvvEWnBH3RaHKRsv/nezQHS+5euw3" +
+            "AJnTNPl5AgMBAAECggEAR9PsFx1Gx8gwJCioYMyqG8xGEmeV6SHqT7Te7WX7YdpO" +
+            "mdphtn3sQI8gqlkNfm5WXhYeGLr3Clw9pgDEXTUrRkGT0QPjzgNXzvtyjknOoy9j" +
+            "FyymjIjF88hwE/Jc3X3dVbbiurx+/TsMqgst05pC62DLKKRKIUX6Le1dmuf5vs3E" +
+            "gjDZR+Z86H8jNm0Qg5OXwbUs7uIaMKun6QUGqk0YfdeIQdMXerKp48HLSI+j+bMS" +
+            "pkE5wt4MSk3G90qHzxLgO7N2FuUFJunl8t0jrDIg7eG8qDPT2rO7tFP8zvikJbGz" +
+            "zNfI9l6CIXnPXFJtoAFRt8XBG4sNF5ncSdJbDTpXAQKBgQDySdXYOkMCHxFSKAG/" +
+            "pCyFwCMozfvKL2HShS/lVc7wwVG/yvPeqpKFvq7+xob6R20rbJEzgSBSlOwpol9s" +
+            "f+fuduUPSzLK/Dz+yL6o3CrX18g2SSgZSMbqN1KDmoF7D3GO81AmdBs/FQkg8wAa" +
+            "oWSI8K5QUuw0nfMMWZZ4bS7VLQKBgQDt1+TpC3euInhakwrYDnGqRy7W3YEuILDN" +
+            "Adp+IujN0sKKIH6dx9hZxSbqEE/t4uev3Pga9P8e+91h9rIc38b3Xw2Xn2iN/bSa" +
+            "dk7ThAu9leiJG9bs1gN7mT8Gq8kV/RKM8npAjht2dlx61T3Eb80WSf8sC3BWJ2TE" +
+            "M88jjuT8/QKBgCOPqL5i1sDx9GXdj1wkaZB8Ae0URpeHWtE+UShU7tmxViFTVXXi" +
+            "DT1qHl8wnlEPuLs95RXtJuRYDU2TEnRnVZBPjREwlVTrrrwqlKlOH0+s0Sr+k88a" +
+            "Om/YDNlaDRUV0DIODj6GnhUlLkDSyboe5BWhVcReV2Llp+2xHH+ybsRFAoGBAK6C" +
+            "2Cy+A0Q7en9KoIxCnNfJfu6ce+oyhkcFcyFVz+clGyRqDz0Jow7K/3CCI4NyF3kL" +
+            "8uckmARN3PPCJJHXB4/9qGV1yytT2a3z3IaJvmuOkJ35VUtVBB0uJfZpGRQPKgtM" +
+            "5rJzEmdrFRPzXmzBc4NFK/tPMU+le+QR94wpjo6pAoGBAOmilsvFp4UcuAeOt50q" +
+            "4FC2ApgHw4f95nCi/rtUbuC9AwiFD8nBGZTLFO1lxoms52uJ9RWYLBpY4JmWo1VG" +
+            "IaU0+nKTljLCQZNHqA87bkG4lQIKsZjNJ47PW1iUdNtXJ58aw/qnj2ldIGIcZQQY" +
+            "52pD2/10mSJy5oxiqdMccmbs";
+
+    /**
+     * 证书序列号
+     */
+    public static final String SERIAL_NO = "5A886697B1EA67984766E953683E04D2DC96482C";
+
+    /**
+     * 认证类型
+     */
+    public static final String SCHEMA = "WECHATPAY2-SHA256-RSA2048";
+
+    /**
+     * 认证类型
+     */
+    public static final String PRIVATE_KEY = "efef4a06a1654e0f78d113377ea37aed";
+}
diff --git a/wisenergy-service/wisenergy-service.iml b/wisenergy-service/wisenergy-service.iml
new file mode 100644
index 0000000000000000000000000000000000000000..1ef2560bef85ca7dc2d10255ce9fa589eae38930
--- /dev/null
+++ b/wisenergy-service/wisenergy-service.iml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="wisenergy-mapper" />
+    <orderEntry type="module" module-name="wisenergy-model" />
+    <orderEntry type="module" module-name="wisenergy-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.16.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: org.springframework:spring-web:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-test:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.8" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.16" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
+    <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.6.7" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.23" level="project" />
+    <orderEntry type="library" name="Maven: com.hikvision.ga:artemis-http-client:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains:annotations:20.1.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-core:4.5.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.5" level="project" />
+    <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-api:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-util:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: com.alipay.sdk:alipay-sdk-java:4.11.33.ALL" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpmime:4.5.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" 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.8" level="project" />
+    <orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13" level="project" />
+    <orderEntry type="library" name="Maven: com.itextpdf:itext-asian:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-pool:commons-pool:1.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.8" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" />
+    <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.6.3" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/wisenergy-shiro/.gitignore b/wisenergy-shiro/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b4f66076247712dbd69e9ec586a827b3bd8fcd7b
--- /dev/null
+++ b/wisenergy-shiro/.gitignore
@@ -0,0 +1,7 @@
+workspace
+.project
+.classpath
+*.settings
+.idea
+*.class
+target/
\ No newline at end of file
diff --git a/wisenergy-shiro/pom.xml b/wisenergy-shiro/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1aecd0d0389ab68a5f34bf91409873c0ae10306c
--- /dev/null
+++ b/wisenergy-shiro/pom.xml
@@ -0,0 +1,35 @@
+<?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>
+        <artifactId>wisenergy-parent</artifactId>
+        <groupId>org.yun</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>wisenergy-shiro</artifactId>
+    <version>${moduleVersion.wisenergy-shiro}</version>
+    <packaging>jar</packaging>
+
+    <!-- 项目依赖 -->
+    <dependencies>
+        <!-- 模块依赖 -->
+        <dependency>
+            <groupId>org.yun</groupId>
+            <artifactId>wisenergy-service</artifactId>
+            <version>${moduleVersion.wisenergy-service}</version>
+        </dependency>
+        <!-- Shiro -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring-boot-web-starter</artifactId>
+        </dependency>
+    </dependencies>
+
+    <!-- MAVEN构建 -->
+    <build>
+        <finalName>${project.artifactId}-${moduleVersion.project-shiro}</finalName>
+    </build>
+</project>
\ No newline at end of file
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/config/ShiroConfig.java b/wisenergy-shiro/src/main/java/com/project/shiro/config/ShiroConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..eaa1f579ffa0b7bc63a1feec3a7c71badd91aec8
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/config/ShiroConfig.java
@@ -0,0 +1,197 @@
+package com.project.shiro.config;
+
+import com.project.shiro.util.AuthenticationFilter;
+import com.project.shiro.util.AuthenticationRealm;
+import com.project.shiro.util.AuthorizationFilter;
+import com.project.shiro.util.redis.ShiroRedisCacheManager;
+import com.project.shiro.util.redis.ShiroRedisSessionDAO;
+import org.apache.shiro.session.mgt.SessionManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+
+import javax.servlet.Filter;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Description: shiro配置类
+ * User: mxy
+ * Date: 2019-04-16
+ */
+@Configuration
+public class ShiroConfig {
+
+    private static final transient Logger logger = LoggerFactory.getLogger(ShiroConfig.class);
+
+    /**
+     * 配置拦截器
+     * <p>
+     * 定义拦截URL权限,优先级从上到下
+     * 1). anon  : 匿名访问,无需登录
+     * 2). authc : 登录后才能访问
+     * 3). logout: 登出
+     * 4). frameperms : 自定义的过滤器
+     * <p>
+     * URL 匹配风格
+     * 1). ?:匹配一个字符,如 /admin? 将匹配 /admin1,但不匹配 /admin 或 /admin/;
+     * 2). *:匹配零个或多个字符串,如 /admin* 将匹配 /admin 或/admin123,但不匹配 /admin/1;
+     * 3). **:匹配路径中的零个或多个路径,如 /admin/** 将匹配 /admin/a 或 /admin/a/b
+     * <p>
+     * 配置身份验证成功,失败的跳转路径
+     */
+    @Bean
+    public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {
+        logger.info("进入Shiro拦截工厂");
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        // 设置securityManager
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+
+        // 自定义的过滤器
+        Map<String, Filter> filterMap = new HashMap<>();
+        // map里面key值要为过滤器的名称,value为过滤器对象
+        filterMap.put("authc", authenticationFilter());
+        filterMap.put("frameperms", authorizationFilter());
+        // 将自定义的过滤器加入到过滤器集合中
+        shiroFilterFactoryBean.setFilters(filterMap);
+
+        // 设置拦截器集合
+        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
+        filterChainDefinitionMap.put("/admin/", "anon"); // 后台资源-匿名访问
+        filterChainDefinitionMap.put("/admin/res/**", "anon"); // 静态资源-匿名访问
+        filterChainDefinitionMap.put("/admin/anon/**", "anon"); // 后台可匿名访问资源-匿名访问
+        filterChainDefinitionMap.put("/admin/login", "authc"); // 登录页面-身份认证
+        filterChainDefinitionMap.put("/admin/logout", "logout");    // 用户退出,只需配置logout即可实现该功能
+        filterChainDefinitionMap.put("/admin/common/**", "anon");  // 其他路径均需要身份认证,一般位于最下面,优先级最低
+        filterChainDefinitionMap.put("/admin/**", "authc,frameperms");  // 其他路径均需要身份认证,一般位于最下面,优先级最低
+
+        // 设置拦截器
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+        shiroFilterFactoryBean.setLoginUrl("/admin/login");       // 登录的路径
+//        shiroFilterFactoryBean.setUnauthorizedUrl("/admin/common/unauthorized.jhtml");  // 验证失败后跳转的路径
+        logger.info("Shiro拦截工厂配置完成");
+        return shiroFilterFactoryBean;
+    }
+
+    /**
+     * 配置Shiro生命周期处理器
+     */
+    @Bean
+    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    /**
+     * 自动创建代理类,若不添加,Shiro的注解可能不会生效。
+     */
+    @Bean
+    @DependsOn({"lifecycleBeanPostProcessor"})
+    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        advisorAutoProxyCreator.setProxyTargetClass(true);
+        return advisorAutoProxyCreator;
+    }
+
+    /**
+     * 开启Shiro的注解
+     */
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
+        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
+        return authorizationAttributeSourceAdvisor;
+    }
+
+    /**
+     * 配置加密匹配,使用MD5的方式,进行1024次加密
+     */
+//    @Bean
+//    public HashedCredentialsMatcher hashedCredentialsMatcher() {
+//        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
+//        hashedCredentialsMatcher.setHashAlgorithmName("MD5");
+//        hashedCredentialsMatcher.setHashIterations(1024);
+//        return hashedCredentialsMatcher;
+//    }
+
+    /**
+     * SecurityManager 安全管理器;Shiro的核心
+     */
+    @Bean
+    public DefaultWebSecurityManager securityManager() {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        // 自定义的Realm
+        securityManager.setRealm(authenticationShiroRealm());
+        // 缓存管理
+        securityManager.setCacheManager(shiroRedisCacheManager());
+        // 会话管理
+        securityManager.setSessionManager(sessionManager());
+        return securityManager;
+    }
+
+    /**
+     * 自定义Realm,可以多个
+     */
+    @Bean
+    public AuthenticationRealm authenticationShiroRealm() {
+        AuthenticationRealm authenticationRealm = new AuthenticationRealm();
+        //authenticationRealm.setCredentialsMatcher(hashedCredentialsMatcher());
+        return authenticationRealm;
+    }
+
+    /**
+     * redis缓存管理
+     */
+    @Bean
+    public ShiroRedisCacheManager shiroRedisCacheManager() {
+        return new ShiroRedisCacheManager();
+    }
+
+    /**
+     * 设置session会话管理者
+     */
+    @Bean
+    public SessionManager sessionManager() {
+        DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
+        defaultWebSessionManager.setSessionIdCookie(simpleCookie());
+        defaultWebSessionManager.setSessionDAO(shiroRedisSessionDAO());
+        return defaultWebSessionManager;
+    }
+
+    /**
+     * session管理
+     */
+    @Bean
+    public ShiroRedisSessionDAO shiroRedisSessionDAO() {
+        return new ShiroRedisSessionDAO();
+    }
+
+    /**
+     * 这里需要设置一个cookie的名称  原因就是会跟原来的session的id值重复的
+     */
+    @Bean
+    public SimpleCookie simpleCookie() {
+        return new SimpleCookie("SHAREJSESSIONID");
+    }
+
+
+    @Bean
+    public AuthenticationFilter authenticationFilter() {
+        return new AuthenticationFilter();
+    }
+
+    @Bean
+    public AuthorizationFilter authorizationFilter() {
+        return new AuthorizationFilter();
+    }
+
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/controller/AuthController.java b/wisenergy-shiro/src/main/java/com/project/shiro/controller/AuthController.java
new file mode 100644
index 0000000000000000000000000000000000000000..e00226deba6f802f8b32f3a8f73b17fc67d68c56
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/controller/AuthController.java
@@ -0,0 +1,46 @@
+/*
+package com.project.shiro.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+*/
+/**
+ * 控制器编码范例
+ *
+ * @author wyy
+ * @date 2019-08-20 19:57
+ *//*
+
+@Api(value = "shiro权限测试", tags = "shiro权限测试")
+@RestController("adminAuthController")
+@RequestMapping("/admin")
+public class AuthController extends BaseController {
+
+    */
+/**
+     * 测试权限
+     *
+     * @return
+     *//*
+
+    @ApiOperation(value = "test", notes = "测试权限", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "test", value = "测试参数", dataType = "String")
+    })
+    @RequiresPermissions({"admin:test1"})
+    @PostMapping(value = "/test")
+    public Map<String, Object> test() {
+        return getResult(123);
+    }
+
+}
+*/
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/controller/BaseController.java b/wisenergy-shiro/src/main/java/com/project/shiro/controller/BaseController.java
new file mode 100644
index 0000000000000000000000000000000000000000..473a9fcda17264aca49f2b5e09d0c2cba472223b
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/controller/BaseController.java
@@ -0,0 +1,139 @@
+/*
+package com.project.shiro.controller;
+
+import BASE_RESP_CODE_ENUM;
+import BaseCustomException;
+import Result;
+import net.sf.json.JSONObject;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.ConversionNotSupportedException;
+import org.springframework.beans.TypeMismatchException;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.http.converter.HttpMessageNotWritableException;
+import org.springframework.web.HttpMediaTypeNotAcceptableException;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+*/
+/**
+ * 控制器基类
+ *
+ * @author wyy
+ * @date 2019年0月14日
+ *//*
+
+public abstract class BaseController {
+    private static final long serialVersionUID = -6344078923170236539L;
+    protected Logger log = LoggerFactory.getLogger(this.getClass());
+
+    */
+/**
+     * 应用接口异常处理
+     *
+     * @param response Response相应对象
+     * @param ex
+     *//*
+
+    @ResponseBody
+    @ExceptionHandler(Exception.class)
+    public void handleException(HttpServletResponse response, Exception ex) {
+        Class eClass = ex.getClass();
+        Map<String, Object> map = new HashMap<>();
+        */
+/*map.put(Result.RESULT_FLG.valueOf(), ResultUtil.Result.FAIL.getValue());*//*
+
+        if (!eClass.equals(BaseCustomException.class)) {
+            log.error(ExceptionUtils.getStackTrace(ex));
+        }
+        //以下异常中,除注释过的,其他异常可不关注
+        if (eClass.equals(MissingServletRequestParameterException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.MIS_REQ_PARAM, map);
+        } else if (eClass.equals(TypeMismatchException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.MIS_REQ_PARAM, map);
+        } else if (eClass.equals(HttpMessageNotReadableException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.MIS_REQ_PARAM, map);
+        } else if (eClass.equals(HttpRequestMethodNotSupportedException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.METHOD_NOT_SUPPORTED, map);
+        } else if (eClass.equals(HttpMediaTypeNotAcceptableException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.MEDIA_TYPE_NOT_ACCEPT, map);
+        } else if (eClass.equals(HttpMediaTypeNotSupportedException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.MEDIA_TYPE_NOT_SUPPORTED, map);
+        } else if (eClass.equals(ConversionNotSupportedException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.SERVER_ERROR, map);
+        } else if (eClass.equals(HttpMessageNotWritableException.class)) {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.SERVER_ERROR, map);
+        } else if (eClass.equals(BaseCustomException.class)) { //系统业务异常
+            addExceptionToMap((BaseCustomException) ex, map);
+        } else if (eClass.equals(UnauthorizedException.class)) { // 无权限
+            addExceptionToMap(new BaseCustomException(BASE_RESP_CODE_ENUM.REJECT_REQUEST), map);
+        } else {
+            addResCodeToMap(BASE_RESP_CODE_ENUM.SERVER_ERROR, map);
+        }
+
+        // 错误相应编码回写
+        PrintWriter writer = null;
+        try {
+            response.setContentType("application/json; charset=UTF-8");
+            writer = response.getWriter();
+            writer.write(JSONObject.fromObject(map).toString());
+            writer.flush();
+        } catch (Exception e) {
+            IOUtils.closeQuietly(writer);
+            log.error("接口异常:{}", ExceptionUtils.getFullStackTrace(e));
+        }
+    }
+
+    */
+/**
+     * 添加系统异常信息到map中
+     *
+     * @param responseCodeEnum 错误响应编码枚举类对象
+     * @param map              响应错误编码集合
+     *//*
+
+    protected void addResCodeToMap(BASE_RESP_CODE_ENUM responseCodeEnum, Map<String, Object> map) {
+        map.put(ResultUtil.ERRORCODE_PARAM_NAME, responseCodeEnum.getCode());
+        map.put(ResultUtil.ERRORMSG_PARAM_NAME, responseCodeEnum.getMsg());
+    }
+
+    */
+/**
+     * 添加异常信息到map中
+     *
+     * @param baseCustomException 接口异常类
+     * @param map                 接口异常集合
+     *//*
+
+    protected void addExceptionToMap(BaseCustomException baseCustomException, Map<String, Object> map) {
+        map.put(ResultUtil.ERRORCODE_PARAM_NAME, baseCustomException.getErrorCode());
+        map.put(ResultUtil.ERRORMSG_PARAM_NAME, baseCustomException.getErrorMsg());
+    }
+
+    */
+/**
+     * 添加数据到结果对象中
+     *
+     * @param obj 封装接口集合参数
+     * @return
+     *//*
+
+    public Map<String, Object> getResult(Object obj) {
+        Map<String, Object> map = new HashMap<>();
+        map.put(ResultUtil.RESULT_PARAM_NAME, ResultUtil.Result.SUCCESS.getValue());
+        map.put(ResultUtil.DATA_PARAM_NAME, obj);
+        return map;
+    }
+}
+*/
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/controller/loginController.java b/wisenergy-shiro/src/main/java/com/project/shiro/controller/loginController.java
new file mode 100644
index 0000000000000000000000000000000000000000..84a95179c750e097dc41b2d1bbae97ffac86f9a4
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/controller/loginController.java
@@ -0,0 +1,62 @@
+/*
+package com.project.shiro.controller;
+
+import BaseCustomException;
+import com.project.shiro.util.AuthenticationToken;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.subject.Subject;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+*/
+/**
+ * 后台公用controller
+ *//*
+
+@RestController("adminLoginController")
+@RequestMapping("/admin")
+public class loginController extends BaseController {
+    private static final long serialVersionUID = -7624305021416504596L;
+
+    */
+/**
+     * shiro登录
+     *
+     * @return
+     *//*
+
+    @ApiOperation(value = "shiro登录", notes = "shiro登录", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "loginName", value = "账户名", dataType = "String"),
+            @ApiImplicitParam(name = "enPassword", value = "密码", dataType = "String")
+    })
+    @PostMapping(value = "/login")
+    public Map<String, Object> login(String loginName, String enPassword) {
+        try {
+            Subject subject = SecurityUtils.getSubject();
+            AuthenticationToken token = new AuthenticationToken(loginName, enPassword, false, "", "", "");
+            subject.login(token);
+        } catch (UnknownAccountException e) {
+            String msg = "账号不存在";
+            throw new BaseCustomException("10090", msg);
+        } catch (IncorrectCredentialsException e) {
+            String msg = "密码不正确";
+            throw new BaseCustomException("10091", msg);
+        } catch (AuthenticationException e) {
+            String msg = "用户验证失败";
+            throw new BaseCustomException("10092", msg);
+        }
+        return getResult("success");
+    }
+
+}
+*/
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationFilter.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..62be758c5b6bac1cf56aa8211fe143ee5f70cdbc
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationFilter.java
@@ -0,0 +1,275 @@
+package com.project.shiro.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.util.StringUtils;
+import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
+import org.apache.shiro.web.util.WebUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * 自定义表单认证过滤器
+ *
+ * @author wyy
+ * @date 2019/07/26
+ */
+public class AuthenticationFilter extends FormAuthenticationFilter {
+    private static final Logger log = LoggerFactory.getLogger(AuthenticationFilter.class);
+
+    //加密密码参数
+    private static final String DEFAULT_EN_PASSWORD_PARAM = "enPassword";
+
+    //默认的登录名称
+    private static final String DEFAULT_USERNAME_PARAM = "loginName";
+
+    //默认验证码ID参数
+    private static final String DEFAULT_CAPTCHA_ID_PARAM = "captchaId";
+
+    //默认验证码参数
+    private static final String DEFAULT_CAPTCHA_PARAM = "captcha";
+
+    private String captchaIdParam = DEFAULT_CAPTCHA_ID_PARAM;
+
+    private String captchaParam = DEFAULT_CAPTCHA_PARAM;
+
+    private String usernameParam = DEFAULT_USERNAME_PARAM;
+
+    private String enPasswordParam = DEFAULT_EN_PASSWORD_PARAM;
+
+    /**
+     * 创建token
+     */
+    @Override
+    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
+        String loginName = getUsername(request);
+        String password = getPassword(request);
+        boolean isRemeberMe = isRememberMe(request);
+        String ip = getHost(request);
+        return new com.project.shiro.util.AuthenticationToken(loginName, password, isRemeberMe, ip, "", "");
+    }
+
+    /**
+     * 登录拒绝;增加Ajax异步处理
+     *
+     * @param servletRequest  请求对象
+     * @param servletResponse 响应对象
+     * @return
+     * @throws Exception
+     */
+    @Override
+    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
+        // 判断是否为ajax异步请求
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        HttpServletResponse response = (HttpServletResponse) servletResponse;
+
+        // 判断是否为登录请求
+        if (this.isLoginRequest(servletRequest, response)) {
+            if (this.isLoginSubmission(servletRequest, response)) {
+
+                if (log.isTraceEnabled()) {
+                    log.trace("Login submission detected.  Attempting to execute login.");
+                }
+                boolean b = executeLogin(servletRequest, response);
+                return b;
+            } else {
+                if (log.isTraceEnabled()) {
+                    log.trace("Login page view.");
+                }
+                return true;
+            }
+        } else {
+            if (log.isTraceEnabled()) {
+                log.trace("Attempting to access a path which requires authentication.  Forwarding to the Authentication url [" + this.getLoginUrl() + "]");
+            }
+
+            // 异步请求报错
+            if (isAjaxReq(request, response)) {
+                response.setContentType("application/json");
+                response.setCharacterEncoding("UTF-8");
+                PrintWriter out = response.getWriter();
+                JSONObject json = new JSONObject();
+                json.put("result", "fail");
+                json.put("msg", "未登录");
+                out.println(json);
+                out.flush();
+                out.close();
+                return false;
+            }
+
+//             如果同步请求继续执行基类方法(当为同步方法的时候,基类会直接跳转登录页面)
+            return super.onAccessDenied(request, response);
+        }
+
+    }
+
+    /**
+     * 重写登录成功的方法;如果为异步请求,直接返回成功响应
+     *
+     * @param token
+     * @param subject
+     * @param servletRequest
+     * @param servletResponse
+     * @return
+     * @throws Exception
+     */
+    @Override
+    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
+        // 如果为异步请求,登录成功后,直接返回数据,前台跳转登录后的页面处理
+        if (isAjaxReq(servletRequest, servletResponse)) {
+            HttpServletResponse response = (HttpServletResponse) servletResponse;
+            response.setContentType("application/json");
+            response.setCharacterEncoding("UTF-8");
+            PrintWriter out = response.getWriter();
+            JSONObject json = new JSONObject();
+            json.put("result", "success");
+            json.put("msg", "登录成功");
+            out.write(json.toJSONString());
+            out.flush();
+            out.close();
+            return true;
+        }
+        return super.onLoginSuccess(token, subject, servletRequest, servletResponse);
+    }
+
+    @Override
+    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+        //Always return true if the request's method is OPTIONSif (request instanceof HttpServletRequest) {
+        if (((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")) {
+            return true;
+        }
+        return super.isAccessAllowed(request, response, mappedValue);
+    }
+
+    /**
+     * 重写登录失败的方法;如果为异步请求,直接返回失败响应
+     *
+     * @param token
+     * @param e
+     * @param request
+     * @param response
+     * @return
+     */
+    @Override
+    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
+        // 如果为异步登录,直接返回错误结果
+        if (isAjaxReq(request, response)) {
+            PrintWriter out = null;
+            try {
+                response = (HttpServletResponse) response;
+                response.setContentType("application/json");
+                response.setCharacterEncoding("UTF-8");
+                out = response.getWriter();
+                JSONObject json = new JSONObject();
+                if (e.equals("org.apache.shiro.authc.pam.UnsupportedTokenException")) {
+                    String message = "验证码错误!";
+                    json.put("result", "fail");
+                    json.put("msg", message);
+                } else if (e.equals("org.apache.shiro.authc.UnknownAccountException")) {
+                    String message = "此账号不存在!";
+                    json.put("result", "fail");
+                    json.put("msg", message);
+                } else if (e.equals("org.apache.shiro.authc.DisabledAccountException")) {
+                    String message = "此账号已被禁用!";
+                    json.put("result", "fail");
+                    json.put("msg", message);
+                } else if (e.equals("org.apache.shiro.authc.LockedAccountException")) {
+                    String message = "此账号已被锁定";
+                    json.put("result", "fail");
+                    json.put("msg", message);
+                } else if (e.equals("org.apache.shiro.authc.IncorrectCredentialsException")) {
+                    String message = "密码错误";
+                    json.put("result", "fail");
+                    json.put("msg", message);
+                } else if (e.equals("org.apache.shiro.authc.AuthenticationException")) {
+                    String message = "账号认证失败!";
+                    json.put("result", "fail");
+                    json.put("msg", message);
+                }
+                out.write(json.toJSONString());
+                out.flush();
+                out.close();
+                return false;
+            } catch (IOException ex) {
+                ex.printStackTrace();
+                log.error("shiro认证失败");
+            }
+
+        }
+
+        // 同步请求走基类
+        return super.onLoginFailure(token, e, request, response);
+    }
+
+
+    /**
+     * 获取密码
+     *
+     * @param servletRequest
+     * @return
+     */
+    @Override
+    protected String getPassword(ServletRequest servletRequest) {
+        String parameter = servletRequest.getParameter(enPasswordParam);
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        String enPasswor = request.getParameter(enPasswordParam);
+        String password = enPasswor;
+        return password;
+    }
+
+    /**
+     * 判断是否为Ajax请求
+     *
+     * @param servletRequest
+     * @param servletResponse
+     * @return
+     */
+    public boolean isAjaxReq(ServletRequest servletRequest, ServletResponse servletResponse) {
+        boolean isAjaxReq = false;
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        HttpServletResponse response = (HttpServletResponse) servletResponse;
+        String requestType = request.getHeader("X-Requested-With");
+        if (requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest")) {
+            isAjaxReq = true;
+        }
+        return isAjaxReq;
+    }
+
+    public String getEnPasswordParam() {
+        return enPasswordParam;
+    }
+
+    public void setEnPasswordParam(String enPasswordParam) {
+        this.enPasswordParam = enPasswordParam;
+    }
+
+    public String getUsernameParam() {
+        return usernameParam;
+    }
+
+    public String getCaptchaIdParam() {
+        return captchaIdParam;
+    }
+
+    public void setCaptchaIdParam(String captchaIdParam) {
+        this.captchaIdParam = captchaIdParam;
+    }
+
+    public String getCaptchaParam() {
+        return captchaParam;
+    }
+
+    public void setCaptchaParam(String captchaParam) {
+        this.captchaParam = captchaParam;
+    }
+
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationRealm.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationRealm.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea43120159aafec5effe5d88ab128b962b6298a8
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationRealm.java
@@ -0,0 +1,195 @@
+package com.project.shiro.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.project.model.core.Admin;
+import com.project.model.core.Menu;
+import com.project.model.core.Role;
+import com.project.service.core.AdminService;
+import com.project.service.core.MenuService;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.Permission;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+
+import javax.annotation.Resource;
+import java.io.PrintWriter;
+import java.util.*;
+
+/**
+ * 认证
+ */
+public class AuthenticationRealm extends AuthorizingRealm {
+
+    @Resource(name = "adminServiceImpl")
+    private AdminService adminService;
+
+    @Resource(name = "menuServiceImpl")
+    private MenuService menuService;
+
+    /**
+     * 获取认证信息
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken token) {
+        AuthenticationToken authToken = (AuthenticationToken) token;
+        // 获取登录名、密码
+        String username = authToken.getUsername();
+        String password = new String(authToken.getPassword());
+
+        if (username != null && password != null) {
+            Admin admin = adminService.getByLoginName(username);
+
+            if (admin == null) {
+                throw new UnknownAccountException();
+            }
+
+            if (!admin.getStatus().equals(Admin.STATUS_ENUM.ENABLE.getValue())) {
+                throw new DisabledAccountException();
+            }
+
+            //用户锁定
+            if (admin.getIsLocked()) {
+
+                //账号锁定分钟数
+                Date lockedDate = admin.getLockedDate();
+                Date unlockedDate = DateUtils.addMinutes(lockedDate, 10);
+
+                //判断锁定时间是否已过
+                if (new Date().after(unlockedDate)) {
+                    admin.setLoginFailCnt(0);
+                    admin.setIsLocked(false);
+                    admin.setLockedDate(null);
+                    adminService.update(admin);
+                } else {
+                    throw new LockedAccountException();
+                }
+            }
+
+            //密码不正确
+            if (!DigestUtils.md5Hex(password).equals(admin.getLoginPwd())) {
+                int loginFailCount = admin.getLoginFailCnt() + 1;
+                if (loginFailCount >= 5) {
+                    admin.setIsLocked(true);
+                    admin.setLockedDate(new Date());
+                }
+                admin.setLoginFailCnt(loginFailCount);
+                adminService.update(admin);
+                throw new IncorrectCredentialsException();
+            }
+            admin.setLoginFailCnt(0);
+            adminService.update(admin);
+            return new SimpleAuthenticationInfo(new Principal(admin.getId(), username), password, getName());
+        }
+        throw new UnknownAccountException();
+    }
+
+    /**
+     * 获取授权信息
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+
+        Principal principal = (Principal) principals.fromRealm(getName()).iterator().next();
+
+        if (principal != null) {
+            SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo();
+
+            //获取admin对象
+            Admin adminTemp = new Admin();
+            adminTemp.setId(principal.getId());
+            List<Admin> admins = adminService.getAdminCascadeRole(adminTemp);
+            Admin admin = admins.get(0);
+
+            //获取用户的角色信息
+            Set<String> roleSet = new HashSet<String>();
+            for (Role role : admin.getRoles()) {
+                if (role.getStatus().equals(Role.STATUS_ENUM.ENABLE.getValue())) {
+                    roleSet.add(role.getRoleCode());
+                }
+            }
+
+            //根据角色ids获取权限信息
+            List<Menu> menuList = menuService.findOrdinaryMenu(principal.getId());
+            Set<String> menuSet = new HashSet<String>();
+            for (Menu menu : menuList) {
+                if (StringUtils.isNotBlank(menu.getCode())) {
+                    menuSet.add(menu.getCode());
+                }
+            }
+
+            //将角色和资源放入授权对象中
+            authInfo.addRoles(roleSet);
+            authInfo.addStringPermissions(menuSet);
+            return authInfo;
+        }
+
+        return null;
+    }
+
+    /**
+     * 超级管理员自动获取所有权限
+     */
+//    @Override
+//    public boolean isPermitted(PrincipalCollection principals, String permission) {
+////        User user = ((User) principals.getPrimaryPrincipal());
+////        if (Role.ADMIN_FLAG_SUPER_ADMIN == user.getRole().getAdminFlag()) {
+////            return true;
+////        }
+//
+//        return isPermitted(principals, getPermissionResolver().resolvePermission(permission));
+//    }
+
+    @Override
+    public boolean isPermitted(PrincipalCollection principals, Permission permission) {
+        AuthorizationInfo info = getAuthorizationInfo(principals);
+        Collection<Permission> perms = getPermissions(info);
+        if (CollectionUtils.isEmpty(perms)) {
+            return false;
+        }
+
+        for (Permission perm : perms) {
+            if (perm.implies(permission)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * 踢掉上一个登录的同名用户
+     *
+     * @param id 主键
+     */
+
+//    private void stopPreviousSession(Integer id) {
+//        Collection<Session> sessions = sessionDAO.getActiveSessions();
+//        Session currSession = SecurityUtils.getSubject().getSession();
+//        Serializable sId = currSession.getId();
+//        for (Session session : sessions) {
+//            SimplePrincipalCollection collection = (SimplePrincipalCollection) session
+//                    .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
+//            if (collection == null) {
+//                continue;
+//            }
+//
+//            User u = (User) collection.getPrimaryPrincipal();
+//            if (id.equals(u.getId())) {
+//                if (sId.equals(session.getId())) {
+//                    continue;
+//                }
+//
+//                session.stop();
+//                break;
+//            }
+//        }
+//    }
+
+
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationToken.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..01bef66991867274db6de3cad24d049ba43556cd
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationToken.java
@@ -0,0 +1,41 @@
+package com.project.shiro.util;
+
+import org.apache.shiro.authc.UsernamePasswordToken;
+
+/**
+ * 登录令牌
+ */
+public class AuthenticationToken extends UsernamePasswordToken {
+
+    private static final long serialVersionUID = 4628652632307774263L;
+
+    //验证码ID
+    private String captchaId;
+
+    //验证码
+    private String captcha;
+
+    //ip保留
+    public AuthenticationToken(String loginName, String password, boolean remeberMe, String ip, String captchaId, String caprcha) {
+        super(loginName, password, remeberMe);
+        this.captchaId = captchaId;
+        this.captcha = caprcha;
+    }
+
+    public String getCaptchaId() {
+        return captchaId;
+    }
+
+    public void setCaptchaId(String captchaId) {
+        this.captchaId = captchaId;
+    }
+
+    public String getCaptcha() {
+        return captcha;
+    }
+
+    public void setCaptcha(String captcha) {
+        this.captcha = captcha;
+    }
+
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthorizationFilter.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthorizationFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e4192f4c6535354f3761f964ea1fc8c3e0ee067
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthorizationFilter.java
@@ -0,0 +1,47 @@
+package com.project.shiro.util;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.ResponseHeader;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author wyy
+ * @date 2019-09-14 17:57
+ */
+public class AuthorizationFilter extends PermissionsAuthorizationFilter {
+     /**
+     * shiro认证perms资源失败后回调方法
+     * @param servletRequest
+     * @param servletResponse
+     * @return
+     * @throws IOException
+     */
+    @Override
+    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
+        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
+        String requestedWith = httpServletRequest.getHeader("X-Requested-With");
+        if (StringUtils.isNotEmpty(requestedWith) && StringUtils.equals(requestedWith, "XMLHttpRequest")) {//如果是ajax返回指定格式数据
+            httpServletResponse.setContentType("application/json");
+            httpServletResponse.setCharacterEncoding("UTF-8");
+            PrintWriter out = httpServletResponse.getWriter();
+            JSONObject json = new JSONObject();
+            json.put("result", "success");
+            json.put("msg", "登录成功");
+            out.write(json.toJSONString());
+            out.flush();
+            out.close();
+        } else {//如果是普通请求进行重定向
+            httpServletResponse.sendRedirect("/403");
+        }
+        return false;
+    }
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/Principal.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/Principal.java
new file mode 100644
index 0000000000000000000000000000000000000000..332eaf4a13f19b795f7f7ee5ad8f229d033443c2
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/Principal.java
@@ -0,0 +1,38 @@
+package com.project.shiro.util;
+
+import java.io.Serializable;
+
+public class Principal implements Serializable {
+
+    private static final long serialVersionUID = 598764316789461315L;
+
+    public Long id;
+
+    public String loginName;
+
+    public Principal(Long id, String loginName) {
+        this.id = id;
+        this.loginName = loginName;
+    }
+
+    public Principal() {
+
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCache.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCache.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac97a732598069a5c9585006b36066ea8388fedc
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCache.java
@@ -0,0 +1,178 @@
+package com.project.shiro.util.redis;
+
+import cn.wisenergy.service.common.utils.ByteUtil;
+import cn.wisenergy.service.common.utils.redis.RedisClient;
+import cn.wisenergy.service.common.utils.redis.RedisConsts;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.util.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.*;
+
+public class ShiroRedisCache<K, V> implements Cache<K, V> {
+
+    //初始化Log日志
+    private Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    //注入redisClient实例
+    @Resource(name = "redisClient")
+    private RedisClient redisClient;
+
+    //shiroSession的key值前缀
+    private String keyPrefix;
+
+    //通过redisClient实例和prefix参数构造redisCache
+    public ShiroRedisCache(RedisClient redisClient, String prefix) {
+        if (redisClient == null) {
+            throw new IllegalArgumentException("shiroRedisCahe初始化时,redisClient参数不能为空");
+        }
+        this.redisClient = redisClient;
+        this.keyPrefix = prefix;
+    }
+
+    /**
+     * 获得String类型的KEY
+     *
+     * @param key
+     * @return
+     */
+    private String getPreStringKey(K key) {
+        String preKey = null;
+        if (key instanceof String) {
+            preKey = this.keyPrefix + key;
+            return preKey;
+        } else {
+            try {
+                preKey = keyPrefix + ByteUtil.bytesToHexString(ByteUtil.objectToBytes(key));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            return preKey;
+        }
+    }
+
+    @Override
+    public V get(K key) throws CacheException {
+        logger.debug("根据key从Redis中获取对象 key [" + key + "]");
+        try {
+            if (key == null) {
+                return null;
+            } else {
+                V Vvalue = (V) redisClient.get(getPreStringKey(key));
+                if (Vvalue == null) {
+                    return null;
+                }
+                return Vvalue;
+            }
+        } catch (Throwable t) {
+            throw new CacheException(t);
+        }
+
+    }
+
+    @Override
+    public V put(K key, V value) throws CacheException {
+        logger.debug("根据key从存储 key [" + key + "]");
+        try {
+            redisClient.set(getPreStringKey(key), value);
+            redisClient.setAndExpire(getPreStringKey(key), value, RedisConsts.ADMIN_SHIRO_REALM_EXPIRE);
+            return value;
+        } catch (Throwable t) {
+            throw new CacheException(t);
+        }
+    }
+
+    @Override
+    public V remove(K key) throws CacheException {
+        logger.debug("从redis中删除 key [" + key + "]");
+        try {
+            V previous = get(key);
+            redisClient.del(getPreStringKey(key));
+            return previous;
+        } catch (Throwable t) {
+            throw new CacheException(t);
+        }
+    }
+
+    @Override
+    public void clear() throws CacheException {
+        logger.debug("从redis中删除所有元素");
+        try {
+//            redisClient.flushDB();
+        } catch (Throwable t) {
+            throw new CacheException(t);
+        }
+    }
+
+    @Override
+    public int size() {
+//		try {
+//			Long longSize = new Long(redisClient.dbSize());
+//            return longSize.intValue();
+//        } catch (Throwable t) {
+//            throw new CacheException(t);
+//        }
+        return 0;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Set<K> keys() {
+        try {
+            Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*"));
+            if (CollectionUtils.isEmpty(keys)) {
+                return Collections.emptySet();
+            } else {
+                Set<K> newKeys = new HashSet<K>();
+                for (byte[] key : keys) {
+                    newKeys.add((K) key);
+                }
+                return newKeys;
+            }
+        } catch (Throwable t) {
+            throw new CacheException(t);
+        }
+    }
+
+    @Override
+    public Collection<V> values() {
+        try {
+            Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*"));
+            if (!CollectionUtils.isEmpty(keys)) {
+                List<V> values = new ArrayList<V>(keys.size());
+                for (byte[] key : keys) {
+                    @SuppressWarnings("unchecked")
+                    V value = get((K) key);
+                    if (value != null) {
+                        values.add(value);
+                    }
+                }
+                return Collections.unmodifiableList(values);
+            } else {
+                return Collections.emptyList();
+            }
+        } catch (Throwable t) {
+            throw new CacheException(t);
+        }
+    }
+
+    public String getKeyPrefix() {
+        return keyPrefix;
+    }
+
+    public void setKeyPrefix(String keyPrefix) {
+        this.keyPrefix = keyPrefix;
+    }
+
+    public RedisClient getRedisClient() {
+        return redisClient;
+    }
+
+    public void setRedisClient(RedisClient redisClient) {
+        this.redisClient = redisClient;
+    }
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCacheManager.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCacheManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..3aa5f43ecafabff6f7eeeaafed1f0dfc78138ea6
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCacheManager.java
@@ -0,0 +1,59 @@
+package com.project.shiro.util.redis;
+
+
+import cn.wisenergy.service.common.utils.redis.RedisClient;
+import cn.wisenergy.service.common.utils.redis.RedisConsts;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.cache.CacheException;
+import org.apache.shiro.cache.CacheManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.Resource;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+public class ShiroRedisCacheManager implements CacheManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(ShiroRedisCacheManager.class);
+
+    private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>();
+
+    //注入redisClient实例
+    @Resource(name = "redisClient")
+    private RedisClient redisClient;
+
+    /**
+     * shiro权限缓存前缀
+     */
+    private String keyPrefix = RedisConsts.ADMIN_SHIRO_REALM_KEY;
+
+
+    @Override
+    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
+
+        logger.debug("获取名称为: " + name + " 的RedisCache实例");
+        Cache c = caches.get(keyPrefix + name);
+        if (c == null) {
+            c = new ShiroRedisCache<K, V>(redisClient, keyPrefix);
+            caches.put(keyPrefix + name, c);
+        }
+        return c;
+    }
+
+    public RedisClient getRedisClient() {
+        return redisClient;
+    }
+
+    public void setRedisClient(RedisClient redisClient) {
+        this.redisClient = redisClient;
+    }
+
+    public String getKeyPrefix() {
+        return keyPrefix;
+    }
+
+    public void setKeyPrefix(String keyPrefix) {
+        this.keyPrefix = keyPrefix;
+    }
+}
diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisSessionDAO.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisSessionDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..d921480e2ec515384e2e0fb908d653b6857e5cb4
--- /dev/null
+++ b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisSessionDAO.java
@@ -0,0 +1,129 @@
+package com.project.shiro.util.redis;
+
+import cn.wisenergy.service.common.utils.ByteUtil;
+import cn.wisenergy.service.common.utils.redis.RedisClient;
+import cn.wisenergy.service.common.utils.redis.RedisConsts;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.session.UnknownSessionException;
+import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ShiroRedisSessionDAO extends AbstractSessionDAO {
+
+    private static Logger logger = LoggerFactory.getLogger(ShiroRedisSessionDAO.class);
+
+    //注入redisClient实例
+    @Resource(name = "redisClient")
+    private RedisClient redisClient;
+
+    /**
+     * shiro-redis的session对象前缀
+     */
+
+    private String keyPrefix = RedisConsts.ADMIN_SHIRO_SESSION_KEY;
+
+    @Override
+    public void update(Session session) throws UnknownSessionException {
+        this.saveSession(session);
+    }
+
+    private void saveSession(Session session) throws UnknownSessionException {
+        if (session == null || session.getId() == null) {
+            logger.error("session or session id is null");
+            return;
+        }
+        this.redisClient.setAndExpire(this.getPreStringKey(session.getId()), session, RedisConsts.ADMIN_SHIRO_SESSION_EXPIRE);
+    }
+
+    @Override
+    public void delete(Session session) {
+        if (session == null || session.getId() == null) {
+            logger.error("session or session id is null");
+            return;
+        }
+        redisClient.del(getPreStringKey(session.getId()));
+
+    }
+
+    @Override
+    public Collection<Session> getActiveSessions() {
+        Set<Session> sessions = new HashSet<Session>();
+
+        Set<byte[]> keys = null;
+        try {
+            keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        if (keys != null && keys.size() > 0) {
+            for (byte[] key : keys) {
+                Session s = null;
+                try {
+                    s = (Session) ByteUtil.bytesToObject(redisClient.get(key));
+                } catch (IOException e) {
+                    e.printStackTrace();
+                } catch (ClassNotFoundException e) {
+                    e.printStackTrace();
+                }
+                sessions.add(s);
+            }
+        }
+
+        return sessions;
+    }
+
+    @Override
+    protected Serializable doCreate(Session session) {
+        Serializable sessionId = this.generateSessionId(session);
+        this.assignSessionId(session, sessionId);
+        this.saveSession(session);
+        return sessionId;
+    }
+
+    @Override
+    protected Session doReadSession(Serializable sessionId) {
+        if (sessionId == null) {
+            logger.error("session id is null");
+            return null;
+        }
+
+        Session s = (Session) redisClient.get(this.getPreStringKey(sessionId));
+        return s;
+    }
+
+    /**
+     * 获得String类型的key
+     *
+     * @param
+     * @return
+     */
+    private String getPreStringKey(Serializable sessionId) {
+        String preKey = this.keyPrefix + sessionId;
+        return preKey;
+    }
+
+    public String getKeyPrefix() {
+        return keyPrefix;
+    }
+
+    public void setKeyPrefix(String keyPrefix) {
+        this.keyPrefix = keyPrefix;
+    }
+
+    public void setRedisClient(RedisClient redisClient) {
+        this.redisClient = redisClient;
+    }
+
+    public RedisClient getRedisClient() {
+        return redisClient;
+    }
+
+}
diff --git a/wisenergy-web-admin/.gitignore b/wisenergy-web-admin/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b4f66076247712dbd69e9ec586a827b3bd8fcd7b
--- /dev/null
+++ b/wisenergy-web-admin/.gitignore
@@ -0,0 +1,7 @@
+workspace
+.project
+.classpath
+*.settings
+.idea
+*.class
+target/
\ No newline at end of file
diff --git a/wisenergy-web-admin/pom.xml b/wisenergy-web-admin/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cb0b86183b5f5f7c02f8a87ed080ca529061ab32
--- /dev/null
+++ b/wisenergy-web-admin/pom.xml
@@ -0,0 +1,46 @@
+<?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>cn.wisenergy</groupId>
+        <artifactId>wisenergy-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>wisenergy-web-admin</artifactId>
+    <version>${moduleVersion.wisenergy-web-admin}</version>
+    <packaging>jar</packaging>
+    <name>${project.artifactId} Webapp</name>
+
+    <!-- 项目依赖 -->
+    <dependencies>
+        <!-- 模块依赖 -->
+        <dependency>
+            <groupId>cn.wisenergy</groupId>
+            <artifactId>wisenergy-service</artifactId>
+            <version>${moduleVersion.wisenergy-service}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>1.4.0</version>
+        </dependency>
+    </dependencies>
+
+    <!-- MAVEN构建 -->
+    <build>
+        <finalName>${project.artifactId}-${moduleVersion.wisenergy-web-admin}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/Application.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/Application.java
new file mode 100644
index 0000000000000000000000000000000000000000..4165de6e495fc9ddc83047b5be0495464f57cfc1
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/Application.java
@@ -0,0 +1,25 @@
+package cn.wisenergy;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * 配置netty启动
+ */
+@EnableCaching
+@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
+@MapperScan(
+        basePackages = "cn.wisenergy.mapper")
+@EnableSwagger2
+@EnableScheduling
+public class Application {
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}
+
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/AccountController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/AccountController.java
new file mode 100644
index 0000000000000000000000000000000000000000..0461a77714f1b6b5be67b8d071157a760de1cda5
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/AccountController.java
@@ -0,0 +1,38 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.dto.AccountDto;
+import cn.wisenergy.model.vo.AccountLoginVo;
+import cn.wisenergy.service.app.AccountSerivce;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author 86187
+ */
+@Api(tags = "管理员登录")
+@RestController
+@RequestMapping("/account")
+@Slf4j
+public class AccountController {
+    @Autowired
+    private AccountSerivce accountSerivce;
+
+    @ApiOperation(value = "管理员登录",notes = "管理员登录",httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userName",value = "账号",required = true),
+            @ApiImplicitParam(name = "password",value = "密码",required = true)
+    })
+    @PostMapping("/login")
+    public R<AccountDto> getAccountInfo(@RequestBody AccountLoginVo accountLoginVo){
+        log.info("AccountController[].getAccountInfo[].input.param:accountLoginVo:"+accountLoginVo);
+        //返回数据
+        return accountSerivce.getAccountInfo(accountLoginVo);
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/BannerController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/BannerController.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f055e3ef39655997beaef6d0e88ddec674d5f96
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/BannerController.java
@@ -0,0 +1,102 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Banner;
+import cn.wisenergy.model.dto.BannerDto;
+import cn.wisenergy.model.vo.AdvertisingQueryVo;
+import cn.wisenergy.service.app.BannerService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author 86187
+ * @ Description: 管理端-广告管理
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 10:43
+ */
+@RestController
+@Api(tags = "管理端-广告管理")
+@RequestMapping("/banner")
+@Slf4j
+public class BannerController {
+    @Autowired
+    private BannerService bannerService;
+
+    @ApiOperation(value = "广告添加", notes = "广告添加", httpMethod = "POST")
+    @ApiImplicitParam(name = "advertising", value = "广告数据", dataType = "Banner")
+    @PostMapping("/add")
+    public R<Boolean> add(@RequestBody Banner advertising) {
+        log.info("BannerController[].add[].input.param:advertising:" + advertising);
+        return bannerService.add(advertising);
+    }
+
+    @ApiOperation(value = "广告查询", notes = "广告查询", httpMethod = "POST")
+    @ApiImplicitParam(name = "advertisingQueryVo", value = "分页数据", dataType = "AdvertisingQueryVo")
+    @PostMapping("/getList")
+    public R<PageInfo<BannerDto>> getList(@RequestBody AdvertisingQueryVo advertisingQueryVo) {
+        log.info("BannerController[].add[].input.param:advertisingQueryVo:" + advertisingQueryVo);
+        return bannerService.getList(advertisingQueryVo);
+    }
+
+    @ApiOperation(value = "查看详情", notes = "查看详情", httpMethod = "GET")
+    @ApiImplicitParam(name = "id", value = "广告id", dataType = "int")
+    @GetMapping("/getById")
+    public R<Banner> getById(Integer id) {
+        log.info("BannerController[].getById[].input.param:id" + id);
+        return bannerService.getById(id);
+
+    }
+
+    @ApiOperation(value = "广告投放", notes = "广告投放", httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "广告id", dataType = "int", required = true),
+            @ApiImplicitParam(name = "status", value = "广告状态:0:暂停中 1:投放中", dataType = "int", required = true)
+    })
+    @GetMapping("/putIn")
+    public R<Boolean> editStatus(Integer id, Integer status) {
+        log.info("BannerController[]editStatus[]input.param:id,status{}" + id, status);
+        return bannerService.editStatus(id, status);
+    }
+
+    @ApiOperation(value = "广告编辑", notes = "广告编辑", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "advertising", value = "广告修改数据", dataType = "Banner"),
+    })
+    @PostMapping("/edit")
+    public R<Boolean> edit(@RequestBody Banner advertising) {
+        log.info("BannerController[].edit[].input.param:advertising:" + advertising);
+        return bannerService.edit(advertising);
+    }
+
+
+    @ApiOperation(value = "获取顶部/底部广告", notes = "获取顶部/底部广告", httpMethod = "GET")
+    @ApiImplicitParam(name = "type", value = "广告类型:1:顶部 2:底部", dataType = "int", required = true)
+    @GetMapping("/getBanners")
+    public R<List<Banner>> getBanners(Integer type) {
+        log.info("BannerController[]getBanners[]input.param.type:" + type);
+        if (null == type) {
+            return R.error("入参不能为空!");
+        }
+        return bannerService.getTopBanners(type);
+    }
+
+    @ApiOperation(value = "删除广告", notes = "删除广告", httpMethod = "GET")
+    @ApiImplicitParam(name = "id", value = "广告id", dataType = "int", required = true)
+    @GetMapping("/delBanner")
+    public R<Boolean> delBanner(Integer id) {
+        log.info("BannerController[]delBanner[]input.param.id:" + id);
+        if (null == id) {
+            return R.error("入参不能为空!");
+        }
+        return bannerService.delBanner(id);
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/FileUploadController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/FileUploadController.java
new file mode 100644
index 0000000000000000000000000000000000000000..f13985c578531af823beb62280396c918986b974
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/FileUploadController.java
@@ -0,0 +1,84 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+
+/**
+ * @author 86187
+ * @ Description:
+ * @ Author     : 86187
+ * @ Date       : 2021/2/3 17:05
+ */
+@Api(tags = "图片上传")
+@RestController
+@RequestMapping("/pic")
+@Slf4j
+public class FileUploadController {
+
+    /**
+     * 请求 url 中的资源映射,不推荐写死在代码中,最好提供可配置,如 /upload_flowChart/**
+     */
+    @Value("${uploadFile.resourceHandler}")
+    private String resourceHandler;
+
+    /**
+     * 上传文件保存的本地目录,使用@Value获取全局配置文件中配置的属性值,如 D:/java/upload_flowChart/
+     */
+    @Value("${uploadFile.location}")
+    private String uploadImagesLocation;
+
+    /**
+     * 允许上传的格式
+     */
+    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png", ".xlsx", ".xls"};
+
+    @ApiOperation(value = "文件上传", notes = "文件上传")
+    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
+    public R file(
+            @ApiParam(required = true, value = "上传文件")
+            @RequestParam("file") MultipartFile file,
+            HttpServletRequest request) {
+
+        boolean isLegal = true;
+
+        if (file.isEmpty()) {
+            // 上传文件为空
+            return R.error("上传文件不能为空");
+        }
+        for (String type : IMAGE_TYPE) {
+            if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), type)) {
+                isLegal = false;
+                break;
+            }
+        }
+        if (isLegal) {
+            return R.error("上传文件类型不符合");
+        }
+        File folder = new File(uploadImagesLocation);
+        if (!folder.exists()) {
+            folder.mkdirs();
+        }
+        String oldName = file.getOriginalFilename();
+        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
+        try {
+            file.transferTo(new File(folder, newName));
+            String url = "/upload_flowChart/" + newName;
+            return R.ok(200, url);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return R.error("上传文件失败!");
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/GraduationController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/GraduationController.java
new file mode 100644
index 0000000000000000000000000000000000000000..777749b4038410201128954353fc9932f1474c67
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/GraduationController.java
@@ -0,0 +1,31 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Graduation;
+import cn.wisenergy.service.app.GraduationSerivce;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "毕业院校查询")
+@RestController
+@RequestMapping("/school")
+@Slf4j
+public class GraduationController {
+
+    @Autowired
+    private GraduationSerivce graduationSerivce;
+
+    @ApiOperation(value = "毕业院校查询", notes = "毕业院校查询",httpMethod = "GET")
+    @GetMapping(value = "/getList")
+    public R<List<Graduation>> getSchool(){
+        return graduationSerivce.getList();
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PayController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PayController.java
new file mode 100644
index 0000000000000000000000000000000000000000..43eccc6407f9260a3d0f1fe6f89513546ef90f00
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PayController.java
@@ -0,0 +1,218 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.dto.PayPageDto;
+import cn.wisenergy.model.dto.PayQueryDto;
+import cn.wisenergy.service.app.WxPayService;
+import cn.wisenergy.service.common.Common;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.request.AlipayTradePagePayRequest;
+import com.alipay.api.request.AlipayTradeQueryRequest;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.crypto.IllegalBlockSizeException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SignatureException;
+import java.security.spec.InvalidKeySpecException;
+
+/**
+ * @author 86187
+ * @ Description:
+ * @ Author     : 86187
+ * @ Date       : 2021/2/1 10:05
+ */
+@RestController
+@Api(tags = "PC-支付接口")
+@RequestMapping("/pay")
+@Slf4j
+public class PayController {
+    private static final String CHARSET = "UTF-8";
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @ApiOperation(value = "PC支付宝-支付接口", notes = "PC支付宝-支付接口", httpMethod = "POST")
+    @ApiImplicitParam(name = "payPageDto", value = "参数", dataType = "PayPageDto")
+    @PostMapping("/page")
+    public R<String> doPost(@RequestBody PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) throws IOException, AlipayApiException {
+
+        if (null == payPageDto || null == payPageDto.getTotal()) {
+            return R.error("人参不能为空!");
+        }
+
+        AlipayClient alipayClient = new DefaultAlipayClient(Common.PAY_URL_CS, Common.APP_ID_CS, Common.PRIVATE_KEY_CS, "json", "GBK", Common.ALIPAY_PUBLIC_KEY_CS, "RSA2");
+        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
+        String tradeNo = "21" + System.currentTimeMillis();
+
+        //创建API对应的request
+        alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
+        //在公共参数中设置回跳和通知地址
+        alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");
+        alipayRequest.setBizContent("{" +
+                "\"out_trade_no\":\"" + tradeNo + "\"," +
+                "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
+                "\"total_amount\":" + payPageDto.getTotal() + "," +
+                "\"subject\":\"充值\"," +
+                "\"body\":\"充值\"," +
+                "\"time_expire\":\"2021-01-30 10:05:01\"," +
+                "      \"goods_detail\":[{" +
+                "        \"goods_id\":\"apple-01\"," +
+                "\"alipay_goods_id\":\"20010001\"," +
+                "\"goods_name\":\"ipad\"," +
+                "\"quantity\":1," +
+                "\"price\":2000," +
+                "\"goods_category\":\"34543238\"," +
+                "\"categories_tree\":\"124868003|126232002|126252004\"," +
+                "\"body\":\"特价手机\"," +
+                "\"show_url\":\"http://www.alipay.com/xxx.jpg\"" +
+                "        }]," +
+                "\"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," +
+                "\"extend_params\":{" +
+                "\"sys_service_provider_id\":\"2088511833207846\"," +
+                "\"hb_fq_num\":\"3\"," +
+                "\"hb_fq_seller_percent\":\"100\"," +
+                "\"industry_reflux_info\":\"{\\\\\\\"scene_code\\\\\\\":\\\\\\\"metro_tradeorder\\\\\\\",\\\\\\\"channel\\\\\\\":\\\\\\\"xxxx\\\\\\\",\\\\\\\"scene_data\\\\\\\":{\\\\\\\"asset_name\\\\\\\":\\\\\\\"ALIPAY\\\\\\\"}}\"," +
+                "\"card_type\":\"S0JP0000\"" +
+                "    }," +
+                "\"goods_type\":\"0\"," +
+                "\"timeout_express\":\"90m\"," +
+                "\"promo_params\":\"{\\\"storeIdType\\\":\\\"1\\\"}\"," +
+                "\"royalty_info\":{" +
+                "\"royalty_type\":\"ROYALTY\"," +
+                "        \"royalty_detail_infos\":[{" +
+                "          \"serial_no\":1," +
+                "\"trans_in_type\":\"userId\"," +
+                "\"batch_no\":\"123\"," +
+                "\"out_relation_id\":\"20131124001\"," +
+                "\"trans_out_type\":\"userId\"," +
+                "\"trans_out\":\"2088101126765726\"," +
+                "\"trans_in\":\"2088101126708402\"," +
+                "\"amount\":0.1," +
+                "\"desc\":\"分账测试1\"," +
+                "\"amount_percentage\":\"100\"" +
+                "          }]" +
+                "    }," +
+                "\"sub_merchant\":{" +
+                "\"merchant_id\":\"2088000603999128\"," +
+                "\"merchant_type\":\"alipay: 支付宝分配的间连商户编号, merchant: 商户端的间连商户编号\"" +
+                "    }," +
+                "\"merchant_order_no\":\"20161008001\"," +
+                "\"enable_pay_channels\":\"pcredit,moneyFund,debitCardExpress\"," +
+                "\"store_id\":\"NJ_001\"," +
+                "\"disable_pay_channels\":\"pcredit,moneyFund,debitCardExpress\"," +
+                "\"qr_pay_mode\":\"1\"," +
+                "\"qrcode_width\":100," +
+                "\"settle_info\":{" +
+                "        \"settle_detail_infos\":[{" +
+                "          \"trans_in_type\":\"cardAliasNo\"," +
+                "\"trans_in\":\"A0001\"," +
+                "\"summary_dimension\":\"A0001\"," +
+                "\"settle_entity_id\":\"2088xxxxx;ST_0001\"," +
+                "\"settle_entity_type\":\"SecondMerchant、Store\"," +
+                "\"amount\":0.1" +
+                "          }]," +
+                "\"settle_period_time\":\"7d\"" +
+                "    }," +
+                "\"invoice_info\":{" +
+                "\"key_info\":{" +
+                "\"is_support_invoice\":true," +
+                "\"invoice_merchant_name\":\"ABC|003\"," +
+                "\"tax_num\":\"1464888883494\"" +
+                "      }," +
+                "\"details\":\"[{\\\"code\\\":\\\"100294400\\\",\\\"name\\\":\\\"服饰\\\",\\\"num\\\":\\\"2\\\",\\\"sumPrice\\\":\\\"200.00\\\",\\\"taxRate\\\":\\\"6%\\\"}]\"" +
+                "    }," +
+                "\"agreement_sign_params\":{" +
+                "\"personal_product_code\":\"GENERAL_WITHHOLDING_P\"," +
+                "\"sign_scene\":\"INDUSTRY|CARRENTAL\"," +
+                "\"external_agreement_no\":\"test\"," +
+                "\"external_logon_id\":\"13852852877\"," +
+                "\"sign_validity_period\":\"2m\"," +
+                "\"third_party_type\":\"PARTNER\"," +
+                "\"buckle_app_id\":\"1001164\"," +
+                "\"buckle_merchant_id\":\"268820000000414397785\"," +
+                "\"promo_params\":\"{\\\"key\\\",\\\"value\\\"}\"" +
+                "    }," +
+                "\"integration_type\":\"PCWEB\"," +
+                "\"request_from_url\":\"https://\"," +
+                "\"business_params\":\"{\\\"data\\\":\\\"123\\\"}\"," +
+                "\"ext_user_info\":{" +
+                "\"name\":\"李明\"," +
+                "\"mobile\":\"16587658765\"," +
+                "\"cert_type\":\"IDENTITY_CARD\"," +
+                "\"cert_no\":\"362334768769238881\"," +
+                "\"min_age\":\"18\"," +
+                "\"fix_buyer\":\"F\"," +
+                "\"need_check_info\":\"F\"" +
+                "    }" +
+                "  }");
+        String form = "";
+        //调用SDK生成表单
+        form = alipayClient.pageExecute(alipayRequest).getBody();
+
+        httpResponse.setContentType("text/html;charset=" + CHARSET);
+        //直接将完整的表单html输出到页面
+        httpResponse.getWriter().write(form);
+        httpResponse.getWriter().flush();
+        httpResponse.getWriter().close();
+        return R.ok();
+    }
+
+    @ApiOperation(value = "PC支付宝-交易查询", notes = "PC支付宝-交易查询", httpMethod = "POST")
+    @ApiImplicitParam(name = "payQueryDto", value = "查询参数", dataType = "PayQueryDto")
+    @PostMapping("/query")
+    public R<String> query(@RequestBody PayQueryDto payQueryDto) throws AlipayApiException {
+        AlipayClient alipayClient = new DefaultAlipayClient(Common.PAY_URL_CS, Common.APP_ID_CS, Common.PRIVATE_KEY_CS, "json", "GBK", Common.ALIPAY_PUBLIC_KEY_CS, "RSA2");
+        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
+        request.setBizContent("{" +
+                "    \"out_trade_no\":\"" + payQueryDto.getOutTradeNo() + "\"," +
+                "    \"trade_no\":\"" + payQueryDto.getTradeNo() + "\"" +
+                "  }");
+        AlipayTradeQueryResponse response = alipayClient.execute(request);
+        System.out.println(response.getBody());
+        return R.ok(response.getBody());
+    }
+
+
+    @ApiOperation(value = "微行支付-统一下单", notes = "微行支付-统一下单", httpMethod = "POST")
+    @ApiImplicitParam(name = "payPageDto", value = "支付入参", dataType = "PayPageDto")
+    @PostMapping("/wxPay")
+    public R<String> wxPay(@RequestBody PayPageDto payPageDto) throws AlipayApiException, UnsupportedEncodingException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        return wxPayService.wxPay(payPageDto);
+    }
+
+
+    @ApiOperation(value = "微信支付-交易查询", notes = "微信支付-交易查询", httpMethod = "POST")
+    @ApiImplicitParam(name = "payQueryDto", value = "查询参数", dataType = "PayQueryDto")
+    @PostMapping("/queryWx")
+    public R<String> queryWx(@RequestBody PayQueryDto payQueryDto) throws AlipayApiException, InvalidKeySpecException, SignatureException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
+        if (null == payQueryDto || StringUtils.isBlank(payQueryDto.getOutTradeNo())) {
+            return R.error("操作错误!");
+        }
+
+        return wxPayService.queryWx(payQueryDto);
+    }
+
+    @ApiOperation(value = "测试-微行支付-统一下单", notes = "测试-微行支付-统一下单", httpMethod = "POST")
+    @ApiImplicitParam(name = "payPageDto", value = "支付入参", dataType = "PayPageDto")
+    @PostMapping("/wx_Pay")
+    public R<String> wx_Pay(@RequestBody PayPageDto payPageDto) throws AlipayApiException, IOException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, SignatureException, IllegalBlockSizeException {
+        return wxPayService.wx_Pay(payPageDto);
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PayRecordController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PayRecordController.java
new file mode 100644
index 0000000000000000000000000000000000000000..675e704126d125f00aa99e528209bc4719203214
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PayRecordController.java
@@ -0,0 +1,60 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.PayRecord;
+import cn.wisenergy.model.app.Volunteer;
+import cn.wisenergy.model.vo.PayRecordQueryVo;
+import cn.wisenergy.model.vo.PayRecordShowVo;
+import cn.wisenergy.service.app.PayRecordService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * @ Description: PC-我的账户
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 10:45
+ * @author 86187
+ */
+@RestController
+@Api(tags = "PC-我的账户")
+@RequestMapping("/pay/record")
+@Slf4j
+public class PayRecordController {
+
+    @Autowired
+    private PayRecordService payRecordService;
+
+    @ApiOperation(value = "保存充值记录", notes = "保存充值记录", httpMethod = "POST")
+    @ApiImplicitParam(name = "payRecord", value = "充值记录信息", dataType = "PayRecord")
+    @PostMapping("/add")
+    public R<Boolean> add(@RequestBody PayRecord payRecord) {
+        log.info("volunteer-service[]PayRecordController[]add[]input.param.payRecord:" + payRecord);
+        if (null == payRecord) {
+            return R.error("入参为空!");
+        }
+
+        return payRecordService.add(payRecord);
+    }
+
+    @ApiOperation(value = "获取充值记录列表", notes = "获取充值记录列表", httpMethod = "GET")
+    @ApiImplicitParam(name = "payVo", value = "充值记录查询参数", dataType = "PayRecord")
+    @GetMapping("/getList")
+    public R<PageInfo<PayRecordShowVo>> getList(PayRecordQueryVo payVo) {
+        log.info("volunteer-service[]PayRecordController[]getList[]input.param.payVo:" + payVo);
+        if (null == payVo) {
+            return R.error("入参为空!");
+        }
+
+        return payRecordService.getList(payVo);
+    }
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PriceController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PriceController.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0bfa111ccf03a9b44e4f6950f54f518fc2ec8bc
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PriceController.java
@@ -0,0 +1,36 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Price;
+import cn.wisenergy.service.app.PriceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+import java.util.List;
+
+
+/**
+ * @author 86187
+ */
+@Api(tags = "价格明细")
+@RestController
+@RequestMapping("/price")
+@Slf4j
+public class PriceController {
+
+    @Autowired
+    private PriceService priceService;
+
+    @ApiOperation(value = "获取价格明细", notes = "获取价格明细", httpMethod = "GET")
+    @GetMapping("/getList")
+    public R<List<Price>> getList() {
+        log.info("volunteer-service[]PriceController[]getList[]input.param");
+
+        return priceService.getList();
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/ProfessionController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/ProfessionController.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ce7e347d636f6d575e0d01d2931a60d21027806
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/ProfessionController.java
@@ -0,0 +1,44 @@
+package cn.wisenergy.web.admin.controller.app;
+
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.Profession;
+import cn.wisenergy.service.app.ProfessionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+import java.util.List;
+
+/**
+ * @ Description: 用户管理模
+ * @ Author     : 86187
+ * @ Date       : 2021/1/13 10:29
+ */
+@RestController
+@Api(tags = "专业管理")
+@RequestMapping("/profession")
+@Slf4j
+public class ProfessionController {
+    @Autowired
+    private ProfessionService professionService;
+
+    @ApiOperation(value = "获取专业树结构", notes = "获取专业树结构", httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "type", value = "考生类型 1:文化考生 2:美术考生 3:体育生 4:文学编导", dataType = "int"),
+            @ApiImplicitParam(name = "userId", value = "考生id", dataType = "int")
+    })
+    @GetMapping("/getTree")
+    public R<List<Profession>> getTree(Integer type,Integer userId) {
+        if (null == type || null == userId) {
+            return R.error("入参为空!");
+        }
+        return professionService.getTree(type,userId);
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/RefillCardController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/RefillCardController.java
new file mode 100644
index 0000000000000000000000000000000000000000..32f8c3abe40571af5a82f5b62e0d5acdd4d293b5
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/RefillCardController.java
@@ -0,0 +1,77 @@
+package cn.wisenergy.web.admin.controller.app;
+
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.RefillCard;
+import cn.wisenergy.model.dto.RefillCardDto;
+import cn.wisenergy.service.app.RefillCardService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+@Api(tags = "充值卡管理")
+@RestController
+@RequestMapping("/refillCard")
+@Slf4j
+public class RefillCardController {
+
+    @Autowired
+    private RefillCardService refillCardService;
+
+    @ApiOperation(value = "添加充值卡",notes = "添加充值卡",httpMethod = "POST")
+    @ApiImplicitParam(name = "numbers",value = "卡的数量",dataType="int",required = true)
+    @PostMapping("/manage")
+    public R<Boolean> manage(Integer numbers){
+        log.info("RefillCardController[].manage[].input.param,numbers"+numbers);
+
+        //创建对象参数
+        RefillCard refillCard = new RefillCard();
+        refillCard.setCardNumber(numbers);
+        return  refillCardService.add(refillCard);
+    }
+
+    @ApiOperation(value = "激活充值卡",notes = "激活充值卡",httpMethod = "POST")
+    @ApiImplicitParam(name = "batchNumber",value = "批次号",dataType = "string",required = true)
+    @PostMapping("/update")
+    public R<Boolean> update(String batchNumber){
+        log.info("RefillCardController[].manage[].input.param,batchNumber"+batchNumber);
+        return refillCardService.update(batchNumber);
+    }
+
+    @ApiOperation(value = "充值卡查询",notes = "充值卡查询",httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNo",value = "页数",dataType="int"),
+            @ApiImplicitParam(name = "pageSize",value = "每页显示条数",dataType="int")
+    })
+    @GetMapping("/select")
+    public R<PageInfo<RefillCardDto>> select(Integer pageNo, Integer pageSize){
+        log.info("RefillCardController[].select[].input.param.parampageNo,pageSize"+pageNo,pageSize);
+        return refillCardService.getList(pageNo, pageSize);
+    }
+
+    @ApiOperation(value = "生成卡片",notes = "生成卡片",httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id",value = "充值卡id",dataType="int"),
+    })
+    @GetMapping("/createCard")
+    public R<Boolean> createCard(Integer id){
+        log.info("RefillCardController[].createCard[].input.param:id"+id);
+        return refillCardService.createCard(id);
+    }
+
+    @ApiOperation(value = "充值卡导出",notes = "充值卡导出",httpMethod = "GET")
+    @ApiImplicitParam(name = "batchNumber",value = "充值卡批次号",dataType = "string",required = true)
+    @GetMapping(value = "/exportCard")
+    public R<Boolean> exportCard(String batchNumber, HttpServletResponse response){
+        log.info("RefillCardController[].exportCard[].input.param:batchNumber"+batchNumber);
+
+        return refillCardService.createExcel(batchNumber,response);
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SchemeController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SchemeController.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a8b1d5ab6afeb7091fbc0e36775f8754d850d47
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SchemeController.java
@@ -0,0 +1,136 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.expection.BaseException;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.SchemeInfo;
+import cn.wisenergy.model.vo.SchemeQueryVo;
+import cn.wisenergy.model.vo.SchemeVo;
+import cn.wisenergy.model.vo.VolunteerVo;
+import cn.wisenergy.service.app.SchemeService;
+import cn.wisenergy.service.app.VolunteerService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author 86187
+ * @ Description: PC-方案
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 10:50
+ */
+@RestController
+@Api(tags = "PC-方案")
+@RequestMapping("/scheme")
+@Slf4j
+public class SchemeController {
+
+    @Autowired
+    private SchemeService schemeService;
+
+    @Autowired
+    private VolunteerService volunteerService;
+
+    @ApiOperation(value = "方案查询", notes = "方案查询", httpMethod = "GET")
+    @ApiImplicitParam(name = "queryVo", value = "志愿查询参数", dataType = "SchemeQueryVo")
+    @GetMapping("/getList")
+    public R<VolunteerVo> getList(SchemeVo queryVo) {
+        log.info("volunteer-service[]SchemeController[]getList[]input.param.queryVo:" + queryVo);
+        if (null == queryVo) {
+            return R.error("入参为空!");
+        }
+
+        return schemeService.getList(queryVo);
+    }
+
+    @ApiOperation(value = "Excel批量添加方案志愿", notes = "Excel批量添加方案志愿")
+    @PostMapping("/excel/add")
+    public R excelAdd(@RequestParam("file") MultipartFile file, @RequestParam("type") Integer type,
+                      @RequestParam("schemeName") String schemeName,
+                      @RequestParam("fileUrl") String fileUrl, HttpServletResponse response) throws IOException {
+        log.info("volunteer-service[]SchemeController[]excelAdd[]input.param.file:" + file);
+        if (file == null || file.isEmpty() || null == type || StringUtils.isBlank(schemeName) ||
+                StringUtils.isBlank(fileUrl)) {
+            throw new BaseException("操作错误");
+        }
+
+        volunteerService.excelAdd(file, type, schemeName, fileUrl, response);
+        return R.ok("添加成功");
+    }
+
+    @ApiOperation(value = "测试Excel", notes = "测试Excel")
+    @ApiImplicitParam(name = "file", value = "志愿查询参数", dataType = "MultipartFile")
+    @PostMapping("/excel/add/ceshi")
+    public R ceshi(@RequestBody MultipartFile file, HttpServletResponse response) throws IOException {
+        log.info("");
+        if (file == null || file.isEmpty()) {
+            throw new BaseException("操作错误");
+        }
+
+        volunteerService.ceshi(file, response);
+        return R.ok("添加成功");
+    }
+
+
+    @ApiOperation(value = "方案上传Excel模板", notes = "方案上传Excel模板")
+    @PostMapping("/excel/template")
+    public R excelTemplate(HttpServletResponse response) throws IOException {
+
+        volunteerService.excelTemplate(response);
+        return R.ok(response);
+    }
+
+    @ApiOperation(value = "获取方案列表", notes = "获取方案列表", httpMethod = "GET")
+    @ApiImplicitParam(name = "queryVo", value = "查询参数", dataType = "SchemeQueryVo")
+    @GetMapping("/getSchemeList")
+    public R<PageInfo<SchemeInfo>> getSchemeList(SchemeQueryVo queryVo) {
+        log.info("volunteer-service[]SchemeController[]getSchemeList[]input.param.queryVo:" + queryVo);
+        if (null == queryVo) {
+            return R.error("入参为空!");
+        }
+
+        return schemeService.getSchemeList(queryVo);
+    }
+
+    @ApiOperation(value = "删除方案", notes = "删除方案", httpMethod = "DELETE")
+    @ApiImplicitParam(name = "schemeId", value = "方案id", dataType = "schemeId")
+    @DeleteMapping("/delete")
+    public R<Boolean> delete(Integer schemeId) {
+        log.info("volunteer-service[]SchemeController[]getSchemeList[]input.param.schemeId:" + schemeId);
+        if (null == schemeId) {
+            return R.error("入参为空!");
+        }
+
+        return schemeService.deleteById(schemeId);
+    }
+
+    @ApiOperation(value = "获取方案下载路径", notes = "获取方案下载路径", httpMethod = "GET")
+    @ApiImplicitParam(name = "schemeId", value = "方案id", dataType = "int")
+    @GetMapping("/download")
+    public R<String> download(Integer schemeId) {
+        log.info("volunteer-service[]SchemeController[]download[]input.param.schemeId:" + schemeId);
+        if (null == schemeId) {
+            return R.error("入参为空!");
+        }
+
+        return schemeService.download(schemeId);
+    }
+
+    @ApiOperation(value = "测试重复数据", notes = "测试重复数据", httpMethod = "GET")
+    @ApiImplicitParam(name = "schemeId", value = "方案id", dataType = "int")
+    @GetMapping("/ceishi")
+    public List<Integer> ceishi(Integer schemeId) {
+
+        return schemeService.ceishi(schemeId);
+    }
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SchemeRecordController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SchemeRecordController.java
new file mode 100644
index 0000000000000000000000000000000000000000..ade25a045eebcc2b434ca2f490fceea09d1cc893
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SchemeRecordController.java
@@ -0,0 +1,99 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.SchemeQueryRecord;
+import cn.wisenergy.model.app.Volunteer;
+import cn.wisenergy.model.vo.SchemeRecordQueryVo;
+import cn.wisenergy.service.app.SchemeRecordService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @ Description: PC-我的方案
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 10:48
+ * @author 86187
+ */
+@RestController
+@Api(tags = "PC-我的方案")
+@RequestMapping("/scheme/record")
+@Slf4j
+public class SchemeRecordController {
+
+    @Autowired
+    private SchemeRecordService schemeRecordService;
+
+    @ApiOperation(value = "保存方案查询记录", notes = "保存方案查询记录", httpMethod = "POST")
+    @ApiImplicitParam(name = "query", value = "方案查询信息", dataType = "SchemeQueryRecord")
+    @PostMapping("/add")
+    public R<SchemeQueryRecord> add(@RequestBody SchemeQueryRecord query) {
+        log.info("volunteer-service[]SchemeRecordController[]add[]input.param.query:" + query);
+        if (null == query) {
+            return R.error("入参为空!");
+        }
+
+        return schemeRecordService.add(query);
+    }
+
+    @ApiOperation(value = "获取方案查询记录列表", notes = "获取方案查询记录列表", httpMethod = "GET")
+    @ApiImplicitParam(name = "queryVo", value = "方案查询记录参数", dataType = "SchemeRecordQueryVo")
+    @GetMapping("/getList")
+    public R<PageInfo<SchemeQueryRecord>> getList(SchemeRecordQueryVo queryVo) {
+        log.info("volunteer-service[]SchemeRecordController[]getList[]input.param.queryVo:" + queryVo);
+        if (null == queryVo) {
+            return R.error("入参为空!");
+        }
+
+        return schemeRecordService.getList(queryVo);
+    }
+
+    @ApiOperation(value = "获取充值记录志愿列表", notes = "获取充值记录志愿列表", httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户id", dataType = "int", required = true),
+            @ApiImplicitParam(name = "recordId", value = "记录id", dataType = "int", required = true)
+    })
+    @GetMapping("/getVolunteerList")
+    public R<List<Volunteer>> getVolunteerList(Integer userId, Integer recordId) {
+        log.info("volunteer-service[]SchemeRecordController[]getVolunteerList[]input.param.userId:{},recordId:" + userId, recordId);
+        if (null == userId || null == recordId) {
+            return R.error("入参为空!");
+        }
+
+        return schemeRecordService.getVolunteerList(userId, recordId);
+    }
+
+    @ApiOperation(value = "方案导出", notes = "方案导出", httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户id", dataType = "int", required = true),
+            @ApiImplicitParam(name = "recordId", value = "记录id", dataType = "int", required = true)
+    })
+    @GetMapping("/export")
+    public R<Boolean> export(Integer userId, Integer recordId, HttpServletResponse response) {
+        log.info("volunteer-service[]SchemeRecordController[]getVolunteerList[]input.param.userId,recordId:" + userId, recordId);
+        if (null == userId || null == recordId) {
+            return R.error("入参为空!");
+        }
+
+        return schemeRecordService.export(userId, recordId,response);
+    }
+
+    @ApiOperation(value = "方案Excel导出",notes = "方案Excel导出",httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户id", dataType = "int", required = true),
+            @ApiImplicitParam(name = "recordId", value = "记录id", dataType = "int", required = true)
+    })
+    @GetMapping(value = "/createExcel")
+    public R<Boolean> createExcel(Integer userId, Integer recordId, HttpServletResponse response){
+        log.info("volunteer-service[]SchemeRecordController[]createExcel[]input.param.userId,recordId:" + userId, recordId);
+        return schemeRecordService.createExcel(userId,recordId,response);
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SendSmsController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SendSmsController.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e72103f6f2b6b7ba2fd31807cb40fdbdf62a680
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SendSmsController.java
@@ -0,0 +1,59 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.vo.SendSmsVo;
+import cn.wisenergy.service.app.SendSmsSerVice;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author 86187
+ * @ Description: 短信管理
+ * @ Author     : 86187
+ * @ Date       : 2021/1/15 15:40
+ */
+@RestController
+@Api(tags = "短信管理")
+@RequestMapping("/user")
+@Slf4j
+public class SendSmsController {
+    @Autowired
+    private SendSmsSerVice sendSmsSerVice;
+
+    @ApiOperation(value = "发送短信验证码", notes = "发送短信验证码", httpMethod = "POST")
+    @ApiImplicitParam(name = "sendSmsVo", value = "手机号码", dataType = "SendSmsVo")
+    @PostMapping("/sendSms")
+    public R<Boolean> sendSms(@RequestBody SendSmsVo sendSmsVo) throws Exception {
+        log.info("SendSmsController[]sendSms[]input.param.sendSmsVo:" + sendSmsVo);
+        if (null == sendSmsVo || StringUtils.isBlank(sendSmsVo.getPhone()) ||
+                null == sendSmsVo.getSource() || null == sendSmsVo.getScene()) {
+            return R.error("入参为空!");
+        }
+
+        return sendSmsSerVice.sendSmCode(sendSmsVo);
+    }
+
+    @ApiOperation(value = "在缓存中记录验证码", notes = "在缓存中记录验证码", httpMethod = "GET")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "phone", value = "手机号码", dataType = "String", required = true),
+            @ApiImplicitParam(name = "code", value = "短信验证码", dataType = "String", required = true),
+            @ApiImplicitParam(name = "scene", value = "场景类型 1:验证码登录 2:手机注册 3:修改密码 4:找回密码", dataType = "int", required = true),
+            @ApiImplicitParam(name = "source", value = "来源 PC/APP", dataType = "String", required = true)
+    })
+    @GetMapping("/valid")
+    public R<Boolean> valid(String phone, String code, Integer scene, String source) {
+        log.info("SendSmsController[]valid[]input.param:phone,code,type" + phone, code, scene);
+        if (StringUtils.isBlank(phone) || StringUtils.isBlank(code) || StringUtils.isBlank(source) ||
+                null == scene) {
+            return R.error("入参为空!");
+        }
+
+        return sendSmsSerVice.valid(phone, code, scene, source);
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserController.java
new file mode 100644
index 0000000000000000000000000000000000000000..2367b663a3055fcd0215625dec031f7b1bba2df5
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserController.java
@@ -0,0 +1,129 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.constant.RedisConsts;
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.User;
+import cn.wisenergy.model.dto.UserCommitDto;
+import cn.wisenergy.model.dto.UserInfoDto;
+import cn.wisenergy.model.vo.UserInfoVo;
+import cn.wisenergy.model.vo.UserQueryVo;
+import cn.wisenergy.model.vo.UserShowVo;
+import cn.wisenergy.service.app.UserService;
+import cn.wisenergy.web.config.JwtConfig;
+import cn.wisenergy.web.shiro.JwtUtil;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+/**
+ * @ Description: 用户管理模
+ * @ Author     : 86187
+ * @ Date       : 2021/1/7 10:29
+ * @author 86187
+ */
+@RestController
+@Api(tags = "PC-用户管理")
+@RequestMapping("/user")
+@Slf4j
+public class UserController {
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private JwtUtil jwtUtil;
+    @Autowired
+    private JwtConfig jwtConfig;
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+
+    @ApiOperation(value = "用户管理", notes = "用户管理", httpMethod = "POST")
+    @ApiImplicitParam(name = "queryVo", value = "用户信息", dataType = "UserQueryVo")
+    @PostMapping("/manage")
+    public R<PageInfo<UserInfoDto>> manageUser(@RequestBody UserQueryVo queryVo) {
+        log.info("UserController[]manageUser[]input.param:queryV0:" + queryVo);
+        if (null == queryVo) {
+            return R.error("入参为空!");
+        }
+        //返回数据
+        return userService.getUserList(queryVo);
+    }
+
+    @ApiOperation(value = "提交个人信息", notes = "提交个人信息", httpMethod = "POST")
+    @ApiImplicitParam(name = "userInfo", value = "个人信息", dataType = "UserCommitDto")
+    @PostMapping("/commit")
+    public R<UserInfoVo> commitUserInfo(@RequestBody UserCommitDto userInfo) {
+        log.info("UserController[]commitUserInfo[]input.param:queryV0:" + userInfo);
+        if (null == userInfo) {
+            return R.error("入参为空!");
+        }
+        //返回数据
+        return userService.commitUserInfo(userInfo);
+    }
+
+    @ApiOperation(value = "编辑个人信息", notes = "编辑个人信息", httpMethod = "POST")
+    @ApiImplicitParam(name = "userInfo", value = "个人信息", dataType = "UserCommitDto")
+    @PostMapping("/edit")
+    public R<Boolean> edit(@RequestBody UserCommitDto userInfo) {
+        log.info("UserController[]edit[]input.param:queryV0:" + userInfo);
+        if (null == userInfo) {
+            return R.error("入参为空!");
+        }
+        //返回数据
+        return userService.edit(userInfo);
+    }
+
+    @ApiOperation(value = "获取个人信息", notes = "获取个人信息", httpMethod = "GET")
+    @ApiImplicitParam(name = "userId", value = "用户id", dataType = "int")
+    @GetMapping("/getById")
+    public R<UserShowVo> getById(Integer userId) {
+        log.info("UserController[]getById[]input.param:queryV0:" + userId);
+        if (null == userId) {
+            return R.error("入参为空!");
+        }
+
+        //返回数据
+        return userService.getById(userId);
+    }
+
+    @ApiOperation(value = "测试like循环查询", notes = "测试like循环查询", httpMethod = "GET")
+    @GetMapping("/test")
+    public R<List<User>> test() {
+        log.info("UserController[]test[]input.param");
+
+        //返回数据
+        return userService.test();
+    }
+
+    /**
+     * shiro登录
+     *
+     * @return
+     */
+    @ApiOperation(value = "获取token接口", notes = "获取token接口", httpMethod = "POST")
+    @PostMapping(value = "/login")
+    public R<String> login(String phone) {
+        if (StringUtils.isBlank(phone)) {
+            return R.error("入参为空!");
+        }
+
+        //用户信息
+        User user = userService.getByPhone(phone);
+
+        // 创建token
+        String token = jwtUtil.generateToken(user);
+        // 保存Redis
+        redisTemplate.opsForValue().set(RedisConsts.JWT_ACCESS_TOKEN + token, token);
+        return R.ok(token);
+    }
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserLimitController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserLimitController.java
new file mode 100644
index 0000000000000000000000000000000000000000..c37b751d6584e643b3b6d91e03d40cd132840f96
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserLimitController.java
@@ -0,0 +1,68 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.app.UserLimit;
+import cn.wisenergy.model.vo.AddLimitVo;
+import cn.wisenergy.model.vo.MinusLimitVo;
+import cn.wisenergy.service.app.UserLimitService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author 86187
+ * @ Description: PC-用户查询次数
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 10:50
+ */
+@RestController
+@Api(tags = "PC-用户查询次数")
+@RequestMapping("/user/limit")
+@Slf4j
+public class UserLimitController {
+
+    @Autowired
+    private UserLimitService userLimitService;
+
+    @ApiOperation(value = "获取用户查询次数", notes = "获取用户查询次数", httpMethod = "GET")
+    @ApiImplicitParam(name = "userId", value = "用户id", dataType = "int", required = true)
+    @GetMapping("/getByUserId")
+    public R<UserLimit> getByUserId(Integer userId) {
+        log.info("volunteer-service[]UserLimitController[]getVolunteerList[]input.param.userId:" + userId);
+        if (null == userId) {
+            return R.error("入参为空!");
+        }
+
+        return userLimitService.getByUserId(userId);
+    }
+
+    @ApiOperation(value = "用户充值", notes = "用户充值", httpMethod = "POST")
+    @ApiImplicitParam(name = "addLimitVo", value = "充值信息", dataType = "AddLimitVo")
+    @PostMapping("/addLimit")
+    public R<Boolean> addLimit(@RequestBody AddLimitVo addLimitVo) {
+        log.info("volunteer-service[]UserLimitController[]addLimit[]input.param.addLimitVo:" + addLimitVo);
+        if (null == addLimitVo || null == addLimitVo.getUserId() || null == addLimitVo.getPayType()) {
+            return R.error("入参不能为空!");
+        }
+
+        return userLimitService.addLimit(addLimitVo);
+    }
+
+
+    @ApiOperation(value = "扣减用户查询次数", notes = "扣减用户查询次数", httpMethod = "POST")
+    @ApiImplicitParam(name = "minusLimitVo", value = "用户id", dataType = "MinusLimitVo")
+    @PostMapping("/minusLimit")
+    public R<Boolean> minusLimit(@RequestBody MinusLimitVo minusLimitVo) {
+        log.info("volunteer-service[]UserLimitController[]minusLimit[]input.param.minusLimitVo:" + minusLimitVo);
+        if (null == minusLimitVo || null == minusLimitVo.getUserId()) {
+            return R.error("入参为空!");
+        }
+
+        return userLimitService.minusLimit(minusLimitVo.getUserId());
+    }
+
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserLoginController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserLoginController.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cbc569049d0fe40619d686e2d55cc1885f2a7ce
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserLoginController.java
@@ -0,0 +1,122 @@
+package cn.wisenergy.web.admin.controller.app;
+
+
+import cn.wisenergy.common.utils.R;
+import cn.wisenergy.model.vo.*;
+import cn.wisenergy.service.app.UserLoginService;
+import cn.wisenergy.web.common.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author 86187
+ * @ Description: PC-用户登录
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 10:50
+ */
+@RestController
+@Api(tags = "PC-用户登录")
+@RequestMapping("/user/login")
+@Slf4j
+public class UserLoginController extends BaseController {
+
+    @Autowired
+    private UserLoginService userLoginService;
+
+    @ApiOperation(value = "用户注册", notes = "用户注册", httpMethod = "POST")
+    @ApiImplicitParam(name = "userVo", value = "用户信息", dataType = "UserRegisterVo")
+    @PostMapping("/register")
+    public R<UserInfoVo> register(@RequestBody UserRegisterVo userVo) {
+        log.info("volunteer-service[]UserLongController[]resetPassword[]input.param.userVo:" + userVo);
+
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) ||
+                StringUtils.isBlank(userVo.getPassword()) || StringUtils.isBlank(userVo.getSmCode()) ||
+                null == userVo.getSource() || null == userVo.getScene()) {
+            return R.error("入参为空!");
+        }
+
+        return userLoginService.register(userVo);
+    }
+
+    @ApiOperation(value = "用户验证码登录", notes = "用户验证码登录", httpMethod = "POST")
+    @ApiImplicitParam(name = "userVo", value = "用户信息", dataType = "UserLoginVo")
+    @PostMapping("/loginCode")
+    public R<UserInfoVo> loginCode(@RequestBody UserLoginVo userVo) {
+        log.info("volunteer-service[]UserLongController[]loginCode[]input.param.userVo:" + userVo);
+
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) || StringUtils.isBlank(userVo.getCode()) ||
+                null == userVo.getSource() || null == userVo.getScene()) {
+            return R.error("入参为空!");
+        }
+
+        return userLoginService.loginCode(userVo);
+    }
+
+    @ApiOperation(value = "用户账号密码登录", notes = "用户账号密码登录", httpMethod = "POST")
+    @ApiImplicitParam(name = "userVo", value = "登录用户信息", dataType = "UserLoginVo")
+    @PostMapping("/login")
+    public R<UserInfoVo> login(@RequestBody UserLoginVo userVo) {
+        log.info("volunteer-service[]UserLongController[]login[]input.param.userVo:" + userVo);
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) || StringUtils.isBlank(userVo.getPassword())) {
+            return R.error("入参不能为空!");
+        }
+
+        return userLoginService.login(userVo);
+    }
+
+
+    @ApiOperation(value = "退出登录", notes = "退出登录", httpMethod = "POST")
+    @ApiImplicitParam(name = "outVo", value = "退出用户信息", dataType = "LoginOutVo")
+    @PostMapping("/loginOut")
+    public R<Boolean> loginOut(@RequestBody LoginOutVo outVo) {
+        log.info("volunteer-service[]UserLongController[]loginOut[]input.param.outVo:" + outVo);
+        if (null == outVo || null == outVo.getUserId()) {
+            return R.error("入参不能为空!");
+        }
+
+        return userLoginService.loginOut(outVo.getUserId());
+    }
+
+    @ApiOperation(value = "修改用户密码", notes = "修改用户密码", httpMethod = "POST")
+    @ApiImplicitParam(name = "userVo", value = "用户密码", dataType = "UpdatePasswordVo")
+    @PostMapping("/updatePassword")
+    public R<Boolean> updatePassword(@RequestBody UpdatePasswordVo userVo) {
+        log.info("volunteer-service[]UserLongController[]updatePassword[]input.param.userVo:" + userVo);
+        if (null == userVo || null == userVo.getUserId() || StringUtils.isBlank(userVo.getOldPassword()) ||
+                StringUtils.isBlank(userVo.getNewPassword())) {
+            return R.error("入参不能为空!");
+        }
+
+        return userLoginService.updatePassword(userVo);
+    }
+
+    @ApiOperation(value = "重置密码", notes = "重置密码", httpMethod = "POST")
+    @PostMapping("/resetPassword")
+    public R<Boolean> resetPassword(Integer userId) {
+        log.info("volunteer-service[]UserLongController[]resetPassword[]input.param.userId:" + userId);
+        if (null == userId) {
+            return R.error("入参不能为空!");
+        }
+
+        return userLoginService.resetPassword(userId);
+    }
+
+    @ApiOperation(value = "短信重置密码", notes = "修改用户密码", httpMethod = "POST")
+    @ApiImplicitParam(name = "userVo", value = "用户密码", dataType = "UserLoginVo")
+    @PostMapping("/smsResetPassword")
+    public R<Boolean> smsResetPassword(@RequestBody UserLoginVo userVo) {
+        log.info("volunteer-service[]UserLongController[]smsResetPassword[]input.param.userVo:" + userVo);
+        if (null == userVo || StringUtils.isBlank(userVo.getPhone()) || StringUtils.isBlank(userVo.getPassword()) ||
+                null == userVo.getSource() || null == userVo.getScene()) {
+            return R.error("入参不能为空!");
+        }
+
+        return userLoginService.smsResetPassword(userVo);
+    }
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/VolunteerController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/VolunteerController.java
new file mode 100644
index 0000000000000000000000000000000000000000..deff57dcc3280094a8417b49231c6182b5f7f066
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/VolunteerController.java
@@ -0,0 +1,19 @@
+package cn.wisenergy.web.admin.controller.app;
+
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @ Description: PC-志愿模块
+ * @ Author     : 86187
+ * @ Date       : 2021/1/14 10:55
+ * @author 86187
+ */
+@RestController
+@Api(tags = "PC-志愿模块")
+@RequestMapping("/volunteer")
+@Slf4j
+public class VolunteerController {
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/DataAuthAspect.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/DataAuthAspect.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ffb6c7a69ff098feeb22e9940ddc674e0dfb3a3
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/DataAuthAspect.java
@@ -0,0 +1,71 @@
+package cn.wisenergy.web.aspect;
+
+import cn.wisenergy.common.annotation.DataAuth;
+import cn.wisenergy.common.constant.CommonConstants;
+import cn.wisenergy.common.enums.RespCodeEnum;
+import cn.wisenergy.common.utils.exception.Result;
+import cn.wisenergy.model.app.AccountInfo;
+import cn.wisenergy.service.app.AccountSerivce;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * 数据权限,切面处理类
+ */
+@Aspect
+@Component
+public class DataAuthAspect {
+    @Autowired
+    AccountSerivce sysUserService;
+
+    @Pointcut("@annotation(cn.wisenergy.common.annotation.DataAuth)")
+    public void dataPointCut() {
+    }
+
+    @Around("dataPointCut()")
+    public Object around(ProceedingJoinPoint pjp) throws Throwable {
+        MethodSignature signature = (MethodSignature) pjp.getSignature();
+        Method method = signature.getMethod();
+        // 获取方法上的注解
+        DataAuth dataAuth = method.getAnnotation(DataAuth.class);
+        if (dataAuth != null) {
+            // 获取注解值
+            String mapKey = dataAuth.value();
+            // 获取请求参数
+            Object[] args = pjp.getArgs();
+            for (Object obj : args) {
+                if (obj instanceof Map) {
+                    Map<String, Object> map = (Map<String, Object>) obj;
+                    // 获取当前用户
+                    AccountInfo sysUser = (AccountInfo) SecurityUtils.getSubject().getPrincipal();
+                    if (sysUser != null) {
+                        // 超级管理员返回全量数据
+                        if (!StringUtils.equals(sysUser.getId().toString(), CommonConstants.SUPER_ADMIN)) {
+                            // 查询用户的数据权限信息,如果存在数据权限集合,将集合存入请求参数map中
+//                            Set<String> dataAuthList = sysUserService.getUserDataAuth(sysUser);
+//                            if (dataAuthList != null && !dataAuthList.isEmpty()) {
+//                                map.put(mapKey, dataAuthList);
+//                            }
+                        }
+                        return pjp.proceed();
+                    }
+                }
+            }
+        }
+        Result result = new Result();
+        result.setResult(Result.RESULT_FLG.FAIL.getValue());
+        result.setErrorCode(RespCodeEnum.DATA_AUTH_UNAUTHORIZED.getCode());
+        result.setErrorMsg(RespCodeEnum.DATA_AUTH_UNAUTHORIZED.getMsg());
+        return result;
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/SysLogAspect.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/SysLogAspect.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5e5b44b3f01ec351b6150f89a882563150f60fd
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/SysLogAspect.java
@@ -0,0 +1,93 @@
+package cn.wisenergy.web.aspect;
+
+import cn.wisenergy.common.utils.exception.Result;
+import cn.wisenergy.common.utils.ip.IpUtils;
+import com.alibaba.fastjson.JSON;
+import org.apache.shiro.SecurityUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * 系统日志,切面处理类
+ */
+@Aspect
+@Component
+public class SysLogAspect {
+//	@Autowired
+//	private SysLogService sysLogService;
+//
+//	@Pointcut("@annotation(cn.wisenergy.common.annotation.SysLog)")
+//	public void logPointCut() {
+//	}
+//
+//	@Around("logPointCut()")
+//	public Object around(ProceedingJoinPoint point) throws Throwable {
+//		long beginTime = System.currentTimeMillis();
+//		//执行方法
+//		Object result = point.proceed();
+//		//执行时长(毫秒)
+//		long time = System.currentTimeMillis() - beginTime;
+//
+//		//保存日志
+//		saveSysLog(point, time, result);
+//
+//		return result;
+//	}
+//
+//	private void saveSysLog(ProceedingJoinPoint joinPoint, long time,Object result) {
+//		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+//		Method method = signature.getMethod();
+//
+//		SysLogEntity sysLog = new SysLogEntity();
+//		cn.wisenergy.common.annotation.SysLog syslog = method.getAnnotation(cn.wisenergy.common.annotation.SysLog.class);
+//		if(syslog != null){
+//			//注解上的描述
+//			sysLog.setOperation(syslog.value());
+//		}
+//
+//		//请求的方法名
+//		String className = joinPoint.getTarget().getClass().getName();
+//		String methodName = signature.getName();
+//		sysLog.setMethod(className + "." + methodName + "()");
+//
+//		//请求的参数
+//		Object[] args = joinPoint.getArgs();
+//		String params = JSON.toJSONString(args);
+//		sysLog.setParams(params);
+//
+//		//返回值
+//		Result<?> r= (Result<?>) result;
+//		if("success".equals(r.getResult())) {
+//			sysLog.setState("成功");
+//		}else {
+//			sysLog.setState("失败");
+//		}
+//		//获取request
+//        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+//        //设置IP地址
+//		sysLog.setIp(IpUtils.getIpAddr(request));
+//		//用户名
+//		SysUserEntity principal = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
+//		String username =principal.getUsername();
+//		sysLog.setUsername(username);
+//		sysLog.setTime(time);
+//		sysLog.setCreateDate(new Date());
+//		//保存系统日志
+//		try {
+//			sysLogService.save(sysLog);
+//		} catch (Exception e) {
+//			e.printStackTrace();
+//		}
+//	}
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/WebLogAspect.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/WebLogAspect.java
new file mode 100644
index 0000000000000000000000000000000000000000..d92bf6e486903c90c34ecc0440a20e47adf5de37
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/aspect/WebLogAspect.java
@@ -0,0 +1,62 @@
+package cn.wisenergy.web.aspect;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * AOP日志
+ */
+@Aspect
+@Component
+@Slf4j
+public class WebLogAspect {
+
+    /**
+     * 两个..代表所有子目录,最后括号里的两个..代表所有参数
+     */
+    @Pointcut("execution( * cn.wisenergy.web.admin.controller..*.*(..))")
+    public void logPointCut() {
+    }
+
+    @Before("logPointCut()")
+    public void doBefore(JoinPoint joinPoint) {
+        // 接收到请求,记录请求内容
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = attributes.getRequest();
+
+        // 记录下请求内容
+        log.info(" ___________________________________________________________");
+        log.info("| 请求地址 : {}", request.getRequestURL().toString());
+        log.info("| 请求方式 : {}", request.getMethod());
+        // 获取执行的方法全路径
+        String methodName = joinPoint.getSignature().getName();
+        log.info("| 执行方法 : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), methodName);
+    }
+
+    /**
+     * returning的值和doAfterReturning的参数名一致
+     */
+    @AfterReturning(returning = "ret", pointcut = "logPointCut()")
+    public void doAfterReturning(Object ret) {
+        // 处理完请求,返回内容
+        log.info("| 返回值 : {}", JSON.toJSONString(ret));
+        log.info(" ———————————————————————————————————————————");
+    }
+
+    @Around("logPointCut()")
+    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
+        long startTime = System.currentTimeMillis();
+        // ob 为方法的返回值
+        Object ob = pjp.proceed();
+        log.info("| 耗时 : {}", (System.currentTimeMillis() - startTime));
+        return ob;
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/common/BaseController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/common/BaseController.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec69513687499b1b60ff3eca9914c2f136ec080d
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/common/BaseController.java
@@ -0,0 +1,49 @@
+package cn.wisenergy.web.common;
+
+import cn.wisenergy.model.app.User;
+import cn.wisenergy.service.app.UserService;
+import cn.wisenergy.web.shiro.JwtUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 控制器基类
+ *
+ * @author wyy
+ * @date 2019年08月15日
+ */
+@Slf4j
+public abstract class BaseController {
+
+    @Autowired
+    private UserService authUserService;
+    @Autowired
+    JwtUtil jwtUtil;
+    @Autowired
+    HttpServletRequest request;
+
+    /**
+     * 获取当前登录用户
+     *
+     * @return
+     */
+    public User getUser() {
+        return (User) SecurityUtils.getSubject().getPrincipal();
+    }
+
+
+    protected <T> Page<T> getPage(int size) {
+        int _size = size, _index = 1;
+        if (request.getParameter("_size") != null) {
+            _size = Integer.parseInt(request.getParameter("_size"));
+        }
+        if (request.getParameter("_index") != null) {
+            _index = Integer.parseInt(request.getParameter("_index"));
+        }
+        return new Page<T>(_index, _size);
+    }
+}
\ No newline at end of file
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/FilterConfig.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/FilterConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..8a51b76a1ca323b2c1ff62df4098154bc2d9dd44
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/FilterConfig.java
@@ -0,0 +1,25 @@
+package cn.wisenergy.web.config;
+
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.filter.DelegatingFilterProxy;
+
+/**
+ * Filter配置
+ */
+@Configuration
+public class FilterConfig {
+
+    @Bean
+    public FilterRegistrationBean shiroFilterRegistration() {
+        FilterRegistrationBean registration = new FilterRegistrationBean();
+        registration.setFilter(new DelegatingFilterProxy("shiroFilter"));
+        //该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理
+        registration.addInitParameter("targetFilterLifecycle", "true");
+        registration.setEnabled(true);
+        registration.setOrder(Integer.MAX_VALUE - 1);
+        registration.addUrlPatterns("/*");
+        return registration;
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/JwtConfig.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/JwtConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..7fec8e26059541cacd500652a764cdbf3f2ff019
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/JwtConfig.java
@@ -0,0 +1,27 @@
+package cn.wisenergy.web.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * Jwt配置
+ *
+ * @author lut
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "jwt")
+public class JwtConfig {
+
+    /**
+     * 过期时间
+     */
+    private int expire;
+
+    /**
+     * 秘钥串
+     */
+    private String secret;
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/MvcConfiguration.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/MvcConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..7632b8e7f25dcef52d7f8c026762a1a18d1c82ea
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/MvcConfiguration.java
@@ -0,0 +1,164 @@
+package cn.wisenergy.web.config;
+
+import com.alibaba.fastjson.PropertyNamingStrategy;
+import com.alibaba.fastjson.serializer.SerializeConfig;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.serializer.ToStringSerializer;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.ByteArrayHttpMessageConverter;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * MVC配置
+ *
+ * @author WYY
+ * @date 2019/4/18
+ */
+@Configuration
+public class MvcConfiguration implements WebMvcConfigurer {
+
+    @Value("${uploadFile.resourceHandler}")
+    private String resourceHandler;
+
+    @Value("${uploadFile.location}")
+    private String location;
+
+    /**
+     * 后置跨域支持【当出现跨域请求,此处会放在拦截器最后执行,CORS失效】
+     *
+     * @param registry
+     */
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**")
+                .allowedOrigins("*")
+                .allowedHeaders("*")
+                .allowedMethods("*")
+                .allowCredentials(true)
+                .maxAge(3600);
+    }
+
+    /**
+     * 配置消息转换器:Ali开源的fastJson
+     *
+     * @param converters
+     */
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        // 先移除jackson转换器,springBoot1.x可以不排除
+        for (int i = converters.size() - 1; i >= 0; i--) {
+            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
+                converters.remove(i);
+            }
+        }
+        //1.需要定义一个convert转换消息的对象;
+        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
+        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
+        ByteArrayHttpMessageConverter byteArrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
+
+        //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;
+        FastJsonConfig fastJsonConfig = new FastJsonConfig();
+        fastJsonConfig.setSerializerFeatures(
+                SerializerFeature.PrettyFormat,
+                SerializerFeature.WriteMapNullValue,
+                SerializerFeature.WriteNullStringAsEmpty,
+                SerializerFeature.DisableCircularReferenceDetect,
+                SerializerFeature.WriteNullListAsEmpty,
+                SerializerFeature.BrowserCompatible,
+                SerializerFeature.WriteDateUseDateFormat);
+        // 设置编码
+        fastJsonConfig.setCharset(Charset.forName("UTF-8"));
+        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        // 设置数字转化问题
+        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
+        serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
+        serializeConfig.put(Long.class, ToStringSerializer.instance);
+        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
+        serializeConfig.setPropertyNamingStrategy( PropertyNamingStrategy.CamelCase);
+        fastJsonConfig.setSerializeConfig(serializeConfig);
+
+        //3处理中文乱码问题
+        List<MediaType> fastMediaTypes = new ArrayList<>();
+        fastMediaTypes.add(MediaType.APPLICATION_JSON);
+        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
+        fastMediaTypes.add(MediaType.TEXT_HTML);
+        fastMediaTypes.add(MediaType.MULTIPART_FORM_DATA);
+
+        //4.在convert中添加配置信息.
+        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
+        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
+
+        //5.将convert添加到converters当中.
+        converters.add(fastJsonHttpMessageConverter);
+        converters.add(stringHttpMessageConverter);
+        converters.add(byteArrayHttpMessageConverter);
+    }
+
+    /**
+     * 启用@EnableWebMvc后,properties文件中的静态路径失效,必须覆盖后重新制定
+     * 配置静态访问资源
+     *
+     * @param registry
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // swagger2配置
+        registry.addResourceHandler("swagger-ui.html")
+                .addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**")
+                .addResourceLocations("classpath:/META-INF/resources/webjars/");
+
+        // 静态资源拦截
+        registry.addResourceHandler("/**")
+                .addResourceLocations("classpath:/META-INF/")
+                .addResourceLocations("classpath:/META-INF/resources/")
+                .addResourceLocations("classpath:/resources/")
+                .addResourceLocations("classpath:/static/")
+                .addResourceLocations("classpath:/public/")
+                .addResourceLocations("classpath:/");
+        //上传文件配置
+        registry.addResourceHandler(resourceHandler)
+                .addResourceLocations("file:///"+location);
+    }
+
+    @Override
+    public void addFormatters(FormatterRegistry registry) {
+        registry.addConverter(new Converter<String, Date>(){
+            @Override
+            public Date convert(String source) {
+                SimpleDateFormat simpleDateFormat;
+                if (source.contains(" ")) {
+                    simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                } else {
+                    simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                }
+                try {
+                    return simpleDateFormat.parse(source);
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+                return null;
+            }
+        });
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/MyBatisPlusConfig.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/MyBatisPlusConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..593deac2a05495e8954ccd1ada3989febb17f583
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/MyBatisPlusConfig.java
@@ -0,0 +1,22 @@
+package cn.wisenergy.web.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MyBatisPlusConfig {
+
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
+        // paginationInterceptor.setOverflow(false);
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        // paginationInterceptor.setLimit(500);
+        // 开启 count 的 join 优化,只针对部分 left join
+        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
+        return paginationInterceptor;
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/rest/RestTemplateConfig.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/rest/RestTemplateConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d8de9fed5bb256b949be4c319e62e258a44d152
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/rest/RestTemplateConfig.java
@@ -0,0 +1,14 @@
+package cn.wisenergy.web.config.rest;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    RestTemplate restTemplate(){
+        return new RestTemplate();
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/swagger/Swagger2.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/swagger/Swagger2.java
new file mode 100644
index 0000000000000000000000000000000000000000..56e1b4443a91b08f20c7ba5f9987496117f86a12
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/swagger/Swagger2.java
@@ -0,0 +1,51 @@
+package cn.wisenergy.web.config.swagger;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+//注解开启 swagger2 功能
+@EnableSwagger2
+//注解标示,这是一个配置类,@Configuation注解包含了@Component注解
+//可以不用在使用@Component注解标记这是个bean了,
+@Configuration
+public class Swagger2 {
+
+    /**
+     * 通过 createRestApi函数来构建一个DocketBean
+     * 函数名,可以随意命名,喜欢什么命名就什么命名
+     */
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())//调用apiInfo方法,创建一个ApiInfo实例,里面是展示在文档页面信息内容
+                .select()
+                //控制暴露出去的路径下的实例
+                //如果某个接口不想暴露,可以使用以下注解
+                //@ApiIgnore 这样,该接口就不会暴露在 swagger2 的页面下
+                .apis(RequestHandlerSelectors.basePackage("cn.wisenergy.web.admin.controller.app"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    //构建 api文档的详细信息函数
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                //页面标题
+                .title("高考志愿一点通")
+                //创建人
+                .contact(new Contact("WYY", "", ""))
+                //版本号
+                .version("2.0")
+                //描述
+                .description("API接口描述")
+                .build();
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/AuthToken.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/AuthToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfc30b13d62ea4037dc6466d797f9dd5f4ee859c
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/AuthToken.java
@@ -0,0 +1,25 @@
+package cn.wisenergy.web.shiro;
+
+
+import org.apache.shiro.authc.AuthenticationToken;
+
+/**
+ * token
+ */
+public class AuthToken implements AuthenticationToken {
+    private String token;
+
+    public AuthToken(String token) {
+        this.token = token;
+    }
+
+    @Override
+    public String getPrincipal() {
+        return token;
+    }
+
+    @Override
+    public Object getCredentials() {
+        return token;
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/JwtUtil.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/JwtUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e281e49ca607ef2bf066efe7ada1d598f168b6e
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/JwtUtil.java
@@ -0,0 +1,108 @@
+package cn.wisenergy.web.shiro;
+
+import cn.wisenergy.common.enums.RespCodeEnum;
+import cn.wisenergy.model.app.User;
+import cn.wisenergy.web.config.JwtConfig;
+import com.alibaba.fastjson.JSON;
+import io.jsonwebtoken.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Jwt-Token工具类
+ *
+ * @author lut
+ */
+@Slf4j
+@Component
+@EnableConfigurationProperties(JwtConfig.class)
+public class JwtUtil {
+
+    @Autowired
+    JwtConfig jwtConfig;
+
+    /**
+     * 生成Jwt令牌
+     *
+     * @param jSubject
+     * @return
+     */
+    private String createJWT(String jSubject) {
+        log.info("构建Jwt令牌-->{}", jSubject);
+        return Jwts.builder()
+                .signWith(SignatureAlgorithm.HS512, jwtConfig.getSecret())
+                .setSubject(jSubject)
+                .setIssuedAt(DateTime.now().toDate())
+                //.setExpiration(DateTime.now().plusSeconds(jwtConfig.getExpire() * 2).toDate())
+                .compact();
+    }
+
+    /**
+     * 解析令牌数据
+     *
+     * @param token
+     * @return
+     */
+    public Claims getClaimsFromToken(String token) {
+        Claims claims;
+        try {
+            claims = Jwts.parser()
+                    .setSigningKey(jwtConfig.getSecret())
+                    .parseClaimsJws(token)
+                    .getBody();
+        } catch (ExpiredJwtException e) {
+            throw new IncorrectCredentialsException(RespCodeEnum.TOKEN_IS_NOT_TIMEOUT.getMsg());
+        } catch (MalformedJwtException | SignatureException e) {
+            log.error("JWT解析异常,ex={}", e.getMessage(), e);
+            throw new IncorrectCredentialsException(RespCodeEnum.TOKEN_IS_NOT_ERROR.getMsg());
+        }
+        return claims;
+    }
+
+    /**
+     * 生成Jwt令牌
+     *
+     * @param userDetails 用户信息
+     * @return
+     */
+    public String generateToken(User userDetails) {
+        return createJWT(JSON.toJSONString(userDetails));
+    }
+
+    /**
+     * 从令牌中获取用户信息
+     *
+     * @return
+     */
+    public User getUserFromToken(Claims claims) {
+        return JSON.parseObject(claims.getSubject(), User.class);
+    }
+
+    /**
+     * 判断令牌是否过期
+     *
+     * @param claims
+     * @return 是否过期
+     */
+    public Boolean isTokenExpired(Claims claims) {
+        return claims.getExpiration().before(DateTime.now().plusSeconds(jwtConfig.getExpire()).toDate());
+    }
+
+    /**
+     * 从请求头中获取token
+     *
+     * @return
+     */
+    public String getToken() {
+        HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
+        return request.getHeader("Authorization");
+    }
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/ShiroConfig.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/ShiroConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..26eddc497cd7962e64fd6d0e8b3071c122f33c9a
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/ShiroConfig.java
@@ -0,0 +1,118 @@
+package cn.wisenergy.web.shiro;
+
+import cn.wisenergy.web.shiro.filter.AuthFilter;
+import cn.wisenergy.web.shiro.filter.AuthRealm;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.Filter;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * shiro配置类
+ */
+@Configuration
+public class ShiroConfig {
+
+    /**
+     * 配置拦截器
+     * <p>
+     * 定义拦截URL权限,优先级从上到下
+     * 1). anon  : 匿名访问,无需登录
+     * 2). authc : 登录后才能访问
+     * 3). logout: 登出
+     * 4). frameperms : 自定义的过滤器
+     * <p>
+     * URL 匹配风格
+     * 1). ?:匹配一个字符,如 /admin? 将匹配 /admin1,但不匹配 /admin 或 /admin/;
+     * 2). *:匹配零个或多个字符串,如 /admin* 将匹配 /admin 或/admin123,但不匹配 /admin/1;
+     * 3). **:匹配路径中的零个或多个路径,如 /admin/** 将匹配 /admin/a 或 /admin/a/b
+     * <p>
+     * 配置身份验证成功,失败的跳转路径
+     */
+    @Bean("shiroFilter")
+    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        // 设置securityManager
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+
+        // 自定义的过滤器
+        Map<String, Filter> filterMap = new HashMap<>();
+        // map里面key值要为过滤器的名称,value为过滤器对象
+        filterMap.put("oauth2", new AuthFilter());
+        // 将自定义的过滤器加入到过滤器集合中
+        shiroFilterFactoryBean.setFilters(filterMap);
+
+        // 设置拦截器集合
+        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
+//        filterChainDefinitionMap.put("/authInformation/save", "anon");//存储设备IMEI号和手机SIM卡ID号
+//        filterChainDefinitionMap.put("/sys/login", "anon"); // 登录页面-身份认证
+//        filterChainDefinitionMap.put("/sys/registered", "anon"); // 注册页面
+//        filterChainDefinitionMap.put("/swagger-ui.html", "anon"); // swagger接口-匿名访问
+//        filterChainDefinitionMap.put("/swagger/**", "anon");
+//        filterChainDefinitionMap.put("/admin/anon/**", "anon");
+//        filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon");
+//        filterChainDefinitionMap.put("/swagger-resources/**", "anon");
+//        filterChainDefinitionMap.put("/v2/api-docs", "anon");
+//        filterChainDefinitionMap.put("/upload_flowChart/**", "anon");//图片地址
+//        filterChainDefinitionMap.put("/webSocket/**", "anon");//socket
+//        filterChainDefinitionMap.put("/message/**", "anon");//消息推送接口
+//        filterChainDefinitionMap.put("/**", "oauth2");  // 其他路径均需要身份认证,一般位于最下面,优先级最低
+
+        // 设置拦截器
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+        return shiroFilterFactoryBean;
+    }
+
+    /**
+     * 配置Shiro生命周期处理器
+     */
+    @Bean("lifecycleBeanPostProcessor")
+    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    @Bean
+    public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
+        return defaultAdvisorAutoProxyCreator;
+    }
+
+    /**
+     * 配置加密匹配,使用MD5的方式,进行1024次加密
+     */
+//    @Bean
+//    public HashedCredentialsMatcher hashedCredentialsMatcher() {
+//        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
+//        hashedCredentialsMatcher.setHashAlgorithmName("MD5");
+//        hashedCredentialsMatcher.setHashIterations(1024);
+//        return hashedCredentialsMatcher;
+//    }
+    @Bean("securityManager")
+    public SecurityManager securityManager(AuthRealm authRealm) {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        securityManager.setRealm(authRealm);
+        securityManager.setRememberMeManager(null);
+        return securityManager;
+    }
+
+    /**
+     * 开启Shiro的注解
+     */
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
+        advisor.setSecurityManager(securityManager);
+        return advisor;
+    }
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthFilter.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6262ce6f168cf1578b022e3fd573938228f5ae9
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthFilter.java
@@ -0,0 +1,138 @@
+package cn.wisenergy.web.shiro.filter;
+
+import cn.wisenergy.common.enums.RespCodeEnum;
+import cn.wisenergy.common.utils.HttpContextUtils;
+import cn.wisenergy.common.utils.exception.Result;
+import cn.wisenergy.web.shiro.AuthToken;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * oauth2过滤器
+ */
+@Slf4j
+public class AuthFilter extends AuthenticatingFilter {
+
+    /**
+     * 这里重写了父类的方法,使用我们自己定义的Token类,提交给shiro。
+     * 这个方法返回null的话会直接抛出异常,进入isAccessAllowed() 的异常处理逻辑。
+     *
+     * @throws Exception
+     */
+    @Override
+    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
+        //获取请求token
+        String token = getRequestToken((HttpServletRequest) request);
+        if (StringUtils.isBlank(token)) {
+            return null;
+        }
+        return new AuthToken(token);
+    }
+
+    /**
+     * 父类会在请求进入拦截器后调用该方法,返回true则继续,返回false则会调用onAccessDenied()。这里在不通过时,还调用了isPermissive()方法
+     */
+    @Override
+    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+        if (((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())) {
+            return true;
+        }
+//        boolean allowed = false;
+//        try {
+//            allowed = executeLogin(request, response);
+//        } catch(IllegalStateException e){ //not found any token
+//            log.error("Not found any token");
+//        }catch (Exception e) {
+//            log.error("Error occurs when login", e);
+//        }
+
+//        return allowed || super.isPermissive(mappedValue);
+        return false;
+    }
+
+    /**
+     * 如果这个Filter在之前isAccessAllowed()方法中返回false,则会进入这个方法。这里直接返回错误的response
+     */
+    @Override
+    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+        //获取请求token,如果token不存在,直接返回40101
+        String token = getRequestToken((HttpServletRequest) request);
+        if (StringUtils.isBlank(token)) {
+            HttpServletResponse httpResponse = (HttpServletResponse) response;
+            httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
+            httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());
+            httpResponse.setCharacterEncoding("gbk");
+
+            Result result = new Result();
+            result.setResult(Result.RESULT_FLG.FAIL.getValue());
+            result.setErrorCode(RespCodeEnum.NO_AUTH_REQUEST.getCode());
+            result.setErrorMsg(RespCodeEnum.NO_AUTH_REQUEST.getMsg());
+            String json = JSON.toJSONString(result);
+            httpResponse.getWriter().print(json);
+            return false;
+        }
+
+        return executeLogin(request, response);
+    }
+
+//    /**
+//     *  如果Shiro Login认证成功,会进入该方法,等同于用户名密码登录成功,这里还判断了是否要刷新Token
+//     */
+//    @Override
+//    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {
+//        HttpServletResponse httpResponse = WebUtils.toHttp(response);
+//        if(token instanceof AuthToken){
+//            AuthToken jwtToken = (AuthToken)token;
+//            String newtoken  = jwtToken.getPrincipal();
+//            if(StringUtils.isNotBlank(newtoken)){
+//                httpResponse.setHeader("x-auth-token", newtoken);
+//            }
+//        }
+//        return true;
+//    }
+
+    /**
+     * 如果调用shiro的login认证失败,会回调这个方法
+     */
+    @Override
+    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+        httpResponse.setContentType("application/json;charset=utf-8");
+        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
+        httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());
+        try {
+            //处理登录失败的异常
+            Throwable throwable = e.getCause() == null ? e : e.getCause();
+            Result result = new Result();
+            result.setErrorCode(String.valueOf(HttpStatus.SC_UNAUTHORIZED));
+            result.setResult(Result.RESULT_FLG.FAIL.getValue());
+            result.setErrorMsg(throwable.getMessage());
+            String json = JSON.toJSONString(result);
+            httpResponse.getWriter().print(json);
+        } catch (IOException e1) {
+        }
+        return false;
+    }
+
+    /**
+     * 获取请求头中的token
+     */
+    private String getRequestToken(HttpServletRequest httpRequest) {
+        //从header中获取token
+        String token = httpRequest.getHeader("Authorization");
+        return token;
+    }
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthRealm.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthRealm.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f29f00814b6143a7c3fc25f6f61f4318b8c0736
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthRealm.java
@@ -0,0 +1,128 @@
+package cn.wisenergy.web.shiro.filter;
+
+import cn.wisenergy.common.constant.RedisConsts;
+import cn.wisenergy.common.enums.RespCodeEnum;
+import cn.wisenergy.model.app.AccountInfo;
+import cn.wisenergy.model.app.User;
+import cn.wisenergy.service.app.UserService;
+import cn.wisenergy.web.config.JwtConfig;
+import cn.wisenergy.web.shiro.AuthToken;
+import cn.wisenergy.web.shiro.JwtUtil;
+import io.jsonwebtoken.Claims;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Set;
+
+/**
+ * 认证
+ *
+ * @author lut
+ */
+@Slf4j
+@Component
+public class AuthRealm extends AuthorizingRealm {
+
+    @Autowired
+    private UserService sysUserService;
+    @Autowired
+    private UserService authUserService;
+    @Autowired
+    private JwtUtil jwtUtil;
+    @Autowired
+    private JwtConfig jwtConfig;
+    @Resource
+    RedisTemplate<String, Object> redisTemplate;
+
+    @Override
+    public boolean supports(AuthenticationToken token) {
+        return token instanceof AuthToken;
+    }
+
+    /**
+     * 授权(验证权限时调用)
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        AccountInfo user = (AccountInfo) principals.getPrimaryPrincipal();
+        String userId = user.getId().toString();
+        //用户权限列表
+//        Set<String> permsSet = sysUserService.queryAllPerms(userId);
+        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
+//        info.setStringPermissions(permsSet);
+        return info;
+    }
+
+    /**
+     * 认证(登录时调用)
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
+        // 获取token
+        String accessToken = (String) token.getPrincipal();
+        User userEntity = null;
+        Boolean refreshFlag = false;
+        // 解析token
+        Claims claims = jwtUtil.getClaimsFromToken(accessToken);
+        // 从token中获取用户
+        userEntity = jwtUtil.getUserFromToken(claims);
+        // 获取redis Key
+        String redisKey = RedisConsts.JWT_ACCESS_TOKEN + accessToken;
+        // 从redis中获取token
+        String redisToken = (String) redisTemplate.opsForValue().get(redisKey);
+      /*  try {
+            if (redisToken != null) {
+                //这里刷新token 是否过期,如果过期需要更新token
+                if (jwtUtil.isTokenExpired(claims)) {
+                    // 重新签发token
+                    String refreshToken = jwtUtil.generateToken(userEntity);
+                    // 将新token存入Redis中
+                    redisTemplate.opsForValue().set(RedisConsts.JWT_ACCESS_TOKEN + refreshToken, refreshToken, jwtConfig.getExpire() + 60 * 60);
+                    HttpServletResponse resp = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+                    resp.setHeader("refresh-token", accessToken);
+                    refreshFlag = true;
+                }
+            } else {
+                throw new IncorrectCredentialsException(RespCodeEnum.NO_AUTH_REQUEST.getMsg());
+            }
+        } catch (ExpiredJwtException e) {
+            // token解析异常
+            log.error("token解析异常,ex={}", e.getMessage(), e);
+            throw new IncorrectCredentialsException(RespCodeEnum.TOKEN_IS_NOT_TIMEOUT.getMsg());
+        }*/
+        //查询用户信息
+        User user = authUserService.getByPhone(userEntity.getPhone());
+        // 判断请求token与redis中是否相同,如果token被刷新,则不判断
+        if (!refreshFlag && !StringUtils.equals(accessToken, redisToken)) {
+            throw new IncorrectCredentialsException(RespCodeEnum.NO_AUTH_REQUEST.getMsg());
+        }
+        // 账号不存在
+        if (user == null) {
+            throw new UnknownAccountException("账号不存在");
+        }
+        // 密码错误
+//        if (!password.equals(user.getPassword())) {
+//            throw new IncorrectCredentialsException("账号或密码不正确");
+//        }
+        //账号锁定
+//        if (user.getStatus() == 2) {
+//            throw new LockedAccountException("账号已被锁定,请联系管理员");
+//        }
+        if (refreshFlag) {
+            // 重置Redis中token过期时间,如果token被刷新,则不进行重置
+            redisTemplate.opsForValue().set(redisKey, accessToken, jwtConfig.getExpire() + 60 * 60);
+        }
+        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, accessToken, getName());
+        return info;
+    }
+
+}
diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthorizationFilter.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthorizationFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c7c4ec84801e2f70358f52f904fc742382ae1c7
--- /dev/null
+++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/shiro/filter/AuthorizationFilter.java
@@ -0,0 +1,46 @@
+package cn.wisenergy.web.shiro.filter;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author wyy
+ * @date 2019-09-14 17:57
+ */
+public class AuthorizationFilter extends PermissionsAuthorizationFilter {
+     /**
+     * shiro认证perms资源失败后回调方法
+     * @param servletRequest
+     * @param servletResponse
+     * @return
+     * @throws IOException
+     */
+    @Override
+    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
+        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
+        String requestedWith = httpServletRequest.getHeader("X-Requested-With");
+        if (StringUtils.isNotEmpty(requestedWith) && StringUtils.equals(requestedWith, "XMLHttpRequest")) {//如果是ajax返回指定格式数据
+            httpServletResponse.setContentType("application/json");
+            httpServletResponse.setCharacterEncoding("UTF-8");
+            PrintWriter out = httpServletResponse.getWriter();
+            JSONObject json = new JSONObject();
+            json.put("result", "success");
+            json.put("msg", "登录成功");
+            out.write(json.toJSONString());
+            out.flush();
+            out.close();
+        } else {//如果是普通请求进行重定向
+            httpServletResponse.sendRedirect("/403");
+        }
+        return false;
+    }
+}
diff --git a/wisenergy-web-admin/src/main/resources/application-dev.yml b/wisenergy-web-admin/src/main/resources/application-dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1c86162db82bbae6d1ef057add79cc07f7bcf56a
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/application-dev.yml
@@ -0,0 +1,70 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      driver-class-name: com.mysql.cj.jdbc.Driver
+      url: jdbc:mysql://192.168.110.165:3306/volunteer?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
+      username: root
+      password: adm4HYservice$
+      initial-size: 10
+      max-active: 100
+      min-idle: 10
+      max-wait: 60000
+      # 打开PSCache,并且指定每个连接上PSCache的大小
+      pool-prepared-statements: true
+      max-pool-prepared-statement-per-connection-size: 20
+      time-between-eviction-runs-millis: 60000
+      min-evictable-idle-time-millis: 300000
+      #Oracle需要打开注释
+      #validation-query: SELECT 1 FROM DUAL
+      test-while-idle: true
+      test-on-borrow: false
+      test-on-return: false
+      stat-view-servlet:
+        enabled: true
+        url-pattern: /druid/*
+      #login-username: admin
+      #login-password: admin
+      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+      filter:
+        stat:
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: false
+        wall:
+          config:
+            multi-statement-allow: true
+  #文件上传配置
+  servlet:
+    multipart:
+      # 启用
+      enabled: true
+      # 上传文件单个限制
+      max-file-size: 10MB
+      # 总限制
+      max-request-size: 20MB
+
+  redis:
+    database: 0
+    host: 192.168.110.165
+    port: 6379
+    password: adm4HYservice$    # 密码(默认为空)
+    timeout: 6000ms  # 连接超时时长(毫秒)
+    jedis:
+      pool:
+        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
+        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-idle: 10      # 连接池中的最大空闲连接
+        min-idle: 5       # 连接池中的最小空闲连
+###上传文件配置 :该配置可根据部署的系统或开发人员自定义路径,每次部署之前需要修改location
+uploadFile:
+  resourceHandler: /upload_flowChart/**   #请求 url 中的资源映射也是保存到数据库中的父级路径
+  #location: D:/java/test/upload_flowChart/ #自定义上传文件服务器硬盘保存路径  ,linux服务器保存路径 /home/changfa/app/wxbjgkpt/upload_flowChart
+  location: /opt/images/upload_flowChart/ #自定义上传文件服务器硬盘保存路径  ,linux服务器保存路径 /home/changfa/app/wxbjgkpt/upload_flowChart/
+jwt:
+  # 加密秘钥
+  secret: f4e2e52034348f86b67cde581c0f9eb5
+  # token有效时长,单位秒
+  expire: 14400
+logging:
+  config: classpath:logback-spring.xml
\ No newline at end of file
diff --git a/wisenergy-web-admin/src/main/resources/application-prod.yml b/wisenergy-web-admin/src/main/resources/application-prod.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a662340dbda0abc3da9bd9bac229eb6ad5c713b0
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/application-prod.yml
@@ -0,0 +1,58 @@
+logging:
+  level:
+    root: info
+    com.sinosoft: info
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      driver-class-name: com.mysql.cj.jdbc.Driver
+      url: jdbc:mysql://localhost:3306/dydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
+      username: root
+      password: root
+      initial-size: 10
+      max-active: 100
+      min-idle: 10
+      # 配置获取连接等待超时的时间
+      max-wait: 60000
+      pool-prepared-statements: true
+      max-pool-prepared-statement-per-connection-size: 20
+      time-between-eviction-runs-millis: 60000
+      validationQuery: select 'x'
+      #Oracle需要打开注释
+      #validation-query: SELECT 1 FROM DUAL
+      test-while-idle: true
+      test-on-borrow: false
+      test-on-return: false
+      stat-view-servlet:
+        enabled: true
+        url-pattern: /druid/*
+        #login-username: admin
+        #login-password: admin
+      filter:
+        stat:
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: false
+        wall:
+          config:
+            multi-statement-allow: true
+  # redis配置
+  redis:
+    open: false  # 是否开启redis缓存  true开启   false关闭
+    database: 0
+    host: localhost
+    port: 6379
+    password:    # 密码(默认为空)
+    timeout: 6000ms  # 连接超时时长(毫秒)
+    jedis:
+      pool:
+        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
+        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-idle: 10      # 连接池中的最大空闲连接
+        min-idle: 5       # 连接池中的最小空闲连接
+jwt:
+  # 加密秘钥
+  secret: f4e2e52034348f86b67cde581c0f9eb5
+  # token有效时长,单位秒
+  expire: 14400
\ No newline at end of file
diff --git a/wisenergy-web-admin/src/main/resources/application-test.yml b/wisenergy-web-admin/src/main/resources/application-test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e4fb385193b2711b7423e309105bcd67f3f9d41d
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/application-test.yml
@@ -0,0 +1,52 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      driver-class-name: com.mysql.cj.jdbc.Driver
+      url: jdbc:mysql://localhost:3306/dydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
+      username: root
+      password: root
+      initial-size: 10
+      max-active: 100
+      min-idle: 10
+      max-wait: 60000
+      pool-prepared-statements: true
+      max-pool-prepared-statement-per-connection-size: 20
+      time-between-eviction-runs-millis: 60000
+      min-evictable-idle-time-millis: 300000
+      #Oracle需要打开注释
+      #validation-query: SELECT 1 FROM DUAL
+      test-while-idle: true
+      test-on-borrow: false
+      test-on-return: false
+      stat-view-servlet:
+        enabled: true
+        url-pattern: /druid/*
+        #login-username: admin
+        #login-password: admin
+      filter:
+        stat:
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: false
+        wall:
+          config:
+            multi-statement-allow: true
+  redis:
+    open: false  # 是否开启redis缓存  true开启   false关闭
+    database: 0
+    host: localhost
+    port: 6379
+    password:    # 密码(默认为空)
+    timeout: 6000ms  # 连接超时时长(毫秒)
+    jedis:
+      pool:
+        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
+        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-idle: 10      # 连接池中的最大空闲连接
+        min-idle: 5       # 连接池中的最小空闲连接
+#jwt:
+          ##  # 加密秘钥
+          ##  secret: f4e2e52034348f86b67cde581c0f9eb5
+        ##  # token有效时长,单位秒
+        ##  expire: 14400
diff --git a/wisenergy-web-admin/src/main/resources/application.yml b/wisenergy-web-admin/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dbf602d47e2172ab6be8292d6e7d34d9eb7024ef
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/application.yml
@@ -0,0 +1,64 @@
+server:
+  tomcat:
+    uri-encoding: UTF-8
+    max-threads: 1000
+    min-spare-threads: 30
+  port: 8997
+  connection-timeout: 5000ms
+
+spring:
+  main:
+    allow-bean-definition-overriding: true
+  # 环境 dev|test|prod
+  profiles:
+    active: dev
+  # jackson时间格式化
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+      enabled: true
+  mvc:
+    throw-exception-if-no-handler-found: true
+#  resources:
+#    add-mappings: false
+
+#mybatis
+mybatis-plus:
+  mapper-locations: classpath*:/mapper/**/*.xml
+  #实体扫描,多个package用逗号或者分号分隔
+  #typeAliasesPackage: cn.wisenergy.service.*
+  global-config:
+    #数据库相关配置
+    db-config:
+      #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
+      id-type: AUTO
+      #驼峰下划线转换
+      column-underline: true
+      logic-delete-value: -1
+      logic-not-delete-value: 0
+    banner: false
+  #原生配置
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+    call-setters-on-nulls: true
+    jdbc-type-for-null: 'null'
+
+
+camera:
+  ysy:   #萤石云
+    api:
+      appKey: 53ff83088a8b445ea1b30c0ba85f7653
+      appSecret: 0274e379003912b7ec1f3ef18a169624
+
+  isc:          #海康威视
+    api:
+      host: 172.18.1.51:4443
+      #host: 111.203.232.172:4443
+      appKey: 23756916
+      appSecret: TDrCbqQXe9XSt7SimYDO
+      path: /artemis
diff --git a/wisenergy-web-admin/src/main/resources/db/ljfl.sql b/wisenergy-web-admin/src/main/resources/db/ljfl.sql
new file mode 100644
index 0000000000000000000000000000000000000000..e1b681ab404235a0ab5dbd24c4c9dc453c096256
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/db/ljfl.sql
@@ -0,0 +1,80 @@
+/*
+ Navicat MySQL Data Transfer
+
+ Source Server         : test
+ Source Server Type    : MySQL
+ Source Server Version : 50727
+ Source Host           : localhost:3306
+ Source Schema         : ljfl
+
+ Target Server Type    : MySQL
+ Target Server Version : 50727
+ File Encoding         : 65001
+
+ Date: 03/11/2020 10:07:47
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for camera
+-- ----------------------------
+DROP TABLE IF EXISTS `camera`;
+CREATE TABLE `camera`  (
+  `id` int(11) NOT NULL COMMENT '主键',
+  `camera_number` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '摄像机编号',
+  `name` varchar(30) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '名称',
+  `site` varchar(30) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '投放点',
+  `inspector_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '督察员姓名',
+  `inspector_phone` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '督察员手机号',
+  `longitude` double NULL DEFAULT NULL COMMENT '经度',
+  `latitude` double NULL DEFAULT NULL COMMENT '纬度',
+  `status` int(2) NULL DEFAULT NULL COMMENT '状态:0:在线  1:离线',
+  `is_delete` int(2) NULL DEFAULT NULL COMMENT '是否删除 0:正常  1:删除',
+  `remark` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '备注',
+  `rubbish_id` int(11) NULL DEFAULT NULL COMMENT '所属垃圾点id',
+  `create_time` datetime(0) NULL DEFAULT NULL,
+  `update_time` datetime(0) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for resident
+-- ----------------------------
+DROP TABLE IF EXISTS `resident`;
+CREATE TABLE `resident`  (
+  `id` int(11) NOT NULL COMMENT '主键id',
+  `name` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '姓名',
+  `phone` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '手机号码',
+  `sex` int(2) NULL DEFAULT NULL COMMENT '性别  1:男  2:女',
+  `street` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '所属街道',
+  `community` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '所属社区',
+  `remark` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '备注',
+  `is_delete` int(2) NULL DEFAULT NULL COMMENT '是否删除 0:正常 1:删除',
+  `create_time` datetime(0) NULL DEFAULT NULL,
+  `update_time` datetime(0) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for rubbish
+-- ----------------------------
+DROP TABLE IF EXISTS `rubbish`;
+CREATE TABLE `rubbish`  (
+  `id` int(11) NOT NULL COMMENT '主键id',
+  `rubbish_number` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '垃圾站编号',
+  `user_name` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '负责人姓名',
+  `street` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '所属街道',
+  `community` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '所属社区',
+  `live_time` datetime(0) NULL DEFAULT NULL COMMENT '直播时间',
+  `click_time` datetime(0) NULL DEFAULT NULL COMMENT '点播时间',
+  `remark` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '备注',
+  `status` int(2) NULL DEFAULT NULL COMMENT '状态 :0:再用  1:弃用',
+  `is_delete` int(2) NULL DEFAULT NULL COMMENT '是否删除 0:正常 1:删除',
+  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git "a/wisenergy-web-admin/src/main/resources/db/\346\231\272\350\203\275\345\236\203\345\234\276\345\210\206\347\261\273\350\241\250\347\273\223\346\236\204\346\250\241\345\236\213.ndm2" "b/wisenergy-web-admin/src/main/resources/db/\346\231\272\350\203\275\345\236\203\345\234\276\345\210\206\347\261\273\350\241\250\347\273\223\346\236\204\346\250\241\345\236\213.ndm2"
new file mode 100644
index 0000000000000000000000000000000000000000..24645022b85e3283d9b168c99d909481a5f731a8
--- /dev/null
+++ "b/wisenergy-web-admin/src/main/resources/db/\346\231\272\350\203\275\345\236\203\345\234\276\345\210\206\347\261\273\350\241\250\347\273\223\346\236\204\346\250\241\345\236\213.ndm2"
@@ -0,0 +1,1228 @@
+{
+  "paper": {
+    "name": "A4",
+    "leftMargin": 0.5,
+    "rightMargin": 0.5,
+    "topMargin": 0.5,
+    "bottomMargin": 0.5,
+    "isPortriat": true
+  },
+  "modelVersion": 2.01,
+  "defaultSchema": "Default",
+  "server": {
+    "objectType": "Server_MYSQL",
+    "name": "Default",
+    "serverVersion": 50727,
+    "edition": "Default",
+    "lowerCaseTableNames": 0,
+    "schemas": [
+      {
+        "objectType": "Schema_MYSQL",
+        "name": "Default",
+        "tables": [],
+        "views": []
+      },
+      {
+        "objectType": "Schema_MYSQL",
+        "name": "ljfl",
+        "tables": [
+          {
+            "objectType": "Table_MYSQL",
+            "name": "camera",
+            "comment": "",
+            "engine": "InnoDB",
+            "characterSet": "latin1",
+            "collation": "latin1_swedish_ci",
+            "autoIncrement": 0,
+            "tablespace": "",
+            "storage": "",
+            "insertMethod": "",
+            "connection": "",
+            "checksum": false,
+            "rowFormat": "Dynamic",
+            "avgRowLength": 0,
+            "maxRows": 0,
+            "minRows": 0,
+            "keyBlockSize": 0,
+            "packKeys": "",
+            "delayKeyWrite": false,
+            "dataDirectory": "",
+            "indexDirectory": "",
+            "statsAutoRecalc": "",
+            "statsPersistent": "",
+            "statsSamplePages": 0,
+            "union": "",
+            "pageCheckSum": false,
+            "transactional": false,
+            "compression": "",
+            "oldName": "camera",
+            "encryption": false,
+            "createOptions": "",
+            "createTime": "2020-11-03 10:13:38",
+            "checkTime": "",
+            "dataFree": 0,
+            "dataLength": 16384,
+            "indexLength": 0,
+            "maxDataLength": 0,
+            "rows": 0,
+            "updateTime": "",
+            "DDL": "CREATE TABLE `camera` (\n  `id` int(11) NOT NULL COMMENT '主键',\n  `camera_number` varchar(20) DEFAULT NULL COMMENT '摄像机编号',\n  `name` varchar(30) DEFAULT NULL COMMENT '名称',\n  `inspector_name` varchar(255) DEFAULT NULL COMMENT '督察员姓名',\n  `inspector_phone` varchar(255) DEFAULT NULL COMMENT '督察员手机号',\n  `longitude` double DEFAULT NULL COMMENT '经度',\n  `latitude` double DEFAULT NULL COMMENT '纬度',\n  `status` int(2) DEFAULT NULL COMMENT '状态:0:在线  1:离线',\n  `is_delete` int(2) DEFAULT NULL COMMENT '是否删除 0:正常  1:删除',\n  `remark` varchar(255) DEFAULT NULL COMMENT '备注',\n  `rubbish_id` int(11) DEFAULT NULL COMMENT '所属垃圾点id',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1",
+            "partitionBy": "",
+            "partitionByExpr": "",
+            "partitions": 0,
+            "partitionKeyAlgorithm": "",
+            "subPartitionBy": "",
+            "subPartitionByExpr": "",
+            "subPartitions": 0,
+            "subPartitionKeyAlgorithm": "",
+            "fields": [
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "id",
+                "type": "int",
+                "length": 11,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": false,
+                "defaultType": "Others",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "主键",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "id"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "camera_number",
+                "type": "varchar",
+                "length": 20,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "摄像机编号",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "camera_number"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "name",
+                "type": "varchar",
+                "length": 30,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "名称",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "name"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "inspector_name",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "督察员姓名",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "inspector_name"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "inspector_phone",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "督察员手机号",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "inspector_phone"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "longitude",
+                "type": "double",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "经度",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "longitude"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "latitude",
+                "type": "double",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "纬度",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "latitude"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "status",
+                "type": "int",
+                "length": 2,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "状态:0:在线  1:离线",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "status"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "is_delete",
+                "type": "int",
+                "length": 2,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "是否删除 0:正常  1:删除",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "is_delete"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "remark",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "备注",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "remark"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "rubbish_id",
+                "type": "int",
+                "length": 11,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "所属垃圾点id",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "rubbish_id"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "create_time",
+                "type": "datetime",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "创建时间",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "create_time"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "update_time",
+                "type": "datetime",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "更新时间",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "update_time"
+              }
+            ],
+            "indexes": [],
+            "primaryKey": {
+              "objectType": "PrimaryKey_MYSQL",
+              "name": "",
+              "fields": [
+                {
+                  "objectType": "IndexField_MYSQL",
+                  "name": "id",
+                  "keyLength": 0,
+                  "order": "",
+                  "oldName": "id"
+                }
+              ],
+              "oldName": "",
+              "indexMethod": "BTREE",
+              "comment": ""
+            },
+            "foreignKeys": [],
+            "triggers": [],
+            "tablePartitions": []
+          },
+          {
+            "objectType": "Table_MYSQL",
+            "name": "resident",
+            "comment": "",
+            "engine": "InnoDB",
+            "characterSet": "latin1",
+            "collation": "latin1_swedish_ci",
+            "autoIncrement": 0,
+            "tablespace": "",
+            "storage": "",
+            "insertMethod": "",
+            "connection": "",
+            "checksum": false,
+            "rowFormat": "Dynamic",
+            "avgRowLength": 0,
+            "maxRows": 0,
+            "minRows": 0,
+            "keyBlockSize": 0,
+            "packKeys": "",
+            "delayKeyWrite": false,
+            "dataDirectory": "",
+            "indexDirectory": "",
+            "statsAutoRecalc": "",
+            "statsPersistent": "",
+            "statsSamplePages": 0,
+            "union": "",
+            "pageCheckSum": false,
+            "transactional": false,
+            "compression": "",
+            "oldName": "resident",
+            "encryption": false,
+            "createOptions": "",
+            "createTime": "2020-11-03 09:58:48",
+            "checkTime": "",
+            "dataFree": 0,
+            "dataLength": 16384,
+            "indexLength": 0,
+            "maxDataLength": 0,
+            "rows": 0,
+            "updateTime": "",
+            "DDL": "CREATE TABLE `resident` (\n  `id` int(11) NOT NULL COMMENT '主键id',\n  `name` varchar(20) DEFAULT NULL COMMENT '姓名',\n  `phone` varchar(20) DEFAULT NULL COMMENT '手机号码',\n  `sex` int(2) DEFAULT NULL COMMENT '性别  1:男  2:女',\n  `street` varchar(255) DEFAULT NULL COMMENT '所属街道',\n  `community` varchar(255) DEFAULT NULL COMMENT '所属社区',\n  `remark` varchar(255) DEFAULT NULL COMMENT '备注',\n  `is_delete` int(2) DEFAULT NULL COMMENT '是否删除 0:正常 1:删除',\n  `create_time` datetime DEFAULT NULL,\n  `update_time` datetime DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1",
+            "partitionBy": "",
+            "partitionByExpr": "",
+            "partitions": 0,
+            "partitionKeyAlgorithm": "",
+            "subPartitionBy": "",
+            "subPartitionByExpr": "",
+            "subPartitions": 0,
+            "subPartitionKeyAlgorithm": "",
+            "fields": [
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "id",
+                "type": "int",
+                "length": 11,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": false,
+                "defaultType": "Others",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "主键id",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "id"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "name",
+                "type": "varchar",
+                "length": 20,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "姓名",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "name"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "phone",
+                "type": "varchar",
+                "length": 20,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "手机号码",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "phone"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "sex",
+                "type": "int",
+                "length": 2,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "性别  1:男  2:女",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "sex"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "street",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "所属街道",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "street"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "community",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "所属社区",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "community"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "remark",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "备注",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "remark"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "is_delete",
+                "type": "int",
+                "length": 2,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "是否删除 0:正常 1:删除",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "is_delete"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "create_time",
+                "type": "datetime",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "create_time"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "update_time",
+                "type": "datetime",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "update_time"
+              }
+            ],
+            "indexes": [],
+            "primaryKey": {
+              "objectType": "PrimaryKey_MYSQL",
+              "name": "",
+              "fields": [
+                {
+                  "objectType": "IndexField_MYSQL",
+                  "name": "id",
+                  "keyLength": 0,
+                  "order": "",
+                  "oldName": "id"
+                }
+              ],
+              "oldName": "",
+              "indexMethod": "BTREE",
+              "comment": ""
+            },
+            "foreignKeys": [],
+            "triggers": [],
+            "tablePartitions": []
+          },
+          {
+            "objectType": "Table_MYSQL",
+            "name": "rubbish",
+            "comment": "",
+            "engine": "InnoDB",
+            "characterSet": "latin1",
+            "collation": "latin1_swedish_ci",
+            "autoIncrement": 0,
+            "tablespace": "",
+            "storage": "",
+            "insertMethod": "",
+            "connection": "",
+            "checksum": false,
+            "rowFormat": "Dynamic",
+            "avgRowLength": 0,
+            "maxRows": 0,
+            "minRows": 0,
+            "keyBlockSize": 0,
+            "packKeys": "",
+            "delayKeyWrite": false,
+            "dataDirectory": "",
+            "indexDirectory": "",
+            "statsAutoRecalc": "",
+            "statsPersistent": "",
+            "statsSamplePages": 0,
+            "union": "",
+            "pageCheckSum": false,
+            "transactional": false,
+            "compression": "",
+            "oldName": "rubbish",
+            "encryption": false,
+            "createOptions": "",
+            "createTime": "2020-11-03 10:04:00",
+            "checkTime": "",
+            "dataFree": 0,
+            "dataLength": 16384,
+            "indexLength": 0,
+            "maxDataLength": 0,
+            "rows": 0,
+            "updateTime": "",
+            "DDL": "CREATE TABLE `rubbish` (\n  `id` int(11) NOT NULL COMMENT '主键id',\n  `rubbish_number` varchar(20) DEFAULT NULL COMMENT '垃圾站编号',\n  `user_name` varchar(20) DEFAULT NULL COMMENT '负责人姓名',\n  `street` varchar(255) DEFAULT NULL COMMENT '所属街道',\n  `community` varchar(255) DEFAULT NULL COMMENT '所属社区',\n  `live_time` int(11) DEFAULT NULL COMMENT '直播时间',\n  `click_time` int(11) DEFAULT NULL COMMENT '点播时间',\n  `remark` varchar(255) DEFAULT NULL COMMENT '备注',\n  `status` int(2) DEFAULT NULL COMMENT '状态 :0:再用  1:弃用',\n  `is_delete` int(2) DEFAULT NULL COMMENT '是否删除 0:正常 1:删除',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1",
+            "partitionBy": "",
+            "partitionByExpr": "",
+            "partitions": 0,
+            "partitionKeyAlgorithm": "",
+            "subPartitionBy": "",
+            "subPartitionByExpr": "",
+            "subPartitions": 0,
+            "subPartitionKeyAlgorithm": "",
+            "fields": [
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "id",
+                "type": "int",
+                "length": 11,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": false,
+                "defaultType": "Others",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "主键id",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "id"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "rubbish_number",
+                "type": "varchar",
+                "length": 20,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "垃圾站编号",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "rubbish_number"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "user_name",
+                "type": "varchar",
+                "length": 20,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "负责人姓名",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "user_name"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "street",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "所属街道",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "street"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "community",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "所属社区",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "community"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "live_time",
+                "type": "int",
+                "length": 11,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "直播时间",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "live_time"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "click_time",
+                "type": "int",
+                "length": 11,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "点播时间",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "click_time"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "remark",
+                "type": "varchar",
+                "length": 255,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "latin1",
+                "collation": "latin1_swedish_ci",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "备注",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "remark"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "status",
+                "type": "int",
+                "length": 2,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "状态 :0:再用  1:弃用",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "status"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "is_delete",
+                "type": "int",
+                "length": 2,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "是否删除 0:正常 1:删除",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "is_delete"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "create_time",
+                "type": "datetime",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "创建时间",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "create_time"
+              },
+              {
+                "objectType": "TableField_MYSQL",
+                "name": "update_time",
+                "type": "datetime",
+                "length": 0,
+                "decimals": 0,
+                "isUnsigned": false,
+                "isZeroFill": false,
+                "setEnumValues": "",
+                "isBinary": false,
+                "charset": "",
+                "collation": "",
+                "isNullable": true,
+                "defaultType": "Null",
+                "defaultValue": "",
+                "isOnUpdateCurrentTimestamp": false,
+                "isAutoInc": false,
+                "comment": "更新时间",
+                "columnFormat": "",
+                "storage": "",
+                "isVirtual": false,
+                "isGeneratedAlways": false,
+                "virtualExpr": "",
+                "virtualType": "",
+                "oldName": "update_time"
+              }
+            ],
+            "indexes": [],
+            "primaryKey": {
+              "objectType": "PrimaryKey_MYSQL",
+              "name": "",
+              "fields": [
+                {
+                  "objectType": "IndexField_MYSQL",
+                  "name": "id",
+                  "keyLength": 0,
+                  "order": "",
+                  "oldName": "id"
+                }
+              ],
+              "oldName": "",
+              "indexMethod": "BTREE",
+              "comment": ""
+            },
+            "foreignKeys": [],
+            "triggers": [],
+            "tablePartitions": []
+          }
+        ],
+        "views": []
+      }
+    ]
+  },
+  "diagrams": [
+    {
+      "name": "Diagram 1",
+      "paperWidth": 1,
+      "paperHeight": 1,
+      "tableFont": "Arial Unicode MS",
+      "tableFontSize": 14,
+      "isBalckWhite": false,
+      "showDBSchemaName": false,
+      "showViewRelations": true,
+      "notation": "default",
+      "showFieldComment": false,
+      "showTableComment": false,
+      "shapes": [
+        {
+          "type": "table",
+          "schemaName": "ljfl",
+          "tableName": "camera",
+          "x": 240,
+          "y": 0,
+          "width": 214,
+          "height": 310,
+          "isBold": false,
+          "titleColor": {
+            "r": 55,
+            "g": 131,
+            "b": 192,
+            "a": 1
+          }
+        },
+        {
+          "type": "table",
+          "schemaName": "ljfl",
+          "tableName": "resident",
+          "x": 20,
+          "y": 300,
+          "width": 187,
+          "height": 250,
+          "isBold": false,
+          "titleColor": {
+            "r": 55,
+            "g": 131,
+            "b": 192,
+            "a": 1
+          }
+        },
+        {
+          "type": "table",
+          "schemaName": "ljfl",
+          "tableName": "rubbish",
+          "x": 10,
+          "y": 0,
+          "width": 204,
+          "height": 290,
+          "isBold": false,
+          "titleColor": {
+            "r": 55,
+            "g": 131,
+            "b": 192,
+            "a": 1
+          }
+        }
+      ],
+      "layers": [],
+      "relations": [],
+      "viewRelations": []
+    }
+  ]
+}
\ No newline at end of file
diff --git a/wisenergy-web-admin/src/main/resources/loadFFmpeg.properties b/wisenergy-web-admin/src/main/resources/loadFFmpeg.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e9ea598b1a8c1f8c9a2f37adca1052bd86293ef0
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/loadFFmpeg.properties
@@ -0,0 +1,20 @@
+#ffmpeg\u6267\u884C\u8DEF\u5F84\uFF0C\u4E00\u822C\u4E3Affmpeg\u7684\u5B89\u88C5\u76EE\u5F55\uFF0C\u8BE5\u8DEF\u5F84\u53EA\u80FD\u662F\u76EE\u5F55\uFF0C\u4E0D\u80FD\u4E3A\u5177\u4F53\u6587\u4EF6\u8DEF\u5F84\uFF0C\u5426\u5219\u4F1A\u62A5\u9519
+#windows \u4E0B\u914D\u7F6E
+#path=D:/ffmpeg/bin/
+#\u6D4B\u8BD5\u73AF\u5883
+path=/home/hy/ffmpeg-git-20201128-amd64-static
+#path=F:/ffmpeg/ffmpeg-N-100449-g28aedc7f54-win64-gpl-shared/bin/
+#\u751F\u4EA7\u73AF\u5883linux \u4E0B\u914D\u7F6E
+#path=/usr/local/ffmpeg/bin/
+#\u5B58\u653E\u4EFB\u52A1\u7684\u9ED8\u8BA4Map\u7684\u521D\u59CB\u5316\u5927\u5C0F
+size=10
+#\u4E8B\u4EF6\u56DE\u8C03\u901A\u77E5\u63A5\u53E3\u5730\u5740
+callback=
+#\u7F51\u7EDC\u8D85\u65F6\u8BBE\u7F6E\uFF08\u6BEB\u79D2\uFF09
+timeout=300
+
+#\u5F00\u542F\u4FDD\u6D3B\u7EBF\u7A0B
+keepalive=true
+
+#\u662F\u5426\u8F93\u51FAdebug\u6D88\u606F
+debug=true
diff --git a/wisenergy-web-admin/src/main/resources/logback-spring.xml b/wisenergy-web-admin/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4e3d346f8c8c565dd07d4e977635ddc16b769f8e
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/logback-spring.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false" >
+    <!-- 定义日志路径、级别 -->
+    <springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
+    <property name="LOG_DIR" value="/logs/${spring.application.name}" />
+    <property name="LOG_LEVEL" value="info" />
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+    <!-- 打印日志到控制台 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <Target>System.out</Target>
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>DEBUG</level>
+        </filter>
+    </appender>
+
+    <!-- 打印error日志 -->
+    <appender name="E" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Append>true</Append>
+        <encoder>
+            <pattern>%date [%level] %logger{80} [%file : %line] - %msg%n</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_DIR}/${project.artifactId}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+        </rollingPolicy>
+    </appender>
+
+    <!-- 打印info日志 -->
+    <appender name="I" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Append>true</Append>
+        <encoder>
+            <pattern>%date [%level] %logger{80} [%file : %line] - %msg%n</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_DIR}/${project.artifactId}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+        </rollingPolicy>
+    </appender>
+
+    <!-- 打印Druid监控日志 -->
+    <appender name="druidLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Append>true</Append>
+        <encoder>
+            <pattern>%date [%level] %logger{80} [%file : %line] - %msg%n</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>Debug</level>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_DIR}/${project.artifactId}/druid.%d{yyyy-MM-dd}.log</fileNamePattern>
+        </rollingPolicy>
+    </appender>
+
+    <!-- druid转存监控日志 -->
+    <logger name="druid.statLog" additivity="false">
+        <appender-ref ref="druidLog"/>
+    </logger>
+
+    <!-- 项目日志 -->
+    <logger name="cn.wisenergy"/>
+
+    <!-- 日志根 -->
+    <root level="${LOG_LEVEL}">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="E"/>
+        <appender-ref ref="I"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/wisenergy-web-admin/src/main/resources/static/readme.md b/wisenergy-web-admin/src/main/resources/static/readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..28ef6a03d1ca41d5305ba36af0211a8993e8489e
--- /dev/null
+++ b/wisenergy-web-admin/src/main/resources/static/readme.md
@@ -0,0 +1 @@
+# 开发时请删除此文件
\ No newline at end of file
diff --git a/wisenergy-web-admin/wisenergy-web-admin.iml b/wisenergy-web-admin/wisenergy-web-admin.iml
new file mode 100644
index 0000000000000000000000000000000000000000..edb2e99f0489da0f59e6357ad854b91a1666a6b3
--- /dev/null
+++ b/wisenergy-web-admin/wisenergy-web-admin.iml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="wisenergy-service" />
+    <orderEntry type="module" module-name="wisenergy-mapper" />
+    <orderEntry type="module" module-name="wisenergy-model" />
+    <orderEntry type="module" module-name="wisenergy-common" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.19" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.16.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: org.springframework:spring-web:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.12" level="project" />
+    <orderEntry type="library" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-test:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.10" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.8" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.16" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.36.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
+    <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.2" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.6.7" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.23" level="project" />
+    <orderEntry type="library" name="Maven: com.hikvision.ga:artemis-http-client:1.1.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.jetbrains:annotations:20.1.0" level="project" />
+    <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-core:4.5.3" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.5" level="project" />
+    <orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-api:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-util:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
+    <orderEntry type="library" name="Maven: com.alipay.sdk:alipay-sdk-java:4.11.33.ALL" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.62" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.6.0" level="project" />
+    <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.httpcomponents:httpmime:4.5.8" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" 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.8" level="project" />
+    <orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13" level="project" />
+    <orderEntry type="library" name="Maven: com.itextpdf:itext-asian:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-pool:commons-pool:1.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.8" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" />
+    <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" />
+    <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
+    <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.6.3" level="project" />
+  </component>
+</module>
\ No newline at end of file