Bladeren bron

第一次提交

wangys 6 jaren geleden
commit
8ba92d895a
100 gewijzigde bestanden met toevoegingen van 6390 en 0 verwijderingen
  1. 44 0
      manage-api/pom.xml
  2. 47 0
      manage-api/src/main/java/cn/efunbox/manage/base/entity/Company.java
  3. 45 0
      manage-api/src/main/java/cn/efunbox/manage/base/entity/CostType.java
  4. 51 0
      manage-api/src/main/java/cn/efunbox/manage/base/entity/Department.java
  5. 82 0
      manage-api/src/main/java/cn/efunbox/manage/base/entity/Manage.java
  6. 51 0
      manage-api/src/main/java/cn/efunbox/manage/base/entity/Product.java
  7. 52 0
      manage-api/src/main/java/cn/efunbox/manage/base/entity/Project.java
  8. 47 0
      manage-api/src/main/java/cn/efunbox/manage/base/entity/User.java
  9. 19 0
      manage-api/src/main/java/cn/efunbox/manage/base/enums/BaseStatusEnum.java
  10. 13 0
      manage-api/src/main/java/cn/efunbox/manage/base/enums/CmsUserSuperEnum.java
  11. 18 0
      manage-api/src/main/java/cn/efunbox/manage/base/enums/CompanyTypeEnum.java
  12. 18 0
      manage-api/src/main/java/cn/efunbox/manage/base/enums/IncomeStatusEnum.java
  13. 18 0
      manage-api/src/main/java/cn/efunbox/manage/base/enums/ManageTypeEnum.java
  14. 13 0
      manage-api/src/main/java/cn/efunbox/manage/base/enums/UserSuperEnum.java
  15. 5 0
      manage-api/src/main/java/cn/efunbox/manage/base/package-info.java
  16. 12 0
      manage-api/src/main/java/cn/efunbox/manage/base/repository/CompanyRepository.java
  17. 12 0
      manage-api/src/main/java/cn/efunbox/manage/base/repository/CostTypeRepository.java
  18. 16 0
      manage-api/src/main/java/cn/efunbox/manage/base/repository/DepartmentRepository.java
  19. 12 0
      manage-api/src/main/java/cn/efunbox/manage/base/repository/ManageRepository.java
  20. 14 0
      manage-api/src/main/java/cn/efunbox/manage/base/repository/ProductRepository.java
  21. 14 0
      manage-api/src/main/java/cn/efunbox/manage/base/repository/ProjectRepository.java
  22. 22 0
      manage-api/src/main/java/cn/efunbox/manage/base/repository/UserRepository.java
  23. 13 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/CompanyService.java
  24. 13 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/CostTypeService.java
  25. 17 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/DepartmentService.java
  26. 13 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/ManageService.java
  27. 13 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/ProductService.java
  28. 13 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/ProjectService.java
  29. 17 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/UserService.java
  30. 53 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/impl/CompanyServiceImpl.java
  31. 52 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/impl/CostTypeServiceImpl.java
  32. 89 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/impl/DepartmentServiceImpl.java
  33. 94 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/impl/ManageServiceImpl.java
  34. 51 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/impl/ProductServiceImpl.java
  35. 51 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/impl/ProjectServiceImpl.java
  36. 84 0
      manage-api/src/main/java/cn/efunbox/manage/base/service/impl/UserServiceImpl.java
  37. 56 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/BASE64EncoderUtil.java
  38. 65 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/ClientCustomSSL.java
  39. 191 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/CommonUtil.java
  40. 36 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/ConfigUtil.java
  41. 40 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/Constants.java
  42. 44 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/MD5Util.java
  43. 24 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/MyX509TrustManager.java
  44. 43 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/QRCodeUtil.java
  45. 120 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/TimeUtil.java
  46. 63 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/WeekUtil.java
  47. 86 0
      manage-api/src/main/java/cn/efunbox/manage/base/util/XMLUtil.java
  48. 22 0
      manage-api/src/main/java/cn/efunbox/manage/base/vo/DeptTreeVO.java
  49. 11 0
      manage-api/src/main/java/cn/efunbox/manage/base/vo/LoginVo.java
  50. 25 0
      manage-api/src/main/java/cn/efunbox/manage/base/vo/UserVo.java
  51. 104 0
      manage-common/pom.xml
  52. 132 0
      manage-common/src/main/java/cn/efunbox/manage/common/configuration/FrontConfiguration.java
  53. 26 0
      manage-common/src/main/java/cn/efunbox/manage/common/data/BasicRepository.java
  54. 153 0
      manage-common/src/main/java/cn/efunbox/manage/common/data/ProjectJpaRepository.java
  55. 575 0
      manage-common/src/main/java/cn/efunbox/manage/common/data/ProjectSimpleJpaRepository.java
  56. 257 0
      manage-common/src/main/java/cn/efunbox/manage/common/entity/page/OnePage.java
  57. 83 0
      manage-common/src/main/java/cn/efunbox/manage/common/entity/page/Pageable.java
  58. 19 0
      manage-common/src/main/java/cn/efunbox/manage/common/enums/BaseOrderEnum.java
  59. 35 0
      manage-common/src/main/java/cn/efunbox/manage/common/helper/SortHelper.java
  60. 61 0
      manage-common/src/main/java/cn/efunbox/manage/common/intercepter/AdminInterceptor.java
  61. 109 0
      manage-common/src/main/java/cn/efunbox/manage/common/intercepter/AllowOriginInterceptor.java
  62. 27 0
      manage-common/src/main/java/cn/efunbox/manage/common/result/AbstractApiCode.java
  63. 97 0
      manage-common/src/main/java/cn/efunbox/manage/common/result/ApiCode.java
  64. 115 0
      manage-common/src/main/java/cn/efunbox/manage/common/result/ApiResult.java
  65. 198 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/BeanUtil.java
  66. 11 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/Constants.java
  67. 389 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/HttpClientUtil.java
  68. 187 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/HttpUtils.java
  69. 104 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/IaasRequestUtils.java
  70. 68 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/IpUtils.java
  71. 71 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/MD5.java
  72. 23 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/MyX509TrustManager.java
  73. 13 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/PutFilter.java
  74. 161 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/RSAEncrypt.java
  75. 175 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/SmsDemo.java
  76. 60 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/SmsUtil.java
  77. 198 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/SnowflakeIdUtil.java
  78. 25 0
      manage-common/src/main/java/cn/efunbox/manage/common/utils/WxApiUtil.java
  79. 87 0
      manage-web/pom.xml
  80. 29 0
      manage-web/src/main/java/cn/efunbox/manage/base/BaseApplication.java
  81. 75 0
      manage-web/src/main/java/cn/efunbox/manage/base/configuration/AsyncConfig.java
  82. 184 0
      manage-web/src/main/java/cn/efunbox/manage/base/configuration/PersistConfiguration.java
  83. 24 0
      manage-web/src/main/java/cn/efunbox/manage/base/configuration/RestTemplateConfig.java
  84. 30 0
      manage-web/src/main/java/cn/efunbox/manage/base/controller/DepartmentController.java
  85. 57 0
      manage-web/src/main/java/cn/efunbox/manage/base/controller/LoginController.java
  86. 40 0
      manage-web/src/main/java/cn/efunbox/manage/base/controller/ManageController.java
  87. 114 0
      manage-web/src/main/java/cn/efunbox/manage/base/utils/HttpUtil.java
  88. 96 0
      manage-web/src/main/resources/application-dev.properties
  89. 85 0
      manage-web/src/main/resources/application-prd.properties
  90. 9 0
      manage-web/src/main/resources/application.properties
  91. BIN
      manage-web/src/main/resources/cert/apiclient_cert.p12
  92. 29 0
      manage-web/src/main/resources/logback-spring.xml
  93. 31 0
      manage-web/src/main/resources/templates/error.html
  94. BIN
      manage-web/src/main/resources/templates/image/bg.jpg
  95. BIN
      manage-web/src/main/resources/templates/image/bind_error.png
  96. BIN
      manage-web/src/main/resources/templates/image/bind_success.png
  97. BIN
      manage-web/src/main/resources/templates/image/cha.png
  98. BIN
      manage-web/src/main/resources/templates/image/code.png
  99. BIN
      manage-web/src/main/resources/templates/image/error.jpg
  100. 0 0
      manage-web/src/main/resources/templates/image/logo.png

+ 44 - 0
manage-api/pom.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>manage-root</artifactId>
+        <groupId>cn.efunbox.manage</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <version>1.0.0-SNAPSHOT</version>
+    <artifactId>manage-api</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.efunbox.manage</groupId>
+            <artifactId>manage-common</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!--上传源码 -->
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <attach>true</attach>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 47 - 0
manage-api/src/main/java/cn/efunbox/manage/base/entity/Company.java

@@ -0,0 +1,47 @@
+package cn.efunbox.manage.base.entity;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Company
+ * Created by wangys on 2019/03/07
+ */
+@Data
+@ToString
+@DynamicUpdate
+@DynamicInsert
+@Entity
+@Table(name = "company")
+public class Company implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "code")
+    private String code;
+
+    @Column(name = "sort")
+    private Integer sort;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_created")
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified")
+    private Date gmtModified;
+
+}

+ 45 - 0
manage-api/src/main/java/cn/efunbox/manage/base/entity/CostType.java

@@ -0,0 +1,45 @@
+package cn.efunbox.manage.base.entity;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * CostType
+ * Created by wangys on 2019/03/07
+ */
+@Data
+@ToString
+@DynamicInsert
+@DynamicUpdate
+@Entity
+@Table(name = "cost_type")
+public class CostType implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "code")
+    private String code;
+
+    @Column(name = "name")
+    private String name;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "sort")
+    private Integer sort;
+
+    @Column(name = "gmt_created")
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified")
+    private Date gmtModified;
+}

+ 51 - 0
manage-api/src/main/java/cn/efunbox/manage/base/entity/Department.java

@@ -0,0 +1,51 @@
+package cn.efunbox.manage.base.entity;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Department
+ * Created by wangys on 2019/09/07
+ */
+@DynamicInsert
+@DynamicUpdate
+@ToString
+@Data
+@Entity
+@Table(name = "department")
+public class Department implements Serializable {
+
+    @Id
+    private Long id;
+
+    @Column(name = "code")
+    private String code;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "full_name")
+    private String fullName;
+
+    @Column(name = "path")
+    private Long path;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "sort")
+    private Integer sort;
+
+    @Column(name = "gmt_created")
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified")
+    private Date gmtModified;
+}

+ 82 - 0
manage-api/src/main/java/cn/efunbox/manage/base/entity/Manage.java

@@ -0,0 +1,82 @@
+package cn.efunbox.manage.base.entity;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.enums.CompanyTypeEnum;
+import cn.efunbox.manage.base.enums.IncomeStatusEnum;
+import cn.efunbox.manage.base.enums.ManageTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Manage
+ * Created by wangys on 2019/03/07
+ */
+@Data
+@ToString
+@Entity
+@DynamicInsert
+@DynamicUpdate
+@Table(name = "manage")
+public class Manage implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "dept_id")
+    private Long deptId;
+
+    @Column(name = "product_id")
+    private String productId;
+
+    @Column(name = "project_id")
+    private String projectId;
+
+    @Column(name = "company_id")
+    private String companyId;
+
+    @Enumerated(EnumType.ORDINAL)
+    private ManageTypeEnum type;
+
+    @Column(name = "amount")
+    private Double amount;
+
+    @Enumerated(EnumType.ORDINAL)
+    private IncomeStatusEnum incomeStatus;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "cost_type")
+    private String costType;
+
+    @Enumerated(EnumType.ORDINAL)
+    private CompanyTypeEnum company_type;
+
+    @Column(name = "remark")
+    private String remark;
+
+    @Column(name = "happen_time")
+    private Date happenTime;
+
+    @Column(name = "sort")
+    private Integer sort;
+
+    @Column(name = "gmt_created")
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified")
+    private Date gmtModified;
+
+    @Transient
+    private List<Long> deptIds;
+
+    @Transient
+    private List<String> costTypes;
+}

+ 51 - 0
manage-api/src/main/java/cn/efunbox/manage/base/entity/Product.java

@@ -0,0 +1,51 @@
+package cn.efunbox.manage.base.entity;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Product
+ * Created by wangys on 2019/03/07
+ */
+@Data
+@ToString
+@DynamicInsert
+@DynamicUpdate
+@Entity
+@Table(name = "product")
+public class Product implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "dept_id")
+    private Long deptId;
+
+    @Column(name = "project_id")
+    private String projectId;
+
+    @Column(name = "code")
+    private String code;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "sort")
+    private Integer sort;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_created")
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified")
+    private Date gmtModified;
+}

+ 52 - 0
manage-api/src/main/java/cn/efunbox/manage/base/entity/Project.java

@@ -0,0 +1,52 @@
+package cn.efunbox.manage.base.entity;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Project
+ * Created by wangys on 2019/03/07
+ */
+@Data
+@ToString
+@DynamicUpdate
+@DynamicInsert
+@Entity
+@Table(name = "project")
+public class Project implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "code")
+    private String code;
+
+    @Column(name = "dept_id")
+    private Long deptId;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "full_name")
+    private String fullName;
+
+    @Column(name = "sort")
+    private Integer sort;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_created")
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified")
+    private Date gmtModified;
+
+}

+ 47 - 0
manage-api/src/main/java/cn/efunbox/manage/base/entity/User.java

@@ -0,0 +1,47 @@
+package cn.efunbox.manage.base.entity;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.enums.CmsUserSuperEnum;
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+@ToString
+@Entity
+@DynamicInsert
+@DynamicUpdate
+@Data
+@Table(name = "user")
+public class User implements Serializable{
+
+    @Id
+    private String id;
+
+    @Column(name = "user_name")
+    private String userName;
+
+    @Column(name = "nick_name")
+    private String nickName;
+
+    @JSONField(serialize=false)
+    private String password;
+
+    @Column(name = "is_super")
+    private CmsUserSuperEnum isSuper;
+
+    @Column(name = "gmt_created")
+    private String gmtCreated;
+
+    @Column(name = "gmt_modified")
+    private String gmtModified;
+
+    private BaseStatusEnum status;
+}

+ 19 - 0
manage-api/src/main/java/cn/efunbox/manage/base/enums/BaseStatusEnum.java

@@ -0,0 +1,19 @@
+package cn.efunbox.manage.base.enums;
+
+public enum BaseStatusEnum {
+
+    NORMAL("正常"),DEL("已删除"), DISABLE("禁用");
+    String name;
+    BaseStatusEnum(String name) {
+        this.name = name;  
+    }
+
+    public String getName() {  
+        return name;  
+    }
+    @Override
+    public String toString() {
+        return this.name;
+    }
+
+}  

+ 13 - 0
manage-api/src/main/java/cn/efunbox/manage/base/enums/CmsUserSuperEnum.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.base.enums;
+
+
+public enum CmsUserSuperEnum {
+
+    SUPER("超级管理员"),NO_SUPER("管理员");
+
+    private String name;
+
+    CmsUserSuperEnum(String name){
+        this.name=name;
+    }
+}

+ 18 - 0
manage-api/src/main/java/cn/efunbox/manage/base/enums/CompanyTypeEnum.java

@@ -0,0 +1,18 @@
+package cn.efunbox.manage.base.enums;
+
+public enum CompanyTypeEnum {
+
+    COMPANY("外部"),DEPARTMENT("部门"), PROJECT("项目");
+    String name;
+    CompanyTypeEnum(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+    @Override
+    public String toString() {
+        return this.name;
+    }
+}

+ 18 - 0
manage-api/src/main/java/cn/efunbox/manage/base/enums/IncomeStatusEnum.java

@@ -0,0 +1,18 @@
+package cn.efunbox.manage.base.enums;
+
+public enum IncomeStatusEnum {
+
+    INVOICE("开票/应收"),ARRIVAL("到账"), INTERNAL("内部核算");
+    String name;
+    IncomeStatusEnum(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+    @Override
+    public String toString() {
+        return this.name;
+    }
+}

+ 18 - 0
manage-api/src/main/java/cn/efunbox/manage/base/enums/ManageTypeEnum.java

@@ -0,0 +1,18 @@
+package cn.efunbox.manage.base.enums;
+
+public enum ManageTypeEnum {
+
+    INCOME("收入"),COST("成本/费用");
+    String name;
+    ManageTypeEnum(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+    @Override
+    public String toString() {
+        return this.name;
+    }
+}

+ 13 - 0
manage-api/src/main/java/cn/efunbox/manage/base/enums/UserSuperEnum.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.base.enums;
+
+
+public enum UserSuperEnum {
+
+    SUPER("超级管理员"),NO_SUPER("管理员");
+
+    private String name;
+
+    UserSuperEnum(String name){
+        this.name=name;
+    }
+}

+ 5 - 0
manage-api/src/main/java/cn/efunbox/manage/base/package-info.java

@@ -0,0 +1,5 @@
+/**
+ * package-info
+ * Created by xusq on 2018/6/4.
+ */
+package cn.efunbox.manage.base;

+ 12 - 0
manage-api/src/main/java/cn/efunbox/manage/base/repository/CompanyRepository.java

@@ -0,0 +1,12 @@
+package cn.efunbox.manage.base.repository;
+
+import cn.efunbox.manage.base.entity.Company;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.common.data.BasicRepository;
+
+import java.util.List;
+
+public interface CompanyRepository extends BasicRepository<Company> {
+
+    List<Company> findByStatusOrderBySortDesc(BaseStatusEnum status);
+}

+ 12 - 0
manage-api/src/main/java/cn/efunbox/manage/base/repository/CostTypeRepository.java

@@ -0,0 +1,12 @@
+package cn.efunbox.manage.base.repository;
+
+import cn.efunbox.manage.base.entity.CostType;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.common.data.BasicRepository;
+
+import java.util.List;
+
+public interface CostTypeRepository extends BasicRepository<CostType> {
+
+    List<CostType> findByStatusOrderBySortDesc(BaseStatusEnum status);
+}

+ 16 - 0
manage-api/src/main/java/cn/efunbox/manage/base/repository/DepartmentRepository.java

@@ -0,0 +1,16 @@
+package cn.efunbox.manage.base.repository;
+
+import cn.efunbox.manage.base.entity.Department;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.common.data.BasicRepository;
+
+import java.util.List;
+
+
+public interface DepartmentRepository extends BasicRepository<Department> {
+
+    List<Department> findByPath(Long path);
+
+    List<Department> findByStatusOrderBySortDesc(BaseStatusEnum status);
+
+}

+ 12 - 0
manage-api/src/main/java/cn/efunbox/manage/base/repository/ManageRepository.java

@@ -0,0 +1,12 @@
+package cn.efunbox.manage.base.repository;
+
+import cn.efunbox.manage.base.entity.Manage;
+import cn.efunbox.manage.common.data.BasicRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+
+public interface ManageRepository extends JpaSpecificationExecutor, BasicRepository<Manage> {
+
+    List<Manage> findAllByDeptIdIn(List<Long> ids);
+}

+ 14 - 0
manage-api/src/main/java/cn/efunbox/manage/base/repository/ProductRepository.java

@@ -0,0 +1,14 @@
+package cn.efunbox.manage.base.repository;
+
+import cn.efunbox.manage.base.entity.Product;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.common.data.BasicRepository;
+
+import java.util.List;
+
+
+public interface ProductRepository extends BasicRepository<Product> {
+
+    List<Product> findByStatusOrderBySortDesc(BaseStatusEnum status);
+
+}

+ 14 - 0
manage-api/src/main/java/cn/efunbox/manage/base/repository/ProjectRepository.java

@@ -0,0 +1,14 @@
+package cn.efunbox.manage.base.repository;
+
+import cn.efunbox.manage.base.entity.Project;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.common.data.BasicRepository;
+
+import java.util.List;
+
+
+public interface ProjectRepository extends BasicRepository<Project> {
+
+
+    List<Project> findByStatusOrderBySortDesc(BaseStatusEnum status);
+}

+ 22 - 0
manage-api/src/main/java/cn/efunbox/manage/base/repository/UserRepository.java

@@ -0,0 +1,22 @@
+package cn.efunbox.manage.base.repository;
+
+import cn.efunbox.manage.base.entity.User;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.common.data.BasicRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface UserRepository extends BasicRepository<User> {
+
+
+    User findByUserNameAndStatus(String userName, BaseStatusEnum status);
+
+    User findByIdAndStatus(String id, BaseStatusEnum normal);
+
+    @Modifying
+    @Query("update User set status=:status where id  in(:ids)")
+    int updateStatusByIds(@Param("ids") List<String> ids, @Param("status") BaseStatusEnum status);
+}

+ 13 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/CompanyService.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.base.service;
+
+import cn.efunbox.manage.base.entity.Company;
+import cn.efunbox.manage.common.result.ApiResult;
+
+public interface CompanyService {
+
+    ApiResult list(Company company);
+
+    ApiResult save(Company company);
+
+    ApiResult update(Company company);
+}

+ 13 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/CostTypeService.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.base.service;
+
+import cn.efunbox.manage.base.entity.CostType;
+import cn.efunbox.manage.common.result.ApiResult;
+
+public interface CostTypeService {
+
+    ApiResult list(CostType costType);
+
+    ApiResult save(CostType costType);
+
+    ApiResult update(CostType costType);
+}

+ 17 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/DepartmentService.java

@@ -0,0 +1,17 @@
+package cn.efunbox.manage.base.service;
+
+import cn.efunbox.manage.base.entity.Department;
+import cn.efunbox.manage.common.result.ApiResult;
+
+public interface DepartmentService {
+
+    ApiResult getDeptTree(Long deptId);
+
+    ApiResult save(Department department);
+
+    ApiResult list(Department department);
+
+    ApiResult update(Department department);
+
+    ApiResult getDeptChild(Long deptId);
+}

+ 13 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/ManageService.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.base.service;
+
+import cn.efunbox.manage.base.entity.Manage;
+import cn.efunbox.manage.common.result.ApiResult;
+
+public interface ManageService {
+
+    ApiResult list(Manage manage);
+
+    ApiResult save(Manage manage);
+
+    ApiResult update(Manage manage);
+}

+ 13 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/ProductService.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.base.service;
+
+import cn.efunbox.manage.base.entity.Product;
+import cn.efunbox.manage.common.result.ApiResult;
+
+public interface ProductService {
+
+    ApiResult list(Product product);
+
+    ApiResult save(Product product);
+
+    ApiResult update(Product product);
+}

+ 13 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/ProjectService.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.base.service;
+
+import cn.efunbox.manage.base.entity.Project;
+import cn.efunbox.manage.common.result.ApiResult;
+
+public interface ProjectService {
+
+    ApiResult list(Project project);
+
+    ApiResult save(Project project);
+
+    ApiResult update(Project project);
+}

+ 17 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/UserService.java

@@ -0,0 +1,17 @@
+package cn.efunbox.manage.base.service;
+
+import cn.efunbox.manage.base.entity.User;
+import cn.efunbox.manage.base.vo.UserVo;
+import cn.efunbox.manage.common.result.ApiResult;
+
+import java.util.List;
+
+public interface UserService {
+    ApiResult<UserVo> login(String userName, String password);
+
+    ApiResult<User> saveUser(User cmsUser);
+
+    ApiResult<User> updateUser(User cmsUser);
+
+    ApiResult<User> deleteUserByIds(List<String> ids);
+}

+ 53 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/impl/CompanyServiceImpl.java

@@ -0,0 +1,53 @@
+package cn.efunbox.manage.base.service.impl;
+
+import cn.efunbox.manage.base.entity.Company;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.repository.CompanyRepository;
+import cn.efunbox.manage.base.service.CompanyService;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import com.sun.xml.internal.rngom.parse.host.Base;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * CompanyServiceImpl
+ * Created by wangys on 2019/03/08
+ */
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+    @Autowired
+    CompanyRepository companyRepository;
+
+
+    @Override
+    public ApiResult list(Company company) {
+        List<Company> companies = companyRepository.findByStatusOrderBySortDesc(BaseStatusEnum.NORMAL);
+        if(Objects.nonNull(companies)){
+            return ApiResult.ok(companies);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult save(Company company) {
+        company = companyRepository.save(company);
+        if(Objects.nonNull(company)){
+            return ApiResult.ok(company);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult update(Company company) {
+        company = companyRepository.update(company);
+        if(Objects.nonNull(company)){
+            return ApiResult.ok(company);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+}

+ 52 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/impl/CostTypeServiceImpl.java

@@ -0,0 +1,52 @@
+package cn.efunbox.manage.base.service.impl;
+
+import cn.efunbox.manage.base.entity.CostType;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.repository.CostTypeRepository;
+import cn.efunbox.manage.base.service.CostTypeService;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import com.sun.xml.internal.rngom.parse.host.Base;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * CostTypeServiceImpl
+ * Created by wangys on 2019/03/08
+ */
+@Service
+public class CostTypeServiceImpl implements CostTypeService {
+
+    @Autowired
+    CostTypeRepository costTypeRepository;
+
+    @Override
+    public ApiResult list(CostType costType) {
+        List<CostType> costTypes = costTypeRepository.findByStatusOrderBySortDesc(BaseStatusEnum.NORMAL);
+        if(Objects.nonNull(costTypes)){
+            return ApiResult.ok(costTypes);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult save(CostType costType) {
+        costType = costTypeRepository.save(costType);
+        if(Objects.nonNull(costType)){
+            return ApiResult.ok(costType);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult update(CostType costType) {
+        costType = costTypeRepository.update(costType);
+        if(Objects.nonNull(costType)){
+            return ApiResult.ok(costType);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+}

+ 89 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/impl/DepartmentServiceImpl.java

@@ -0,0 +1,89 @@
+package cn.efunbox.manage.base.service.impl;
+
+import cn.efunbox.manage.base.entity.Department;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.repository.DepartmentRepository;
+import cn.efunbox.manage.base.service.DepartmentService;
+import cn.efunbox.manage.base.vo.DeptTreeVO;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * DepartmentServiceImpl
+ * Created by wangys on 2019/03/07
+ */
+@Service
+public class DepartmentServiceImpl implements DepartmentService {
+
+    @Autowired
+    DepartmentRepository departmentRepository;
+
+    @Override
+    public ApiResult getDeptTree(Long deptId) {
+        return ApiResult.ok(recursiveTree(deptId));
+    }
+
+    @Override
+    public ApiResult list(Department department) {
+        List<Department> departments = departmentRepository.findByStatusOrderBySortDesc(BaseStatusEnum.NORMAL);
+        if(Objects.nonNull(departments)){
+            return ApiResult.ok(departments);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult save(Department department) {
+        department = departmentRepository.save(department);
+        if(Objects.nonNull(department)){
+            return ApiResult.ok(department);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult update(Department department) {
+        department = departmentRepository.update(department);
+        if(Objects.nonNull(department)){
+            return ApiResult.ok(department);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+
+    @Override
+    public ApiResult getDeptChild(Long deptId) {
+        List<Department> departments = new ArrayList<>();
+        departments = deptChild(deptId,departments);
+        departments.add(departmentRepository.find(deptId));
+        return ApiResult.ok(departments);
+    }
+
+    private DeptTreeVO recursiveTree(Long cid) {
+        Department department = departmentRepository.find(cid);
+        DeptTreeVO node = new DeptTreeVO();
+        node.setLabel(department.getName());
+        node.setCid(department.getId());
+        List<Department> childTreeNodes = departmentRepository.findByPath(cid);
+        for(Department child : childTreeNodes){
+            DeptTreeVO n = recursiveTree(child.getId()); //递归
+            node.getChildren().add(n);
+        }
+        return node;
+    }
+
+    private List<Department> deptChild(Long cid, List<Department> departments) {
+        List<Department> childTreeNodes = departmentRepository.findByPath(cid);
+        departments.addAll(childTreeNodes);
+        for(Department child : childTreeNodes){
+            deptChild(child.getId(), departments); //递归
+        }
+        return departments;
+    }
+}

+ 94 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/impl/ManageServiceImpl.java

@@ -0,0 +1,94 @@
+package cn.efunbox.manage.base.service.impl;
+
+import cn.efunbox.manage.base.entity.Manage;
+import cn.efunbox.manage.base.repository.ManageRepository;
+import cn.efunbox.manage.base.service.ManageService;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * ManageSreviceImpl
+ * Created by wangys on 2019/03/08
+ */
+@Service
+public class ManageServiceImpl implements ManageService {
+
+    @Autowired
+    ManageRepository manageRepository;
+
+    @Override
+    public ApiResult list(Manage manage) {
+        Specification querySpecifi = new Specification<Manage>() {
+            @Override
+            public Predicate toPredicate(Root<Manage> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+
+                List<Predicate> predicates = new ArrayList<>();
+                if(!StringUtils.equals("0", manage.getCompanyId()) && StringUtils.isNotBlank(manage.getCompanyId())){
+                    predicates.add(criteriaBuilder.equal(root.get("companyId"), manage.getCompanyId()));
+                }
+                if(!StringUtils.equals("0", manage.getProductId()) && StringUtils.isNotBlank(manage.getProductId())){
+                    predicates.add(criteriaBuilder.equal(root.get("productId"), manage.getProductId()));
+                }
+                if(!StringUtils.equals("0", manage.getProductId()) && StringUtils.isNotBlank(manage.getProductId())){
+                    predicates.add(criteriaBuilder.equal(root.get("projectId"), manage.getProductId()));
+                }
+                if(Objects.nonNull(manage.getType())){
+                    predicates.add(criteriaBuilder.equal(root.get("type"), manage.getType()));
+                }
+                if(!StringUtils.equals("0", manage.getCostType()) && StringUtils.isNotBlank(manage.getCostType())){
+                    predicates.add(criteriaBuilder.equal(root.get("costType"), manage.getCostType()));
+                }
+                if(Objects.nonNull(manage.getIncomeStatus())){
+                    predicates.add(criteriaBuilder.equal(root.get("incomeStatus"), manage.getIncomeStatus()));
+                }
+                if(manage.getDeptIds() != null && manage.getDeptIds().size() > 0){
+                    List<Predicate> list = new ArrayList<>();
+                    if (manage.getDeptIds() != null && manage.getDeptIds().size() > 0) {
+                        CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get("deptId"));
+                        for (Long id : manage.getDeptIds()) {
+                            in.value(id);
+                        }
+                        list.add(in);
+                    }
+                    predicates.addAll(list);
+                }
+                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
+            }
+        };
+        List<Manage> manages = manageRepository.findAll(querySpecifi);
+        if(Objects.nonNull(manages)){
+            return ApiResult.ok(manages);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult save(Manage manage) {
+        manage = manageRepository.save(manage);
+        if(Objects.nonNull(manage)){
+            return ApiResult.ok(manage);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult update(Manage manage) {
+        manage = manageRepository.update(manage);
+        if(Objects.nonNull(manage)){
+            return ApiResult.ok(manage);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+}

+ 51 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/impl/ProductServiceImpl.java

@@ -0,0 +1,51 @@
+package cn.efunbox.manage.base.service.impl;
+
+import cn.efunbox.manage.base.entity.Product;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.repository.ProductRepository;
+import cn.efunbox.manage.base.service.ProductService;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * ProductServiceImpl
+ * Created by wangys on 2019/03/07
+ */
+@Service
+public class ProductServiceImpl implements ProductService {
+
+    @Autowired
+    ProductRepository productRepository;
+
+    @Override
+    public ApiResult list(Product product) {
+        List<Product> products = productRepository.findByStatusOrderBySortDesc(BaseStatusEnum.NORMAL);
+        if(Objects.nonNull(products)){
+            return ApiResult.ok(products);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult save(Product product) {
+        product = productRepository.save(product);
+        if(Objects.nonNull(product)){
+            return ApiResult.ok(product);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult update(Product product) {
+        product = productRepository.update(product);
+        if(Objects.nonNull(product)){
+            return ApiResult.ok(product);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+}

+ 51 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/impl/ProjectServiceImpl.java

@@ -0,0 +1,51 @@
+package cn.efunbox.manage.base.service.impl;
+
+import cn.efunbox.manage.base.entity.Project;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.repository.ProjectRepository;
+import cn.efunbox.manage.base.service.ProjectService;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * ProjectServiceImpl
+ * Created by wangys on 2019/03/08
+ */
+@Service
+public class ProjectServiceImpl implements ProjectService {
+
+    @Autowired
+    ProjectRepository projectRepository;
+
+    @Override
+    public ApiResult list(Project project) {
+        List<Project> projects = projectRepository.findByStatusOrderBySortDesc(BaseStatusEnum.NORMAL);
+        if(Objects.nonNull(projects)){
+            return ApiResult.ok(projects);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult save(Project project) {
+        project = projectRepository.save(project);
+        if(Objects.nonNull(project)){
+            return ApiResult.ok(project);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+
+    @Override
+    public ApiResult update(Project project) {
+        project = projectRepository.update(project);
+        if(Objects.nonNull(project)){
+            return ApiResult.ok(project);
+        }
+        return ApiResult.error(ApiCode.UNKNOWN_ERROR);
+    }
+}

+ 84 - 0
manage-api/src/main/java/cn/efunbox/manage/base/service/impl/UserServiceImpl.java

@@ -0,0 +1,84 @@
+package cn.efunbox.manage.base.service.impl;
+
+import cn.efunbox.manage.base.entity.User;
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.repository.UserRepository;
+import cn.efunbox.manage.base.service.UserService;
+import cn.efunbox.manage.base.vo.UserVo;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import cn.efunbox.manage.common.utils.BeanUtil;
+import cn.efunbox.manage.common.utils.MD5;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+@Service
+public class UserServiceImpl implements UserService {
+
+    @Autowired
+    private UserRepository userRepository;
+
+
+    @Override
+    public ApiResult<UserVo> login(String userName, String password) {
+        if(StringUtils.isBlank(userName)||StringUtils.isBlank(password)){
+            return ApiResult.error(ApiCode.PARAMETER_ERROR);
+        }
+        User User = userRepository.findByUserNameAndStatus(userName, BaseStatusEnum.NORMAL);
+        String MD5Password = User.getPassword();
+        if(User==null){
+            return ApiResult.error(ApiCode.NO_UID);
+        }
+        if(StringUtils.isBlank(MD5Password)|| !MD5Password.equals(MD5.MD5Encode(password))){
+            return ApiResult.error(ApiCode.PASSWORD_ERROR);
+        }
+        UserVo UserVo = new UserVo();
+        BeanUtil.copy(User,UserVo);
+        return ApiResult.ok(UserVo);
+    }
+
+    @Override
+    public ApiResult<User> saveUser(User User) {
+
+        String userName = User.getUserName();
+        String password = User.getPassword();
+        if(User==null||StringUtils.isBlank(userName)||StringUtils.isBlank(password)){
+            return ApiResult.error(ApiCode.PARAMETER_ERROR);
+        }
+        User repeatUser = userRepository.findByUserNameAndStatus(userName, BaseStatusEnum.NORMAL);
+        if(repeatUser!=null){
+            return ApiResult.error(ApiCode.USERNAME_REPEAT);
+        }
+        User.setStatus(BaseStatusEnum.NORMAL);
+        User.setPassword(MD5.getMD5Str(password));
+        userRepository.save(User);
+        return ApiResult.ok(User);
+    }
+
+    @Override
+    public ApiResult<User> updateUser(User User) {
+
+        if(User==null||StringUtils.isBlank(User.getId())){
+            return ApiResult.error(ApiCode.PARAMETER_ERROR);
+        }
+        String password = User.getPassword();
+        if(StringUtils.isNotBlank(password)){
+            User.setPassword(MD5.getMD5Str(password));
+        }
+        userRepository.update(User);
+        return ApiResult.ok(User);
+    }
+    @Transactional
+    @Override
+    public ApiResult<User> deleteUserByIds(List<String> ids) {
+        if(ids==null||ids.size()==0){
+            return ApiResult.error(ApiCode.PARAMETER_ERROR);
+        }
+        userRepository.updateStatusByIds(ids,BaseStatusEnum.DEL);
+        return ApiResult.ok();
+    }
+}

+ 56 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/BASE64EncoderUtil.java

@@ -0,0 +1,56 @@
+package cn.efunbox.manage.base.util;
+
+public class BASE64EncoderUtil {
+  private static char[] codec_table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+      'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+      'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+      'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+      'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
+      '7', '8', '9', '+', '/' };
+
+  public static String encode(byte[] a) {
+    int totalBits = a.length * 8;
+    int nn = totalBits % 6;
+    int curPos = 0;// process bits
+    StringBuffer toReturn = new StringBuffer();
+    while (curPos < totalBits) {
+      int bytePos = curPos / 8;
+      switch (curPos % 8) {
+      case 0:
+        toReturn.append(codec_table[(a[bytePos] & 0xfc) >> 2]);
+        break;
+      case 2:
+
+        toReturn.append(codec_table[(a[bytePos] & 0x3f)]);
+        break;
+      case 4:
+        if (bytePos == a.length - 1) {
+          toReturn.append(codec_table[((a[bytePos] & 0x0f) << 2) & 0x3f]);
+        } else {
+          int pos = (((a[bytePos] & 0x0f) << 2) | ((a[bytePos + 1] & 0xc0) >> 6)) & 0x3f;
+          toReturn.append(codec_table[pos]);
+        }
+        break;
+      case 6:
+        if (bytePos == a.length - 1) {
+          toReturn.append(codec_table[((a[bytePos] & 0x03) << 4) & 0x3f]);
+        } else {
+          int pos = (((a[bytePos] & 0x03) << 4) | ((a[bytePos + 1] & 0xf0) >> 4)) & 0x3f;
+          toReturn.append(codec_table[pos]);
+        }
+        break;
+      default:
+        // never hanppen
+        break;
+      }
+      curPos += 6;
+    }
+    if (nn == 2) {
+      toReturn.append("==");
+    } else if (nn == 4) {
+      toReturn.append("=");
+    }
+    return toReturn.toString();
+  }
+
+}

+ 65 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/ClientCustomSSL.java

@@ -0,0 +1,65 @@
+package cn.efunbox.manage.base.util;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContexts;
+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.springframework.util.ResourceUtils;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.security.KeyStore;
+
+/**
+ * 退款认证
+ * 创建者 tomas
+ * 创建时间	2017年7月31日
+ *
+ */
+public class ClientCustomSSL {
+	 public static String httpsRequest(String url,String data) throws Exception {
+        /** 
+         * 注意PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的 
+         */  
+        KeyStore keyStore  = KeyStore.getInstance("PKCS12");  
+        File certfile = ResourceUtils.getFile(ConfigUtil.CERT_PATH);
+        FileInputStream instream = new FileInputStream(certfile);
+        try {  
+            keyStore.load(instream, ConfigUtil.MCH_ID.toCharArray());
+        } finally {  
+            instream.close();  
+        }  
+        SSLContext sslcontext = SSLContexts.custom()  
+                .loadKeyMaterial(keyStore, ConfigUtil.MCH_ID.toCharArray())
+                .build();  
+        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(  
+                sslcontext,  
+                new String[] { "TLSv1" },  
+                null,  
+                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);  
+        CloseableHttpClient httpclient = HttpClients.custom()  
+                .setSSLSocketFactory(sslsf)  
+                .build();
+		try {
+			HttpPost httpost = new HttpPost(url);
+			httpost.setEntity(new StringEntity(data, "UTF-8"));
+			CloseableHttpResponse response = httpclient.execute(httpost);
+			try {
+				HttpEntity entity = response.getEntity();
+				String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
+				EntityUtils.consume(entity);
+				return jsonStr;
+			} finally {
+				response.close();
+			}
+		} finally {
+			httpclient.close();
+		}
+	}  
+}

+ 191 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/CommonUtil.java

@@ -0,0 +1,191 @@
+package cn.efunbox.manage.base.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+
+public class CommonUtil {
+	/**
+	 * 除法
+	 */
+	public static BigDecimal divide(String arg1, String arg2) {
+		if (StringUtils.isEmpty(arg1)) {
+			arg1 = "0.0";
+		}
+		if (StringUtils.isEmpty(arg2)) {
+			arg2 = "0.0";
+		}
+		BigDecimal big3 = new BigDecimal("0.00");
+		if (Double.parseDouble(arg2) != 0) {
+			BigDecimal big1 = new BigDecimal(arg1);
+			BigDecimal big2 = new BigDecimal(arg2);
+			big3 = big1.divide(big2, 2, BigDecimal.ROUND_HALF_EVEN);
+		}
+		return big3;
+	}
+
+	/**
+	 * 乘法
+	 */
+	public static BigDecimal mul(String arg1, String arg2) {
+		if (StringUtils.isEmpty(arg1)) {
+			arg1 = "0.0";
+		}
+		if (StringUtils.isEmpty(arg2)) {
+			arg2 = "0.0";
+		}
+		BigDecimal big1 = new BigDecimal(arg1);
+		BigDecimal big2 = new BigDecimal(arg2);
+		BigDecimal big3 = big1.multiply(big2);
+		return big3;
+	}
+
+	/**
+	 * 减法
+	 */
+	public static BigDecimal sub(String arg1, String arg2) {
+		if (StringUtils.isEmpty(arg1)) {
+			arg1 = "0.0";
+		}
+		if (StringUtils.isEmpty(arg2)) {
+			arg2 = "0.0";
+		}
+		BigDecimal big1 = new BigDecimal(arg1);
+		BigDecimal big2 = new BigDecimal(arg2);
+		BigDecimal big3 = big1.subtract(big2);
+		return big3;
+	}
+
+	/**
+	 * 加法
+	 */
+	public static BigDecimal add(String arg1, String arg2) {
+		if (StringUtils.isEmpty(arg1)) {
+			arg1 = "0.0";
+		}
+		if (StringUtils.isEmpty(arg2)) {
+			arg2 = "0.0";
+		}
+		BigDecimal big1 = new BigDecimal(arg1);
+		BigDecimal big2 = new BigDecimal(arg2);
+		BigDecimal big3 = big1.add(big2);
+		return big3;
+	}
+
+	/**
+	 * 加法
+	 */
+	public static String add2(String arg1, String arg2) {
+		if (StringUtils.isEmpty(arg1)) {
+			arg1 = "0.0";
+		}
+		if (StringUtils.isEmpty(arg2)) {
+			arg2 = "0.0";
+		}
+		BigDecimal big1 = new BigDecimal(arg1);
+		BigDecimal big2 = new BigDecimal(arg2);
+		BigDecimal big3 = big1.add(big2);
+		return big3.toString();
+	}
+
+	/**
+	 * 四舍五入保留N位小数 先四舍五入在使用double值自动去零
+	 * 
+	 * @param arg
+	 * @param scare
+	 *            保留位数
+	 * @return
+	 */
+	public static String setScare(BigDecimal arg, int scare) {
+		BigDecimal bl = arg.setScale(scare, BigDecimal.ROUND_HALF_UP);
+		return String.valueOf(bl.doubleValue());
+	}
+
+	public static double setDifScare(double arg) {
+		BigDecimal bd = new BigDecimal(arg);
+		BigDecimal bl = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
+		return Double.parseDouble(bl.toString());
+	}
+
+	/**
+	 * 四舍五入保留两位小数 先四舍五入在使用double值自动去零
+	 * 
+	 * @param arg
+	 * @return
+	 */
+	public static String setDifScare(String arg) {
+		BigDecimal bd = new BigDecimal(arg);
+		BigDecimal bl = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
+		return bl.toString();
+	}
+
+	/**
+	 * 四舍五入保留N位小数 先四舍五入在使用double值自动去零(传参String类型)
+	 * 
+	 * @param arg
+	 * @return
+	 */
+	public static String setDifScare(String arg, int i) {
+		BigDecimal bd = new BigDecimal(arg);
+		BigDecimal bl = bd.setScale(i, BigDecimal.ROUND_HALF_UP);
+		return bl.toString();
+	}
+
+	/**
+	 * 转化成百分数 先四舍五入在使用double值自动去零
+	 * 
+	 * @param arg
+	 * @return
+	 */
+	public static String setFenScare(BigDecimal arg) {
+		BigDecimal bl = arg.setScale(3, BigDecimal.ROUND_HALF_UP);
+		String scare = String.valueOf(mul(bl.toString(), "100").doubleValue());
+		String fenScare = scare + "%";
+		return fenScare;
+	}
+
+	/**
+	 * 使用java正则表达式去掉多余的.与0
+	 * 
+	 * @param s
+	 * @return
+	 */
+	public static String subZeroAndDot(String s) {
+		if (s.indexOf(".") > 0) {
+			s = s.replaceAll("0+?$", "");// 去掉多余的0
+			s = s.replaceAll("[.]$", "");// 如最后一位是.则去掉
+		}
+		return s;
+	}
+
+	/**
+	 * 元转分,确保price保留两位有效数字
+	 * @return
+	 */
+	public static long changeY2F(double price) {
+		DecimalFormat df = new DecimalFormat("#.00");
+		price = Double.valueOf(df.format(price));
+		long money =(long) price * 100;
+		return money;
+	}
+
+	/**
+	 * 分转元,转换为bigDecimal在toString
+	 * @return
+	 */
+	public static String changeF2Y(long price) {
+		return BigDecimal.valueOf(price).divide(new BigDecimal(100)).toString();
+	}
+
+
+	/**
+	 * 如果只是用于程序中的格式化数值然后输出,那么这个方法还是挺方便的。
+	 * 应该是这样使用:System.out.println(String.format("%.2f", d));
+	 * @param d
+	 * @return
+	 */
+	public static String formatDouble(double d) {
+		return String.format("%.2f", d);
+	}
+}

+ 36 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/ConfigUtil.java

@@ -0,0 +1,36 @@
+package cn.efunbox.manage.base.util;
+
+public class ConfigUtil {
+
+
+    public final static String CERT_PATH  = "/data/app/cert/apiclient_cert.p12";//微信支付证书
+//    public final static String CERT_PATH  = "classpath:./cert/apiclient_cert.p12";//微信支付证书
+
+
+    public final static String TRANSFERS_REQUEST_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
+    public final static String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+    public final static String GROUP_SUCCESS_JOIN_PAGE = "pages/groupPage/my-group/my-group?share=true";
+    public final static String WEEKLY_REPORT_JOIN_PAGE = "pages/index/index";
+    public final static String REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund";
+
+
+    /**
+     * 服务号相关信息
+     */
+    public final static String APP_ID = "wxdfa8a4f1623d28db";//服务号的应用号
+    public final static String MCH_ID = "1510904561";//商户号
+    public final static String API_KEY = "2018LJYK730ZGCKM1238XUFENGLING77";//API密钥
+    public final static String GROUP_SUCCESS_TEMPLATE_ID = "n_R5rymvXH20PCvbnHRSr3S3TsqRkz4HFPojnN-xbGI";
+    public final static String GROUP_FAILED_TEMPLATE_ID = "WyRIh33WWt5lUH6fb7uMLYwsfPex2DnSL9DaCNStdRY";
+    public final static String GROUP_IOS_MSG_TEMPLATE_ID = "OhOwFvB0xy3alDMWdHwKUzdLziC33oDs4qEg1qGF53g";
+    public final static String WEEKLY_REPORT_TEMPLATE_ID = "zBqFwSrI082RsZCo2k10awMw7csro1uq5FB9OaH4UpI";
+
+
+//    public final static String APP_ID = "wx8961a3e5512f307c";//服务号的应用号
+//    public final static String MCH_ID = "1220285601";//商户号
+//    public final static String API_KEY = "efunbox2015OTT6YIDONGWEIXINZHIFU";//API密钥
+//    public final static String GROUP_SUCCESS_TEMPLATE_ID = "n_R5rymvXH20PCvbnHRSr3S3TsqRkz4HFPojnN-xbGI";
+//    public final static String GROUP_FAILED_TEMPLATE_ID = "WyRIh33WWt5lUH6fb7uMLYwsfPex2DnSL9DaCNStdRY";
+//    public final static String GROUP_IOS_MSG_TEMPLATE_ID = "OhOwFvB0xy3alDMWdHwKUzdLziC33oDs4qEg1qGF53g";
+//    public final static String WEEKLY_REPORT_TEMPLATE_ID = "zBqFwSrI082RsZCo2k10awMw7csro1uq5FB9OaH4UpI";
+}

+ 40 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/Constants.java

@@ -0,0 +1,40 @@
+package cn.efunbox.manage.base.util;
+
+/**
+ * 定义常量类
+ */
+public class Constants {
+
+
+
+	public static String BIZ_CODE = "1008";
+
+	/**
+	 * 请求微信时的错误标志字段
+	 */
+	public static final String WEIXIN_ERROR_CODE_FIELD = "errcode";
+
+
+	//系统任务
+	public static int INTEGRAL_OP_TYPE_SYSTEM_TASK = 0;
+
+	//用户奖赏
+	public static int INTEGRAL_OP_TYPE_USER_REWARD = 1;
+
+	//兑换奖品
+	public static int INTEGRAL_OP_TYPE_PRIZE = 2;
+
+	//团购
+	public static int INTEGRAL_OP_TYPE_GROUP = 3;
+
+	//用户登录
+	public static int INTEGRAL_OP_TYPE_LOGIN = 4;
+
+	//收入
+	public static int INTEGRAL_TYPE_INCOME = 0;
+
+	//支出
+	public static int INTEGRAL_TYPE_OUTLAY = 1;
+}
+
+	

+ 44 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/MD5Util.java

@@ -0,0 +1,44 @@
+package cn.efunbox.manage.base.util;
+
+import java.security.MessageDigest;
+
+public class MD5Util {
+
+    private static String byteArrayToHexString(byte b[]) {
+        StringBuffer resultSb = new StringBuffer();
+        for (int i = 0; i < b.length; i++)
+            resultSb.append(byteToHexString(b[i]));
+
+        return resultSb.toString();
+    }
+
+    private static String byteToHexString(byte b) {
+        int n = b;
+        if (n < 0)
+            n += 256;
+        int d1 = n / 16;
+        int d2 = n % 16;
+        return hexDigits[d1] + hexDigits[d2];
+    }
+
+    public static String MD5Encode(String origin, String charsetname) {
+        String resultString = null;
+        try {
+            resultString = new String(origin);
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            if (charsetname == null || "".equals(charsetname))
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes()));
+            else
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes(charsetname)));
+        } catch (Exception exception) {
+        }
+        return resultString;
+    }
+
+    private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
+            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
+
+
+}

+ 24 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/MyX509TrustManager.java

@@ -0,0 +1,24 @@
+package cn.efunbox.manage.base.util;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * 信任管理器
+ */
+public class MyX509TrustManager implements X509TrustManager {
+
+    // 检查客户端证书
+    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+    }
+
+    // 检查服务器端证书
+    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+    }
+
+    // 返回受信任的X509证书数组
+    public X509Certificate[] getAcceptedIssuers() {
+        return null;
+    }
+}

+ 43 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/QRCodeUtil.java

@@ -0,0 +1,43 @@
+package cn.efunbox.manage.base.util;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import sun.misc.BASE64Encoder;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Hashtable;
+
+public class QRCodeUtil {
+
+    /**
+     * 根据内容,生成指定宽高、指定格式的二维码图片
+     *
+     * @param url   内容
+     * @return 生成的二维码图片路径
+     * @throws Exception
+     */
+    public static String generateQRCode(String url) throws IOException, WriterException {
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
+        hints.put(EncodeHintType.MARGIN, 0);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 360, 360, hints);
+        BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        ImageIO.write(image, "png", os);
+        byte b[] = os.toByteArray();
+        String QRCode = new BASE64Encoder().encode(b);
+        return QRCode;
+    }
+
+    public static void main(String[] args) throws Exception {
+        String s = QRCodeUtil.generateQRCode("http://www.baidu.com");
+        System.out.println(s);
+    }
+}

+ 120 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/TimeUtil.java

@@ -0,0 +1,120 @@
+package cn.efunbox.manage.base.util;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class TimeUtil {
+
+    private static final String DEFAULT_PATTERN = "yyyy-MM-dd";
+    /**
+     * 一天的毫秒数
+     */
+    private static long TIME_OF_ONE_DAY = 24 * 60 * 60 * 1000;
+
+    public static Long getTimeDiffer(String date) throws ParseException {
+        Date nowDate=new Date();
+        DateFormat format=new SimpleDateFormat("yy-MM-dd hh:mm:ss");
+        long from = format.parse(date).getTime();
+        long to = nowDate.getTime();
+        Long sconds = (to - from)/1000;
+        int hours=(24*60*60);
+        if((sconds-hours)>=0){
+            return null;
+        }else {
+            Long xx=  hours-sconds;
+            return xx;
+        }
+
+    }
+
+    public static String format(Date date) {
+        DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return format.format(date);
+
+    }
+
+    public static String formatMonthDay(String day) {
+        DateFormat format=new SimpleDateFormat("yyyy-MM-dd");
+        Date date = new Date();
+        try {
+            date = format.parse(day);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        format = new SimpleDateFormat("MM.dd");
+        return format.format(date);
+
+    }
+
+    public static String formatDay(Date date) {
+        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        return format.format(date);
+
+    }
+
+    /**
+     * 将DATE类型转成String类型,pattern默认为yyyy-MM-dd
+     *
+     * @return
+     */
+    public static String getDateStr() {
+        Date  date = new Date();
+        SimpleDateFormat formater = new SimpleDateFormat(DEFAULT_PATTERN);
+        return formater.format(date);
+    }
+
+    public static String getPreDateStr() {
+        Date  date = new Date(System.currentTimeMillis() - TIME_OF_ONE_DAY);
+        SimpleDateFormat formater = new SimpleDateFormat(DEFAULT_PATTERN);
+        return formater.format(date);
+    }
+
+    public static String weekOne(){
+        Calendar cal = Calendar.getInstance();
+        int d = 0;
+        if (cal.get(Calendar.DAY_OF_WEEK) == 1) {
+            d = -6;
+        } else {
+            d = 2 - cal.get(Calendar.DAY_OF_WEEK);
+        }
+        cal.add(Calendar.DAY_OF_WEEK, d);
+
+        return formatDay(cal.getTime());
+    }
+
+
+    public static String dayOfWeek(int day){
+        Calendar cal = Calendar.getInstance();
+        int d = 0;
+        if (cal.get(Calendar.DAY_OF_WEEK) == 1) {
+            d = -6;
+        } else {
+            d = 2 - cal.get(Calendar.DAY_OF_WEEK);
+        }
+        cal.add(Calendar.DAY_OF_WEEK, d);
+        cal.add(Calendar.DATE,day);
+        return formatDay(cal.getTime());
+    }
+
+
+
+    public static  void main(String[] arg0){
+       /* String dateStr = getDateStr();
+        String preDateStr = getPreDateStr();
+        System.out.println(dateStr);
+        System.out.println(preDateStr);*/
+
+//        double v = Math.random() * 50 + 50;
+//        System.out.println(v);
+//
+//        Random random = new Random();
+//        double v1 = random.nextDouble() * 50 + 50;
+
+        String date = weekOne();
+        System.out.println(date);
+
+    }
+}

+ 63 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/WeekUtil.java

@@ -0,0 +1,63 @@
+package cn.efunbox.manage.base.util;
+
+import java.util.Calendar;
+
+/**
+ * WeekUtil
+ * Created by xusq on 2018/1/30.
+ */
+public class WeekUtil {
+
+    public static int currentWeek() {
+
+        Calendar c = Calendar.getInstance();
+
+        return getWeekNumber(c);
+    }
+
+    private static  int getWeekNumber(Calendar calendar){
+        int currentWeek = calendar.get(Calendar.WEEK_OF_YEAR);
+
+        int year = calendar.get(Calendar.YEAR);
+
+        int weekNumber = year * 100 + currentWeek;
+
+        int endWeek = calendar.get(Calendar.DAY_OF_YEAR);
+
+        if (endWeek > 359 && currentWeek == 1) {
+            weekNumber = (year + 1) * 100 + 1;
+        }
+
+        return weekNumber;
+    }
+
+    public static int preWeek() {
+
+
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.DATE, -7);
+
+        return getWeekNumber(c);
+    }
+
+    public static int nextWeek() {
+
+
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.DATE, 7);
+
+
+
+        return getWeekNumber(c);
+    }
+
+    public static void main(String[] args) {
+        int i = WeekUtil.currentWeek();
+
+        int i1 = WeekUtil.nextWeek();
+        System.out.println(i1);
+        int i2 = WeekUtil.preWeek();
+        System.out.println(i2);
+        System.out.println(i);
+    }
+}

+ 86 - 0
manage-api/src/main/java/cn/efunbox/manage/base/util/XMLUtil.java

@@ -0,0 +1,86 @@
+package cn.efunbox.manage.base.util;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+public class XMLUtil {
+    /**
+     * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
+     * @param strxml
+     * @return
+     * @throws JDOMException
+     * @throws IOException
+     */
+    public static Map doXMLParse(String strxml) throws JDOMException, IOException {
+        strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
+
+        if(null == strxml || "".equals(strxml)) {
+            return null;
+        }
+
+        Map m = new HashMap();
+
+        InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
+        SAXBuilder builder = new SAXBuilder();
+        Document doc = builder.build(in);
+        Element root = doc.getRootElement();
+        List list = root.getChildren();
+        Iterator it = list.iterator();
+        while(it.hasNext()) {
+            Element e = (Element) it.next();
+            String k = e.getName();
+            String v = "";
+            List children = e.getChildren();
+            if(children.isEmpty()) {
+                v = e.getTextNormalize();
+            } else {
+                v = XMLUtil.getChildrenText(children);
+            }
+
+            m.put(k, v);
+        }
+
+        //关闭流
+        in.close();
+
+        return m;
+    }
+
+    /**
+     * 获取子结点的xml
+     * @param children
+     * @return String
+     */
+    public static String getChildrenText(List children) {
+        StringBuffer sb = new StringBuffer();
+        if(!children.isEmpty()) {
+            Iterator it = children.iterator();
+            while(it.hasNext()) {
+                Element e = (Element) it.next();
+                String name = e.getName();
+                String value = e.getTextNormalize();
+                List list = e.getChildren();
+                sb.append("<" + name + ">");
+                if(!list.isEmpty()) {
+                    sb.append(XMLUtil.getChildrenText(list));
+                }
+                sb.append(value);
+                sb.append("</" + name + ">");
+            }
+        }
+
+        return sb.toString();
+    }
+
+}

+ 22 - 0
manage-api/src/main/java/cn/efunbox/manage/base/vo/DeptTreeVO.java

@@ -0,0 +1,22 @@
+package cn.efunbox.manage.base.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * DeptTreeVO
+ * Created by wangys on 2019/03/07
+ */
+@Data
+public class DeptTreeVO {
+
+    private String label;
+
+    private Long cid;
+
+    private List<DeptTreeVO> children = new ArrayList<>();
+
+}

+ 11 - 0
manage-api/src/main/java/cn/efunbox/manage/base/vo/LoginVo.java

@@ -0,0 +1,11 @@
+package cn.efunbox.manage.base.vo;
+
+import lombok.Data;
+
+@Data
+public class LoginVo {
+
+    private String userName;
+
+    private String password;
+}

+ 25 - 0
manage-api/src/main/java/cn/efunbox/manage/base/vo/UserVo.java

@@ -0,0 +1,25 @@
+package cn.efunbox.manage.base.vo;
+
+import cn.efunbox.manage.base.enums.BaseStatusEnum;
+import cn.efunbox.manage.base.enums.CmsUserSuperEnum;
+import lombok.Data;
+
+@Data
+public class UserVo {
+
+    private String id;
+
+    private String userName;
+
+    private String nickName;
+
+    private CmsUserSuperEnum isSuper;
+
+    private String gmtCreated;
+
+    private String gmtModified;
+
+    private BaseStatusEnum status;
+
+    private String token;
+}

+ 104 - 0
manage-common/pom.xml

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>manage-root</artifactId>
+        <groupId>cn.efunbox.manage</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>manage-common</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <dependencies>
+        <!-- aop 切面 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <!-- redis 组件 -->
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-redis</artifactId>
+            <version>1.8.3.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <version>1.4.0.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <version>1.1.0.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>2.8.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-sts</artifactId>
+            <version>2.1.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk16</artifactId>
+            <version>1.46</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.sourceforge.jexcelapi</groupId>
+            <artifactId>jxl</artifactId>
+            <version>2.6.10</version>
+        </dependency>
+    </dependencies>
+    <!-- build -->
+    <build>
+        <plugins>
+            <!--上传源码 -->
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <attach>true</attach>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 132 - 0
manage-common/src/main/java/cn/efunbox/manage/common/configuration/FrontConfiguration.java

@@ -0,0 +1,132 @@
+/*
+*
+ * 文件名:@WebConfiguration.java <br/>
+ * 包名:tv.acfun.album.front.configuration <br/>
+ * 项目名:acfun-album-front <br/>
+ * @author tomas <br/>
+
+*/
+
+package cn.efunbox.manage.common.configuration;
+
+
+import cn.efunbox.manage.common.intercepter.AdminInterceptor;
+import cn.efunbox.manage.common.intercepter.AllowOriginInterceptor;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 类名:WebConfiguration  <br />
+ *
+ * 功能:Web相关配置
+ *
+ * @author tomas <br />
+ * 创建时间:2016年7月27日 下午3:57:19  <br />
+ * @version 2016年7月27日*/
+@Configuration
+@EnableWebMvc
+public class FrontConfiguration extends WebMvcConfigurerAdapter implements EnvironmentAware {
+	// 日志记录器
+	private static final Logger logger = LoggerFactory.getLogger(FrontConfiguration.class);
+
+	// 当前的环境对象
+	protected Environment environment;
+	@Autowired
+	AllowOriginInterceptor allowOriginInterceptor;
+
+	@Autowired
+	private AdminInterceptor adminInterceptor;
+
+	public void addInterceptors(InterceptorRegistry registry) {
+
+		registry.addInterceptor(allowOriginInterceptor);
+		registry.addInterceptor(adminInterceptor)
+				.addPathPatterns("/cms/**")
+				.excludePathPatterns("/cms/login")
+				.excludePathPatterns("/cms/logout");
+	}
+
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        super.configureMessageConverters(converters);
+
+//        1.需要先定义一个convert转换消息的对象;
+//        2.添加fastjson的配置信息,比如是否要格式化返回的json数据
+//        3.在convert中添加配置信息
+//        4.将convert添加到converters中
+
+        //1.定义一个convert转换消息对象
+        FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
+        List<MediaType> mediaTypeList = new ArrayList<>();
+        mediaTypeList.add(MediaType.APPLICATION_JSON);
+        mediaTypeList.add(MediaType.TEXT_HTML);
+        mediaTypeList.add(MediaType.APPLICATION_FORM_URLENCODED);
+
+        fastConverter.setSupportedMediaTypes(mediaTypeList);
+        //2.添加fastjson的配置信息,比如:是否要格式化返回json数据
+        FastJsonConfig fastJsonConfig=new FastJsonConfig();
+        fastJsonConfig.setSerializerFeatures(
+                SerializerFeature.PrettyFormat,
+				SerializerFeature.DisableCircularReferenceDetect,
+                SerializerFeature.WriteNullListAsEmpty,
+                SerializerFeature.WriteMapNullValue,
+                SerializerFeature.WriteNullStringAsEmpty
+        );
+        fastConverter.setFastJsonConfig(fastJsonConfig);
+        converters.add(fastConverter);
+    }
+
+	@Bean("validator")
+	public Validator validator() {
+		return Validation.buildDefaultValidatorFactory().getValidator();
+	}
+
+   /* @Bean
+    public HttpMessageConverters fastJsonHttpMessageConverters() {
+
+        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
+
+        FastJsonConfig fastJsonConfig = new FastJsonConfig();
+
+        fastJsonConfig.setSerializerFeatures(
+//                SerializerFeature.PrettyFormat,
+                SerializerFeature.WriteNullListAsEmpty,
+                SerializerFeature.WriteMapNullValue,
+                SerializerFeature.WriteNullStringAsEmpty);
+
+        fastConverter.setFastJsonConfig(fastJsonConfig);
+
+        HttpMessageConverter<?> converter = fastConverter;
+
+        return new HttpMessageConverters(converter);
+
+    }*/
+
+	/**
+	 * Set the {@code Environment} that this object runs in.
+	 *
+	 * @param environment
+	 */
+	@Override
+	public void setEnvironment(Environment environment) {
+		this.environment = environment;
+	}
+}

+ 26 - 0
manage-common/src/main/java/cn/efunbox/manage/common/data/BasicRepository.java

@@ -0,0 +1,26 @@
+/**
+ * 文件名:@BasicRepository.java <br/>
+ * 包名:tv.acfun.base.repository <br/>
+ * 项目名:acfun-base-provider <br/>
+ * @author xtwin <br/>
+ */
+package cn.efunbox.manage.common.data;
+
+import org.springframework.data.repository.NoRepositoryBean;
+
+
+/**
+ * 类名:BaseRepository  <br />
+ *
+ * 功能:基础持久仓库
+ *
+ * @author xtwin <br />
+ * 创建时间:2016年7月27日 上午10:59:21  <br />
+ * @version 2016年7月27日
+ */
+@NoRepositoryBean
+public interface BasicRepository<E> extends ProjectJpaRepository<E,Long> {
+
+
+
+}

+ 153 - 0
manage-common/src/main/java/cn/efunbox/manage/common/data/ProjectJpaRepository.java

@@ -0,0 +1,153 @@
+/**
+ * 文件名:@ProjectJpaRepository.java <br/>
+ * 包名:cn.efunbox.afw.data.jpa.spring.support <br/>
+ * 项目名:afw-data <br/>
+ * @author xtwin <br/>
+ */
+package cn.efunbox.manage.common.data;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 类名:ProjectJpaRepository  <br />
+ *
+ * 功能:
+ *
+ * @author xtwin <br />
+ * 创建时间:2016年7月26日 下午3:20:36  <br />
+ * @version 2016年7月26日
+ */
+@NoRepositoryBean
+public interface ProjectJpaRepository<E, ID extends Serializable> extends JpaRepository<E, ID> {
+
+	/**
+	 * 功能:统计符合样板的数据条数 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年3月31日 下午4:56:01 <br/>
+	 */
+	long count(E sample);
+	
+	/**
+	 * 功能:检查是否存在 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月17日 下午12:04:48 <br/>
+	 */
+	boolean exists(E sample);
+
+	/**
+	 * 功能:根据id查询 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年3月30日 下午6:28:23 <br/>
+	 */
+	E find(ID id);
+	/**
+	 * 功能:查询符合条件的第一条 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月2日 上午11:55:36 <br/>
+	 */
+	E findFirst(E sample);
+
+	/**
+	 * 功能:根据ids查询 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年3月30日 下午6:28:23 <br/>
+	 */
+	List<E> findByIds(List<ID> id);
+
+	/**
+	 * 功能:查询符合条件的第一条 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月2日 上午11:58:10 <br/>
+	 */
+	E findFirst(E sample, Sort sort);
+
+	/**
+	 * 功能:分页查询所有数据,使用id降序排序 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年3月31日 下午4:52:30 <br/>
+	 */
+	List<E> find(Long start, Integer offset);
+	
+	/**
+	 * 功能:分页查询,使用sort规则排序 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月29日 上午10:19:05 <br/>
+	 */
+	List<E> find(Long start, Integer offset, Sort sort);
+	
+	/**
+	 * 功能:根据样板查询数据,使用id降序排序 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年3月30日 下午6:51:00 <br/>
+	 */
+	List<E> find(E sample);
+	
+	/**
+	 * 功能:根据样板查询数据,使用sort规则排序 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月29日 上午10:19:51 <br/>
+	 */
+	List<E> find(E sample, Sort sort);
+	
+	/**
+	 * 功能:分页查询,按id降序排序 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年3月31日 上午11:58:31 <br/>
+	 */
+	List<E> find(E sample, Long start, Integer offset);
+	
+	/**
+	 * 功能:分页查询,且排序 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月29日 上午9:44:26 <br/>
+	 */
+	List<E> find(E sample, Long start, Integer offset, Sort sort);
+	
+	/**
+	 * 功能:更新操作,不更新为null的字段 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:35:47 <br/>
+	 */
+	E update(E entity);
+	/**
+	 * 功能:基于原生merge方法的 批量更新操作
+	 *
+	 * @author  tomas <br/>
+	 * @version 2017年8月1日 上午9:35:47 <br/>
+	 */
+	<S extends E> List<S> update(Iterable<S> entities);
+
+	/**
+	 * 功能:基于原生merge方法的 批量save操作
+	 *
+	 * @author  tomas <br/>
+	 * @version 2017年8月1日 上午9:35:47 <br/>
+	 */
+	<S extends E> List<S> save(Iterable<S> entities);
+	
+	/**
+	 * 功能:更新操作,可以选择是否要忽略更新为null的字段 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:36:20 <br/>
+	 */
+	E update(E entity, boolean ignoreNull);
+}

+ 575 - 0
manage-common/src/main/java/cn/efunbox/manage/common/data/ProjectSimpleJpaRepository.java

@@ -0,0 +1,575 @@
+/**
+ * 文件名:@AfwSimpleJpaRepository.java <br/>
+ * 包名:cn.efunbox.afw.data.jpa.spring.support <br/>
+ * 项目名:afw-data <br/>
+ * @author xtwin <br/>
+ */
+package cn.efunbox.manage.common.data;
+
+import cn.efunbox.manage.common.utils.SnowflakeIdUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.domain.Sort.Order;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.jpa.repository.support.JpaEntityInformation;
+import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.Attribute;
+import javax.persistence.metamodel.Attribute.PersistentAttributeType;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 类名:AfwSimpleJpaRepository  <br />
+ *
+ * 功能:Jpa仓库基础实现
+ *
+ * @author xtwin <br />
+ * 创建时间:2016年7月26日 下午3:19:42  <br />
+ * @version 2016年7月26日
+ */
+public class ProjectSimpleJpaRepository<E, ID extends Serializable> extends SimpleJpaRepository<E, ID> implements ProjectJpaRepository<E, ID> {
+	
+	// 日志记录器
+	private static final Logger logger = LoggerFactory.getLogger(ProjectSimpleJpaRepository.class);
+	
+	// jpa管理器对象
+	private EntityManager entityManager;
+	
+	// 实体信息
+	private JpaEntityInformation<E, ID> entityInformation;
+	
+	/**
+	 * 构造方法
+	 */
+	public ProjectSimpleJpaRepository(JpaEntityInformation<E, ID> entityInformation, EntityManager entityManager) {
+		super(entityInformation, entityManager);
+		
+		// 保留该对象,方便后续使用
+		this.entityInformation = entityInformation;
+		this.entityManager = entityManager;
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月26日 下午3:23:06<br/>
+	 * 
+	 * @param sample
+	 * @return <br/>
+	 * @see ProjectJpaRepository#count(Object)
+	 */
+	@Override
+	public long count(E sample) {
+		return count(getSpecification(sample));
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年8月17日 下午12:05:21<br/>
+	 *
+	 * @param sample
+	 * @return <br/>
+	 * @see ProjectJpaRepository#exists(Object)
+	 */
+	@Override
+	public boolean exists(E sample) {
+		return count(sample) > 0L;
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年7月26日 下午3:23:06<br/>
+	 *
+	 * @param id
+	 * @return <br/>
+	 * @see ProjectJpaRepository#find(Serializable)
+	 */
+	@Override
+	public E find(ID id) {
+		return findOne(id);
+	}
+	/**
+	 * 功能:根据ids查询 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年3月30日 下午6:28:23 <br/>
+	 */
+	public List<E> findByIds(List<ID> ids){
+		return findAll(ids);
+	}
+
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年7月26日 下午3:23:06<br/>
+	 *
+	 * @param start
+	 * @param offset
+	 * @return <br/>
+	 * @see ProjectJpaRepository#find(Long, Integer)
+	 */
+	@Override
+	public List<E> find(Long start, Integer offset) {
+		return find(start, offset, null);
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年7月29日 上午10:20:21<br/>
+	 *
+	 * @param start
+	 * @param offset
+	 * @param sort
+	 * @return <br/>
+	 * @see ProjectJpaRepository#find(Long, Integer, Sort)
+	 */
+	@Override
+	public List<E> find(Long start, Integer offset, Sort sort) {
+		return find(null, start, offset, sort);
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年8月2日 上午11:58:30<br/>
+	 *
+	 * @param sample
+	 * @return <br/>
+	 * @see ProjectJpaRepository#findFirst(Object)
+	 */
+	@Override
+	public E findFirst(E sample) {
+		return findFirst(sample, null);
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年8月2日 上午11:58:30<br/>
+	 *
+	 * @param sample
+	 * @param sort
+	 * @return <br/>
+	 * @see ProjectJpaRepository#findFirst(Object, Sort)
+	 */
+	@Override
+	public E findFirst(E sample, Sort sort) {
+		List<E> list = find(sample, 0L, 1, sort);
+
+		return null == list || list.isEmpty() ? null : list.get(0);
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年7月26日 下午3:23:06<br/>
+	 *
+	 * @param sample
+	 * @return <br/>
+	 * @see ProjectJpaRepository#find(Object)
+	 */
+	@Override
+	public List<E> find(E sample) {
+		return find(sample, null);
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年7月29日 上午10:20:21<br/>
+	 *
+	 * @param sample
+	 * @param sort
+	 * @return <br/>
+	 * @see ProjectJpaRepository#find(Object, Sort)
+	 */
+	@Override
+	public List<E> find(E sample, Sort sort) {
+		return find(sample, null, null,sort);
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年7月26日 下午3:23:06<br/>
+	 *
+	 * @param sample
+	 * @param start
+	 * @param offset
+	 * @return <br/>
+	 * @see ProjectJpaRepository#find(Object, Long, Integer)
+	 */
+	@Override
+	public List<E> find(E sample, Long start, Integer offset) {
+		return find(sample, start, offset, null);
+	}
+
+	/**
+	 * 功能: <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年7月29日 上午9:44:56<br/>
+	 *
+	 * @param sample
+	 * @param start
+	 * @param offset
+	 * @param sort
+	 * @return <br/>
+	 * @see ProjectJpaRepository#find(Object, Long, Integer, Sort)
+	 */
+	@Override
+	public List<E> find(E sample, Long start, Integer offset, Sort sort) {
+		// 创建qbe
+		Specification<E> spec = getSpecification(sample);
+
+		if (null == sort) {
+			// 默认按id降序排序
+			sort = new Sort(new Order(Direction.DESC, entityInformation.getIdAttribute().getName()));
+		}
+
+		// 取得查询对象
+		TypedQuery<E> query = getQuery(spec, sort);
+
+		// 起始条数,从零开始
+		if (null != start) {
+			// TODO 此处只接受整形值
+			query.setFirstResult(start.intValue());
+		}
+
+		// 查询条数
+		if (null != offset) {
+			query.setMaxResults(offset);
+		}
+
+		// 执行查询
+		return query.getResultList();
+	}
+
+
+	/**
+	 * 功能: 更新操作,不更新为null的字段 <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年8月1日 上午9:37:15<br/>
+	 *
+	 * @param entity
+	 * @return <br/>
+	 * @see ProjectJpaRepository#update(Object)
+	 */
+	@Transactional
+	public E update(E entity) {
+		return update(entity, true);
+	}
+
+	/**
+	 * Saves all given entities.
+	 *
+	 * @param entities
+	 * @return the saved entities
+	 * @throws IllegalArgumentException in case the given domain is {@literal null}.
+	 */
+	@Override
+	@Transactional
+	public <S extends E> List<S> save(Iterable<S> entities) {
+
+		return insertOrUpdateBatch(entities);
+	}
+	/**
+	 * Saves a given domain. Use the returned instance for further operations as the save operation might have changed the
+	 * domain instance completely.
+	 *
+	 * @param entity
+	 * @return the saved domain
+	 */
+	@Transactional
+	public <S extends E> S save(S entity) {
+
+		if (entityInformation.isNew(entity)) {
+			setSnowflakeIdId(entity);
+			entityManager.persist(entity);
+			return entity;
+		} else {
+			return entityManager.merge(entity);
+		}
+	}
+	/**
+	 * 功能: 动态数据更新,可以选择是否需要更新null字段 <br/>
+	 *
+	 * 重写:xtwin <br/>
+	 *
+	 * @version :2016年8月1日 上午9:37:05<br/>
+	 *
+	 * @param entity
+	 * @param ignoreNull
+	 * @return <br/>
+	 * @see ProjectJpaRepository#update(Object, boolean)
+	 */
+	@Transactional
+	public E update(E entity, boolean ignoreNull) {
+		// 取得当前实体的id
+		ID id = entityInformation.getId(entity);
+		
+		// 检查id是否为空Ø
+		if (null == id) {
+			throw new RuntimeException("The update domain id must be not empty !");
+		}
+		
+		// 查询库中当前对象的信息
+		E persist = find(id);
+		
+		// 检查该id对应的数据是否存在
+		if (null == persist) {
+			throw new RuntimeException("The update domain id is not exist : " + id);
+		}
+		
+		// 标识是否发生了变化
+		boolean isChanged = false;
+		
+		// 取得所有属性
+		for (Attribute<? super E, ?> attr : entityManager.getMetamodel().entity(getDomainClass()).getAttributes()) {
+			// 依次处理每个字段
+			/*PersistentAttributeType patype = attr.getPersistentAttributeType();
+
+			if (PersistentAttributeType.MANY_TO_ONE.equals(patype) 
+					|| PersistentAttributeType.ONE_TO_MANY.equals(patype)) {
+
+				// 忽略
+				continue;
+			}*/
+			
+			Member member = attr.getJavaMember();
+			
+			Field field = null;
+			if (member instanceof Field) {
+				field = (Field) member;
+			} else {
+				field = ReflectionUtils.findField(getDomainClass(), attr.getName());
+			}
+			
+			// 取得字段值
+			Object value = ReflectionUtils.getField(field, entity);
+			if (null != value || ! ignoreNull) {
+				// 旧值
+				Object oldValue = ReflectionUtils.getField(field, persist);
+				
+				if ((null == value && null != oldValue) 
+						|| (null != value && ! value.equals(oldValue))) {
+					
+					// 将新值更新到持久化对象中
+					ReflectionUtils.setField(field, persist, value);
+					
+					// 标记为发生了更新
+					isChanged = true;
+				}
+			}
+		}
+		
+		if (isChanged) {
+			persist = save(persist);
+		} else {
+			// 没有发生变更,忽略更新
+			logger.debug("has no changed : {}", id);
+		}
+		
+		// 执行保存并返回
+		return persist;
+	}
+	/**
+	 * update all given entities.
+	 *
+	 * @param entities
+	 * @return the saved entities
+	 * @throws IllegalArgumentException in case the given domain is {@literal null}.
+	 */
+	@Transactional
+	public <S extends E> List<S> update(Iterable<S> entities) {
+		return insertOrUpdateBatch(entities);
+	}
+
+	private <S extends E> List<S> insertOrUpdateBatch(Iterable<S> entities) {
+		List<S> result = new ArrayList<>();
+		if (entities == null) {
+			return result;
+		}
+		Iterator<S> iterator = entities.iterator();
+		int i = 0;
+		int count = 0;
+		//遍历循环 每20个 insert 批量插入/更新 一次库
+		while (iterator.hasNext()) {
+			S entity = iterator.next();
+			if (entityInformation.isNew(entity)) {
+				setSnowflakeIdId(entity);
+				entityManager.persist(entity);
+			} else {
+				update(entity);
+			}
+			result.add(entity);
+			i++;
+			if (i % 20 == 0) {
+				entityManager.flush();
+				entityManager.clear();
+
+				count=0;
+			}else {
+				count++;
+			}
+		}
+		//判断 是否有剩余未flush的 最后flush
+		if (count>0){
+			entityManager.flush();
+			entityManager.clear();
+		}
+		return result;
+	}
+
+	/**
+	 * 功能:获取qbe <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月29日 上午9:43:25 <br/>
+	 */
+	protected Specification<E> getSpecification(E sample) {
+		return null == sample ? null : new Specification<E>() {
+			@Override
+			public Predicate toPredicate(Root<E> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+				try {
+					// 获取qbe
+					return ProjectSimpleJpaRepository.this.toPredicate(sample, root, query, cb);
+				} catch (Exception e) {
+					throw new RuntimeException("toPredicate fail with error : " + String.valueOf(e), e);
+				}
+			}
+		};
+	}
+
+	/**
+	 * 功能:转为查询样板,可以由子类重写 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月29日 上午10:15:27 <br/>
+	 * @throws IllegalAccessException 
+	 * @throws IllegalArgumentException 
+	 */
+	protected Predicate toPredicate(E sample, Root<E> root, CriteriaQuery<?> query, CriteriaBuilder cb) throws Exception {
+		// 存放查询条件
+		List<Predicate> list = new ArrayList<Predicate>();
+		
+		// 处理实体中的所有字段
+		for (Attribute<? super E, ?> attr : entityManager.getMetamodel().entity(getDomainClass()).getAttributes()) {
+			// 依次处理每个字段
+			PersistentAttributeType patype = attr.getPersistentAttributeType();
+
+			// 打印日志
+			logger.debug("the attr type is : {}", patype);
+
+			if (PersistentAttributeType.MANY_TO_ONE.equals(patype) 
+					|| PersistentAttributeType.ONE_TO_MANY.equals(patype)) {
+
+				// 忽略
+				continue;
+			}
+
+			Object value = null;
+			
+			Member member = attr.getJavaMember();
+			if (member instanceof Method) {
+				value = ReflectionUtils.invokeMethod((Method) member, sample);
+			} else if (member instanceof Field) {
+				//((Field) member).setAccessible(true);
+				// 确保可以访问
+				ReflectionUtils.makeAccessible((Field) member);
+				
+				// 取得字段的值
+				value = ((Field) member).get(sample);
+			}
+			
+			if (null != value) {
+				Predicate tmp = null;
+				//like 查询放在最前面
+				List<Predicate> likePredicate = new ArrayList<Predicate>();
+				if (String.class.isAssignableFrom(attr.getJavaType()) ) {
+					if(!StringUtils.isEmpty(value)){
+						StringBuilder stringBuilder=new StringBuilder(((String) value).trim());
+						//如果以 % 开头和结尾 表示 like 查询
+						if("%".equals(stringBuilder.substring(0,1)) || stringBuilder.toString().endsWith("%")){
+							tmp = cb.like(root.get(attr.getName()), (String) value);
+							likePredicate.add(tmp);
+						}else{
+							tmp = cb.equal(root.get(attr.getName()), value);
+							list.add(tmp);
+						}
+					}
+				} else  {
+					tmp = cb.equal(root.get(attr.getName()), value);
+					list.add(tmp);
+				}
+				if(likePredicate.size()>0){
+					list.addAll(0,likePredicate);
+				}
+			}
+		}
+		
+		// where条件
+		return list.isEmpty() ? null : cb.and(list.toArray(new Predicate[list.size()]));
+	}
+
+
+	protected void setSnowflakeIdId(E entity){
+		try {
+			Field field = ReflectionUtils.findField(entity.getClass(),entityInformation.getIdAttribute().getName());
+			if(entityInformation.getIdAttribute().getType().getJavaType().getName().equals("java.lang.Long")){
+				ReflectionUtils.makeAccessible(field);
+				ReflectionUtils.setField(field, entity, SnowflakeIdUtil.getSnowflakeIdUtil().nextId());
+			}else if(entityInformation.getIdAttribute().getType().getJavaType().getName().equals("java.lang.String")) {
+				logger.debug(" uuid  entityInformation.getIdAttribute().getName() ={}",entityInformation.getIdAttribute().getName());
+				ReflectionUtils.makeAccessible(field);
+				ReflectionUtils.setField(field, entity, SnowflakeIdUtil.getSnowflakeIdUtil().nextCode());
+			}
+		}catch (Exception e){
+			logger.error("Reflect set id 出错 mag ={}",e.getMessage(),e);
+		}
+	}
+}

+ 257 - 0
manage-common/src/main/java/cn/efunbox/manage/common/entity/page/OnePage.java

@@ -0,0 +1,257 @@
+/**
+ * 文件名:@OnePage.java <br/>
+ * 包名:cn.efunbox.afw.core.domain.page <br/>
+ * 项目名:afw-core <br/>
+ * @author xtwin <br/>
+ */
+package cn.efunbox.manage.common.entity.page;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 类名:OnePage  <br />
+ *
+ * 功能:分页,一页
+ *
+ * @author xtwin <br />
+ * 创建时间:2016年7月28日 上午11:26:12  <br />
+ * @version 2016年7月28日
+ */
+public class OnePage<E> implements Pageable<List<E>> ,Serializable {
+
+	private static final long serialVersionUID = 1L;
+	// 默认分页数据条数
+	public final static int DEFAULT_PAGE_SIZE = 10;
+	
+	// 当前页
+	private int pageNo = 1;
+	
+	// 当前页大小
+	private int pageSize = DEFAULT_PAGE_SIZE;
+	
+	// 总条数
+	private long totalSize;
+	
+	// 数据内容
+	private List<E> list;
+
+	/**
+	 * 构造方法
+	 */
+	protected OnePage() {
+		// 默认构造方法
+	}
+	
+	/**
+	 * 构造方法
+	 */
+	public OnePage(Long totalSize) {
+		this(totalSize, null, null);
+	}
+	
+	/**
+	 * 构造方法
+	 */
+	public OnePage(Long totalSize, Integer pageNo) {
+		this(totalSize, pageNo, null);
+	}
+	
+	/**
+	 * 构造方法
+	 */
+	public OnePage(Long totalSize, Integer pageNo, Integer pageSize) {
+		// 总记录数
+		if (null != totalSize) {
+			if (totalSize < 0) {
+				throw new RuntimeException("totalSize must be not less than zero!");
+			}
+			this.totalSize = totalSize;
+		}
+		
+		// 当前页码
+		if (null != pageNo) {
+			if (pageNo < 0) {
+				throw new RuntimeException("pageNo must be not less than zero!");
+			}
+			this.pageNo = pageNo;
+		}
+
+		
+		// 当前页数据条数
+		if (null != pageSize) {
+			if (pageSize < 0) {
+				throw new RuntimeException("pageSize must be not less than zero!");
+			}
+			
+			this.pageSize = pageSize;
+		}
+
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月31日 上午9:27:27<br/>
+	 * 
+	 * @return <br/>
+	 */
+	@Override
+	public int getTotalNo() {
+		return totalSize == 0 ? 1 : (int) ((totalSize / pageSize) + (totalSize % pageSize == 0 ? 0 : 1));
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月31日 上午9:27:27<br/>
+	 * 
+	 * @return <br/>
+	 */
+	@Override
+	public long getTotalSize() {
+		return totalSize;
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月31日 上午9:27:27<br/>
+	 * 
+	 * @return <br/>
+	 */
+	@Override
+	public int getPageNo() {
+		return pageNo;
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月31日 上午9:27:27<br/>
+	 * 
+	 * @return <br/>
+	 */
+	@Override
+	public int getPageSize() {
+		return pageSize;
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月31日 上午9:27:27<br/>
+	 * 
+	 * @return <br/>
+	 */
+	@Override
+	public boolean hasNext() {
+		return getPageNo() < getTotalNo();
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月31日 上午9:27:27<br/>
+	 * 
+	 * @return <br/>
+	 */
+	@Override
+	public boolean hasPrevious() {
+		return getPageNo() > 1;
+	}
+
+	/**
+	 * @version 2016年7月31日-上午10:57:49
+	 */
+	public void setPageNo(int pageNo) {
+		this.pageNo = pageNo;
+	}
+
+	/**
+	 * @version 2016年7月31日-上午10:57:49
+	 */
+	public void setPageSize(int pageSize) {
+		this.pageSize = pageSize;
+	}
+
+	/**
+	 * @version 2016年7月31日-上午10:57:49
+	 */
+	public void setTotalSize(int totalSize) {
+		/*if (totalSize < 0) {
+			throw new AfwRuntimeException("totalSize must be not less than zero!");
+		}*/
+		this.totalSize = totalSize;
+	}
+	
+	/**
+	 * 功能:bean规范 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月31日 下午12:54:59 <br/>
+	 */
+	public boolean isHasNext() {
+		return hasNext();
+	}
+	
+	/**
+	 * 功能:bean规范 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月31日 下午12:55:22 <br/>
+	 */
+	public boolean isHasPrevious() {
+		return hasPrevious();
+	}
+
+	/**
+	 * @version 2016年8月1日-上午10:00:32
+	 */
+	public void setList(List<E> list) {
+		this.list = list;
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年8月1日 上午9:49:32<br/>
+	 * 
+	 * @return <br/>
+	 * @see Pageable#getList()
+	 */
+	@Override
+	public List<E> getList() {
+		return null == list ? Collections.emptyList() : list;
+	}
+
+	/**
+	 * 功能: <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年8月1日 上午10:05:48<br/>
+	 * 
+	 * @return <br/>
+	 * @see Pageable#getStart()
+	 */
+	@Override
+	public long getStart() {
+		return (getPageNo() - 1) * getPageSize();
+	}
+}

+ 83 - 0
manage-common/src/main/java/cn/efunbox/manage/common/entity/page/Pageable.java

@@ -0,0 +1,83 @@
+/**
+ * 文件名:@Pageable.java <br/>
+ * 包名:cn.efunbox.afw.core.domain.page <br/>
+ * 项目名:afw-core <br/>
+ * @author xtwin <br/>
+ */
+package cn.efunbox.manage.common.entity.page;
+
+/**
+ * 类名:Pageable  <br />
+ *
+ * 功能:分页接口
+ *
+ * @author xtwin <br />
+ * 创建时间:2016年7月28日 上午11:18:56  <br />
+ * @version 2016年7月28日
+ */
+public interface Pageable<E> {
+	
+	/**
+	 * 功能:当前页的数据内容 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月28日 上午11:43:27 <br/>
+	 */
+	E getList();
+
+	/**
+	 * 功能:总页数 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:47:45 <br/>
+	 */
+	int getTotalNo();
+	
+	/**
+	 * 功能:总记录数 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:48:40 <br/>
+	 */
+	long getTotalSize();
+
+	/**
+	 * 功能:页码 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:48:33 <br/>
+	 */
+	int getPageNo();
+	
+	/**
+	 * 功能:每页数据条数 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:48:25 <br/>
+	 */
+	int getPageSize();
+	
+	/**
+	 * 功能:起始位置 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午10:02:52 <br/>
+	 */
+	long getStart();
+	
+	/**
+	 * 功能:是否还有下一页 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:48:07 <br/>
+	 */
+	boolean hasNext();
+	
+	/**
+	 * 功能:是否还有上一页 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年8月1日 上午9:47:58 <br/>
+	 */
+	boolean hasPrevious();
+}

+ 19 - 0
manage-common/src/main/java/cn/efunbox/manage/common/enums/BaseOrderEnum.java

@@ -0,0 +1,19 @@
+package cn.efunbox.manage.common.enums;
+
+public enum BaseOrderEnum {
+
+    DESC("降序"), ASC("升序");
+    String name;
+    BaseOrderEnum(String name) {
+        this.name = name;  
+    }
+      
+    public String getName() {  
+        return name;  
+    }
+    @Override
+    public String toString() {
+        return this.name;
+    }
+
+}  

+ 35 - 0
manage-common/src/main/java/cn/efunbox/manage/common/helper/SortHelper.java

@@ -0,0 +1,35 @@
+package cn.efunbox.manage.common.helper;
+
+import cn.efunbox.manage.common.enums.BaseOrderEnum;
+import org.springframework.data.domain.Sort;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+/**
+ * SortHelper
+ * Created by xusq on 2017/5/22.
+ */
+public class SortHelper {
+
+
+    public static Sort sortMap2Sort(LinkedHashMap<String,BaseOrderEnum> sortMap){
+        if (CollectionUtils.isEmpty(sortMap)) {
+            return null;
+        }
+
+        List<Sort.Order> sorts = new ArrayList<>();
+        sortMap.forEach((prop, order) -> {
+            if (BaseOrderEnum.ASC.equals(order)) {
+                sorts.add(new Sort.Order(Sort.Direction.ASC, prop));
+            } else {
+                sorts.add(new Sort.Order(Sort.Direction.DESC, prop));
+            }
+        });
+
+        return new Sort(sorts);
+
+    }
+}

+ 61 - 0
manage-common/src/main/java/cn/efunbox/manage/common/intercepter/AdminInterceptor.java

@@ -0,0 +1,61 @@
+package cn.efunbox.manage.common.intercepter;
+
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import cn.efunbox.manage.common.utils.Constants;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.TimeUnit;
+
+@Component
+@Order(12)
+public class AdminInterceptor implements HandlerInterceptor {
+
+
+    @Autowired
+    RedisTemplate<String, String> redisTemplate;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request,
+                             HttpServletResponse response, Object handler) throws Exception {
+        if(HttpMethod.OPTIONS.matches(request.getMethod())){
+            return false;
+        }
+        ServletOutputStream out = response.getOutputStream();
+        String token = request.getHeader("token");
+        if (StringUtils.isBlank(token)) {
+            ApiResult invalidTokenResult = ApiResult.error(ApiCode.INVALID_TOKEN);
+            out.write(JSONObject.toJSONString(invalidTokenResult).getBytes("UTF-8"));
+            return false;
+        }
+        String user = redisTemplate.opsForValue().get(Constants.EFUNBOX_ADMIN_TOKEN_PREFIX + token);
+        if (StringUtils.isBlank(user)) {
+            ApiResult invalidTokenResult = ApiResult.error(ApiCode.INVALID_TOKEN);
+            out.write(JSONObject.toJSONString(invalidTokenResult).getBytes("UTF-8"));
+            return false;
+        }
+        redisTemplate.expire(Constants.EFUNBOX_ADMIN_TOKEN_PREFIX + token, 30, TimeUnit.MINUTES);
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
+
+    }
+}

+ 109 - 0
manage-common/src/main/java/cn/efunbox/manage/common/intercepter/AllowOriginInterceptor.java

@@ -0,0 +1,109 @@
+package cn.efunbox.manage.common.intercepter;
+
+import cn.efunbox.manage.common.result.ApiResult;
+import com.alibaba.fastjson.JSON;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * Created by libin on 2015/5/13.
+ */
+@Component
+@Order(11)
+public class AllowOriginInterceptor implements HandlerInterceptor {
+    private static final Logger logger = LoggerFactory.getLogger(AllowOriginInterceptor.class);
+
+    private String allowValue = "ai160.com,efunbox.cn,localhost,*";
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        String origin = request.getHeader("Origin");
+        String headers = request.getHeader("Access-Control-Request-Headers");
+        //忽略 OPTIONS 请求
+        if (HttpMethod.OPTIONS.matches(request.getMethod())) {
+            logger.info("OPTIONS 请求 忽略 返回200");
+            //将实体对象转换为JSON Object转换
+            response.setCharacterEncoding("UTF-8");
+            response.setStatus(HttpStatus.OK.value());
+            // TODO  orign 和 refer 的判断 .....
+            if (null!=origin){
+                response.setHeader("Access-Control-Allow-Origin", origin);
+            }else {
+                response.setHeader("Access-Co..." +
+                        "ntrol-Allow-Origin", "*");
+            }
+            response.setContentType("application/json; charset=utf-8");
+            response.setHeader("Access-Control-Allow-Credentials", "true");
+            response.setHeader("Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, PATCH");
+            response.setHeader("Access-Control-Max-Age", "3600");
+            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Token,Authentication, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-control, "+headers);
+            response.setHeader("X-Frame-Options","SAMEORIGIN");
+            PrintWriter out = null;
+            try {
+                out = response.getWriter();
+                out.append(JSON.toJSONString(ApiResult.ok()));
+            } catch (IOException e) {
+                logger.error("request ={} 返回 失败 e={}" ,request.getRequestURI(),e);
+            } finally {
+                if (out != null) {
+                    out.close();
+                }
+            }
+            return false;
+        }
+        //logger.info("进入AllowOriginIntercepter 拦截 origin={}",origin);
+        if (!StringUtils.isEmpty(headers)) {
+            headers = ", " + headers;
+        } else {
+            headers = "";
+        }
+        //Access-Control-Allow-Origin: *
+        if (!StringUtils.isEmpty(origin)) {
+            if (originIsAllow(origin, allowValue)) {
+                response.setHeader("Access-Control-Allow-Origin", origin);
+                response.setHeader("Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, PATCH");
+                response.setHeader("Access-Control-Allow-Headers", "Origin, X-Token, Authentication, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-control, "+headers);
+                response.setHeader("Access-Control-Allow-Credentials", "true");
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+
+    }
+
+    private boolean originIsAllow(String origin, String value) {
+        if (StringUtils.isEmpty(value)) {
+            return false;
+        }
+        if (value.contains("*")) {
+            return true;
+        }
+        String[] values = value.split(",");
+        for (String s : values) {
+            if (origin.indexOf(s) != -1) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 27 - 0
manage-common/src/main/java/cn/efunbox/manage/common/result/AbstractApiCode.java

@@ -0,0 +1,27 @@
+package cn.efunbox.manage.common.result;
+
+import java.io.Serializable;
+
+public abstract class AbstractApiCode implements Serializable {
+    private int code;
+    private String message;
+    private final AbstractApiCode display;
+
+    protected AbstractApiCode(int code, String messasge) {
+        this.code = code;
+        this.message = messasge;
+        this.display = this;
+    }
+
+    public int getCode() {
+        return this.code;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+
+    public AbstractApiCode getDisplay() {
+        return this.display;
+    }
+}

+ 97 - 0
manage-common/src/main/java/cn/efunbox/manage/common/result/ApiCode.java

@@ -0,0 +1,97 @@
+package cn.efunbox.manage.common.result;
+
+
+public class ApiCode extends AbstractApiCode {
+    public static final int _C_OK = 200;
+    public static final ApiCode OK = new ApiCode((String) null, _C_OK);
+    public static final int _C_NOT_FOUND = 404;
+    public static final ApiCode NOT_FOUND = new ApiCode("请求资源不存在", _C_NOT_FOUND);
+    public static final int _C_UNKNOWN_ERROR = 500;
+    public static final ApiCode UNKNOWN_ERROR = new ApiCode("服务端内部错误", _C_UNKNOWN_ERROR);
+    public static final int _C_NO_MOBILE = 505;
+    public static final ApiCode NO_MOBILE = new ApiCode("未绑定手机号", _C_NO_MOBILE);
+    public static final int _C_HAVE_MOBILE = 506;
+    public static final ApiCode HAVE_MOBILE = new ApiCode("该用户已绑定手机号或该手机号已绑定用户", _C_HAVE_MOBILE);
+    public static final int _C_SERVER_ERROR = 500;
+    public static final ApiCode SERVER_ERROR = new ApiCode("网络正忙,请稍后再试......", _C_SERVER_ERROR);
+    public static final int _C_PARAMETER_ERROR = 400;
+    public static final ApiCode PARAMETER_ERROR = new ApiCode("参数错误", _C_PARAMETER_ERROR);
+    public static final int _C_UNAUTHORIZED = 401;
+    public static final ApiCode UNAUTHORIZED = new ApiCode("未认证", _C_UNAUTHORIZED);
+    public static final int _C_INVALID_TOKEN = 402;
+    public static final ApiCode INVALID_TOKEN = new ApiCode("无效的Token", _C_INVALID_TOKEN);
+    public static final int _C_ACCESS_DENIED = 403;
+    public static final ApiCode ACCESS_DENIED = new ApiCode("访问被拒绝", _C_ACCESS_DENIED);
+    public static final int _C_SIGNATURE_ERROR = 510;
+    public static final ApiCode SIGNATURE_ERROR = new ApiCode("签名错误", _C_SIGNATURE_ERROR);
+    public static final int _C_API_UPGRADE = 520;
+    public static final ApiCode API_UPGRADE = new ApiCode("接口已升级", _C_API_UPGRADE);
+    public static final int _C_APPID_NOT_EXIST = 530;
+    public static final ApiCode APPID_NOT_EXIST = new ApiCode("应用id不存在", _C_APPID_NOT_EXIST);
+    public static final int _C_RECORD_EXIST = 531;
+    public static final ApiCode RECORD_EXIST = new ApiCode("记录已存在", _C_RECORD_EXIST);
+    public static final int _C_PARAMETER_INVALID = 540;
+    public static final ApiCode PARAMETER_INVALID = new ApiCode("参数验证不通过", _C_PARAMETER_INVALID);
+    public static final int _C_OPERATION_FAIL = 550;
+    public static final ApiCode OPERATION_FAIL = new ApiCode("操作失败", _C_OPERATION_FAIL);
+    public static final int _c_RESOURCE_NULL = 600;
+    public static final ApiCode RESOURCE_NULL = new ApiCode("用户对应资源为空", _c_RESOURCE_NULL);
+    public static final int _c_SIGN = 555;
+    public static final ApiCode SIGN = new ApiCode("获取验证码过于频繁", _c_SIGN);
+    public static final int _C_NOT_RESOURSE = 300;
+    public static final ApiCode NOT_RESOURSE = new ApiCode("暂无数据", _C_NOT_RESOURSE);
+
+    public static final int _c_NO_UID = 506;
+    public static final ApiCode NO_UID = new ApiCode("没有找到相关用户", _c_NO_UID);
+    public static final int _C_PASSWORD_ERROR = 507;
+    public static final ApiCode PASSWORD_ERROR = new ApiCode("没有找到相关用户", _C_PASSWORD_ERROR);
+    public static final int _C_USERNAME_REPEAT = 508;
+    public static final ApiCode USERNAME_REPEAT = new ApiCode("用户已存在", _C_USERNAME_REPEAT);
+
+
+    public final static int _C_FILE_TO_BIG = 405;
+    public final static ApiCode FILE_TO_BIG = new ApiCode("文件过大", _C_FILE_TO_BIG);
+
+    public final static int _C_FILE_UPLOAD_ERROR = 407;
+    public final static ApiCode FILE_UPLOAD_ERROR = new ApiCode("上传文件失败", _C_FILE_UPLOAD_ERROR);
+
+    public final static int _C_DEVICE_ERROR = 700;
+    public final static ApiCode DEVICE_ERROR = new ApiCode("没有相关deviceCode信息", _C_DEVICE_ERROR);
+    public final static int _C_DATA_ERROR = 701;
+    public final static ApiCode DATA_ERROR = new ApiCode("数据异常", _C_DATA_ERROR);
+
+    public final static int _C_UNIONID_ERROR = 703;
+    public final static ApiCode UNIONID_ERROR = new ApiCode(" unionId为空", _C_UNIONID_ERROR);
+
+    public final static int _C_AWARD_ERROR = 706;
+    public final static ApiCode AWARD_ERROR = new ApiCode("自己不能打赏自己", _C_AWARD_ERROR);
+
+    public final static int _C_VIDEO_ERROR = 707;
+    public final static ApiCode VIDEO_ERROR = new ApiCode("视频地址错误", _C_VIDEO_ERROR);
+
+    public final static int _C_BUY_TIME_ERROR = 708;
+    public final static ApiCode BUY_TIME_ERROR = new ApiCode("购买时长不能超过12个月", _C_BUY_TIME_ERROR);
+
+    public final static int _C_JOINED_GROUP_ERROR = 801;
+    public final static ApiCode JOINED_GROUP_ERROR = new ApiCode("你已参加过当前团购", _C_JOINED_GROUP_ERROR);
+
+    public final static int _C_GROUP_STATUS_ERROR = 802;
+    public final static ApiCode GROUP_STATUS_ERROR = new ApiCode("当前团购已关闭", _C_GROUP_STATUS_ERROR);
+
+    public final static int _C_GROUP_EXIST_ERROR = 803;
+    public final static ApiCode GROUP_EXIST_ERROR = new ApiCode("您有未完成的团正在进行中", _C_GROUP_EXIST_ERROR);
+
+    public final static int _C_GROUP_HEADCOUNT_ERROR = 804;
+    public final static ApiCode GROUP_HEADCOUNT_ERROR = new ApiCode("此团参加人数已达上限", _C_GROUP_HEADCOUNT_ERROR);
+
+    public final static int _C_GROUP_CREATE_ERROR = 805;
+    public final static ApiCode GROUP_CREATE_ERROR = new ApiCode("您已购买过当前课文", _C_GROUP_CREATE_ERROR);
+
+    public final static int _C_JOIN_SHARE_ERROR = 806;
+    public final static ApiCode JOIN_SHARE_ERROR = new ApiCode("您当前没有助力资格", _C_JOIN_SHARE_ERROR);
+
+    protected ApiCode(String message, int code) {
+        super(code, message);
+    }
+}
+

+ 115 - 0
manage-common/src/main/java/cn/efunbox/manage/common/result/ApiResult.java

@@ -0,0 +1,115 @@
+package cn.efunbox.manage.common.result;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.Objects;
+
+public class ApiResult<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private boolean success;
+    private int code;
+    private int count;
+    private String message;
+    private T data;
+
+    public ApiResult() {
+        this.success = true;
+    }
+
+    public ApiResult(ApiCode apiCode) {
+        this(apiCode.getCode(),apiCode.getMessage());
+    }
+
+    private ApiResult(int code, String message) {
+        this.success = true;
+        this.code = code;
+        if(code != 200) {
+            this.success = false;
+        }
+
+        this.message = message;
+    }
+
+    private ApiResult(ApiCode apiCode, T data) {
+        this(apiCode.getCode(), apiCode.getMessage());
+        this.data = data;
+    }
+
+    private ApiResult(ApiCode apiCode, T data,Integer count) {
+        this(apiCode.getCode(), apiCode.getMessage());
+        this.data = data;
+        this.count = count;
+    }
+
+    public static ApiResult ok() {
+        return new ApiResult(ApiCode.OK);
+    }
+
+    public static ApiResult ok(Object value) {
+        return new ApiResult(ApiCode.OK, value);
+    }
+
+    public static ApiResult ok(Object value,Integer award) {
+        if (Objects.isNull(award)) {
+            award = 0;
+        }
+        return new ApiResult(ApiCode.OK, value,award);
+    }
+
+
+    public static ApiResult ok(Map<String, Object> data) {
+        return new ApiResult(ApiCode.OK, data);
+    }
+
+
+    public static ApiResult error(ApiCode code) {
+        return new ApiResult(code);
+    }
+
+    public static ApiResult error(ApiCode code, Object value) {
+        return new ApiResult(code, value);
+    }
+
+    public static ApiResult error(ApiCode code, Map<String, Object> data) {
+        return new ApiResult(code, data);
+    }
+
+    public boolean getSuccess() {
+        return this.success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public int getCode() {
+        return this.code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+    public int getCount() {
+        return this.count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public T getData() {
+        return this.data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+}

+ 198 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/BeanUtil.java

@@ -0,0 +1,198 @@
+package cn.efunbox.manage.common.utils;
+
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.cglib.beans.BeanMap;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+/**
+ * 
+ * 对象操作工具
+ * 
+ */
+public class BeanUtil {
+
+	/**
+	 * 缓存BeanCopier对象,加快对象浅拷贝效率
+	 */
+	private static final Map<String, BeanCopier> BEAN_COPIERS = new ConcurrentHashMap<>();
+
+	/**
+	 * 缓存BeanMap对象,加快Map和javaBean对象的转化
+	 */
+	private static final Map<String, BeanMap> BEAN_MAP = new ConcurrentHashMap<>();
+
+	private BeanUtil(){};
+	
+	/**
+	 * 浅拷贝 只拷贝相同属性名和类型的
+	 * 
+	 * @param srcObj
+	 *            被拷贝对象
+	 * 
+	 * @param destObj
+	 *            拷贝对象
+	 * 
+	 */
+	public static void copy(Object srcObj, Object destObj) {
+		if (srcObj == null || destObj == null) {
+			return;
+		}
+		String key = srcObj.getClass().getName() + destObj.getClass().getName();
+		BeanCopier copier = null;
+		if (BEAN_COPIERS.get(key)==null) {
+			synchronized (BeanUtil.class) {
+				if(BEAN_COPIERS.get(key)==null){
+					copier = BeanCopier.create(srcObj.getClass(), destObj.getClass(), false);
+					BEAN_COPIERS.put(key, copier);
+				}
+			}
+		} else {
+			copier = BEAN_COPIERS.get(key);
+		}
+		copier.copy(srcObj, destObj, null);
+	}
+
+	/**
+	 * 对象转map
+	 * @param obj
+	 * @param fieldNames 需要存入的属性名 属性名之间以,分隔
+	 * @param <T>
+	 * @return
+	 */
+	public static <T> Map<String, Object> getMapByField(T obj, String fieldNames) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		if (obj == null || fieldNames == null) {
+			return map;
+		}
+		BeanMap beanMap = null;
+		beanMap=getBeanMap(obj);
+		for (String f : fieldNames.split(",")) {
+			map.put(f, beanMap.get(f));
+		}
+		return map;
+	}
+
+	/**
+	 * 对象转map
+	 * @param obj
+	 * @param removefieldNames 不需要存入的属性名 属性名之间以,分隔
+	 * @param <T>
+	 * @return
+	 */
+	public static <T> Map<String, Object> getMapByRemoveField(T obj, String removefieldNames) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		if (obj == null) {
+			return map;
+		}
+		BeanMap beanMap = null;
+		beanMap=getBeanMap(obj);
+		for (Object key : beanMap.keySet()) {
+			map.put(key + "", beanMap.get(key));
+		}
+		if(removefieldNames!=null){
+			for(String key:removefieldNames.split(",")){
+				map.remove(key);
+			}
+		}
+		return map;
+	}
+
+	/**
+	 * 对象转map
+	 *
+	 * @param srcObj
+	 * @return
+	 */
+	public static Map<String, Object> getMap(Object srcObj) {
+		return getMapByRemoveField(srcObj, null);
+	}
+
+	/**
+	 * map转对象
+	 *
+	 * @param map
+	 * @param obj
+	 *            需要转换的空对象
+	 *
+	 * @return
+	 */
+	public static <T> T mapToObj(Map<String, Object> map, T obj) {
+		if (obj == null || map == null) {
+			return null;
+		}
+		BeanMap beanMap = null;
+		beanMap=getBeanMap(obj);
+		beanMap.putAll(map);
+		return obj;
+	}
+
+	/**
+	 * 对象集合转map集合
+	 *
+	 * @param objList
+	 * @return
+	 */
+	public static <T> List<Map<String, Object>> objectsToMaps(List<T> objList) {
+		List<Map<String, Object>> list = new ArrayList<>();
+		if (objList != null && objList.size() > 0) {
+			Map<String, Object> map = null;
+			T obj = null;
+			for (int i = 0, size = objList.size(); i < size; i++) {
+				obj = objList.get(i);
+				map = getMap(obj);
+				list.add(map);
+			}
+		}
+		return list;
+	}
+
+	/**
+	 * map集合转对象集合
+	 *
+	 * @param maps
+	 * @param clazz
+	 *            转换的对象class
+	 * @return
+	 */
+	public static <T> List<T> mapsToObjects(List<Map<String, Object>> maps, Class<T> clazz) {
+		List<T> list = new ArrayList<>();
+		if (maps != null && maps.size() > 0) {
+			Map<String, Object> map = null;
+			T bean = null;
+			try {
+				for (int i = 0, size = maps.size(); i < size; i++) {
+					map = maps.get(i);
+					bean = clazz.newInstance();
+					mapToObj(map, bean);
+					list.add(bean);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return list;
+	}
+
+	private static BeanMap getBeanMap(Object obj){
+		BeanMap beanMap=null;
+		String key=obj.getClass().getName();
+		if (BEAN_MAP.get(key)==null) {
+			synchronized (BeanUtil.class) {
+				if(BEAN_MAP.get(key)==null){
+					beanMap = BeanMap.create(obj);
+					BEAN_MAP.put(key, beanMap);
+				}
+			}
+		} else {
+			beanMap =BEAN_MAP.get(key);
+		}
+		return beanMap;
+	}
+
+}

+ 11 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/Constants.java

@@ -0,0 +1,11 @@
+package cn.efunbox.manage.common.utils;
+
+public class Constants {
+
+    public static final String QR_CODE_OSS_PREFIX = "cn:efunbox:manage:wx_qr_code_oss_";
+    public static String BIZ_CODE = "1008";
+    public static String APP_CODE = "1008";
+
+    public static final String EFUNBOX_ADMIN_TOKEN_PREFIX="cn:efunbox:manage:admin_token_";
+
+}

+ 389 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/HttpClientUtil.java

@@ -0,0 +1,389 @@
+package cn.efunbox.manage.common.utils;//package cn.efunbox.manage.common.utils;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import org.apache.commons.httpclient.*;
+//import org.apache.commons.httpclient.methods.GetMethod;
+//import org.apache.commons.httpclient.methods.PostMethod;
+//import org.apache.commons.httpclient.params.HttpMethodParams;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.util.StringUtils;
+//
+//import javax.servlet.http.Cookie;
+//import java.io.BufferedReader;
+//import java.io.IOException;
+//import java.io.InputStreamReader;
+//import java.net.SocketTimeoutException;
+//import java.net.URL;
+//import java.net.URLConnection;
+//import java.util.Iterator;
+//import java.util.List;
+//import java.util.Map;
+//
+///**
+// * HttpClientUtil
+// * Created by xusq on 2017/12/15.
+// */
+//public class HttpClientUtil {
+//
+//    private static final Logger logger = LoggerFactory.getLogger("HttpClientUtil");
+//
+//    public static JSONObject get(String url, Map params) {
+//        String result = doRequest(url,params,Boolean.FALSE);
+//
+//        if (StringUtils.isEmpty(result)) {
+//            return null;
+//        }
+//
+//        return JSON.parseObject(result);
+//    }
+//
+//    public static JSONObject getData(String url, Cookie[] cookies, Map params) {
+//        String result = doRequestCookie(url,cookies,params,Boolean.FALSE);
+//
+//        if (StringUtils.isEmpty(result)) {
+//            return null;
+//        }
+//
+//        return JSON.parseObject(result);
+//    }
+//
+//    public static JSONObject post(String url, Map params) {
+//        String result = doRequest(url,params,Boolean.TRUE);
+//
+//        if (StringUtils.isEmpty(result)) {
+//            return null;
+//        }
+//
+//        return JSON.parseObject(result);
+//    }
+//
+//    public static JSONObject postData(String url, Cookie[] cookies, Map params) {
+//        String result = doRequestCookie(url,cookies,params,Boolean.TRUE);
+//
+//        if (StringUtils.isEmpty(result)) {
+//            return null;
+//        }
+//
+//        return JSON.parseObject(result);
+//    }
+//
+//    private static String doRequest(String url, Map params, boolean isPost) {
+//        logger.debug("HTTP调用[" + (isPost?"POST":"GET") + "][" + url + "][" + params + "]");
+//
+//        HttpClient client = new HttpClient();
+//        HttpMethod httpMethod = null;
+//
+//        String result = "";
+//        try {
+//            if(isPost) {
+//                httpMethod = new PostMethod(url);
+//                if (params != null && params.size() > 0) {
+//                    Iterator paramKeys = params.keySet().iterator();
+//                    NameValuePair[] form = new NameValuePair[params.size()];
+//                    int formIndex = 0;
+//                    while(paramKeys.hasNext()) {
+//                        String key = (String)paramKeys.next();
+//                        Object value = params.get(key);
+//                        if(value != null && value instanceof String && !value.equals("")) {
+//                            form[formIndex] = new NameValuePair(key, (String)value);
+//                            formIndex++;
+//                        } else if(value != null && value instanceof String[] &&
+//                                ((String[])value).length > 0) {
+//                            NameValuePair[] tempForm =
+//                                    new NameValuePair[form.length + ((String[])value).length - 1];
+//                            for(int i=0; i<formIndex; i++) {
+//                                tempForm[i] = form[i];
+//                            }
+//                            form = tempForm;
+//                            for(String v : (String[])value) {
+//                                form[formIndex] = new NameValuePair(key, (String)v);
+//                                formIndex++;
+//                            }
+//                        }
+//                    }
+//                    ((PostMethod)httpMethod).setRequestBody(form);
+//                }
+//
+//            } else {
+//                if(params != null && params.size() > 0) {
+//                    Iterator paramKeys = params.keySet().iterator();
+//                    StringBuffer getUrl = new StringBuffer(url.trim());
+//                    if(url.trim().indexOf("?") > -1) {
+//                        if(url.trim().indexOf("?") < url.trim().length()-1 &&
+//                                url.trim().indexOf("&")  < url.trim().length()-1) {
+//                            getUrl.append("&");
+//                        }
+//                    } else {
+//                        getUrl.append("?");
+//                    }
+//                    while(paramKeys.hasNext()) {
+//                        String key = (String)paramKeys.next();
+//                        Object value = params.get(key);
+//                        if(value != null && value instanceof String && !value.equals("")) {
+//                            getUrl.append(key).append("=").append(value).append("&");
+//                        } else if(value != null && value instanceof String[] &&
+//                                ((String[])value).length > 0) {
+//                            for(String v : (String[])value) {
+//                                getUrl.append(key).append("=").append(v).append("&");
+//                            }
+//                        }
+//                    }
+//                    if(getUrl.lastIndexOf("&") == getUrl.length()-1) {
+//                        httpMethod = new GetMethod(getUrl.substring(0, getUrl.length()-1));
+//                    } else {
+//                        httpMethod = new GetMethod(getUrl.toString());
+//                    }
+//                } else {
+//                    httpMethod = new GetMethod(url);
+//                }
+//            }
+//
+//            client.executeMethod(httpMethod);
+//
+//            result = httpMethod.getResponseBodyAsString();
+//            logger.info(result);
+//            BufferedReader manage = new BufferedReader(new InputStreamReader(
+//                    httpMethod.getResponseBodyAsStream(),"ISO-8859-1"));
+//            String line = null;
+//            String html = null;
+//            while((line = manage.readLine()) != null){
+//                if(html == null) {
+//                    html = "";
+//                } else {
+//                    html += "\r\n";
+//                }
+//                html += line;
+//            }
+//            if(html != null) {
+//                result = new String(html.getBytes("ISO-8859-1"), "UTF-8");
+//            }
+//        } catch (SocketTimeoutException e) {
+//            logger.error("连接超时[" + url + "]",e);
+//        } catch (java.net.ConnectException e) {
+//            logger.error("连接失败[" + url + "]",e);
+//        } catch (Exception e) {
+//            logger.error("连接时出现异常[" + url + "]",e);
+//        } finally {
+//            if (httpMethod != null) {
+//                try {
+//                    httpMethod.releaseConnection();
+//                } catch (Exception e) {
+//                    logger.error("释放网络连接失败[" + url + "]",e);
+//                }
+//            }
+//        }
+//
+//        return result;
+//    }
+//
+//    private static String doRequestCookie(String url, Cookie[] cookies, Map params, boolean isPost) {
+//        logger.debug("HTTP调用[" + (isPost?"POST":"GET") + "][" + url + "][" + params + "]");
+//
+//        HttpClient client = new HttpClient();
+//        HttpMethod httpMethod = null;
+//
+//        String result = "";
+//        try {
+//            if(isPost && params != null && params.size() > 0) {
+//                Iterator paramKeys = params.keySet().iterator();
+//                httpMethod = new PostMethod(url);
+////                httpMethod.setRequestHeader("sign", "1");
+////                httpMethod.setRequestHeader("uid", "1");
+////                httpMethod.setRequestHeader("requestId", "1");
+//                NameValuePair[] form = new NameValuePair[params.size()];
+//                int formIndex = 0;
+//                while(paramKeys.hasNext()) {
+//                    String key = (String)paramKeys.next();
+//                    Object value = params.get(key);
+//                    if(value != null && value instanceof String && !value.equals("")) {
+//                        form[formIndex] = new NameValuePair(key, (String)value);
+//                        formIndex++;
+//                    } else if(value != null && value instanceof String[] &&
+//                            ((String[])value).length > 0) {
+//                        NameValuePair[] tempForm =
+//                                new NameValuePair[form.length + ((String[])value).length - 1];
+//                        for(int i=0; i<formIndex; i++) {
+//                            tempForm[i] = form[i];
+//                        }
+//                        form = tempForm;
+//                        for(String v : (String[])value) {
+//                            form[formIndex] = new NameValuePair(key, (String)v);
+//                            formIndex++;
+//                        }
+//                    }
+//                }
+//                ((PostMethod)httpMethod).setRequestBody(form);
+//            } else {
+//                if(params != null && params.size() > 0) {
+//                    Iterator paramKeys = params.keySet().iterator();
+//                    StringBuffer getUrl = new StringBuffer(url.trim());
+//                    if(url.trim().indexOf("?") > -1) {
+//                        if(url.trim().indexOf("?") < url.trim().length()-1 &&
+//                                url.trim().indexOf("&")  < url.trim().length()-1) {
+//                            getUrl.append("&");
+//                        }
+//                    } else {
+//                        getUrl.append("?");
+//                    }
+//                    while(paramKeys.hasNext()) {
+//                        String key = (String)paramKeys.next();
+//                        Object value = params.get(key);
+//                        if(value != null && value instanceof String && !value.equals("")) {
+//                            getUrl.append(key).append("=").append(value).append("&");
+//                        } else if(value != null && value instanceof String[] &&
+//                                ((String[])value).length > 0) {
+//                            for(String v : (String[])value) {
+//                                getUrl.append(key).append("=").append(v).append("&");
+//                            }
+//                        }
+//                    }
+//                    if(getUrl.lastIndexOf("&") == getUrl.length()-1) {
+//                        httpMethod = new GetMethod(getUrl.substring(0, getUrl.length()-1));
+//                    } else {
+//                        httpMethod = new GetMethod(getUrl.toString());
+//                    }
+//                } else {
+//                    httpMethod = new GetMethod(url);
+//                }
+//            }
+//
+////            httpMethod.releaseConnection();//这里最好把之前的资源放掉
+////            cookies
+//            for (Cookie cookie : cookies) {
+//                if(cookie.getName().equals("uid")) {
+//                    httpMethod.setRequestHeader(cookie.getName(), cookie.getValue());
+////                    httpMethod.setRequestHeader(cookie.getName(), "e7e0d43a-36b1-4e71-a3a3-61469c90d0a2");
+//                }
+//                if(cookie.getName().equals("sign")) {
+//                    httpMethod.setRequestHeader(cookie.getName(), cookie.getValue());
+//                }
+//                if(cookie.getName().equals("requestId")) {
+//                    httpMethod.setRequestHeader(cookie.getName(), cookie.getValue());
+//                }
+//            }
+//
+//            client.executeMethod(httpMethod);
+//
+//            result = httpMethod.getResponseBodyAsString();
+//            logger.info(result);
+//            BufferedReader manage = new BufferedReader(new InputStreamReader(
+//                    httpMethod.getResponseBodyAsStream(),"ISO-8859-1"));
+//            String line = null;
+//            String html = null;
+//            while((line = manage.readLine()) != null){
+//                if(html == null) {
+//                    html = "";
+//                } else {
+//                    html += "\r\n";
+//                }
+//                html += line;
+//            }
+//            if(html != null) {
+//                result = new String(html.getBytes("ISO-8859-1"), "UTF-8");
+//            }
+//        } catch (SocketTimeoutException e) {
+//            logger.error("连接超时[" + url + "]",e);
+//        } catch (java.net.ConnectException e) {
+//            logger.error("连接失败[" + url + "]",e);
+//        } catch (Exception e) {
+//            logger.error("连接时出现异常[" + url + "]",e);
+//        } finally {
+//            if (httpMethod != null) {
+//                try {
+//                    httpMethod.releaseConnection();
+//                } catch (Exception e) {
+//                    logger.error("释放网络连接失败[" + url + "]",e);
+//                }
+//            }
+//        }
+//
+//        return result;
+//    }
+//
+//    /**
+//     * post 发送json请求
+//     *
+//     * @param url
+//     * @param jsonStr
+//     * @return
+//     */
+//    @SuppressWarnings("deprecation")
+//    public static byte[] postJsonRequest(String url, String jsonStr) {
+//        PostMethod method = new PostMethod(url);
+//        try {
+//            HttpClient client = new HttpClient();
+//            method.setRequestHeader("Content-type", "application/json; charset=UTF-8");
+//            method.setRequestHeader("Accept", "application/json; charset=UTF-8");
+//            // 设置为默认的重试策略
+//            method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
+//
+//            method.setRequestBody(jsonStr);
+//            client.executeMethod(method);
+//            return method.getResponseBody();
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        } finally {
+//            method.releaseConnection();
+//        }
+//        return null;
+//    }
+//
+//    /**
+//     * get请求
+//     *
+//     * @param url
+//     * @return
+//     * @throws IOException
+//     * @throws HttpException
+//     */
+//    public static String getRequest(String url) {
+//        String result = "";
+//        BufferedReader in = null;
+//        try {
+//            String urlNameString = url;
+//            URL realUrl = new URL(urlNameString);
+//            // 打开和URL之间的连接
+//            URLConnection connection = realUrl.openConnection();
+//            // 设置通用的请求属性
+//            connection.setRequestProperty("accept", "*/*");
+//            connection.setRequestProperty("connection", "Keep-Alive");
+//            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+//            // 建立实际的连接
+//            connection.connect();
+//            // 获取所有响应头字段
+//            Map<String, List<String>> map = connection.getHeaderFields();
+//            // 遍历所有的响应头字段
+//            for (String key : map.keySet()) {
+//                System.out.println(key + "--->" + map.get(key));
+//            }
+//            // 定义 BufferedReader输入流来读取URL的响应
+//            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+//            String line;
+//            while ((line = in.readLine()) != null) {
+//                result += line;
+//            }
+//        } catch (Exception e) {
+//            System.out.println("发送GET请求出现异常!" + e);
+//            e.printStackTrace();
+//        }
+//        // 使用finally块来关闭输入流
+//        finally {
+//            try {
+//                if (in != null) {
+//                    in.close();
+//                }
+//            } catch (Exception e2) {
+//                e2.printStackTrace();
+//            }
+//        }
+//        return result;
+//    }
+//
+//    public static void main(String[] args) throws Exception {
+//
+//        String s = HttpClientUtil.doRequest("http://www.baidu.com", null, false);
+//        System.out.println(s);
+//    }
+//}

+ 187 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/HttpUtils.java

@@ -0,0 +1,187 @@
+package cn.efunbox.manage.common.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import java.io.*;
+import java.net.ConnectException;
+import java.net.URL;
+import java.util.UUID;
+
+public class HttpUtils {
+	private static Logger LOGGER = LoggerFactory.getLogger(HttpUtils.class);
+
+	public static String doRequest(String requestUrl, String requestMethod, String paramBody) {
+
+		String log = "UUID = "+UUID.randomUUID() + " ; HttpUtils : ";
+
+		LOGGER.info(log + " http weixin api request >>> request = " + requestUrl + " ;paramBody = " + paramBody);
+
+		String result = null;
+
+		try {
+
+			HttpsURLConnection httpUrlConn = setSSLContext(requestUrl,requestMethod);
+
+
+			// 当有数据需要提交时
+			if (null != paramBody) {
+				OutputStream outputStream = httpUrlConn.getOutputStream();
+				// 注意编码格式,防止中文乱码
+				outputStream.write(paramBody.getBytes("UTF-8"));
+				outputStream.close();
+			}
+
+			result = connection2String(httpUrlConn);
+
+			LOGGER.info(log + " http weixin api result >>> request = " + requestUrl + " ;paramBody = " + paramBody + " ;result" + result);
+		} catch (ConnectException ce) {
+			LOGGER.error(log + "Weixin request { " + requestUrl + " } connection timed out. paramBody : " + paramBody + ce.getMessage(),ce);
+		} catch (Exception e) {
+			LOGGER.error(log + "http request error:{} requestUrl : " + requestUrl + "paramBody : " + paramBody, e);
+		} finally {
+			return result;
+		}
+
+	}
+
+
+	public static byte[] doRequestByte(String requestUrl, String requestMethod, String paramBody) {
+
+		String log = "UUID = "+UUID.randomUUID() + " ; HttpUtils : ";
+
+		LOGGER.info(log + " http weixin api request >>> request = " + requestUrl + " ;paramBody = " + paramBody);
+
+		byte[] result = null;
+
+		try {
+
+			HttpsURLConnection httpUrlConn = setSSLContext(requestUrl,requestMethod);
+
+
+			// 当有数据需要提交时
+			if (null != paramBody) {
+				OutputStream outputStream = httpUrlConn.getOutputStream();
+				// 注意编码格式,防止中文乱码
+				outputStream.write(paramBody.getBytes("UTF-8"));
+				outputStream.close();
+			}
+
+			InputStream inputStream = httpUrlConn.getInputStream();
+			ByteArrayOutputStream outstream = new ByteArrayOutputStream(httpUrlConn.getContentLength());
+			byte[] buffer = new byte[4096];
+			int len;
+			while ((len = inputStream.read(buffer)) > 0) {
+				outstream.write(buffer, 0, len);
+			}
+			outstream.close();
+			result = outstream.toByteArray();
+
+			LOGGER.info(log + " http weixin api result >>> request = " + requestUrl + " ;paramBody = " + paramBody );
+		} catch (ConnectException ce) {
+			LOGGER.error(log + "Weixin request { " + requestUrl + " } connection timed out. paramBody : " + paramBody + ce.getMessage(),ce);
+		} catch (Exception e) {
+			LOGGER.error(log + "http request error:{} requestUrl : " + requestUrl + "paramBody : " + paramBody, e);
+		}
+
+		return result;
+	}
+
+	private static String connection2String(HttpsURLConnection httpUrlConn) {
+
+
+		StringBuffer buffer = new StringBuffer();
+		// 将返回的输入流转换成字符串
+		BufferedReader bufferedReader = null;
+		try {
+
+			bufferedReader = new BufferedReader(new InputStreamReader(httpUrlConn.getInputStream(), "utf-8"));
+
+
+			String str = null;
+			while ((str = bufferedReader.readLine()) != null) {
+				buffer.append(str);
+			}
+
+		} catch (IOException e) {
+			LOGGER.error("HttpsURLConnection2String is error," + e.getMessage(), e);
+		} finally {
+			if (bufferedReader != null) {
+				try {
+					bufferedReader.close();
+				} catch (IOException e) {
+					LOGGER.error("bufferedReader close error," + e.getMessage(), e);
+				}
+			}
+		}
+
+		httpUrlConn.disconnect();
+
+		String result = buffer.toString();
+
+		return result;
+	}
+
+	public static String doGet(String requestUrl, String paramBody) {
+		return doRequest(requestUrl, "GET", paramBody);
+	}
+
+	public static String doPost(String requestUrl, String paramBody) {
+		return doRequest(requestUrl, "POST", paramBody);
+	}
+
+	public static String doRequest(String requestUrl, String requestMethod) {
+
+		String result = null;
+
+		String log = "UUID = "+UUID.randomUUID();
+		LOGGER.info(log + " http weixin api request >>> request = " + requestUrl);
+
+		try {
+			HttpsURLConnection httpUrlConn = setSSLContext(requestUrl,requestMethod);
+			// 将返回的输入流转换成字符串
+			result = connection2String(httpUrlConn);
+
+			LOGGER.info(log + " http weixin api result >>> request = " + requestUrl + " ;result" + result);
+		} catch (ConnectException ce) {
+			LOGGER.error(log + " Weixin request {" + requestUrl + "} connection timed out." + ce.getMessage(),ce);
+		} catch (Exception e) {
+			LOGGER.error(log + " http request error:{} requestUrl :" + requestUrl + e.getMessage(), e);
+		}
+
+		return result;
+	}
+
+
+	private static HttpsURLConnection setSSLContext(String requestUrl,String requestMethod) throws Exception{
+
+		HttpsURLConnection httpUrlConn = null;
+		// 创建SSLContext对象,并使用我们指定的信任管理器初始化
+		TrustManager[] tm = { new MyX509TrustManager() };
+		SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+		sslContext.init(null, tm, new java.security.SecureRandom());
+		// 从上述SSLContext对象中得到SSLSocketFactory对象
+		SSLSocketFactory ssf = sslContext.getSocketFactory();
+
+		URL url = new URL(requestUrl);
+		httpUrlConn = (HttpsURLConnection) url.openConnection();
+		httpUrlConn.setSSLSocketFactory(ssf);
+
+		httpUrlConn.setDoOutput(true);
+		httpUrlConn.setDoInput(true);
+		httpUrlConn.setUseCaches(false);
+		// 设置请求方式(GET/POST)
+		httpUrlConn.setRequestMethod(requestMethod);
+
+		if ("GET".equalsIgnoreCase(requestMethod)) {
+			httpUrlConn.connect();
+		}
+
+
+		return httpUrlConn;
+	}
+}

+ 104 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/IaasRequestUtils.java

@@ -0,0 +1,104 @@
+package cn.efunbox.manage.common.utils;
+
+
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+
+/**
+ * IaasRequestUtils
+ * Created by xusq on 2017/10/19.
+ */
+@Slf4j
+public class IaasRequestUtils {
+
+    private IaasRequestUtils(){}
+
+
+    public static HttpHeaders map2HttpHeaders(Map<String,String> headerMap){
+
+        ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (null == attrs) {
+            log.error("error operation, is not in RequestContext");
+            return null;
+        }
+        HttpServletRequest request = attrs.getRequest();
+
+
+        String dist=request.getParameter("dist");
+        String appCode=request.getParameter("appCode");
+        String appVer=request.getParameter("appver");
+        String platform=request.getParameter("platform");
+        String os=request.getParameter("os");
+
+        String iaasDist = "0001";
+
+        if (StringUtils.isNotBlank(dist)) {
+            iaasDist = dist;
+        } else if (StringUtils.isNotBlank(appCode)){
+            iaasDist = appCode;
+        }
+
+        HttpHeaders httpHeaders = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        httpHeaders.setContentType(type);
+        httpHeaders.add("dist",iaasDist);
+        httpHeaders.add("Accept", MediaType.APPLICATION_JSON.toString());
+        httpHeaders.add("bizCode", Constants.BIZ_CODE);
+        httpHeaders.add("appCode", Constants.APP_CODE);
+        if (StringUtils.isNotBlank(appVer)) {
+            httpHeaders.add("appVer",appVer);
+        } else {
+            httpHeaders.add("appVer","2.0");
+        }
+        if (StringUtils.isNotBlank(os)) {
+            httpHeaders.add("os",os);
+        } else {
+            httpHeaders.add("os","0");
+        }if (StringUtils.isNotBlank(platform)) {
+            httpHeaders.add("platform",platform);
+        } else {
+            httpHeaders.add("platform","3");
+        }
+        httpHeaders.add("userIp", IpUtils.getClientIpAddress(request));
+        System.out.println("userIp====="+IpUtils.getClientIpAddress(attrs.getRequest()));
+        String test=httpHeaders.getFirst("platform");
+        System.out.println("platform======="+test);
+        if (CollectionUtils.isEmpty(headerMap)) {
+            return httpHeaders;
+        }
+
+        for (String key : headerMap.keySet()) {
+            httpHeaders.add(key,headerMap.get(key));
+        }
+
+        return httpHeaders;
+    }
+
+    public static ApiResult checkIaasResult(ResponseEntity<ApiResult> responseEntity){
+
+        HttpStatus statusCode = responseEntity.getStatusCode();
+        log.info("request iaas return statusCode : {}",statusCode);
+        log.info("request iaas result : {}",JSON.toJSONString(responseEntity.getBody()));
+        if (HttpStatus.OK.equals(statusCode)) {
+
+            return responseEntity.getBody();
+        } else {
+            return ApiResult.error(ApiCode.SERVER_ERROR);
+        }
+    }
+
+}

+ 68 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/IpUtils.java

@@ -0,0 +1,68 @@
+package cn.efunbox.manage.common.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * IpUtils
+ * Created by xusq on 2017/10/19.
+ */
+@Slf4j
+public class IpUtils {
+    private IpUtils(){}
+
+    public static String getIp(HttpServletRequest request) {
+
+        String ip = request.getHeader("X-Forwarded-For");
+        if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
+            //多次反向代理后会有多个ip值,第一个ip才是真实ip
+            int index = ip.indexOf(",");
+            if(index != -1){
+                return ip.substring(0,index);
+            }else{
+                return ip;
+            }
+        }
+        ip = request.getHeader("X-Real-IP");
+        if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
+            return ip;
+        }
+        return request.getRemoteAddr();
+    }
+    public static String getIp() {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        return getIp(request);
+    }
+    private static final String[] HEADERS_TO_TRY = {
+            "X-Forwarded-For",
+            "Proxy-Client-IP",
+            "WL-Proxy-Client-IP",
+            "HTTP_X_FORWARDED_FOR",
+            "HTTP_X_FORWARDED",
+            "HTTP_X_CLUSTER_CLIENT_IP",
+            "HTTP_CLIENT_IP",
+            "HTTP_FORWARDED_FOR",
+            "HTTP_FORWARDED",
+            "HTTP_VIA",
+            "REMOTE_ADDR",
+            "X-Real-IP"};
+
+    /***
+     * 获取客户端ip地址(可以穿透代理)
+     * @param request
+     * @return
+     */
+    public static String getClientIpAddress(HttpServletRequest request) {
+        for (String header : HEADERS_TO_TRY) {
+            String ip = request.getHeader(header);
+            if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
+                return ip;
+            }
+        }
+        return request.getRemoteAddr();
+    }
+}

+ 71 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/MD5.java

@@ -0,0 +1,71 @@
+package cn.efunbox.manage.common.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class MD5 {
+    public MD5() {
+    }
+
+    public static final String byte2hexString(byte[] bytes) {
+        StringBuffer buf = new StringBuffer(bytes.length * 2);
+        for (int i = 0; i < bytes.length; i++) {
+            if (((int) bytes[i] & 0xff) < 0x10) {
+                buf.append("0");
+            }
+            buf.append(Long.toString((int) bytes[i] & 0xff, 16));
+        }
+        return buf.toString();
+    }
+
+    /**
+     * md5加密
+     * @param sourceString
+     * @return
+     */
+    public static String MD5Encode(String sourceString) {
+        String resultString = null;
+        try {
+            resultString = new String(sourceString);
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            resultString = byte2hexString(md.digest(resultString.getBytes()));
+        } catch (Exception ex) {
+        }
+        return resultString;
+    }
+
+    public static String getMD5Str(String str) {
+        MessageDigest messageDigest = null;
+
+        try {
+            messageDigest = MessageDigest.getInstance("MD5");
+
+            messageDigest.reset();
+
+            messageDigest.update(str.getBytes("UTF-8"));
+        } catch (NoSuchAlgorithmException e) {
+            System.out.println("NoSuchAlgorithmException caught!");
+            System.exit(-1);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        byte[] byteArray = messageDigest.digest();
+
+        StringBuffer md5StrBuff = new StringBuffer();
+
+        for (int i = 0; i < byteArray.length; i++) {
+            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
+                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
+            else
+                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
+        }
+
+        return md5StrBuff.toString();
+    }
+
+    public static void main(String[] args) throws UnsupportedEncodingException {
+    }
+
+}

+ 23 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/MyX509TrustManager.java

@@ -0,0 +1,23 @@
+package cn.efunbox.manage.common.utils;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * 证书信任管理器(用于https请求)
+ * 
+ * @author 张超
+ * @date 2013-08-08  
+ */
+public class MyX509TrustManager implements X509TrustManager {
+
+	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+	}
+	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+	}
+	public X509Certificate[] getAcceptedIssuers() {
+
+		return null;
+	}
+}

+ 13 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/PutFilter.java

@@ -0,0 +1,13 @@
+package cn.efunbox.manage.common.utils;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.HttpPutFormContentFilter;
+
+/**
+ * PutFilter
+ * Created by wangys on 2018/7/17
+ */
+
+@Component
+public class PutFilter extends HttpPutFormContentFilter {
+}

+ 161 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/RSAEncrypt.java

@@ -0,0 +1,161 @@
+package cn.efunbox.manage.common.utils;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import sun.misc.BASE64Decoder;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import java.io.IOException;
+import java.security.*;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+
+/**
+ * RSA加解密方法 RSA生成公钥和私钥 RSA从文件中读取公钥和私钥 RSA从字符串中读取公钥和私钥
+ *
+ * @author guixin
+ */
+@SuppressWarnings("restriction")
+public class RSAEncrypt {
+
+    private static final String DEFAULT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClXd7uSEQEPAMI842Qvt3vD6oa"
+            + "\r"
+            + "nuJk+bKMSs/AwpmIkyjfy1xeK1C9P5XfDxFXlXUWkClhX0yCiKEdeSWf6XgwtZX9"
+            + "\r"
+            + "8//2mb79FhBTZUgFerRNFEQc66RbgClnD3sNg8Svdil281UIz9EuDPQ5dRRdajmj"
+            + "\r" + "dAGIPGrIZVIZHtybYwIDAQAB" + "\r";
+
+    // 字节数据转字符串专用集合
+    private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6',
+            '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+    private final static BouncyCastleProvider bcp = new BouncyCastleProvider();
+    private RSAPublicKey publicKey;// 自动生成的公钥
+
+    public RSAPublicKey getPublicKey() {
+        return publicKey;
+    }
+
+    /**
+     * 随机生成密钥对
+     *
+     * @throws NoSuchAlgorithmException
+     */
+    public void genKeyPair() throws NoSuchAlgorithmException {
+        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
+        keyPairGen.initialize(1024, new SecureRandom());
+        KeyPair keyPair = keyPairGen.generateKeyPair();
+        this.publicKey = (RSAPublicKey) keyPair.getPublic();
+    }
+
+    /**
+     * 加密过程
+     *
+     * @param publicKey     公钥
+     * @param plainTextData 明文数据
+     * @return
+     * @throws Exception 加密过程中的异常信息
+     */
+    public static byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData)
+            throws Exception {
+        if (publicKey == null) {
+            throw new Exception("加密公钥为空, 请设置");
+        }
+
+        Cipher cipher = null;
+        try {
+            cipher = Cipher.getInstance("RSA", bcp);
+            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+            return cipher.doFinal(plainTextData);
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("无此加密算法");
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+            return null;
+        } catch (InvalidKeyException e) {
+            throw new Exception("加密公钥非法,请检查");
+        } catch (IllegalBlockSizeException e) {
+            throw new Exception("明文长度非法");
+        } catch (BadPaddingException e) {
+            throw new Exception("明文数据已损坏");
+        }
+    }
+
+    /**
+     * 字节数据转十六进制字符串
+     *
+     * @param data 输入数据
+     * @return 十六进制内容
+     */
+    public static String byteArrayToString(byte[] data) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < data.length; i++) {
+            stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);
+            stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);
+            if (i < data.length - 1) {
+                stringBuilder.append(' ');
+            }
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 从字符串中加载公钥
+     *
+     * @param publicKeyStr 公钥数据字符串
+     * @throws Exception 加载公钥时产生的异常
+     */
+    public static RSAPublicKey loadPublicKeyByStr(String publicKeyStr)
+            throws Exception {
+        try {
+            BASE64Decoder base64Decoder = new BASE64Decoder();
+            byte[] buffer = base64Decoder.decodeBuffer(publicKeyStr);
+            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
+            return (RSAPublicKey) keyFactory.generatePublic(keySpec);
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("无此算法");
+        } catch (InvalidKeySpecException e) {
+            throw new Exception("公钥非法");
+        } catch (IOException e) {
+            throw new Exception("公钥数据内容读取错误");
+        } catch (NullPointerException e) {
+            throw new Exception("公钥数据为空");
+        }
+    }
+
+    /**
+     * 对字符串进行加密处理
+     *
+     * @param plainTextData
+     * @return
+     * @throws Exception
+     */
+    public static String efunoxRSAEncrypt(String plainTextData) {
+        if (StringUtils.isNotBlank(plainTextData)) {
+            RSAPublicKey publicKey = null;
+            try {
+                publicKey = RSAEncrypt
+                        .loadPublicKeyByStr(RSAEncrypt.DEFAULT_PUBLIC_KEY);
+
+                byte[] mi = RSAEncrypt.encrypt(publicKey, plainTextData.getBytes());
+                return Base64.encodeBase64String(mi);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    public static void main(String[] args) throws Exception {
+        // 测试字符串
+        String plainTextData = "Test String chaijunkun";
+        String str = efunoxRSAEncrypt(plainTextData);
+        System.out.println(str);
+    }
+}

+ 175 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/SmsDemo.java

@@ -0,0 +1,175 @@
+package cn.efunbox.manage.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created on 17/6/7.
+ * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过
+ * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
+ * 工程依赖了2个jar包(存放在工程的libs目录下)
+ * 1:aliyun-java-sdk-core.jar
+ * 2:aliyun-java-sdk-dysmsapi.jar
+ *
+ * 备注:Demo工程编码采用UTF-8
+ * 国际短信发送请勿参照此DEMO
+ */
+@Slf4j
+public class SmsDemo {
+
+    //产品名称:云通信短信API产品,开发者无需替换
+    static final String product = "Dysmsapi";
+    //产品域名,开发者无需替换
+    static final String domain = "dysmsapi.aliyuncs.com";
+
+    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
+    static final String accessKeyId = "LTAIKVC7LxUTi9tO";
+    static final String accessKeySecret = "4mZUJGWfwbBZUkmYjVJJTAF6uNEKgf";
+
+    public static String sendSms(String phone) throws ClientException {
+
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+        try {
+            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象-具体描述见控制台-文档部分内容
+        SendSmsRequest request = new SendSmsRequest();
+        //必填:待发送手机号
+        request.setPhoneNumbers(phone);
+        //必填:短信签名-可在短信控制台中找到
+        request.setSignName("义方教育");
+        //必填:短信模板-可在短信控制台中找到
+        request.setTemplateCode("SMS_92260012");
+        String code=Code();
+        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+        request.setTemplateParam("{\"name\":\"Tom\", \"code\":"+code+"}");
+
+        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
+        //request.setSmsUpExtendCode("90997");
+
+        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+        request.setOutId("yourOutId");
+
+        //hint 此处可能会抛出异常,注意catch
+        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+        log.info("sendSms response : {}", JSON.toJSONString(sendSmsResponse));
+
+        if ("OK".equalsIgnoreCase(sendSmsResponse.getCode())) {
+            return code;
+        }
+
+        return null;
+    }
+
+
+    public static QuerySendDetailsResponse querySendDetails(String bizId, String phone) throws ClientException {
+
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象
+        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
+        //必填-号码
+        request.setPhoneNumber(phone);
+        //可选-流水号
+        request.setBizId(bizId);
+        //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
+        SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
+        request.setSendDate(ft.format(new Date()));
+        //必填-页大小
+        request.setPageSize(10L);
+        //必填-当前页码从1开始计数
+        request.setCurrentPage(1L);
+
+        //hint 此处可能会抛出异常,注意catch
+        QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
+
+        return querySendDetailsResponse;
+    }
+
+    /**
+     * 验证码的生成
+     * @return
+     */
+    public static String Code(){
+        return String.valueOf((int)(Math.random()*9000)+1000);
+    }
+    
+    public static void main(String[] args) throws ClientException, InterruptedException {
+
+        for(int i = 0; i< 1000; i++){
+            System.out.println(Code());
+        }
+
+//    	String phone="18611822573";
+//    	System.out.println(Code());
+//        //发短信
+////        SendSmsResponse response = sendSms(phone);
+//        String response = sendSms(phone);
+
+
+//        System.out.println("短信接口返回的数据----------------");
+//        System.out.println("Code=" + response.getCode());
+//        System.out.println("Message=" + response.getMessage());
+//        System.out.println("RequestId=" + response.getRequestId());
+//        System.out.println("BizId=" + response.getBizId());
+//
+//        Thread.sleep(3000L);
+//       // String phone="";
+//        //查明细
+//        if(response.getCode() != null && response.getCode().equals("OK")) {
+//            QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId(),phone);
+//            System.out.println("短信明细查询接口返回数据----------------");
+//            System.out.println("Code=" + querySendDetailsResponse.getCode());
+//            System.out.println("Message=" + querySendDetailsResponse.getMessage());
+//            int i = 0;
+//            for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
+//            {
+//                System.out.println("SmsSendDetailDTO["+i+"]:");
+//                System.out.println("Content=" + smsSendDetailDTO.getContent());
+//                System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
+//                System.out.println("OutId=" + smsSendDetailDTO.getOutId());
+//                System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
+//                System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
+//                System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
+//                System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
+//                System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
+//            	String regEx="[^0-9]";
+//            	Pattern p = Pattern.compile(regEx);
+//            	Matcher m = p.matcher(smsSendDetailDTO.getContent());
+//            	String sign = m.replaceAll("").trim();
+//            	System.out.println("验证码-===="+sign);
+//            }
+//            System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
+//            System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
+//        }
+
+    }
+}

+ 60 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/SmsUtil.java

@@ -0,0 +1,60 @@
+package cn.efunbox.manage.common.utils;
+
+import com.aliyuncs.exceptions.ClientException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class SmsUtil {
+
+    public static String sendMsg(String mobile,RedisTemplate<String,String> redisTemplate){
+        String code= null;
+        ValueOperations<String,String> valueOperations=redisTemplate.opsForValue();
+        if(valueOperations.get(mobile)!=null){
+            return "buzy";
+        }
+        try {
+            code = SmsDemo.sendSms(mobile);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+
+        if (StringUtils.isBlank(code)) {
+            return null;
+        }
+
+
+        valueOperations.set(mobile,code,2,TimeUnit.MINUTES);
+        //redisTemplate.expire(mobile,2, TimeUnit.MINUTES);
+
+       /* if(code.getCode()!= null && code.getCode().equals("OK")) {
+            QuerySendDetailsResponse querySendDetailsResponse = null;
+            try {
+                querySendDetailsResponse = SmsDemo.querySendDetails(code.getBizId(),mobile);
+            } catch (ClientException e) {
+                e.printStackTrace();
+            }
+            if (Objects.isNull(querySendDetailsResponse)) {
+                return null;
+            }
+            if (CollectionUtils.isEmpty(querySendDetailsResponse.getSmsSendDetailDTOs())) {
+                return null;
+            }
+            QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO=querySendDetailsResponse.getSmsSendDetailDTOs().get(0);
+            String regEx="[^0-9]";
+            Pattern p = Pattern.compile(regEx);
+            Matcher m = p.matcher(smsSendDetailDTO.getContent());
+            sign= m.replaceAll("").trim();
+            valueOperations.set(mobile,sign);
+            redisTemplate.expire(mobile,2, TimeUnit.MINUTES);
+            System.out.println("验证码-===="+sign);
+        }*/
+        System.out.println("验证码-===="+code);
+        return code;
+
+    }
+}

+ 198 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/SnowflakeIdUtil.java

@@ -0,0 +1,198 @@
+package cn.efunbox.manage.common.utils;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Twitter_Snowflake<br>
+ * SnowFlake的结构如下(每部分用-分开):<br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
+ * 加起来刚好64位,为一个Long型。<br>
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ */
+public class SnowflakeIdUtil {
+
+    private static volatile SnowflakeIdUtil singleton = null;
+    // ==============================Fields===========================================
+    /** 开始时间截 (2015-01-01) */
+    private final long twepoch = 1420041600000L;
+
+    /** 机器id所占的位数 */
+    private final long workerIdBits = 5L;
+
+    /** 数据标识id所占的位数 */
+    private final long datacenterIdBits = 5L;
+
+    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    /** 支持的最大数据标识id,结果是31 */
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+    /** 序列在id中占的位数 */
+    private final long sequenceBits = 12L;
+
+    /** 机器ID向左移12位 */
+    private final long workerIdShift = sequenceBits;
+
+    /** 数据标识id向左移17位(12+5) */
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+    /** 时间截向左移22位(5+5+12) */
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+
+    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /** 工作机器ID(0~31) */
+    private long workerId=1L;
+
+    /** 数据中心ID(0~31) */
+    private long datacenterId=1L;
+
+    /** 毫秒内序列(0~4095) */
+    private long sequence = 0L;
+
+    /** 上次生成ID的时间截 */
+    private long lastTimestamp = -1L;
+
+
+
+    //==============================Constructors=====================================
+    private SnowflakeIdUtil(){}
+    /**
+     * 构造函数
+     */
+    public static SnowflakeIdUtil getSnowflakeIdUtil(){
+        if(singleton == null){
+            synchronized (SnowflakeIdUtil.class){
+                if(singleton == null){
+                    singleton = new SnowflakeIdUtil(0,0);
+                }
+            }
+        }
+        return singleton;
+    }
+    public static SnowflakeIdUtil getSnowflakeIdUtil(long workerId, long datacenterId){
+        if(singleton == null){
+            synchronized (SnowflakeIdUtil.class){
+                if(singleton == null){
+                    singleton = new SnowflakeIdUtil(workerId,datacenterId);
+                }
+            }
+        }
+        return singleton;
+    }
+    /**
+     * 构造函数
+     * @param workerId 工作ID (0~31)
+     * @param datacenterId 数据中心ID (0~31)
+     */
+    public SnowflakeIdUtil(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    // ==============================Methods==========================================
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+        //上次生成ID的时间截
+        lastTimestamp = timestamp;
+
+       /* //移位并通过或运算拼到一起组成64位的ID
+        return ((timestamp - twepoch) << timestampLeftShift) //
+                | (datacenterId << datacenterIdShift) //
+                | (workerId << workerIdShift) //
+                | sequence;*/
+
+        // modify by tomas 2017-08-28
+        try {
+            Thread.sleep(1);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return  Long.parseLong(timestamp+ getNewAppend() );
+    }
+
+    protected String getNewAppend() {
+        StringBuilder stringBuilder=new StringBuilder((System.nanoTime() + "").substring(7, 10));
+        return  stringBuilder.toString();
+
+    }
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     * @param lastTimestamp 上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 返回字符串类型 code
+     * @return
+     */
+    public String nextCode() {
+        return  String.valueOf(nextId());
+    }
+    /**
+     * 返回以毫秒为单位的当前时间
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+
+
+    public static void main(String[] args) throws Exception{
+
+        Set<Long> ids= new HashSet<>();
+        long start=System.currentTimeMillis();
+        for (int j=0 ;j<1000;j++){
+            long id = SnowflakeIdUtil.getSnowflakeIdUtil().nextId();
+            ids.add(id);
+            //System.out.println(id);
+        }
+        System.out.println(ids.size()+"---time="+ (System.currentTimeMillis()-start));
+
+    }
+}

+ 25 - 0
manage-common/src/main/java/cn/efunbox/manage/common/utils/WxApiUtil.java

@@ -0,0 +1,25 @@
+package cn.efunbox.manage.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class WxApiUtil {
+
+	/**
+	 * 请求微信时的错误标志字段
+	 */
+	public static final String WEIXIN_ERROR_CODE_FIELD = "errcode";
+
+	/**
+	 * 请求微信时,成功标志字段
+	 */
+	public static final int WEIXIN_SUCCESS_CODE = 0;
+
+	public static boolean isWeixinRequestSuccess(JSONObject jsonObj) {
+		if (jsonObj == null || (jsonObj.containsKey(WEIXIN_ERROR_CODE_FIELD)
+				&& jsonObj.getIntValue(WEIXIN_ERROR_CODE_FIELD) != WEIXIN_SUCCESS_CODE)) {
+			return false;
+		}
+		return true;
+	}
+	
+}

+ 87 - 0
manage-web/pom.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>manage-root</artifactId>
+        <groupId>cn.efunbox.manage</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>manage-web</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>war</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.efunbox.manage</groupId>
+            <artifactId>manage-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.efunbox.manage</groupId>
+            <artifactId>manage-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-tomcat</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <finalName>manage</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>UTF-8</encoding>
+                    <showWarnings>true</showWarnings>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.0.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <outputDirectory>../target</outputDirectory>
+                </configuration>
+            </plugin>
+            <!--<plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>1.5.7.RELEASE</version>
+                <configuration>
+                    <outputDirectory>../target</outputDirectory>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>-->
+        </plugins>
+    </build>
+</project>

+ 29 - 0
manage-web/src/main/java/cn/efunbox/manage/base/BaseApplication.java

@@ -0,0 +1,29 @@
+package cn.efunbox.manage.base;
+
+import cn.efunbox.manage.common.configuration.FrontConfiguration;
+import cn.efunbox.manage.common.data.ProjectSimpleJpaRepository;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+@Import(FrontConfiguration.class)
+@EnableJpaRepositories(repositoryBaseClass = ProjectSimpleJpaRepository.class)
+@ComponentScan(basePackages = {"cn.efunbox.manage.base.*","cn.efunbox.manage.common.*"})
+public class BaseApplication extends SpringBootServletInitializer {
+
+	@Override
+	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+		return application.sources(BaseApplication.class);
+	}
+
+	public static void main(String[] args) {
+		SpringApplication.run(BaseApplication.class, args);
+	}
+}

+ 75 - 0
manage-web/src/main/java/cn/efunbox/manage/base/configuration/AsyncConfig.java

@@ -0,0 +1,75 @@
+package cn.efunbox.manage.base.configuration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.SimpleAsyncTaskExecutor;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+
+@Configuration
+@EnableAsync()
+public class AsyncConfig implements AsyncConfigurer {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Value("${schedule.threadPoolAsyncTaskExecutor.thread.size}")
+    private Integer threadSize;
+    /**
+     *  name = threadPoolAsyncTaskExecutor 时
+     * 使用基于线程池的 Task 执行器
+     * @return
+     */
+    @Bean(name = "threadPoolAsyncTaskExecutor")
+    public Executor threadPoolAsyncTaskExecutor() {
+        ExecutorService executor = Executors.newFixedThreadPool(threadSize);
+        return  executor;
+    }
+
+    @Bean(name = "scheduledExecutorService")
+    public ScheduledExecutorService threadPoolAsyncScheduleExecutor() {
+        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(threadSize);
+        return  scheduledExecutorService;
+    }
+
+    /**
+     * 只有@Async 注解时
+     * 使用 原生的 SimpleAsyncTaskExecutor 执行器
+     * @return
+     */
+    @Override
+    public Executor getAsyncExecutor() {
+        return new SimpleAsyncTaskExecutor();
+    }
+
+    /**
+     * 实现 异常处理 handler
+     * @return
+     */
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return new CustomAsyncExceptionHandler();
+    }
+
+    class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
+
+        @Override
+        public void handleUncaughtException(final Throwable throwable, final Method method, final Object... obj) {
+            logger.error("Exception message - " + throwable.getMessage());
+            logger.error("Method name - " + method.getName());
+            for (final Object param : obj) {
+                logger.error("Param - " + param);
+            }
+        }
+
+    }
+}

+ 184 - 0
manage-web/src/main/java/cn/efunbox/manage/base/configuration/PersistConfiguration.java

@@ -0,0 +1,184 @@
+/**
+ * 文件名:@PersistConfiguration.java <br/>
+ * 包名:tv.acfun.base.configuration <br/>
+ * 项目名:acfun-base-provider <br/>
+ * @author xtwin <br/>
+ */
+package cn.efunbox.manage.base.configuration;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.boot.bind.RelaxedPropertyResolver;
+import org.springframework.cache.CacheManager;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.env.Environment;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
+import org.springframework.data.redis.core.*;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import javax.sql.DataSource;
+
+/**
+ * 类名:PersistConfiguration  <br />
+ *
+ * 功能:持久化相关配置
+ *
+ * @author xtwin <br />
+ * 创建时间:2016年7月26日 上午9:56:48  <br />
+ * @version 2016年7月26日
+ */
+@EntityScan(basePackages={"cn.efunbox.manage.base.entity"})
+public class PersistConfiguration implements EnvironmentAware {
+	
+	// 日志记录器
+	private static final Logger logger = LoggerFactory.getLogger(PersistConfiguration.class);
+	
+	// 应用环境信息
+	private Environment environment;
+
+	//缓存管理器
+	@Bean
+	public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
+		RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
+		//设置缓存过期时间
+		cacheManager.setDefaultExpiration(10000);
+		return cacheManager;
+	}
+	@Bean(name="redisTemplate")
+	public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory){
+		String index = environment.getProperty("spring.redis.database", "0");
+		RedisTemplate<String, Object> template = new RedisTemplate<>();
+		template.setConnectionFactory(factory);
+		factory.setDatabase(Integer.parseInt(index));
+
+		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);
+		template.setKeySerializer(new StringRedisSerializer());
+		template.setValueSerializer(jackson2JsonRedisSerializer);
+		template.setDefaultSerializer(jackson2JsonRedisSerializer);
+		template.setHashValueSerializer(jackson2JsonRedisSerializer);
+		template.setHashKeySerializer(new StringRedisSerializer());
+		template.afterPropertiesSet();
+		return template;
+	}
+
+	/**
+	 * 实例化 HashOperations 对象,可以使用 Hash 类型操作
+	 *
+	 * @param redisTemplate
+	 * @return
+	 */
+	@Bean
+	public HashOperations<String, String, Object> hashOperations(RedisTemplate redisTemplate) {
+		return redisTemplate.opsForHash();
+	}
+
+	/**
+	 * 实例化 ValueOperations 对象,可以使用 String 操作
+	 *
+	 * @param redisTemplate
+	 * @return
+	 */
+	@Bean
+	public ValueOperations<String, Object> valueOperations(RedisTemplate redisTemplate) {
+		return redisTemplate.opsForValue();
+	}
+
+	/**
+	 * 实例化 ListOperations 对象,可以使用 List 操作
+	 *
+	 * @param redisTemplate
+	 * @return
+	 */
+	@Bean
+	public ListOperations<String, Object> listOperations(RedisTemplate redisTemplate) {
+		return redisTemplate.opsForList();
+	}
+
+	/**
+	 * 实例化 SetOperations 对象,可以使用 Set 操作
+	 *
+	 * @param redisTemplate
+	 * @return
+	 */
+	@Bean
+	public SetOperations<String, Object> setOperations(RedisTemplate redisTemplate) {
+		return redisTemplate.opsForSet();
+	}
+
+	/**
+	 * 实例化 ZSetOperations 对象,可以使用 ZSet 操作
+	 *
+	 * @param redisTemplate
+	 * @return
+	 */
+	@Bean
+	public ZSetOperations<String, Object> zSetOperations(RedisTemplate redisTemplate) {
+		return redisTemplate.opsForZSet();
+	}
+
+	/**
+	 * 功能:创建数据源 <br/>
+	 *
+	 * @author xtwin <br/>
+	 * @version 2016年7月27日 上午10:00:02 <br/>
+	 */
+	protected DataSource createDataSource(String prefix) throws Exception {
+		
+		// 创建属性解析器,用于读取配置信息
+		RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment, prefix);
+		
+		// 创建数据源对象
+		DruidDataSource dataSource = new DruidDataSource();
+		
+		// 数据库连接url
+		dataSource.setUrl(resolver.getRequiredProperty("spring.datasource.url"));
+		// 用户名
+		dataSource.setUsername(resolver.getRequiredProperty("spring.datasource.username"));
+		// 密码
+		dataSource.setPassword(resolver.getRequiredProperty("spring.datasource.password"));
+		// 驱动
+		dataSource.setDriverClassName(resolver.getProperty("spring.datasource.driver-class-name"));
+		// 连接池初始大小
+		dataSource.setInitialSize(resolver.getProperty("initial_size", int.class, dataSource.getInitialSize()));
+		// 连接池最小空闲大小
+		dataSource.setMinIdle(resolver.getProperty("min_idle", int.class, dataSource.getMinIdle()));
+		// 连接池最大连接数
+		dataSource.setMaxActive(resolver.getProperty("max_active", int.class, dataSource.getMaxActive()));
+		// 连接最大等待时间
+		dataSource.setMaxWait(resolver.getProperty("max_wait", long.class, dataSource.getMaxWait()));
+		// 在连接池空闲时,测试连接是否可以
+		dataSource.setTestWhileIdle(resolver.getProperty("test_while_idle", boolean.class, dataSource.isTestWhileIdle()));
+		// 在连接池空闲时,测试连接是否可以
+		dataSource.setTestOnBorrow(resolver.getProperty("test_on_borrow", boolean.class, dataSource.isTestOnBorrow()));
+		// 在连接池空闲时,测试连接语句
+		dataSource.setValidationQuery(resolver.getRequiredProperty("validation_query"));
+		return dataSource;
+	}
+
+	/**
+	 * 功能: 由spring注入环境信息 <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月27日 上午10:02:15<br/>
+	 * 
+	 * @param environment <br/>
+	 * @see EnvironmentAware#setEnvironment(Environment)
+	 */
+	@Override
+	public void setEnvironment(Environment environment) {
+		this.environment = environment;
+	}
+}

+ 24 - 0
manage-web/src/main/java/cn/efunbox/manage/base/configuration/RestTemplateConfig.java

@@ -0,0 +1,24 @@
+package cn.efunbox.manage.base.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
+        return new RestTemplate(factory);
+    }
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setReadTimeout(5000);//ms
+        factory.setConnectTimeout(15000);//ms
+        return factory;
+    }
+}

+ 30 - 0
manage-web/src/main/java/cn/efunbox/manage/base/controller/DepartmentController.java

@@ -0,0 +1,30 @@
+package cn.efunbox.manage.base.controller;
+
+import cn.efunbox.manage.base.service.DepartmentService;
+import cn.efunbox.manage.common.result.ApiResult;
+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;
+
+/**
+ * DepartmentController
+ * Created by wangys on 2019/03/07
+ */
+@RestController
+@RequestMapping("/dept")
+public class DepartmentController {
+
+    @Autowired
+    DepartmentService departmentService;
+
+    @GetMapping("/tree")
+    public ApiResult tree(Long deptId){
+        return departmentService.getDeptTree(deptId);
+    }
+
+    @GetMapping("/child")
+    public ApiResult child(Long deptId){
+        return departmentService.getDeptChild(deptId);
+    }
+}

+ 57 - 0
manage-web/src/main/java/cn/efunbox/manage/base/controller/LoginController.java

@@ -0,0 +1,57 @@
+package cn.efunbox.manage.base.controller;
+
+import cn.efunbox.manage.base.entity.User;
+import cn.efunbox.manage.base.service.UserService;
+import cn.efunbox.manage.base.vo.LoginVo;
+import cn.efunbox.manage.base.vo.UserVo;
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import cn.efunbox.manage.common.utils.Constants;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("/")
+public class LoginController {
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private RedisTemplate<String,String> redisTemplate;
+
+    @PostMapping("/login")
+    public ApiResult<UserVo> login(@RequestBody LoginVo loginVo){
+        ApiResult<UserVo> UserApiResult = userService.login(loginVo.getUserName(),loginVo.getPassword());
+        if(UserApiResult.getSuccess()){
+            String token = UUID.randomUUID().toString();
+            UserVo UserVo = UserApiResult.getData();
+            UserVo.setToken(token);
+            redisTemplate.opsForValue().set(Constants.EFUNBOX_ADMIN_TOKEN_PREFIX+token, JSON.toJSONString(UserVo),30, TimeUnit.MINUTES);
+        }
+        return UserApiResult;
+    }
+
+    @GetMapping("/logout")
+    public ApiResult<User> logout(@RequestHeader("token")String token){
+        redisTemplate.delete(Constants.EFUNBOX_ADMIN_TOKEN_PREFIX+token);
+        return ApiResult.ok();
+    }
+
+    @GetMapping("/tokenLogin")
+    public ApiResult<Object> tokenLogin(@RequestHeader("token")String token){
+        String s = redisTemplate.opsForValue().get(Constants.EFUNBOX_ADMIN_TOKEN_PREFIX + token);
+        if(s==null){
+            return ApiResult.error(ApiCode.INVALID_TOKEN);
+        }else{
+            return ApiResult.ok(JSONObject.parse(s));
+        }
+
+    }
+}

+ 40 - 0
manage-web/src/main/java/cn/efunbox/manage/base/controller/ManageController.java

@@ -0,0 +1,40 @@
+package cn.efunbox.manage.base.controller;
+
+import cn.efunbox.manage.base.entity.Department;
+import cn.efunbox.manage.base.entity.Manage;
+import cn.efunbox.manage.base.service.DepartmentService;
+import cn.efunbox.manage.base.service.ManageService;
+import cn.efunbox.manage.common.result.ApiResult;
+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.ArrayList;
+import java.util.List;
+
+/**
+ * ManageController
+ * Created by wangys on 2019/03/08
+ */
+@RequestMapping("/manage")
+@RestController
+public class ManageController {
+
+    @Autowired
+    ManageService manageService;
+
+    @Autowired
+    DepartmentService departmentService;
+
+    @GetMapping
+    public ApiResult findManage(Manage manage){
+        ApiResult<List<Department>> deptResult = departmentService.getDeptChild(manage.getDeptId());
+        List<Long> deptIds = new ArrayList<>();
+        deptResult.getData().stream().forEach(department -> {
+            deptIds.add(department.getId());
+        });
+        manage.setDeptIds(deptIds);
+        return manageService.list(manage);
+    }
+}

+ 114 - 0
manage-web/src/main/java/cn/efunbox/manage/base/utils/HttpUtil.java

@@ -0,0 +1,114 @@
+package cn.efunbox.manage.base.utils;
+
+import cn.efunbox.manage.common.result.ApiCode;
+import cn.efunbox.manage.common.result.ApiResult;
+import com.alibaba.fastjson.JSON;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by tomas on 2017/6/4.
+ */
+
+public class HttpUtil {
+
+    private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class);
+
+    public static void responseOk(HttpServletRequest request,HttpServletResponse response) {
+        responseOutWithJson(request,response, ApiResult.ok());
+    }
+    public static void responseOkData(HttpServletRequest request,HttpServletResponse response, Object data) {
+        Map map = new HashMap<>();
+        map.put("code", ApiCode.OK.getCode());
+        map.put("message", ApiCode.OK.getMessage());
+        map.put("data", data);
+        responseOutWithJson(request, response, map);
+    }
+
+    public static void responseApiCode(HttpServletRequest request,HttpServletResponse response, ApiCode code) {
+        if(code.getCode()==ApiCode._C_OK){
+            responseOutWithJson(request,response, ApiResult.ok());
+        }else {
+            responseOutWithJson(request,response, ApiResult.error(code));
+        }
+    }
+    public static void responseOutWithJson(HttpServletRequest request,HttpServletResponse response, Object data) {
+        //将实体对象转换为JSON Object转换
+        response.setCharacterEncoding("UTF-8");
+        String origin = request.getHeader("Origin");
+        // TODO  orign 和 refer 的判断 .....
+        if (null!=origin){
+            response.setHeader("Access-Control-Allow-Origin", origin);
+        }else {
+            response.setHeader("Access-Control-Allow-Origin", "http://cms.efunbox.cn");
+        }
+        response.setContentType("application/json; charset=utf-8");
+        response.setHeader("Access-Control-Allow-Credentials", "true");
+        response.setHeader("Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, PATCH");
+        //response.setHeader("Access-Control-Max-Age", "3600");
+        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Token,Authentication, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, Cache-control, id, token");
+        response.setHeader("X-Frame-Options","SAMEORIGIN");
+        PrintWriter out = null;
+        try {
+            out = response.getWriter();
+            out.append(JSON.toJSONString(data));
+            logger.info("url= {} 返回JSON ={} ",request.getRequestURI(), JSON.toJSONString(data));
+        } catch (IOException e) {
+            logger.error("request ={} 返回 失败 e={}" ,request.getRequestURI(),e);
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
+
+    public static void delCookies(HttpServletRequest request,HttpServletResponse response, String...  cookies) {
+        for (String cookieName : cookies) {
+            Cookie cookie = new Cookie(cookieName, null);
+            String cookiePath = request.getContextPath();
+            if (!StringUtils.hasLength(cookiePath)) {
+                cookiePath = "/";
+            }
+            cookie.setPath(cookiePath);
+            cookie.setMaxAge(0);
+            response.addCookie(cookie);
+        }
+    }
+
+    /**
+     * 获取客户端的ip
+     * @param request
+     * @return
+     */
+    public static String getIpAddress(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();
+        }
+        return ip;
+    }
+
+
+
+}

+ 96 - 0
manage-web/src/main/resources/application-dev.properties

@@ -0,0 +1,96 @@
+
+########################################################
+### Spring Cloud 基本配置;
+########################################################
+spring.application.name=efunbox-manage-base
+
+
+
+########################################################
+### MYSQL基本配置;
+########################################################
+#dev
+#spring.datasource.url=jdbc:mysql://192.168.1.87:3306/live?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true
+#spring.datasource.username=root
+#spring.datasource.password=admin123
+spring.datasource.url=jdbc:mysql://192.168.1.96:3306/efunbox_manage?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true
+spring.datasource.username=root
+spring.datasource.password=Efunbox^^2015$
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+
+spring.jpa.properties.hibernate.hbm2ddl.auto=update
+spring.jpa.properties.hibernate.format_sql=true
+spring.jpa.show-sql=true
+
+########################################################
+### REDIS (RedisProperties) redis基本配置;
+########################################################
+# 远程 Redis数据库索引(默认为0)
+spring.redis.database=0
+# Redis服务器地址
+spring.redis.host=192.168.1.86
+# Redis服务器连接端口
+spring.redis.port=6379
+# Redis服务器连接密码(默认为空)
+spring.redis.password=otttest
+
+# 连接池最大连接数(使用负值表示没有限制)
+spring.redis.pool.max-active=8
+# 连接池最大阻塞等待时间(使用负值表示没有限制)
+spring.redis.pool.max-wait=-1
+# 连接池中的最大空闲连接
+spring.redis.pool.max-idle=8
+# 连接池中的最小空闲连接
+spring.redis.pool.min-idle=0
+# 连接超时时间(毫秒)
+spring.redis.timeout=0
+
+efunbox.oss.img.url=https://efunbox.lingjiao.cn
+
+
+efunbox.wx.appcode=https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri={REDIRECT_URI}&response_type=code&scope=snsapi_userinfo&state={STATE}#wechat_redirect 
+efunbox.wx.accesstoken=https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={SECRET}&code={CODE}&grant_type=authorization_code
+efunbox.wx.unionId=https://api.weixin.qq.com/sns/userinfo?access_token={ACCESS_TOKEN}&openid={OPENID}&lang=zh_CN
+
+# 执行异步任务的 线程池大小
+schedule.threadPoolAsyncTaskExecutor.thread.size= 16
+
+##基础服务
+iaas.order.content.url=http://zuul.ai160.com/ocenter/v1/orders/content/count?dist={dist}&beginTime={beginTime}&endTime={endTime}
+iaas.create.counts.url=http://zuul.ai160.com/scenter/v1/counts/{contentId}
+iaas.find.counts.url=http://zuul.ai160.com/scenter/v1/counts/?ids={ids}
+iaas.create.auth.url=http://zuul.ai160.com/acenter/v1/auth
+iaas.operation.user.integral.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral
+iaas.find.user.integral.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral?uid={uid}
+iaas.find.users.integral.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral/users?ids={ids}
+iaas.find.user.integral.record.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral/record
+
+#注册登录接口地址
+efunbox.oss.resource.login=http://zuul.ai160.com/ucenter/v1/users/token
+efunbox.oss.resource.register=http://zuul.ai160.com/ucenter/v1/users
+efunbox.oss.resource.token=http://zuul.ai160.com/ucenter/v1/users/token?token
+efunbox.oss.user.info=http://zuul.ai160.com/ucenter/v1/users/{uid}?token={token}
+
+#wx.efunbox.appid=wxdfa8a4f1623d28db
+#wx.efunbox.secret=c38c095e2632581cccfe33d64c712be9
+wx.efunbox.appid=wx8961a3e5512f307c
+wx.efunbox.secret=a2b49659f9ac921eaa03d0bdc031e44c
+wx.efunbox.url=https://api.weixin.qq.com/sns/jscode2session?appid={APPID}&secret={SECRET}&js_code={JSCODE}&grant_type=authorization_code
+wx.efunbox.accessToken=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}
+wx.efunbox.qrCode=https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={ACCESS_TOKEN}
+wx.efunbox.sendMsg=https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={ACCESS_TOKEN}
+#wx.efunbox.sendMsg=https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={ACCESS_TOKEN}
+#wx.efunbox.sendMsg=https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token={ACCESS_TOKEN}
+#oss
+ali.oss.endpoint=oss-cn-beijing.aliyuncs.com
+ali.oss.accessKeyId=LTAIA4of7gbC4JIB
+ali.oss.accessKeySecret=A7oqOTWFlJwjGHGoQo4mkFQ5TxCPiR
+aliyun.oss.file.prefix=reader/resource/
+aliyun.oss.file.qrcode.prefix=reader/resource/qrcode/
+statistics.oss.prefix=reader/statistics/test/
+statistics.oss.report=reader/statistics/test/report/
+
+
+wx.pay.notify.url=https://readertest.lingjiao.cn/readerBase/wx/wxPay/notify
+
+default.like.user.uid=c7f0a8fdd3a549ea9109a7b7486775f2

+ 85 - 0
manage-web/src/main/resources/application-prd.properties

@@ -0,0 +1,85 @@
+
+########################################################
+### Spring Cloud 基本配置;
+########################################################
+spring.application.name=efunbox-manage-base
+
+
+########################################################
+### MYSQL基本配置;
+########################################################
+#prd
+spring.datasource.url=jdbc:mysql://rm-2ze46n5q19ykdk41k.mysql.rds.aliyuncs.com:3306/reader_base?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true
+spring.datasource.username=iaas
+spring.datasource.password=kI5R7u!$CbzrolAD
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+spring.jpa.properties.hibernate.hbm2ddl.auto=update
+spring.jpa.properties.hibernate.format_sql=true
+spring.jpa.show-sql=false
+
+schedule.threadPoolAsyncTaskExecutor.thread.size= 16
+
+########################################################
+### REDIS (RedisProperties) redis基本配置;
+########################################################
+# prd Redis数据库索引(默认为0)
+spring.redis.database=0
+# Redis服务器地址
+spring.redis.host=r-2zef44e1d34b39f4.redis.rds.aliyuncs.com
+# Redis服务器连接端口
+spring.redis.port=6379
+# Redis服务器连接密码(默认为空)
+spring.redis.password=!2Ct05VAcPC6
+
+# 连接池最大连接数(使用负值表示没有限制)
+spring.redis.pool.max-active=8
+# 连接池最大阻塞等待时间(使用负值表示没有限制)
+spring.redis.pool.max-wait=-1
+# 连接池中的最大空闲连接
+spring.redis.pool.max-idle=8
+# 连接池中的最小空闲连接
+spring.redis.pool.min-idle=0
+# 连接超时时间(毫秒)
+spring.redis.timeout=0
+
+efunbox.oss.img.url=https://efunbox.lingjiao.cn
+
+efunbox.wx.appcode=https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri={REDIRECT_URI}&response_type=code&scope=snsapi_userinfo&state={STATE}#wechat_redirect 
+efunbox.wx.accesstoken=https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={SECRET}&code={CODE}&grant_type=authorization_code
+efunbox.wx.unionId=https://api.weixin.qq.com/sns/userinfo?access_token={ACCESS_TOKEN}&openid={OPENID}&lang=zh_CN
+
+
+wx.efunbox.appid=wxdfa8a4f1623d28db
+wx.efunbox.secret=c38c095e2632581cccfe33d64c712be9
+wx.efunbox.url=https://api.weixin.qq.com/sns/jscode2session?appid={APPID}&secret={SECRET}&js_code={JSCODE}&grant_type=authorization_code
+wx.efunbox.accessToken=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}
+wx.efunbox.qrCode=https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={ACCESS_TOKEN}
+wx.efunbox.sendMsg=https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={ACCESS_TOKEN}
+
+#基础服务
+iaas.order.content.url=http://efunzuul.lingjiao.cn/ocenter/v1/orders/content/count?dist={dist}&beginTime={beginTime}&endTime={endTime}
+iaas.create.counts.url=http://efunzuul.lingjiao.cn/scenter/v1/counts/{contentId}
+iaas.find.counts.url=http://efunzuul.lingjiao.cn/scenter/v1/counts/?ids={ids}
+iaas.operation.user.integral.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral
+iaas.find.user.integral.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral?uid={uid}
+iaas.find.users.integral.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral/users?ids={ids}
+iaas.find.user.integral.record.url=http://efunzuul.lingjiao.cn/ucenter/v1/integral/record
+
+#注册登录接口地址
+efunbox.oss.resource.login=http://efunzuul.lingjiao.cn/ucenter/v1/users/token
+efunbox.oss.resource.register=http://efunzuul.lingjiao.cn/ucenter/v1/users
+efunbox.oss.resource.token=http://efunzuul.lingjiao.cn/ucenter/v1/users/token?token
+efunbox.oss.user.info=http://efunzuul.lingjiao.cn/ucenter/v1/users/{uid}?token={token}
+
+#oss
+ali.oss.endpoint=oss-cn-beijing.aliyuncs.com
+ali.oss.accessKeyId=LTAIA4of7gbC4JIB
+ali.oss.accessKeySecret=A7oqOTWFlJwjGHGoQo4mkFQ5TxCPiR
+aliyun.oss.file.prefix=reader/resource/
+aliyun.oss.file.qrcode.prefix=reader/resource/qrcode/
+statistics.oss.prefix=reader/statistics/prod/
+statistics.oss.report=reader/statistics/prod/report/
+
+wx.pay.notify.url=https://reader.lingjiao.cn/readerBase/wx/wxPay/notify
+
+default.like.user.uid=c7f0a8fdd3a549ea9109a7b7486775f2

+ 9 - 0
manage-web/src/main/resources/application.properties

@@ -0,0 +1,9 @@
+# 监听端口
+server.port=8059
+
+#spring.view.prefix=/templates/
+#spring.view.suffix=.jsp
+# 默认激活哪一个环境的配置文件,时也可以在运行动态指定:java -jar myapp.jar --spring.profiles.active=prd
+spring.profiles.active=dev
+spring.http.multipart.maxFileSize = 10Mb
+spring.http.multipart.maxRequestSize=100Mb

BIN
manage-web/src/main/resources/cert/apiclient_cert.p12


+ 29 - 0
manage-web/src/main/resources/logback-spring.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<configuration>
+    <springProperty scope="context" name="applicationname" source="spring.application.name"/>
+    <!-- 声明变量 -->
+    <substitutionProperty name="log.base" value="${LOG_PATH:-/opt/logs/${applicationname}}/${LOG_FILE:-${applicationname}}"/>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%-4d [%green(%thread)] %highlight(%-5level)  %cyan(%-40.40logger{39}:%L) - %m%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.base}.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>[%d{yy-MM-dd HH:mm:ss.SSS}] [%cn] [%thread] %-5level %-40.40logger{39} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="FILE"/>
+    </root>
+    <jmxConfigurator/>
+</configuration>

+ 31 - 0
manage-web/src/main/resources/templates/error.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
+    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
+    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
+    <title>义方快乐学堂7.0</title>
+    <style>
+        *{
+            margin: 0;
+            padding: 0;
+        }
+        html,
+        body {
+            width: 100%;
+            height: 100%;
+        }
+        .error {
+            width: 100%;
+            height: 100%; 
+            background: url("http://ottbase.ai160.com/templates/image/error.jpg") no-repeat;
+            background-size: 100% 100%; 
+        }
+    </style>
+</head>
+<body>
+    <div class="error">
+    </div>
+</body>
+</html>

BIN
manage-web/src/main/resources/templates/image/bg.jpg


BIN
manage-web/src/main/resources/templates/image/bind_error.png


BIN
manage-web/src/main/resources/templates/image/bind_success.png


BIN
manage-web/src/main/resources/templates/image/cha.png


BIN
manage-web/src/main/resources/templates/image/code.png


BIN
manage-web/src/main/resources/templates/image/error.jpg


+ 0 - 0
manage-web/src/main/resources/templates/image/logo.png


Some files were not shown because too many files changed in this diff